"561698 -  Merge 'org.eclipse.mdm.nucleus/master' into 'master'"

Signed-off-by: Simon Skoczylas <simon.skoczylas@karakun.com>
diff --git a/org.eclipse.mdm.nucleus/.gitignore b/org.eclipse.mdm.nucleus/.gitignore
new file mode 100644
index 0000000..7b943bd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/.gitignore
@@ -0,0 +1,22 @@
+# eclipse
+.classpath
+.project
+.settings/
+bin/
+
+# gradle
+.gradle
+build/
+gradle.properties
+
+# intellij
+.idea/
+out/
+*.ipr
+*.iml
+*.iws
+/bin/
+
+# node
+**/node_modules
+**/coverage
diff --git a/org.eclipse.mdm.nucleus/CONTRIBUTING.md b/org.eclipse.mdm.nucleus/CONTRIBUTING.md
new file mode 100644
index 0000000..8f51d10
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/CONTRIBUTING.md
@@ -0,0 +1,54 @@
+# Contributing to Eclipse MDM|BL
+
+Thanks for your interest in this project.
+
+## Project description
+
+* https://projects.eclipse.org/projects/technology.mdmbl
+
+## Developer resources
+
+Information regarding source code management, builds, coding standards, and
+more.
+
+* https://projects.eclipse.org/projects/technology.mdmbl/developer
+
+The project maintains the following source code repositories
+
+* https://git.eclipse.org/r/plugins/gitiles/mdmbl/org.eclipse.mdm.api.base
+* https://git.eclipse.org/r/plugins/gitiles/mdmbl/org.eclipse.mdm.api.default
+* https://git.eclipse.org/r/plugins/gitiles/mdmbl/org.eclipse.mdm.api.odsadapter
+* https://git.eclipse.org/r/plugins/gitiles/mdmbl/org.eclipse.mdm.mdfsorter
+* https://git.eclipse.org/r/plugins/gitiles/mdmbl/org.eclipse.mdm.nucleus
+* https://git.eclipse.org/r/plugins/gitiles/mdmbl/org.eclipse.mdm.openatfx.mdf
+
+This project uses Bugzilla to track ongoing development and issues.
+
+* Search for issues: https://bugs.eclipse.org/bugs/buglist.cgi?product=MDMBL
+* Create a new report:
+   https://bugs.eclipse.org/bugs/enter_bug.cgi?product=MDMBL
+
+Be sure to search for existing bugs before you create another one. Remember that
+contributions are always welcome!
+
+## Eclipse Contributor Agreement
+
+Before your contribution can be accepted by the project team contributors must
+electronically sign the Eclipse Contributor Agreement (ECA).
+
+* http://www.eclipse.org/legal/ECA.php
+
+Commits that are provided by non-committers must have a Signed-off-by field in
+the footer indicating that the author is aware of the terms by which the
+contribution has been provided to the project. The non-committer must
+additionally have an Eclipse Foundation account and must have a signed Eclipse
+Contributor Agreement (ECA) on file.
+
+For more information, please see the Eclipse Committer Handbook:
+https://www.eclipse.org/projects/handbook/#resources-commit
+
+## Contact
+
+Contact the project developers via the project's "dev" list.
+
+* https://dev.eclipse.org/mailman/listinfo/mdmbl-dev
diff --git a/org.eclipse.mdm.nucleus/LICENSE.txt b/org.eclipse.mdm.nucleus/LICENSE.txt
new file mode 100644
index 0000000..e48e096
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/LICENSE.txt
@@ -0,0 +1,277 @@
+Eclipse Public License - v 2.0
+
+    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+    PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
+    OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+  a) in the case of the initial Contributor, the initial content
+     Distributed under this Agreement, and
+
+  b) in the case of each subsequent Contributor:
+     i) changes to the Program, and
+     ii) additions to the Program;
+  where such changes and/or additions to the Program originate from
+  and are Distributed by that particular Contributor. A Contribution
+  "originates" from a Contributor if it was added to the Program by
+  such Contributor itself or anyone acting on such Contributor's behalf.
+  Contributions do not include changes or additions to the Program that
+  are not Modified Works.
+
+"Contributor" means any person or entity that Distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions Distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement
+or any Secondary License (as applicable), including Contributors.
+
+"Derivative Works" shall mean any work, whether in Source Code or other
+form, that is based on (or derived from) the Program and for which the
+editorial revisions, annotations, elaborations, or other modifications
+represent, as a whole, an original work of authorship.
+
+"Modified Works" shall mean any work in Source Code or other form that
+results from an addition to, deletion from, or modification of the
+contents of the Program, including, for purposes of clarity any new file
+in Source Code form that contains any contents of the Program. Modified
+Works shall not include works that contain only declarations,
+interfaces, types, classes, structures, or files of the Program solely
+in each case in order to link to, bind by name, or subclass the Program
+or Modified Works thereof.
+
+"Distribute" means the acts of a) distributing or b) making available
+in any manner that enables the transfer of a copy.
+
+"Source Code" means the form of a Program preferred for making
+modifications, including but not limited to software source code,
+documentation source, and configuration files.
+
+"Secondary License" means either the GNU General Public License,
+Version 2.0, or any later versions of that license, including any
+exceptions or additional permissions as identified by the initial
+Contributor.
+
+2. GRANT OF RIGHTS
+
+  a) Subject to the terms of this Agreement, each Contributor hereby
+  grants Recipient a non-exclusive, worldwide, royalty-free copyright
+  license to reproduce, prepare Derivative Works of, publicly display,
+  publicly perform, Distribute and sublicense the Contribution of such
+  Contributor, if any, and such Derivative Works.
+
+  b) Subject to the terms of this Agreement, each Contributor hereby
+  grants Recipient a non-exclusive, worldwide, royalty-free patent
+  license under Licensed Patents to make, use, sell, offer to sell,
+  import and otherwise transfer the Contribution of such Contributor,
+  if any, in Source Code or other form. This patent license shall
+  apply to the combination of the Contribution and the Program if, at
+  the time the Contribution is added by the Contributor, such addition
+  of the Contribution causes such combination to be covered by the
+  Licensed Patents. The patent license shall not apply to any other
+  combinations which include the Contribution. No hardware per se is
+  licensed hereunder.
+
+  c) Recipient understands that although each Contributor grants the
+  licenses to its Contributions set forth herein, no assurances are
+  provided by any Contributor that the Program does not infringe the
+  patent or other intellectual property rights of any other entity.
+  Each Contributor disclaims any liability to Recipient for claims
+  brought by any other entity based on infringement of intellectual
+  property rights or otherwise. As a condition to exercising the
+  rights and licenses granted hereunder, each Recipient hereby
+  assumes sole responsibility to secure any other intellectual
+  property rights needed, if any. For example, if a third party
+  patent license is required to allow Recipient to Distribute the
+  Program, it is Recipient's responsibility to acquire that license
+  before distributing the Program.
+
+  d) Each Contributor represents that to its knowledge it has
+  sufficient copyright rights in its Contribution, if any, to grant
+  the copyright license set forth in this Agreement.
+
+  e) Notwithstanding the terms of any Secondary License, no
+  Contributor makes additional grants to any Recipient (other than
+  those set forth in this Agreement) as a result of such Recipient's
+  receipt of the Program under the terms of a Secondary License
+  (if permitted under the terms of Section 3).
+
+3. REQUIREMENTS
+
+3.1 If a Contributor Distributes the Program in any form, then:
+
+  a) the Program must also be made available as Source Code, in
+  accordance with section 3.2, and the Contributor must accompany
+  the Program with a statement that the Source Code for the Program
+  is available under this Agreement, and informs Recipients how to
+  obtain it in a reasonable manner on or through a medium customarily
+  used for software exchange; and
+
+  b) the Contributor may Distribute the Program under a license
+  different than this Agreement, provided that such license:
+     i) effectively disclaims on behalf of all other Contributors all
+     warranties and conditions, express and implied, including
+     warranties or conditions of title and non-infringement, and
+     implied warranties or conditions of merchantability and fitness
+     for a particular purpose;
+
+     ii) effectively excludes on behalf of all other Contributors all
+     liability for damages, including direct, indirect, special,
+     incidental and consequential damages, such as lost profits;
+
+     iii) does not attempt to limit or alter the recipients' rights
+     in the Source Code under section 3.2; and
+
+     iv) requires any subsequent distribution of the Program by any
+     party to be under a license that satisfies the requirements
+     of this section 3.
+
+3.2 When the Program is Distributed as Source Code:
+
+  a) it must be made available under this Agreement, or if the
+  Program (i) is combined with other material in a separate file or
+  files made available under a Secondary License, and (ii) the initial
+  Contributor attached to the Source Code the notice described in
+  Exhibit A of this Agreement, then the Program may be made available
+  under the terms of such Secondary Licenses, and
+
+  b) a copy of this Agreement must be included with each copy of
+  the Program.
+
+3.3 Contributors may not remove or alter any copyright, patent,
+trademark, attribution notices, disclaimers of warranty, or limitations
+of liability ("notices") contained within the Program from any copy of
+the Program which they Distribute, provided that Contributors may add
+their own appropriate notices.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program,
+the Contributor who includes the Program in a commercial product
+offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes
+the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and indemnify every
+other Contributor ("Indemnified Contributor") against any losses,
+damages and costs (collectively "Losses") arising from claims, lawsuits
+and other legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the Program
+in a commercial product offering. The obligations in this section do not
+apply to any claims or Losses relating to any actual or alleged
+intellectual property infringement. In order to qualify, an Indemnified
+Contributor must: a) promptly notify the Commercial Contributor in
+writing of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense and any
+related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those performance
+claims and warranties, and if a court requires any other Contributor to
+pay any damages as a result, the Commercial Contributor must pay
+those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
+BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
+TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+PURPOSE. Each Recipient is solely responsible for determining the
+appropriateness of using and distributing the Program and assumes all
+risks associated with its exercise of rights under this Agreement,
+including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs
+or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
+SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further
+action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other software
+or hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of
+time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use
+and distribution of the Program as soon as reasonably practicable.
+However, Recipient's obligations under this Agreement and any licenses
+granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and
+may only be modified in the following manner. The Agreement Steward
+reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement
+Steward has the right to modify this Agreement. The Eclipse Foundation
+is the initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+Distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is published,
+Contributor may elect to Distribute the Program (including its
+Contributions) under the new version.
+
+Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
+receives no rights or licenses to the intellectual property of any
+Contributor under this Agreement, whether expressly, by implication,
+estoppel or otherwise. All rights in the Program not expressly granted
+under this Agreement are reserved. Nothing in this Agreement is intended
+to be enforceable by any entity that is not a Contributor or Recipient.
+No third-party beneficiary rights are created under this Agreement.
+
+Exhibit A - Form of Secondary Licenses Notice
+
+"This Source Code may also be made available under the following
+Secondary Licenses when the conditions for such availability set forth
+in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
+version(s), and exceptions or additional permissions here}."
+
+  Simply including a copy of this Agreement, including this Exhibit A
+  is not sufficient to license the Source Code under Secondary Licenses.
+
+  If it is not possible or desirable to put the notice in a particular
+  file, then You may include the notice in a location (such as a LICENSE
+  file in a relevant directory) where a recipient would be likely to
+  look for such a notice.
+
+  You may add additional accurate notices of copyright ownership.
diff --git a/org.eclipse.mdm.nucleus/NOTICE.txt b/org.eclipse.mdm.nucleus/NOTICE.txt
new file mode 100644
index 0000000..c43053d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/NOTICE.txt
@@ -0,0 +1,381 @@
+# Notices for Eclipse MDM|BL
+
+This content is produced and maintained by the Eclipse MDM|BL project,
+it is a project of the openMDM(R) Eclipse Working Group.
+
+* Project home: https://projects.eclipse.org/projects/technology.mdmbl
+
+## Trademarks
+
+Eclipse MDM|BL, MDM|BL and Eclipse openMDM(R) logo are registered trademarks
+of the Eclipse Foundation.
+
+## Copyright
+
+All content is the property of the following respective authors or their employers.
+For more information regarding authorship of content, please consult the listed
+source code repository logs.
+
+Copyright (c) 2016-2019 Gigatronik Ingolstadt GmbH
+Copyright (c) 2016-2020 Peak Solution GmbH
+Copyright (c) 2017-2020 science + computing AG Tuebingen (ATOS SE)
+Copyright (c) 2017-2018 Canoo Engineering AG
+Copyright (c) 2017-2020 Angelika Wittek
+Copyright (c) 2018-2019 Elektronische Fahrwerksysteme GMBH
+Copyright (c) 2018-2020 Karakun AG
+Copyright (c) 2018-2020 Alexander Nehmer
+
+## Declared Project Licenses
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v. 2.0 which is available at
+http://www.eclipse.org/legal/epl-2.0.
+
+SPDX-License-Identifier: EPL-2.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.
+
+## Third-party Content
+
+The Content includes items that have been sourced from third parties as set out below.
+If you did not receive this Content directly from the Eclipse Foundation, the following
+is provided for informational purposes only, and you should look to
+the Redistributor's license for terms and conditions of use.
+
+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.8.1.jar (3.8.1)
+    * License: Apache License, 2.0
+
+commons-text-1.6.jar (1.6)
+    * License: Apache License, 2.0
+
+gson-2.7.jar (2.7)
+    * License: Apache License, 2.0
+
+Google Guava Version: 25.0-jre  (25.0)
+    * License: Apache License, 2.0
+
+Gradle Wrapper (4.10.2)
+    * License: Apache License, 2.0
+
+hk2-api-2.5.0-b05.jar (2.5.0-b05)
+    * License: CDDL-1.1
+
+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: Apache 2.0
+
+jcl-over-slf4j-1.7.25.jar(1.7.25)
+    * License: MIT License
+    * Licence Path: https://www.slf4j.org/license.html
+    * Project URL:  https://www.slf4j.org
+    * Source URL:   https://github.com/qos-ch/slf4j
+
+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-media-multipart-2.23.2.jar (2.23.2)
+    * License: CDDL
+
+jersey-server-2.23.2.jar (2.23.2)
+    * License: Apache-2.0
+
+log4j-over-slf4j-1.7.25.jar (1.7.25)
+    * License: 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
+
+mimepull-1.9.6.jar (1.9.4)
+    * License: CDDL
+
+openatfx-0.7.4.jar (0.7.4)
+    * License: Apache-2.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
+
+swagger-annotations-2.0.8.jar (2.0.8)
+    * License: Apache-2.0
+
+swagger-ui-3.23.0.jar (3.23.0)
+    * License: Apache-2.0
+
+slf4j-api-1.7.25.jar  (1.7.25)
+    * License: MIT license
+    * Licence Path: https://www.slf4j.org/license.html
+    * Project URL: https://github.com/qos-ch/slf4j
+    * Source URL:  https://github.com/qos-ch/slf4j/releases/tag/v_1.7.25
+
+stax2-api-3.1.4.jar (3.1.4)
+    * License: BSD-2-Clause
+
+validation-api-1.1.0.Final.jar (1.1.0.Final)
+  * License: Apache License, 2.0
+
+vavr-0.9.1-sources.jar (0.9.1)
+  * License: Apache License, 2.0
+
+vavr-match-0.9.1.jar (0.9.1)
+  * License: Apache License, 2.0
+
+woodstox-core-asl-4.4.1.jar (4.4.1)
+  * License: Apache License, 2.0
+
+
+FFAMFAMFAM Silk Icon, Version 1.3
+    * License: Creative Commons Attribution 3.0 License
+    * Licence Path: https://creativecommons.org/licenses/by/3.0/
+    * Project: http://www.famfamfam.com/lab/icons/silk/
+    * Source:  http://www.famfamfam.com/lab/icons/silk/
+
+@angular/animations:7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io/api/animations
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/cdk:7.1.1
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io/api
+    * Source:  https://github.com/angular/angular/releases/tag/7.1.1
+
+
+@angular/common@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io/api/common
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4r
+
+@angular/compiler@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/core@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/forms@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/http@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/platform-browser-dynamic@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/platform-browser@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/router@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+bootstrap@4.1.3
+    * License: MIT
+    * Licence Path: https://github.com/twbs/bootstrap/raw/master/LICENSE
+    * Project: https://getbootstrap.com/
+    * Source:  https://github.com/twbs/bootstrap
+
+class-transformer@0.1.6
+    * License: MIT
+    * Licence Path: https://github.com/typestack/class-transformer/blob/master/LICENSE
+    * Project: https://github.com/pleerock/class-transformer
+    * Source:  https://github.com/pleerock/class-transformer
+
+core-js@2.6.0
+    * License: MIT
+    * Licence Path: https://github.com/zloirock/core-js/raw/master/LICENSE
+    * Project: https://github.com/zloirock/core-js
+    * Source:  https://github.com/zloirock/core-js/releases/tag/v2.6.0
+
+file-saver@1.3.3
+    * License: MIT
+    * Licence Path: https://github.com/eligrey/FileSaver.js/raw/master/LICENSE.md
+    * Project: https://github.com/eligrey/FileSaver.js
+    * Source:  https://github.com/eligrey/FileSaver.js
+
+font-awesome@4.7.0
+    * License: MIT
+    * Licence Path: https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt
+    * Project: https://fontawesome.com/
+    * Source:  https://github.com/FortAwesome/Font-Awesome
+
+ng2-split-pane@1.3.1
+    * License: MIT
+    * Licence Path: https://github.com/wannabegeek/ng2-split-pane/raw/master/LICENSE
+    * Project: https://github.com/wannabegeek/ng2-split-pane
+    * Source:  https://github.com/wannabegeek/ng2-split-pane
+
+ngx-bootstrap@3.1.2
+    * License: MIT
+    * Licence Path: https://github.com/valor-software/ngx-bootstrap/blob/v3.1.2/LICENSE
+    * Project: https://valor-software.com/ngx-bootstrap
+    * Source:  https://github.com/valor-software/ngx-bootstrap/tree/v3.1.2
+
+@ngx-translate/core@11.0.1
+    * License: MIT 
+    * Licence Path:   https://github.com/ngx-translate/core/blob/v11.0.1/LICENSE  
+    * Project URL:    http://www.ngx-translate.com/
+    * Source URL:     https://github.com/ngx-translate/core
+
+@ngx-translate/http-loader@4.0.0
+    * License: MIT 
+    * Licence Path:   https://github.com/ngx-translate/http-loader/blob/v4.0.0/LICENSE  
+    * Project URL:    http://www.ngx-translate.com/
+    * Source URL:     https://github.com/ngx-translate/http-loader/tree/v4.0.0
+
+primeicons:1.0.0
+    * License: MIT
+    * Licence Path: https://github.com/primefaces/primeicons/blob/1.0.0/LICENSE
+    * Project: https://www.primefaces.org/primeng
+    * Source:  https://github.com/primefaces/primeicons/tree/1.0.0
+
+primeng@7.0.1
+    * License: MIT
+    * Licence Path: https://github.com/primefaces/primeng/blob/7.0.1/LICENSE.md
+    * Project: https://www.primefaces.org/primeng
+    * Source:  https://github.com/primefaces/primeng/tree/7.0.1
+
+rxjs@6.3.3
+    * License: Apache-2.0
+    * Project: https://rxjs-dev.firebaseapp.com/
+    * Source:  https://github.com/ReactiveX/rxjs/tree/6.3.3
+
+rxjs-compat:6.3.3
+    * License: Apache-2.0
+    * Project: https://rxjs-dev.firebaseapp.com/
+    * Source:  https://github.com/ReactiveX/rxjs/tree/6.3.3/compat
+
+tslib@1.9.0
+    * License: Apache-2.0
+    * Project: https://github.com/Microsoft/tslib
+    * Source:  https://github.com/Microsoft/tslib/tree/1.9.0
+
+zone.js@0.8.26
+    * License: MIT
+    * Licence Path: https://github.com/angular/zone.js/raw/master/LICENSE
+    * Project: https://github.com/angular
+    * Source:  https://github.com/angular/zone.js/releases/tag/v0.8.26
+
+OMG Event Service Specification (1.2)
+
+* License: LicenseRef - Object-Management-Group-License
+* Project: https://www.omg.org/spec/EVNT/1.2/
+* Source: https://www.omg.org/spec/EVNT/1.2/pdf
+
+OMG Notification Service Specification (1.1)
+
+* License: LicenseRef - Object-Management-Group-License
+* Project: https://www.omg.org/spec/NOT/
+* Source: https://www.omg.org/spec/NOT/1.1/PDF
+
+ods530.idl
+Date: Hoehenkirchen, 06/01/2016
+"The ASAM Board of Directors releases the IDL files for use under the EPL to the Eclipse IWG openMDM.
+This is valid for all versions of ASAM ODS 5.3.x.
+This permission is valid under the conditions of Eclipse will not modify the file."
+
+AvalonEvent.idl, CorbaFileServer.idl
+Date: 08/15/2016
+"Herewith, we release the generated Client-Source-Code generated from our CORBA IDLs, namely
+* CORBANotification Service (generated from „AvalonEvent.idl”)
+* CORBAFileServer (generated from „CorbaFileServer.idl“),
+Under the Eclipse Public License (EPL). This agreement does not include the „AvalonEvent.idl“ and
+„CorbaFileServer.idl“ itself, which remain protected property of HighQSoft. "
+
+## 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/org.eclipse.mdm.nucleus/README.md b/org.eclipse.mdm.nucleus/README.md
new file mode 100644
index 0000000..773f612
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/README.md
@@ -0,0 +1,604 @@
+## Documentation
+
+Before you start, please take a look at the [Getting Started Guide](https://git.eclipse.org/c/mdmbl/org.eclipse.mdm.nucleus.git/plain/doc/GettingStarted_mdmbl.pdf) which can also be found in the [Download area](https://projects.eclipse.org/projects/technology.mdmbl/downloads) of the project and in the `docs` directory relative to this README.md
+
+## Minimum requirements
+* JDK 1.8.0_45
+
+> This project uses a Gradle Wrapper
+
+## Build dependencies
+Before you can build and deploy the application, you have to checkout the following repositories in the same root directory as the current project
+* `git clone https://git.eclipse.org/r/mdmbl/org.eclipse.mdm.api.base.git`
+* `git clone https://git.eclipse.org/r/mdmbl/org.eclipse.mdm.api.default.git`
+* `git clone https://git.eclipse.org/r/mdmbl/org.eclipse.mdm.api.odsadapter.git`
+
+You **MUST** have the following directory structure afterwards
+
+```
+.
+├── org.eclipse.mdm.api.base
+├── org.eclipse.mdm.api.default
+├── org.eclipse.mdm.api.odsadapter
+└── org.eclipse.mdm.nucleus
+```
+
+Now you can use `gradlew install` in the `org.eclipse.mdm.nucleus` directory, but you should configure the application first.
+
+## Build, deploy and configure the application
+
+1. Edit the `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/property.service.ts` and set the `data_host` variable according to your deployment  
+ (This property will be used to create the REST URLs to communicate with the backend).
+ 
+2. Build the application with `gradlew install`.  
+ The command `gradlew install` executed at `org.eclipse.mdm.nucleus` creates a ZIP archive named `build/distributions/openMDM_application-${version}.zip` at `org.eclipse.mdm.nucleus/build/distributions`  
+ The ZIP archive contains the backend `org.eclipse.mdm.nucleus-${version}.war` and the configuration files in the `configuration` directory
+  
+3. Check that the database for the preference service is running, otherwise start it with `asadmin start-database` as described in the Getting Started Guide.
+
+4. Deploy the WAR file `org.eclipse.mdm.nucleuss-${version}.war` on your application server. Make sure to deploy the WAR file with application name `org.eclipse.mdm.nucleus`, otherwise the `LoginRealmModule` is not able to lookup the `ConnectorService` EJB.  
+ Additionally in the following examples, we assume that the context root is also set to `org.eclipse.mdm.nucleus`.  
+ When deploying from command line you can use `asadmin deploy --name org.eclipse.mdm.nucleus /path/to/org.eclipse.mdm.nucleus-${version}.war`
+ 
+5. Copy the content of the extracted `configuration` folder to `GLASSFISH_ROOT/glassfish/domains/domain1/config`.  
+ There is also a system property `org.eclipse.mdm.configPath`, which can be used to redefine the location of the folder to another location.
+ 
+6. Edit the `org.eclipse.mdm.connector/service.xml` file to configure the data sources
+
+7. Configure a `LoginModule` with name `MDMRealm` (See section **Configure LoginModule** for details)
+
+8. Restart the application server
+
+9. Visit the main page of the client to make sure everything works fine.  
+ The main page of the client should be available under `http://SERVER:PORT/{APPLICATIONROOT}` (eg: http://localhost:8080/org.eclipse.mdm.nucleus)
+
+## Configure LoginModule
+
+MDM 5 backend implements the delegated approach to roles and permissions, wherein the data sources (ASAM ODS server, PAK cloud)
+themselves can implement their own security scheme (which they already have) and then delegates the appropriate
+user data to the backends.
+
+In the case of ASAM ODS servers this is done using a technical user and the `for_user` attribute on the established
+connection, so it is a form of 'login on behalf'.
+
+In the case of PAK Cloud this is done by passing the user name along with a http header `X-Remote-User` which is then
+used by PAK Cloud to establish the users roles (from an internal database or an external authentication provider).
+
+Before the user is 'logged in on behalf' he is authenticated by a `LoginModule` within the Glassfish application server.
+There are different implementations available (e.g. LDAP, Certificate, JDBC, ...). To keep this guide simple, we will setup
+a `FileRealm`, which stores the user information in a flat file.
+
+The following command will create a `FileRealm` with name `MDMRealm` that stores the users in a file called `mdm-keyfile`
+```
+asadmin create-auth-realm --classname com.sun.enterprise.security.auth.realm.file.FileRealm --property file=${com.sun.aas.instanceRoot}/config/mdm-keyfile:jaas-context=MDMRealm:assign-groups=Guest MDMRealm
+```
+
+To be able to login you need to explicitly add users to the `MDMRealm`. 
+Here we add the user `MdmUser`
+```
+asadmin create-file-user --authrealmname MDMRealm --groups Admin:DescriptiveDataAuthor:Guest MdmUser
+```
+
+Currently three roles are supported by openMDM, adapt the users according to your needs
+* **Admin**: Administrator role allowed to access the Administration section in the web application
+* **DescriptiveDataAuthor**: Users allowed to edit context data
+* **Guest**: Default application users allowed to browse and read measurement data
+
+Keep in mind that the roles are mainly used to enable/disable certain actions in the web application.
+Authorization in openMDM is still done via the delegation approach, e.g. the adapters are responsible for handling authorization on data.
+
+Next you need to add the following snippet to your `login.conf` in `${com.sun.aas.instanceRoot}/config/`
+```
+MDMRealm {
+  com.sun.enterprise.security.auth.login.FileLoginModule required;
+};
+```
+
+As a last step you have to provide the credentials of the technical user in adapter configuration in `service.xml`. 
+For the ODS adapter you have to specify the parameters `user` and `password` of the technical user. For example
+```
+<service entityManagerFactoryClass="org.eclipse.mdm.api.odsadapter.ODSContextFactory">
+    ...
+	<param name="user">sa</param>
+	<param name="password">sa</param>
+	...
+</service>
+```
+
+Make sure to restart Glassfish afterwards.
+
+### Remove MDMLoginRealm from previous versions
+
+In versions 5.0.0M1, 0.10 and older the configuration of a custom login realm was necessary. If you configured your Glassfish server instance
+for one of these versions, you can remove the old configuration options and artifact, as they are no longer needed.
+
+#### Steps to delete the old configuration and artifacts
+
+* Delete the JAR file `org.eclipse.mdm.realm.login.glassfish-VERSION.jar` from `GLASSFISH_ROOT/glassfish/domains/domain1/lib`  
+* Open the Glassfish login **configuration file** at `GLASSFISH_ROOT/glassfish/domains/domain1/config/login.conf`
+* Delete custom MDM realm module entry to this config file  
+  ```   
+  MDMLoginRealm {
+    org.eclipse.mdm.realm.login.glassfish.LoginRealmModule required;
+  };
+  ```
+* Remove the `MDMLoginRealm` by executing `asadmin delete-auth-realm MDMLoginRealm` or by deleting it in the Glassfish web console  
+
+## Configure logging
+
+MDM 5 uses SLF4J and Logback for logging. The default configuration file can be found at `org.eclipse.mdm.nucleus/src/main/resources/logback.xml`.
+It logs INFO level messages to `mdm5.log` in the **logs** folder of the Glassfish domain.
+If you want to customize logging, you can either edit the file within the WAR file or preferably provide your own logging configuration via system parameter in the JVM settings in Glassfish `-Dlogback.configurationFile=/path/to/config.xml`
+
+## Available REST URLs
+
+Please use the generated OpenAPI Specification, which is generated at build time.
+The OpenAPI Specification is available in `org.eclipse.mdm.nucleus/build/openapi/openapi.json` or at runtime at `http://{SERVER}:{PORT}/{APPLICATIONROOT}/openapi.json`.
+Furthermore a Swagger UI is available at `http://{SERVER}:{PORT}/{APPLICATIONROOT}/swagger.html`
+
+### Structure of the URLs
+
+* `SERVER` the hostname of the Glassfish server
+* `PORT` the port of the Glassfish server
+* `APPLICATIONROOT` is the context root under which MDM is deployed
+* `SOURCENAME` is the source name the underlying data source
+
+#### Environment
+
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments`
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}`
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/localizations`
+
+#### Business objects
+
+The following parameters are recurring throughout the different URLs
+
+* `ID` the identifier of the business object
+
+* `CONTEXTTYPE` is one of
+  * `unitundertest`
+  * `testsequence`
+  * `testequipment`
+  
+* `DATATYPE` is one of
+  * `STRING`
+  * `STRING_SEQUENCE`
+  * `DATE, DATE_SEQUENCE`
+  * `BOOLEAN`
+  * `BOOLEAN_SEQUENCE`
+  * `BYTE`
+  * `BYTE_SEQUENCE`
+  * `SHORT`
+  * `SHORT_SEQUENCE`
+  * `INTEGER`
+  * `INTEGER_SEQUENCE`
+  * `LONG`
+  * `LONG_SEQUENCE`
+  * `FLOAT`
+  * `FLOAT_SEQUENCE`
+  * `DOUBLE`
+  * `DOUBLE_SEQUENCE`
+  * `BYTE_STREAM`
+  * `BYTE_STREAM_SEQUENCE`
+  * `FLOAT_COMPLEX`
+  * `FLOAT_COMPLEX_SEQUENCE`
+  * `DOUBLE_COMPLEX`
+  * `DOUBLE_COMPLEX_SEQUENCE`
+  * `FILE_LINK`
+  * `FILE_LINK_SEQUENCE`
+   
+* `FILTERSTRING` is a String defining a filter. For example `Test.Name eq "t*"` filters for all tests which names begin with `t`.  
+ Strings should be quoted with `"`. `"` characters within strings have to be escaped with a backslash. For backward compatibility `'` is also allowed to quote strings, but may be blocked in URLs in some environments, thus `"` should be preferred.
+ 
+* `REMOTE_PATH` is the remote path of a file link as it is returned in the attributes of type `FILE_LINK` and `FILE_LINK_SEQUENCE`  
+ Make sure to properly URL escape the value of the remote path. Especially slashes have to be escaped with `%2F`.
+ 
+##### Examples
+
+Most of the Business objects support the following calls (examples for **TestStep**)
+
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/teststeps?filter={FILTERSTRING}`
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/teststeps/searchattributes`
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/teststeps/localizations`
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/teststeps/{ID}`
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/teststeps/{ID}/contexts/{CONTEXTTYPE}`
+
+For **TestStep** and **Measurement** it is also possible to receive files
+
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/teststeps/{ID}/files/{REMOTE_PATH}`
+
+
+#### Query endpoint
+
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/query`   
+ Example: `curl -POST -H "Content-Type: application/json" -d '{"resultType": "test", "columns": ["Test.Name", "TestStep.Name"], "filters": { "sourceName": "SOURCENAME", "filter": "Test.Id gt 1", "searchString": ""}}'http://sa:sa@localhost:8080/org.eclipse.mdm.nucleus/mdm/query`
+ 
+* `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/suggestions`  
+ Example: `curl -POST -H "Content-Type: application/json" -d '{"sourceNames": ["SOURCENAME"], "type": "Test", "attrName": "Name"}' http://sa:sa@localhost:8080/org.eclipse.mdm.nucleus/mdm/suggestions`
+
+#### ATFX Import
+
+POST: `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/import`
+
+Imports an ATFX file into the specified environment. The ATFX file must conform to the MDM 5 data model.
+
+> TODO Templates
+
+Three content types are accepted
+* `application/xml`: The ATFX file is sent in the body of the POST request.
+
+* `multipart/form-data`: The ATFX file and its binary files are provided as multipart form data. The field name represents the original file name and the field value the contents of the file.  
+ The ATFX file is detected by its file extension 'atfx' or the media type 'application/xml'. Only one ATFX file can be sent at a time.
+
+* `application/zip`: The ATFX file and its component files are provided as a zip file. The ATFX file is detected by its file extension 'atfx'. Only one ATFX file can be included in the zip file.
+
+The POST request returns a JSON-Object with the following properties
+* state: Status of the import. Either `OK` or `FAILED`.
+* message: Error message in case the import fails.
+* stacktrace: Stacktrace in case the import fails.
+
+The returned HTTP status is either `200`, if the imported succeeded or `400`, if the import failed. 
+
+
+#### ATFX Export
+
+POST: `http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/export`
+
+Accepts a shopping basket XML file and exports the contained elements into an ATFX file. 
+Currently it is only supported to export objects from one environment. 
+
+Returned content types in response:
+* `application/xml`: The response body contains the exported ATFX file
+
+* `application/zip`: The response contains a zip file with the exported ATFX file and accompanying component files.
+
+### Example: File download
+
+* Login  
+ `curl -XPOST --cookie-jar cookie -H "Content-Type: application/x-www-form-urlencoded" -d j_username=sa -d j_password=sa http://localhost:8080/org.eclipse.mdm.nucleus/j_security_check`
+
+* Request a test and extract the remotePath from the first file reference  
+ `FILE_PATH="$(curl --cookie cookie -s http://localhost:8080/org.eclipse.mdm.nucleus/mdm/environments/MDMNVH/teststeps/10 | jq -r '.data[0].attributes[] | select (.name | contains("MDMLinks")) | .value[0].remotePath')"`
+
+* Urlescape remotePath if necessary  
+ `FILE_PATH="$(echo $FILE_PATH | python -c 'import sys,urllib;print urllib.quote(sys.stdin.read().strip(), "")')"`
+
+* Request the file content  
+ `curl --cookie cookie http://localhost:8080/org.eclipse.mdm.nucleus/mdm/environments/MDMNVH/teststeps/10/files/$FILE_PATH`
+
+
+## Preference Service
+Preference service stores its data to a relational database. The database connection is looked up by JNDI and the JNDI name and other database relevant parameters are specified in `src/main/resources/META-INF/persistence.xml`. The default JNDI name for the JDBC resource is set to `jdbc/openMDM`. This JDBC resource and its dependent JDBC Connection Pool has to be created and configured within the Glassfish web administration console or through `asadmin` command line tool.
+
+Furthermore the schema has to be created in the configured database. Therefore database DDL scripts are available for PostgreSQL and Apache Derby databases in the folder `schema/org.eclipse.mdm.preferences` of the distribution.
+Other databases supported by EclipseLink may also work, but is up to the user to adapt the DDL scripts.
+
+### Examples
+* Receive values  
+ `curl -GET -H "Content-Type: application/json" http://localhost:8080/org.eclipse.mdm.nucleus/mdm/preferences?scope=SYSTEM&key=ignoredAttributes`
+ 
+* Set value  
+ `curl -PUT -H "Content-Type: application/json" -d '{"scope": "SYSTEM", "key": "ignoredAttributes", "value": "[\"*.MimeType\"]"}' http://localhost:8080/org.eclipse.mdm.nucleus/mdm/preferences`
+ 
+* Delete entry  
+ `curl -DELETE http://localhost:8080/org.eclipse.mdm.nucleus/mdm/preferences/ID`
+
+
+## FreeTextSearch
+### Configuration
+1. Start ElasticSearch. ElasticSearch can be downloaded at https://www.elastic.co/products/elasticsearch. The minimum supported Elasticsearch version is 7. For testing purpose, it can be simply started by executing `bin/run.sh`
+
+2. Edit the configuration (`global.properties`) to fit your environment. You need an ODS Server which supports Notifications. All fields have to be there, but can be empty. However certain ODS Servers ignore some parameters (e.g. PeakODS ignores pollingIntervall since it pushes notifications).
+
+3. Start the application. At the first run it will index the database. This might take a while. After that MDM registers itself as `NotificationListener` and adapts all changes one-by-one.
+
+### Run on dedicated server
+
+The Indexing is completely independent from the searching. So the Indexer can be freely deployed at any other machine.
+In the simplest case, the same steps as in Configuration have to be done.
+The application can then be deployed on any other machine. All components besides the FreeTextIndexer and its dependencies are not user. Those can be left out, if desired.
+
+## Connector and service.xml
+
+The `service.xml` contains all information necessary for the Connector-Service to connect to the available datasources/adapter instances.
+Since this information includes secret information like passwords, it is possible to provide lookups, which gives you the possibility to specify tokens as references to properties defined elsewhere.
+
+There are different lookups available
+* `sys`: Looks up variables defined as system properties
+* `env`: Looks up variables defined as environment variables
+
+Example:
+
+`<param name="password">${env:odsPassword}</param>`
+
+
+## Known issues
+
+If you run into `java.lang.ClassNotFoundException: javax.xml.parsers.ParserConfigurationException not found by org.eclipse.persistence.moxy` this is a bug described in https://bugs.eclipse.org/bugs/show_bug.cgi?id=463169 and https://java.net/jira/browse/GLASSFISH-21440.
+This solution is to replace `GLASSFISH_HOME/glassfish/modules/org.eclipse.persistence.moxy.jar` with this file http://central.maven.org/maven2/org/eclipse/persistence/org.eclipse.persistence.moxy/2.6.1/org.eclipse.persistence.moxy-2.6.1.jar
+
+If you run into `java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider` you have to download http://central.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.5.1/jackson-module-jaxb-annotations-2.5.1.jar and put in the `GLASSFISH_HOME/glassfish/domains/domain1/autodeploy/bundles` folder
+
+## Client preferences
+
+The applications preferences are managed in the administration section. This section can be accessed via the **Administration** button in the main navigation bar or via http://localhost:8080/org.eclipse.mdm.nucleus/administration
+
+A preference is a pair of a unique key and a value. The key is composed of a prefix defining the purpose of the preference followed by an arbitrary but unique identifier string.
+It is recommended to choose the identifier the same as the preferences `name` field, in case there is one. The value holds the preference's data in a JSON string.
+
+The following preferences, sorted by their scope, can be set
+
+* User
+  - Basket
+  - View
+  - Filter
+
+* System
+  - Node provider
+  - Shopping basket file extensions
+
+* Source
+  - Ignored attributes
+
+However, it might be necessary to reload the application before a newly defined preference is available or any changes on an existing preferences are applied.
+
+**WARNING**: Corrupted preferences can result in malfunctions of the application.
+
+### User scope
+
+A user scoped preference's area of effect is limited to the logged in user. All user scoped preferences can also be set in dialogs in the main application.
+
+1. Basket  
+ Basket preferences keys must start with the prefix `basket.nodes.`  
+ This preference has the fields `items` and `name` and holds all the information for saved baskets.  
+   * The field `items` holds an array of MDMItems, providing the relevant information of a related node, i.e. `source`, `type` and `id`.  
+   * The field `name` defines the name, which is provided in the main application to load this basket.
+   
+   Example  
+   ```
+   {
+     "items": [{"source":"MDMNVH","type":"Test","id":38}],
+     "name": "basketExample"
+   }
+   ```
+
+2. View  
+  View preferences keys must start with the prefix `tableview.view.`  
+  This preference has the fields `columns` and `name` and holds the layout information for the tables displaying the search results and the basket nodes.  
+    * The field `columns` holds an array of ViewColumn objects. A ViewColumn is an Object with the fields `type`, `name`, `sortOrder` and an optional field `style`.  
+    * The field `type` can be set to all available MDM data types, i.e. `Project`, `Pool`, `Test`, `TestStep`, `Measurement`, `ChannelGroup`, `Channel`.  
+    * The field `name` field specifies an attribute, which must be an searchable attribute for the given `type`.  
+    * The field `sortOrder` can be set by the number `1` (ascending), `-1` (descending), or null (unsorted). Only one column of the array can have a non-null value `sortOrder` at a time. The ViewColumn's style element can hold any CSS-style object. However, it is supposed to contain only the columns width. The column order in the array is identically with the appearance in the table.  
+    * The field `name` defines the name, which is provided in the main application to load this view.    
+
+    Example
+    ```
+    {
+     "columns": [
+       {
+         "type": "Test",
+         "name": "Id",
+         "style": {"width":"75px"},
+         "sortOrder": null
+       }
+     ],
+     "name": "viewExample" 
+    }
+    ```
+
+3. Filter  
+  Filter preferences keys must start with the prefix `filter.nodes.`  
+  This preference has the fields `conditions`, `name`, `environments`, `resultType` and `fulltextQuery`.  
+  It provides the information for the attribute based / advanced search.  
+    * The field `conditions` holds an array of Condition objects. A Condition specifies a search condition for attribute based search. It consists of the fields `type`, `name`, `operator`, `value` and `valueType`. The Condition's `type` can be set to all available MDM data types, i.e. `Project`, `Pool`, `Test`, `TestStep`, `Measurement`, `ChannelGroup`, `Channel`.
+      * The Condition's `name` field specifies an attribute, which must be an searchable attribute for the given `type`.  
+      * The Condition's `operator` field, holds on of the following numbers: `0`(=), `1`(<), `2`(>), `3`(like).
+      * The Condition's `value` field holds a string array containing input for the attribute based search.
+      * The Condition's `resultType` field should match the type corresponding to the attribute specified in the `'name` filed, e.g. `string`, `date` or `long`.
+    * The field `name` defines the name, which is provided in the main application to load this filter.
+    * The field `environments` holds an string array with the names of the sources that should be included in the search.
+    * The field `resultType` can be set to all available MDM data types (see above). Only nodes of this type will be included in the search.
+    * The field `fulltextQuery` holds a string containing full text search input.  
+  
+    Example
+    ```
+    { "conditions": [
+        {
+          "type": "Test",
+          "attribute": "Name",
+          "operator": 0,
+          "value": [],
+          "valueType":"string"
+        }
+      ],
+      "name": "filterExample",
+      "environments": ["sourceName"],
+      "resultType": "Test",
+      "fulltextQuery": ""
+    }
+    ```
+
+
+### System scope
+
+System scoped preference are applied globally.
+
+* Node provider  
+  The navigation tree structure can be defined via a node provider. The default node provider is set in `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/defaultnodeprovider.json`.  
+  It is recommended not to change the default node provider. Instead new node providers can be added as preferences.  
+  Their keys must start with the prefix `nodeprovider.`. Once a custom node provider is supplied it can be selected in the dropdown menu in the navigation tree header.  
+  
+  * Structure
+
+     * First layer/root nodes  
+      In the node provider each layer of nodes of the navigation tree is defined in a nested object.  
+      The first layer of nodes, is always the environment level. This is necessary due to the provided endpoints.  
+      The first layer consists of the fields `name`, `type`, and `children`.  
+       * The field `name` sets the name, which is displayed in the application to select the corresponding node provider.  
+       * The field `type` defines the data type of the nodes, which is always `Environments` on the first layer.
+         
+       The next layer of nodes are defined via the field `children`.
+
+     * Children  
+      A child object consists of the fields `type`, `query`, and `children`.  
+       * The field `type` sets the data type of this layer of nodes. It can be set to all available MDM data types, i.e. `Project`, `Pool`, `Test`, `TestStep`, `Measurement`, `ChannelGroup`, `Channel`.  
+       * The filed `query` holds the URL to load this layer of nodes. The first part of the query for each child object should be `/` plus the type of the layer in small letters followed by an `s`.  
+         For a nested child objected a filter is attached to the query in the form: `?filter=<parentType>.Id eq {<parentType>.Id}`. The placeholder <parentType> has to be replaced by the actual parent type (set in the field `type` in the parent child or root layer, see example below).  
+         At runtime the curly braces will be replaced by the Id of the parent node. Further child objects, and thereby more sublayers, can be nested via the field `children`.
+           
+       The children field does not need to be set for the last layer of nodes.
+  
+  * Examples
+
+    * Minimal node provider  
+      ```
+      { "name": "My name to display", "type": "Environment"}  
+      ```    
+
+    * Node provider with two child layers  
+      ```
+       {
+          "name": "My name to display",
+          "type": "Environment",
+          "children": {
+            "type": "Project",
+            "query": "/projects",
+            "children": {
+              "type": "Pool",
+              "query": "/pools?filter=Project.Id eq {Project.Id}"
+            }
+          }
+        }
+      ```
+
+* Shopping basket file extensions
+
+  When downloading the contents of a shopping basket, a file with extension `mdm` is generated.  
+  Additional file extensions can be adding by poviding a preference with key `shoppingbasket.fileextensions`.  
+  Here you can define a list of objects with attributes `label` and `extension`.  
+  For example: `[ { "label": "MyTool", "extension": "mdm-mytool" }, { "label": "OtherTool", "extension": "mdm-other" } ]`.  
+  If `MyTool` has a file handler registered for the extension `mdm-mytool`, the application will be launched if the browser automatically opens the file after download.
+
+### Source scope
+
+Source scoped preferences are applied at any user, but are limited to the specified source. The source can be specified in the **Add Preference** or **Edit Preference** dialog.
+
+* Ignored Attributes  
+  The ignore attributes preference must have the exact key `ignoredAttributes`. An identifier must not be added.  
+  The preference specifies all attributes, which are supposed to be ignored in the detail view. The preference is a simple JSON string holding a list of attributes in the form {"<type>.<AttributeName>"}.  
+  The placeholders <type> and <AttributeName> have to be replaced by the actual type and name of the attribute which should be ignored, respectively.
+
+  Example:  
+  `["*.MimeType", "TestStep.Sortindex"]`
+
+## Create a module for the Web application
+
+Any MDM module needs to be a valid [Angular module](https://angular.io/guide/architecture-modules) aka NgModule.  
+A NgModule consists of the module definition, components, services and other files that are in the scope of the module. 
+The component can hold any content. The component must be declared in a module definition to grant accessibility in the rest of the application.  
+All related files should be stored in a new module subfolder in the app folder `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app` (eg. `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/new-module`)
+
+### Example module
+
+An example for a new module can be found at `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module`
+
+### Creating a MDM module
+
+1. Create a new folder eg. `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/new-module`
+
+2. Create an Angular component (eg. `mdm-new.component.ts`) inside that new folder   
+   ```typescript
+    import {Component} from '@angular/core';
+    @Component({template: '<h1>Example Module</h1>'})
+    export class MDMNewComponent {}
+   ```
+   A component is defined in a Typescript file with the `@Component()` decorator.  
+   Any HTML content can be provided here in an inline template or via a link to an external HTML resource. Thereafter the component itself, which is supposed to hold any logic needed, is defined and exported.  
+   For more details see https://angular.io/guide/architecture-components.
+   
+3. Create a minimal NgModule  (eg. `mdm-new.module.ts` ) inside that new folder    
+   ```typescript
+    import { NgModule } from '@angular/core';
+    import { MDMCoreModule } from '../core/mdm-core.module';
+    import { MDMNewComponent } from './mdm-new.component';
+    @NgModule({imports: [MDMCoreModule], declarations: [MDMNewComponent]})
+    export class MDMNewModule {}
+   ```
+   The `imports` array holds all modules from the application needed in this MDM module. It should always hold the `MDMCoreModule`, which provides basic functionalities.  
+   On the other hand a NgModule grants accessibility of components of this module in other directives (including the HTML template) within the module (in a `declaration` array) or even in other parts of the application (in an `export` array).  
+   For more details see https://angular.io/guide/architecture-modules.
+
+### Embedding a module (no lazy loading)
+
+To embed this new module in MDM you have to register this module in the `MDMModules` Module.
+* Import the new module at `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.module.ts`
+
+* Register a route to the new module at `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules-routing.module.ts`  
+  ```
+  { path: 'new', component: MDMNewComponent}
+  ```
+
+ * Furthermore you have to define a display name for the registered route in the `links` array in `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.component.ts`    
+  ```
+  { path: 'new', name: 'New Module' }
+  ```
+
+For further information refer to the Angular documentation:
+* https://angular.io/guide/architecture-components
+* https://angular.io/guide/architecture-modules
+* https://angular.io/guide/router
+
+
+### Lazy loading and routing module
+
+For lazy-loading (recommended in case there is a high number of modules) embedding of the module is slightly different.
+```
+  { path: 'example', loadChildren: '../example-module/mdm-example.module#MDMExampleModule'}
+```
+
+Additionally, a NgModule, the so called routing module (eg. `mdm-new-routing.module.ts`), is needed to provide the routes to this modules components.
+```typescript
+  const moduleRoutes: Routes = [{ path: '', component: MDMExampleComponent }];
+  @NgModule({imports: [RouterModule.forChild(moduleRoutes)], exports: [RouterModule]})
+  export class MDMExampleRoutingModule {}
+```   
+
+### Filerelease module
+The filerelease module is stored in the following folder `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease`
+
+It can be embedded as any other module described above.  
+```
+{ path: 'filerelease', component: MDMFilereleaseComponent }
+```
+
+```
+{ name: 'MDM Files', path: 'filerelease'}
+```
+
+### Adding a module to the detail view (eg. filerelease module)
+To make the filerelease module available in the detail view it needs to be imported in the corresponding MDM Module `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/mdm-detail.module.ts`  
+Thereafter, the `MDMFilereleaseCreateComponent` can be imported to the `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.ts`.  
+Then the following has to be added to the `org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.html` file:
+```
+  <mdm-filerelease-create [node]=selectedNode [disabled]="isReleasable()"></mdm-filerelease-create>
+```
+
+It should be located right after the add to basket button:
+```
+<div class="btn-group pull-right" role="group">
+  <button type="button" class="btn btn-default" (click)="add2Basket()" [disabled]="isShopable()">In den Warenkorb</button>
+  <mdm-filerelease-create [node]=selectedNode [disabled]="isReleasable()"></mdm-filerelease-create>
+</div>
+```
+
+## Copyright and License
+Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+
+ See the NOTICE file(s) distributed with this work for additional  
+ information regarding copyright ownership.
+
+ This program and the accompanying materials are made available under the  
+ terms of the Eclipse Public License v. 2.0 which is available at  
+ http://www.eclipse.org/legal/epl-2.0.  
+
+ SPDX-License-Identifier: EPL-2.0
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/WebContent/META-INF/MANIFEST.MF b/org.eclipse.mdm.nucleus/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0

+Class-Path: 

+

diff --git a/org.eclipse.mdm.nucleus/build.gradle b/org.eclipse.mdm.nucleus/build.gradle
new file mode 100644
index 0000000..49d7fe9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/build.gradle
@@ -0,0 +1,204 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+plugins {
+	id "org.sonarqube" version "2.5"
+	id "io.swagger.core.v3.swagger-gradle-plugin" version "2.0.8"
+}
+
+group = 'org.eclipse.mdm'
+version = '5.2.0M1'
+
+description = 'mdm nucleus'
+apply plugin: 'war'
+apply plugin: 'maven'
+apply plugin: 'eclipse'
+apply plugin: 'jacoco'
+apply plugin: 'org.sonarqube'
+
+sourceCompatibility = 1.8
+
+repositories {
+	mavenLocal()
+	mavenCentral()
+}
+
+subprojects {
+	configurations.all {
+		resolutionStrategy.dependencySubstitution {
+			substitute module("de.rechner:openatfx") with project(":org.eclipse.mdm.openatfx")
+		}
+	}
+	
+	group = rootProject.group
+	version = rootProject.version
+	
+	apply plugin: 'eclipse'
+	apply plugin: 'java'
+	apply plugin: 'maven'
+	apply plugin: 'jacoco'
+
+	sourceCompatibility = 1.8
+
+	repositories {
+		mavenLocal()
+		mavenCentral()
+	}
+
+	dependencies {
+		compileOnly 'org.slf4j:slf4j-api:1.7.25'
+		compileOnly 'javax:javaee-api:7.0'
+		compile 'io.swagger.core.v3:swagger-annotations:2.0.8'
+		runtime 'ch.qos.logback:logback-classic:1.2.3'
+
+		testCompile 'junit:junit:4.12'
+		testCompile 'org.assertj:assertj-core:3.6.2'
+		testCompile 'org.mockito:mockito-core:2.13.0'
+		testCompile 'javax:javaee-api:7.0'
+	}
+	
+	task sourcesJar(type: Jar, dependsOn: classes) {
+		classifier = 'sources'
+		from sourceSets.main.allSource
+	}
+	
+	artifacts {
+		archives sourcesJar
+	}
+}
+
+clean {
+	dependsOn gradle.includedBuilds*.task(':clean')
+}
+
+configurations.runtime {
+	resolutionStrategy.dependencySubstitution {
+		substitute module("de.rechner:openatfx") with project(":org.eclipse.mdm.openatfx")
+	}
+	exclude group: 'com.sun.mail', module: 'javax.mail'
+	exclude group: 'javax.ws.rs', module: 'javax.ws.rs-api'
+	exclude group: 'javax.activation', module: 'activation'
+	exclude group: 'javax.annotation', module: 'javax.annotation-api'
+	exclude group: 'javax.inject', module: 'javax.inject'
+	exclude group: 'org.glassfish.hk2.external', module: 'javax.inject'
+	exclude group: 'commons-logging', module: 'commons-logging'
+	// exclude guava dependencies
+	exclude group: 'com.google.code.findbugs', module: 'jsr305'
+	exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
+	exclude group: 'com.google.j2objc', module: 'j2objc-annotations'
+	exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
+	exclude group: 'org.checkerframework', module: 'checker-compat-qual'
+}
+
+dependencies {
+	runtime project(':org.eclipse.mdm.application')
+	runtime project(':org.eclipse.mdm.apicopy')
+
+	compile 'org.webjars:swagger-ui:3.23.0'
+	// adapters
+	runtime project(':org.eclipse.mdm.api.atfxadapter')
+	runtime "org.eclipse.mdm:org.eclipse.mdm.api.odsadapter:${version}"
+}
+
+
+resolve {
+	outputPath = file('build/openapi')
+	outputFileName = 'openapi'
+	outputFormat = 'JSONANDYAML'
+	prettyPrint = 'TRUE'
+	classpath = sourceSets.main.runtimeClasspath
+	resourcePackages = ['org.eclipse.mdm']
+	openApiFile = file('src/main/openapi/openApiFile.json')
+}
+
+tasks.war.dependsOn("resolve")
+
+task collectConfiguration() {
+	doLast {
+		subprojects.each { subproject ->
+			copy {
+				from "${project.projectDir}/${subproject.name}/src/main/configuration/"
+				into "${project.projectDir}/build/tmp/openmdm_application/configuration/${subproject.name}"
+			}
+		}
+	}
+}
+
+task copySchema(dependsOn: ':org.eclipse.mdm.preferences:generateSchema') {
+	doLast {
+		copy {
+			from "${project.projectDir}/org.eclipse.mdm.preferences/build/generated-schema/"
+			into "${project.projectDir}/build/tmp/openmdm_application/schema/org.eclipse.mdm.preferences"
+		}
+		
+		copy {
+			from "${project.projectDir}/org.eclipse.mdm.preferences/src/main/sql/"
+			into "${project.projectDir}/build/tmp/openmdm_application/schema/update"
+		}
+	}
+}
+
+task distribute(type: Zip) {
+	archiveName = "openMDM_application-${version}.zip"
+
+	from "${project.projectDir}/LICENSE.txt"
+	from "${project.projectDir}/NOTICE.txt"
+	from "${project.projectDir}/CONTRIBUTING.md"
+	from "${project.projectDir}/readme.md"
+	from "${project.projectDir}/release_notes.md"
+
+	from "${project.projectDir}/doc/GettingStarted_mdmbl.pdf"
+	from "${project.projectDir}/doc/Installation Guide for the openMDM5 Application.pdf"
+
+	from "${project.projectDir}/build/tmp/openmdm_application"
+	from "${project.projectDir}/build/libs/"
+}
+distribute.dependsOn(collectConfiguration)
+distribute.dependsOn(copySchema)
+
+war {
+	from ('org.eclipse.mdm.application/build/node/dist') {
+		include('**/*')
+	}
+	from ("${project.projectDir}/build/openapi/") {
+		include('**/*')
+		filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [VERSION: version])
+	}
+	from ("${project.projectDir}/src/main/webapp/") {
+		include('**/*')
+	}
+
+
+	webXml = file('org.eclipse.mdm.application/src/main/webconfig/web.xml')
+	webInf  {from 'org.eclipse.mdm.application/src/main/webconfig/glassfish-web.xml'}
+
+	metaInf { from 'NOTICE.txt' }
+	metaInf { from 'LICENSE.txt' }
+	metaInf { from 'CONTRIBUTING.md' }
+}
+
+war.finalizedBy(distribute)
+
+jacoco {
+	toolVersion = "0.7.6.201602180812"
+	reportsDir = file("${project.buildDir}/jacoco/test.exec")
+}
+
+sonarqube {
+	properties {
+		property "sonar.java.coveragePlugin", "jacoco"
+		property "sonar.jacoco.reportPaths", "${project.buildDir}/jacoco/test.exec"
+	}
+}
+tasks["sonarqube"].dependsOn "org.eclipse.mdm.application:map_tslint"
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/doc/GettingStarted_mdmbl.pdf b/org.eclipse.mdm.nucleus/doc/GettingStarted_mdmbl.pdf
new file mode 100644
index 0000000..e0bc613
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/doc/GettingStarted_mdmbl.pdf
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/eclipse_formatter.xml b/org.eclipse.mdm.nucleus/eclipse_formatter.xml
new file mode 100644
index 0000000..eb0b582
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/eclipse_formatter.xml
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>

+<profiles version="16">

+<profile kind="CodeFormatterProfile" name="openMDM 5 Formatter (Eclipse built-in 2019-3)" version="16">

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>

+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>

+<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>

+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>

+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>

+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>

+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>

+</profile>

+</profiles>

diff --git a/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.jar b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..7a3265e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.properties b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..b82e006
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME

+distributionPath=wrapper/dists

+zipStoreBase=GRADLE_USER_HOME

+zipStorePath=wrapper/dists

+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip

diff --git a/org.eclipse.mdm.nucleus/gradlew b/org.eclipse.mdm.nucleus/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/org.eclipse.mdm.nucleus/gradlew.bat b/org.eclipse.mdm.nucleus/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windows variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/.gitignore
new file mode 100644
index 0000000..49678ad
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/.gitignore
@@ -0,0 +1,17 @@
+# eclipse
+.classpath
+.project
+.settings/
+bin/
+
+# gradle
+.gradle
+build/
+
+# intellij
+.idea/
+out/
+*.ipr
+*.iml
+*.iws
+/bin/
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/build.gradle
new file mode 100644
index 0000000..95dbed0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/build.gradle
@@ -0,0 +1,41 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+description = 'MDM API - ATFXAdapter'
+
+configurations.all {
+	/* openatfx has a dependency on ODS corba interface classses, but we 
+	 * use the classes generated by org.eclipse.mdm.api.odsadapter and 
+	 * thus exclude the dependency from openatfx
+	 */ 
+	exclude group: 'org.asam', module: 'ods'
+}
+
+dependencies {
+	compile 'org.slf4j:slf4j-api:1.7.25'
+	compile project(':org.eclipse.mdm.openatfx')
+
+	// MDM5 API
+	compile "org.eclipse.mdm:org.eclipse.mdm.api.odsadapter:${version}"
+
+	testRuntime 'ch.qos.logback:logback-classic:1.2.3'
+	testCompile 'junit:junit:4.12'
+	testCompile 'org.assertj:assertj-core:3.6.2'
+	testCompile 'org.mockito:mockito-core:2.13.0'
+}
+
+jar {
+	metaInf { from 'NOTICE.txt' }
+	metaInf { from 'LICENSE.txt' }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContext.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContext.java
new file mode 100644
index 0000000..13f000a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContext.java
@@ -0,0 +1,190 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.asam.ods.AoException;
+import org.asam.ods.AoSession;
+import org.asam.ods.ErrorCode;
+import org.asam.ods.SeverityFlag;
+import org.eclipse.mdm.api.atfxadapter.filetransfer.ATFXFileService;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.file.FileService;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.ExtSystemAttribute;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.query.ODSQueryService;
+import org.omg.CORBA.ORB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ATFXContext encapsulates a session to the ASAM ODS CORBA API of openATFX
+ *
+ */
+public class ATFXContext implements ApplicationContext {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(ATFXContext.class);
+
+	private Map<String, String> parameters;
+
+	private ODSModelManager modelManager;
+	private ATFXEntityManager entityManager;
+
+	private File atfxFile;
+
+	private static final String INCLUDE_CATALOG = "includeCatalog";
+
+	/**
+	 * Creates a new ATFX application context.
+	 * 
+	 * @param orb               the CORBA ORB used to connect to the ODS API
+	 * @param aoSession
+	 * @param parameters
+	 * @param atfxFile
+	 * @param extSystemAttrList
+	 * @throws AoException
+	 */
+	public ATFXContext(ORB orb, AoSession aoSession, Map<String, String> parameters,
+			List<ExtSystemAttribute> extSystemAttrList, File atfxFile) throws AoException {
+		this.parameters = parameters;
+
+		boolean includeCatalog = Boolean.valueOf(parameters.getOrDefault(INCLUDE_CATALOG, "false"));
+
+		this.modelManager = new ODSModelManager(orb, aoSession, new ATFXEntityConfigRepositoryLoader(includeCatalog));
+		this.entityManager = new ATFXEntityManager(this, extSystemAttrList);
+		this.atfxFile = atfxFile;
+
+		LOGGER.debug("ATFXContext initialized.");
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Optional<EntityManager> getEntityManager() {
+		return Optional.of(entityManager);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Optional<ModelManager> getModelManager() {
+		return Optional.of(modelManager);
+	}
+
+	@Override
+	public Optional<EntityFactory> getEntityFactory() {
+		try {
+			return Optional.of(new ODSEntityFactory(modelManager, entityManager.loadLoggedOnUser()));
+		} catch (DataAccessException e) {
+			throw new IllegalStateException("Unable to load instance of the logged in user.");
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Optional<QueryService> getQueryService() {
+		return Optional.of(new ODSQueryService(modelManager));
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Map<String, String> getParameters() {
+		return parameters;
+	}
+
+	/**
+	 * @returns the string "atfx"
+	 */
+	@Override
+	public String getAdapterType() {
+		return "atfx";
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void close() {
+		try {
+			modelManager.close();
+		} catch (AoException e) {
+			LOGGER.warn("Unable to close sesssion due to: " + e.reason, e);
+		}
+	}
+
+	/**
+	 * Returns the {@link ATFXModelManager} used for this context.
+	 * 
+	 * @return the {@link ATFXModelManager}
+	 */
+	public ODSModelManager getODSModelManager() {
+		return modelManager;
+	}
+
+	/**
+	 * Returns the {@link AoSession} used for this context.
+	 * 
+	 * @return {@link AoSession} used for this context.
+	 */
+	public AoSession getAoSession() {
+		return modelManager.getAoSession();
+	}
+
+	/**
+	 * Returns the ORB used for this context
+	 * 
+	 * @return ORB used for this context
+	 */
+	public ORB getORB() {
+		return modelManager.getORB();
+	}
+
+	/**
+	 * Returns a new {@link ATFXContext} with a new ODS co-session.
+	 *
+	 * @return The created {@code ODSContext} is returned.
+	 * @throws AoException Thrown on errors.
+	 */
+	public ATFXContext newContext() throws AoException {
+		throw new AoException(ErrorCode.AO_NOT_IMPLEMENTED, SeverityFlag.ERROR, 0,
+				"Method 'createCoSession' not implemented in openATFX");
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.mdm.api.base.BaseApplicationContext#getFileService()
+	 */
+	@Override
+	public Optional<FileService> getFileService() {
+		return Optional.of(new ATFXFileService(this.atfxFile.getParentFile()));
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContextFactory.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContextFactory.java
new file mode 100644
index 0000000..0187ba0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContextFactory.java
@@ -0,0 +1,98 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.asam.ods.AoException;
+import org.asam.ods.AoSession;
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.ApplicationContextFactory;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.ExtSystem;
+import org.eclipse.mdm.api.dflt.model.ExtSystemAttribute;
+import org.omg.CORBA.ORB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Strings;
+
+import de.rechner.openatfx.AoServiceFactory;
+
+public class ATFXContextFactory implements ApplicationContextFactory {
+
+	private static final Logger LOG = LoggerFactory.getLogger(ATFXContextFactory.class);
+
+	private static final ORB orb = ORB.init(new String[] {}, System.getProperties());
+
+	private static final String PROP_EXTSYSTEMNAME = "extSystemName";
+
+	@Override
+	public ApplicationContext connect(Map<String, String> parameters) throws ConnectionException {
+		return initApplicationContext(parameters, null);
+	}
+
+	public ApplicationContext connect(Map<String, String> parameters, ApplicationContext targetContext)
+			throws ConnectionException {
+
+		EntityManager entityManager = targetContext.getEntityManager()
+				.orElseThrow(() -> new ConnectionException("TargetEntity manager not present!"));
+
+		String extSystemName = parameters.get(PROP_EXTSYSTEMNAME);
+
+		List<ExtSystemAttribute> extSystemAttrList = new ArrayList<>();
+
+		if (!Strings.isNullOrEmpty(extSystemName)) {
+			List<ExtSystem> extSystemList = entityManager.loadAll(ExtSystem.class, extSystemName);
+
+			if (extSystemList == null || extSystemList.isEmpty()) {
+				LOG.warn("External system with name '{}' nor found! Try to import file without mapping!",
+						extSystemName);
+			} else if (extSystemList.size() > 1) {
+				throw new ConnectionException(
+						String.format("More than one external system with name '%s' found!", extSystemName));
+			} else {
+				extSystemAttrList = entityManager.loadChildren(extSystemList.get(0), ExtSystemAttribute.class);
+			}
+		}
+
+		return initApplicationContext(parameters, extSystemAttrList);
+	}
+
+	private ApplicationContext initApplicationContext(Map<String, String> parameters,
+			List<ExtSystemAttribute> extSystemAttrList) throws ConnectionException {
+		File atfxFile = new File(parameters.get("atfxfile"));
+
+		try {
+			AoSession aoSession;
+			if (atfxFile.exists() && Files.size(atfxFile.toPath()) > 0L) {
+				aoSession = AoServiceFactory.getInstance().newAoSession(orb, atfxFile);
+			} else {
+				throw new ConnectionException(
+						"Cannot open session on a not existing or empty ATFX file: " + atfxFile.getAbsolutePath());
+			}
+			return new ATFXContext(orb, aoSession, parameters, extSystemAttrList, atfxFile);
+		} catch (AoException e) {
+			throw new ConnectionException("Error " + e.reason, e);
+		} catch (IOException e) {
+			throw new ConnectionException("Error reading ATFX file " + atfxFile.getAbsolutePath(), e);
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityConfigRepositoryLoader.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityConfigRepositoryLoader.java
new file mode 100644
index 0000000..341606e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityConfigRepositoryLoader.java
@@ -0,0 +1,225 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.util.Locale;
+
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextSensor;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Parameter;
+import org.eclipse.mdm.api.base.model.ParameterSet;
+import org.eclipse.mdm.api.base.model.PhysicalDimension;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Sortable;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.odsadapter.lookup.config.DefaultEntityConfigRepositoryLoader;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfigRepository;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfigRepositoryLoader;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ATFXEntityConfigRepositoryLoader implements EntityConfigRepositoryLoader {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(DefaultEntityConfigRepositoryLoader.class);
+
+	EntityConfigRepository entityConfigRepository;
+
+	private final boolean includeCatalog;
+
+	public ATFXEntityConfigRepositoryLoader(boolean includeCatalog) {
+		this.includeCatalog = includeCatalog;
+	}
+
+	/**
+	 * Loads the {@link EntityConfig}s.
+	 * 
+	 * @return
+	 */
+	@Override
+	public EntityConfigRepository loadEntityConfigurations(ODSModelManager modelManager) {
+		LOGGER.debug("Loading entity configurations...");
+		long start = System.currentTimeMillis();
+
+		entityConfigRepository = new EntityConfigRepository();
+
+		// Environment | Project | Pool | PhysicalDimension | User | Measurement
+		// | ChannelGroup
+		entityConfigRepository.register(create(modelManager, new Key<>(Environment.class), "Environment", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(Project.class), "Project", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(Pool.class), "StructureLevel", true));
+		entityConfigRepository
+				.register(create(modelManager, new Key<>(PhysicalDimension.class), "PhysDimension", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(Measurement.class), "MeaResult", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(ChannelGroup.class), "SubMatrix", false));
+
+		// Unit
+		EntityConfig<Unit> unitConfig = create(modelManager, new Key<>(Unit.class), "Unit", false);
+		unitConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(PhysicalDimension.class)));
+		entityConfigRepository.register(unitConfig);
+
+		// Quantity
+		EntityConfig<Quantity> quantityConfig = create(modelManager, new Key<>(Quantity.class), "Quantity", false);
+		quantityConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+		entityConfigRepository.register(quantityConfig);
+
+		// Channel
+		EntityConfig<Channel> channelConfig = create(modelManager, new Key<>(Channel.class), "MeaQuantity", false);
+		channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+		channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Quantity.class)));
+		entityConfigRepository.register(channelConfig);
+
+		// ParameterSet
+		EntityConfig<Parameter> parameterConfig = create(modelManager, new Key<>(Parameter.class), "ResultParameter",
+				true);
+		parameterConfig.addOptional(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+		EntityConfig<ParameterSet> parameterSetConfig = create(modelManager, new Key<>(ParameterSet.class),
+				"ResultParameterSet", true);
+		parameterSetConfig.addChild(parameterConfig);
+		entityConfigRepository.register(parameterSetConfig);
+
+		if (includeCatalog) {
+			// CatalogComponents
+			registerCatalogComponent(modelManager, ContextType.UNITUNDERTEST);
+			registerCatalogComponent(modelManager, ContextType.TESTSEQUENCE);
+			registerCatalogComponent(modelManager, ContextType.TESTEQUIPMENT);
+		}
+
+		// TestStep
+		EntityConfig<TestStep> testStepConfig = create(modelManager, new Key<>(TestStep.class), "TestStep", true);
+		testStepConfig.setComparator(Sortable.COMPARATOR);
+		entityConfigRepository.register(testStepConfig);
+
+		// Test
+		EntityConfig<Test> testConfig = create(modelManager, new Key<>(Test.class), "Test", true);
+		entityConfigRepository.register(testConfig);
+
+		// ContextRoots
+		registerContextRoot(modelManager, ContextType.UNITUNDERTEST);
+		registerContextRoot(modelManager, ContextType.TESTSEQUENCE);
+		registerContextRoot(modelManager, ContextType.TESTEQUIPMENT);
+
+		LOGGER.debug("Entity configurations loaded in {} ms.", System.currentTimeMillis() - start);
+
+		return entityConfigRepository;
+	}
+
+	/**
+	 * Loads the {@link EntityConfig}s required for {@link ContextRoot} with given
+	 * {@link ContextType}.
+	 *
+	 * @param contextType The {@code ContextType}.
+	 */
+	private void registerContextRoot(ODSModelManager modelManager, ContextType contextType) {
+		EntityConfig<ContextRoot> contextRootConfig = create(modelManager, new Key<>(ContextRoot.class, contextType),
+				ODSUtils.CONTEXTTYPES.get(contextType), true);
+		for (Relation contextComponentRelation : contextRootConfig.getEntityType().getChildRelations()) {
+			EntityType contextComponentEntityType = contextComponentRelation.getTarget();
+			EntityConfig<ContextComponent> contextComponentConfig = create(modelManager,
+					new Key<>(ContextComponent.class, contextType), contextComponentEntityType.getName(), true);
+			contextRootConfig.addChild(contextComponentConfig);
+			if (contextType.isTestEquipment()) {
+				for (Relation contextSensorRelation : contextComponentEntityType.getChildRelations()) {
+					EntityType contextSensorEntityType = contextSensorRelation.getTarget();
+					EntityConfig<ContextSensor> contextSensorConfig = create(modelManager,
+							new Key<>(ContextSensor.class), contextSensorEntityType.getName(), true);
+					contextComponentConfig.addChild(contextSensorConfig);
+				}
+			}
+		}
+		entityConfigRepository.register(contextRootConfig);
+	}
+
+	/**
+	 * Creates a new {@link EntityConfig}.
+	 *
+	 * @param <T>        The entity type.
+	 * @param key        Used as identifier.
+	 * @param typeName   Name of the associated {@link EntityType}.
+	 * @param appendName Flag indicates whether to append the entity types base name
+	 *                   to the MIME type.
+	 * @return The created {@code EntityConfig} is returned.
+	 */
+	private <T extends Entity> EntityConfig<T> create(ODSModelManager modelManager, Key<T> key, String typeName,
+			boolean appendName) {
+		EntityConfig<T> entityConfig = new EntityConfig<>(key);
+		ODSEntityType entityType = (ODSEntityType) modelManager.getEntityType(typeName);
+		entityConfig.setEntityType(entityType);
+		entityConfig.setMimeType(buildDefaultMimeType(entityType, appendName));
+		return entityConfig;
+	}
+
+	/**
+	 * Loads the {@link EntityConfig}s required for {@link CatalogComponent} with
+	 * given {@link ContextType}.
+	 *
+	 * @param contextType The {@code ContextType}.
+	 */
+	private void registerCatalogComponent(ODSModelManager modelManager, ContextType contextType) {
+		String odsName = ODSUtils.CONTEXTTYPES.get(contextType);
+		EntityConfig<CatalogAttribute> catalogAttributeConfig = create(modelManager,
+				new Key<>(CatalogAttribute.class, contextType), "Cat" + odsName + "Attr", true);
+		catalogAttributeConfig.setComparator(Sortable.COMPARATOR);
+		EntityConfig<CatalogComponent> catalogComponentConfig = create(modelManager,
+				new Key<>(CatalogComponent.class, contextType), "Cat" + odsName + "Comp", true);
+		catalogComponentConfig.addChild(catalogAttributeConfig);
+		if (contextType.isTestEquipment()) {
+			EntityConfig<CatalogAttribute> catalogSensorAttributeConfig = create(modelManager,
+					new Key<>(CatalogAttribute.class), "CatSensorAttr", true);
+			EntityConfig<CatalogSensor> catalogSensorConfig = create(modelManager, new Key<>(CatalogSensor.class),
+					"CatSensor", true);
+			catalogSensorConfig.addChild(catalogSensorAttributeConfig);
+			catalogComponentConfig.addChild(catalogSensorConfig);
+		}
+		entityConfigRepository.register(catalogComponentConfig);
+	}
+
+	/**
+	 * Creates a default MIME type for given {@link EntityType}.
+	 *
+	 * @param entityType The {@code EntityType}.
+	 * @param appendName Flag indicates whether to append the entity types base name
+	 *                   to the MIME type.
+	 * @return The created MIME type {@code String} is returned.
+	 */
+	private String buildDefaultMimeType(ODSEntityType entityType, boolean appendName) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("application/x-asam.");
+		sb.append(entityType.getBaseName().toLowerCase(Locale.ROOT));
+		if (appendName) {
+			sb.append('.').append(entityType.getName().toLowerCase(Locale.ROOT));
+		}
+		return sb.toString();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java
new file mode 100644
index 0000000..06da146
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java
@@ -0,0 +1,591 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.management.ServiceNotFoundException;
+
+import org.asam.ods.AoException;
+import org.asam.ods.ApplicationStructure;
+import org.asam.ods.ElemId;
+import org.asam.ods.InstanceElement;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.atfxadapter.transaction.ATFXTransaction;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+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.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.StatusAttachable;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.JoinType;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Classification;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.ExtSystemAttribute;
+import org.eclipse.mdm.api.dflt.model.MDMAttribute;
+import org.eclipse.mdm.api.dflt.model.Status;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.odsadapter.ODSContext;
+import org.eclipse.mdm.api.odsadapter.ODSContextFactory;
+import org.eclipse.mdm.api.odsadapter.ODSEntityManager;
+import org.eclipse.mdm.api.odsadapter.ReadRequestHandler;
+import org.eclipse.mdm.api.odsadapter.lookup.EntityLoader;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Strings;
+
+/**
+ * ASAM ODS implementation of the {@link EntityManager} interface.
+ *
+ * @see ODSEntityManager
+ */
+public class ATFXEntityManager implements EntityManager {
+	private static final String AA_ID = "Id";
+
+	private static final String AE_TESTSTEP = "TestStep";
+
+	private static final String AE_TEST = "Test";
+
+	private static final String AE_STRUCTURE_LEVEL = "StructureLevel";
+
+	private static final String AE_PROJECT = "Project";
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(ATFXEntityManager.class);
+
+	private static final String PROP_ASAMPATH = "org.eclipse.mdm.api.atfxadapter.asampath";
+
+	private static final Pattern EXTSYSTEMCOMP_REGEX = Pattern.compile("\\[(.+)\\].*", Pattern.DOTALL);
+	private static final Pattern EXTSYSTEMATTR_REGEX = Pattern.compile("\\[.*\\](.+)", Pattern.DOTALL);
+
+	private final ATFXContext context;
+	private final ODSModelManager odsModelManager;
+	private final QueryService queryService;
+	private final EntityLoader entityLoader;
+	private final List<ExtSystemAttribute> extSystemAttrList;
+
+	private NameHelper nameHelper;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param context           The {@link ODSContext}.
+	 * @param extSystemAttrList
+	 * @throws ServiceNotFoundException
+	 */
+	public ATFXEntityManager(ATFXContext context, List<ExtSystemAttribute> extSystemAttrList) {
+		this.context = context;
+		this.odsModelManager = context.getODSModelManager();
+		this.queryService = context.getQueryService()
+				.orElseThrow(() -> new ServiceNotProvidedException(QueryService.class));
+		this.extSystemAttrList = extSystemAttrList;
+
+		entityLoader = new EntityLoader(odsModelManager, queryService);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Environment loadEnvironment() throws DataAccessException {
+		List<Environment> environments = loadAll(Environment.class);
+		if (environments.size() != 1) {
+			throw new DataAccessException("Unable to laod the environment entity.");
+		}
+
+		return environments.get(0);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Optional<User> loadLoggedOnUser() throws DataAccessException {
+		return Optional.empty();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public <T extends Entity> List<T> load(Class<T> entityClass, Collection<String> instanceIDs)
+			throws DataAccessException {
+		return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public <T extends Entity> List<T> load(Class<T> entityClass, ContextType contextType,
+			Collection<String> instanceIDs) throws DataAccessException {
+		return entityLoader.loadAll(new Key<>(entityClass, contextType), instanceIDs);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public <T extends Entity> Optional<T> loadParent(Entity child, Class<T> entityClass) throws DataAccessException {
+		EntityType parentEntityType = odsModelManager.getEntityType(entityClass);
+		EntityType childEntityType = odsModelManager.getEntityType(child);
+
+		Optional<String> instanceID = Optional.empty();
+
+		if (child instanceof Channel && ChannelGroup.class.equals(entityClass)) {
+			// this covers the gap between channel and channel group via local column
+			EntityType localColumnEntityType = odsModelManager.getEntityType("LocalColumn");
+
+			Relation relLocalColumnToChannel = localColumnEntityType.getRelation(childEntityType);
+			Relation relLocalColumnToChannelGroup = localColumnEntityType.getRelation(parentEntityType);
+
+			Optional<String> localColumnID = queryService.createQuery().select(localColumnEntityType.getIDAttribute())
+					.fetchSingleton(Filter.idOnly(relLocalColumnToChannel, child.getID()))
+					.map(r -> r.getRecord(localColumnEntityType)).map(r -> r.getID());
+
+			if (localColumnID.isPresent()) {
+				instanceID = queryService.createQuery().select(relLocalColumnToChannelGroup.getAttribute())
+						.fetchSingleton(Filter.idOnly(localColumnEntityType, localColumnID.get()))
+						.map(r -> r.getRecord(localColumnEntityType))
+						.map(r -> r.getID(relLocalColumnToChannelGroup).get());
+			}
+		} else {
+			Relation relationToParent = childEntityType.getRelation(parentEntityType);
+
+			Query query = queryService.createQuery().select(relationToParent.getAttribute());
+			instanceID = query.fetchSingleton(Filter.idOnly(childEntityType, child.getID()))
+					.map(r -> r.getRecord(childEntityType)).map(r -> r.getID(relationToParent).get());
+		}
+
+		if (instanceID.isPresent()) {
+			return Optional.of(entityLoader.load(new Key<>(entityClass), instanceID.get()));
+		}
+
+		return Optional.empty();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public <T extends Entity> List<T> loadAll(Class<T> entityClass, String pattern) throws DataAccessException {
+		return entityLoader.loadAll(new Key<>(entityClass), pattern);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public <T extends StatusAttachable> List<T> loadAll(Class<T> entityClass, Status status, String pattern)
+			throws DataAccessException {
+		EntityType entityType = odsModelManager.getEntityType(entityClass);
+		EntityType classificationType = odsModelManager.getEntityType(Classification.class);
+		EntityType statusEntityType = odsModelManager.getEntityType(status.getTypeName());
+
+		List<String> instanceIDs = queryService.createQuery().join(entityType, classificationType)
+				.join(classificationType, statusEntityType).selectID(entityType)
+				.fetch(Filter.and().id(statusEntityType, status.getID()).name(entityType, pattern)).stream()
+				.map(r -> r.getRecord(entityType)).map(Record::getID).collect(Collectors.toList());
+
+		return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public <T extends Entity> List<T> loadAll(Class<T> entityClass, ContextType contextType, String pattern)
+			throws DataAccessException {
+		return entityLoader.loadAll(new Key<>(entityClass, contextType), pattern);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public <T extends Entity> List<T> loadChildren(Entity parent, Class<T> entityClass, String pattern)
+			throws DataAccessException {
+		if (!Strings.isNullOrEmpty(pattern) && !"*".equals(pattern)) {
+			throw new DataAccessException("Pattern not supported by ATFXAdapter");
+		}
+		EntityType parentEntityType = odsModelManager.getEntityType(parent);
+		EntityType childEntityType = odsModelManager.getEntityType(entityClass);
+
+		List<String> instanceIDs;
+
+		if (parent instanceof ChannelGroup && Channel.class.equals(entityClass)) {
+			// this covers the gap between channel and channel group via local column
+			EntityType localColumnEntityType = odsModelManager.getEntityType("LocalColumn");
+
+			Relation relLocalColumnToChannel = localColumnEntityType.getRelation(childEntityType);
+			Relation relLocalColumnToChannelGroup = localColumnEntityType.getRelation(parentEntityType);
+
+			instanceIDs = queryService.createQuery().select(relLocalColumnToChannel.getAttribute())
+					.fetch(Filter.and().id(relLocalColumnToChannelGroup, parent.getID()).name(localColumnEntityType,
+							pattern))
+					.stream().map(r -> r.getRecord(localColumnEntityType))
+					.map(r -> r.getID(relLocalColumnToChannel).get()).collect(Collectors.toList());
+
+			return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+		} else {
+			Relation relationToParent = childEntityType.getRelation(parentEntityType);
+
+			instanceIDs = queryService.createQuery().selectID(childEntityType).select(relationToParent.getAttribute())
+					.fetch(Filter.and().id(relationToParent, parent.getID()).name(childEntityType, pattern)).stream()
+					.map(r -> r.getRecord(childEntityType)).map(Record::getID).collect(Collectors.toList());
+		}
+
+		return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public List<ContextType> loadContextTypes(ContextDescribable contextDescribable) throws DataAccessException {
+		EntityType contextDescribableEntityType = odsModelManager.getEntityType(contextDescribable);
+		Query query = queryService.createQuery();
+
+		Map<ContextType, EntityType> contextRootEntityTypes = new EnumMap<>(ContextType.class);
+		for (ContextType contextType : ContextType.values()) {
+			EntityType entityType = odsModelManager.getEntityType(ContextRoot.class, contextType);
+			contextRootEntityTypes.put(contextType, entityType);
+			query.join(contextDescribableEntityType.getRelation(entityType), JoinType.OUTER).selectID(entityType);
+		}
+
+		Optional<Result> result = query
+				.fetchSingleton(Filter.idOnly(contextDescribableEntityType, contextDescribable.getID()));
+		if (result.isPresent()) {
+			List<ContextType> contextTypes = new ArrayList<>();
+			for (Entry<ContextType, EntityType> entry : contextRootEntityTypes.entrySet()) {
+				Optional<String> instanceID = result.map(r -> r.getRecord(entry.getValue())).map(Record::getID);
+				if (instanceID.isPresent()) {
+					contextTypes.add(entry.getKey());
+				}
+			}
+
+			return contextTypes;
+		}
+
+		return Collections.emptyList();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Map<ContextType, ContextRoot> loadContexts(ContextDescribable contextDescribable,
+			ContextType... contextTypes) throws DataAccessException {
+		EntityType contextDescribableEntityType = odsModelManager.getEntityType(contextDescribable);
+
+		Map<ContextType, EntityType> contextRootEntityTypes = new EnumMap<>(ContextType.class);
+		Map<ContextType, ContextRoot> contextRoots = new EnumMap<>(ContextType.class);
+		for (ContextType contextType : contextTypes.length == 0 ? ContextType.values() : contextTypes) {
+
+			EntityType entityType = odsModelManager.getEntityType(ContextRoot.class, contextType);
+			contextRootEntityTypes.put(contextType, entityType);
+
+			// openATFX does not support joins in queries, thus we have to retrive the
+			// ContextRoots one by one by ID
+			ElemId elemId = new ElemId(((ODSEntityType) contextDescribableEntityType).getODSID(),
+					ODSConverter.toODSID(contextDescribable.getID()));
+			try {
+				Optional<Relation> relation = getRelation(contextDescribableEntityType, entityType);
+
+				if (relation.isPresent()) {
+					T_LONGLONG[] contextRootIds = odsModelManager.getApplElemAccess().getRelInst(elemId,
+							relation.get().getName());
+
+					if (contextRootIds != null && contextRootIds.length > 0) {
+						// There can only be one result per ContextType, thus we take the first one and
+						// ignore the rest
+						String instanceID = Long.toString(ODSConverter.fromODSLong(contextRootIds[0]));
+
+						contextRoots.put(contextType,
+								entityLoader.load(new Key<>(ContextRoot.class, contextType), instanceID));
+					}
+				}
+			} catch (AoException e) {
+				throw new DataAccessException("Cannot load contextRoot '" + entityType.getName() + "' for ID '"
+						+ contextDescribable.getID() + "': " + e.reason, e);
+			}
+		}
+
+		if (extSystemAttrList != null) {
+			contextRoots = mapAttributesWithExtSystem(contextRoots);
+		}
+
+		return contextRoots;
+	}
+
+	private Optional<Relation> getRelation(EntityType contextDescribableEntityType, EntityType entityType) {
+		try {
+			return Optional.of(contextDescribableEntityType.getRelation(entityType));
+		} catch (IllegalArgumentException e) {
+			return Optional.empty();
+		}
+	}
+
+	private Map<ContextType, ContextRoot> mapAttributesWithExtSystem(Map<ContextType, ContextRoot> contextRoots) {
+
+		EntityFactory entityFactory = this.context.getEntityFactory()
+				.orElseThrow(() -> new DataAccessException("ATFX EntityFactory not found!"));
+
+		Map<ContextType, ContextRoot> returnVal = contextRoots;
+
+		for (ExtSystemAttribute extSystemAttr : extSystemAttrList) {
+
+			String compName = getExtAttrComp(extSystemAttr.getName());
+			String attrName = getExtAttrAttr(extSystemAttr.getName());
+
+			if (!Strings.isNullOrEmpty(compName) && !Strings.isNullOrEmpty(attrName)) {
+				for (ContextRoot root : returnVal.values()) {
+					Optional<ContextComponent> contextComponentExt = root.getContextComponent(compName);
+
+					if (contextComponentExt.isPresent()) {
+
+						Value value = contextComponentExt.get().getValues().get(attrName);
+
+						if (value != null) {
+							for (MDMAttribute mdmAttr : extSystemAttr.getAttributes()) {
+								ContextRoot contextRootMDMAttr = returnVal
+										.get(ContextType.valueOf(mdmAttr.getComponentType().toUpperCase()));
+
+								if (contextRootMDMAttr != null) {
+									Optional<ContextComponent> contextComponentOptional = contextRootMDMAttr
+											.getContextComponent(mdmAttr.getComponentName());
+
+									ContextComponent contextComponent = null;
+
+									if (contextComponentOptional.isPresent()) {
+										contextComponent = contextComponentOptional.get();
+									} else {
+										contextComponent = entityFactory
+												.createContextComponent(mdmAttr.getComponentName(), contextRootMDMAttr);
+									}
+
+									Value valueMDMAttr = value.getValueType().create(mdmAttr.getAttributeName());
+									valueMDMAttr.set(value.extract(value.getValueType()));
+									ODSEntityFactory.extract(contextComponent).getValues()
+											.put(mdmAttr.getAttributeName(), valueMDMAttr);
+								}
+
+							}
+
+							break;
+						}
+
+					}
+
+				}
+			}
+		}
+
+		return returnVal;
+	}
+
+	private void writeValueToMDMAttribute(Map<ContextType, ContextRoot> contextRoots, Value value,
+			MDMAttribute mdmAttr) {
+		EntityFactory entityFactory = this.context.getEntityFactory()
+				.orElseThrow(() -> new DataAccessException("ATFX EntityFactory not found!"));
+
+		ContextRoot contextRootMDMAttr = contextRoots
+				.get(ContextType.valueOf(mdmAttr.getComponentType().toUpperCase()));
+
+		if (contextRootMDMAttr != null) {
+			Optional<ContextComponent> contextComponentOptional = contextRootMDMAttr
+					.getContextComponent(mdmAttr.getComponentName());
+
+			ContextComponent contextComponent = null;
+
+			if (contextComponentOptional.isPresent()) {
+				contextComponent = contextComponentOptional.get();
+			} else {
+
+				contextComponent = entityFactory.createContextComponent(mdmAttr.getComponentName(), contextRootMDMAttr);
+			}
+
+			Value valueMDMAttr = value.getValueType().create(mdmAttr.getAttributeName());
+			valueMDMAttr.set(value.extract(value.getValueType()));
+			ODSEntityFactory.extract(contextComponent).getValues().put(mdmAttr.getAttributeName(), valueMDMAttr);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public List<MeasuredValues> readMeasuredValues(ReadRequest readRequest) throws DataAccessException {
+		return new ReadRequestHandler(odsModelManager, queryService).execute(readRequest);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Transaction startTransaction() throws DataAccessException {
+		try {
+			return new ATFXTransaction(context);
+		} catch (AoException e) {
+			throw new DataAccessException("Unable to start transaction due to: " + e.reason, e);
+		}
+	}
+
+	/**
+	 * Retrives the ASAM paths for the given entities. The ASAM paths are prefixed
+	 * with a servicename, in the form
+	 * <code>corbaloc:[iop|ssliop]:1.2@HOSTNAME:PORT/NameService/MDM.ASAM-ODS/</code>
+	 * 
+	 * @returns returns a map with the ASAM paths to the given entities. If a entity
+	 *          is not found in the ODS server the entity is not included in the
+	 *          result map.
+	 * @throws DataAccessException      if links could not be loaded for the given
+	 *                                  entities
+	 * @throws IllegalArgumentException if a the source or typeName of an entity is
+	 *                                  invalid
+	 * @see org.eclipse.mdm.api.base.BaseEntityManager#getLinks(Collection)
+	 */
+	@Override
+	public Map<Entity, String> getLinks(Collection<Entity> entities) throws DataAccessException {
+
+		Map<Entity, String> linkMap = new HashMap<>();
+
+		ApplicationStructure appStructure;
+		try {
+			appStructure = odsModelManager.getAoSession().getApplicationStructure();
+		} catch (AoException e) {
+			throw new DataAccessException("Could not load application structure! Reason: " + e.reason, e);
+		}
+
+		String serverRoot = context.getParameters().get(ODSContextFactory.PARAM_NAMESERVICE) + "/"
+				+ context.getParameters().get(ODSContextFactory.PARAM_SERVICENAME);
+
+		Map<String, List<Entity>> entitiesByTypeName = entities.stream().filter(e -> e.getTypeName() != null)
+				.collect(Collectors.groupingBy(Entity::getTypeName));
+
+		for (Map.Entry<String, List<Entity>> entry : entitiesByTypeName.entrySet()) {
+			ODSEntityType et = (ODSEntityType) odsModelManager.getEntityType(entry.getKey());
+
+			List<ElemId> elemIds = entry.getValue().stream()
+					.map(e -> new ElemId(et.getODSID(), ODSConverter.toODSLong(Long.parseLong(e.getID()))))
+					.collect(Collectors.toList());
+
+			try {
+				InstanceElement[] instances = appStructure.getInstancesById(elemIds.toArray(new ElemId[0]));
+
+				for (InstanceElement ie : instances) {
+					String id = Long.toString(ODSConverter.fromODSLong(ie.getId()));
+					String asamPath = serverRoot + ie.getAsamPath();
+					entry.getValue().stream().filter(e -> e.getID().equals(id)).findFirst()
+							.ifPresent(e -> linkMap.put(e, asamPath));
+				}
+			} catch (AoException e) {
+				LOGGER.debug("Could not load links for entities: " + entities + ". Reason: " + e.reason, e);
+			}
+		}
+
+		return linkMap;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public <T extends Entity> List<T> loadRelatedEntities(Entity entity, String relationName, Class<T> relatedClass) {
+		ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));
+		ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));
+
+		try {
+			T_LONGLONG[] instanceIds = context.getAoSession().getApplElemAccess().getRelInst(elemId, relationName);
+			List<String> instanceIDs = Stream.of(instanceIds).map(ODSConverter::fromODSLong).map(Object::toString)
+					.collect(Collectors.toList());
+			return entityLoader.loadAll(new Key<>(relatedClass), instanceIDs);
+		} catch (AoException e) {
+			throw new DataAccessException("Cannot load related instances: " + e.reason, e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Optional<TemplateTest> loadTemplate(Test test) {
+		return Optional.of(ODSEntityFactory.extract(test).getMutableStore().get(TemplateTest.class));
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Optional<TemplateTestStep> loadTemplate(TestStep testStep) {
+		return Optional.of(ODSEntityFactory.extract(testStep).getMutableStore().get(TemplateTestStep.class));
+	}
+
+	private static String getExtAttrComp(final String str) {
+		String returnVal = null;
+
+		Matcher matcher = EXTSYSTEMCOMP_REGEX.matcher(str);
+		if (matcher.matches()) {
+			returnVal = matcher.group(1);
+		}
+		return returnVal;
+	}
+
+	private static String getExtAttrAttr(final String str) {
+		String returnVal = null;
+
+		Matcher matcher = EXTSYSTEMATTR_REGEX.matcher(str);
+		if (matcher.matches()) {
+			returnVal = matcher.group(1);
+		}
+		return returnVal;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/NameHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/NameHelper.java
new file mode 100644
index 0000000..97a3967
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/NameHelper.java
@@ -0,0 +1,89 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+

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

+

+import java.util.ArrayList;

+import java.util.HashMap;

+import java.util.List;

+import java.util.Map;

+import java.util.regex.Pattern;

+

+import org.asam.ods.AoException;

+import org.asam.ods.AoSession;

+import org.asam.ods.ApplicationElement;

+import org.asam.ods.InstanceElement;

+import org.asam.ods.InstanceElementIterator;

+import org.asam.ods.Relationship;

+

+/**

+ * @author akn

+ *

+ */

+public class NameHelper {

+

+	private static final Pattern PATTERN_TESTSTEP_ASAM_PATH = Pattern.compile(

+			"\\/\\[Environment\\].+\\/\\[Project\\](.+)\\/\\[StructureLevel\\](.+)\\/\\[Test\\](.+)\\/\\[TestStep\\](.+)");

+

+	private final AoSession aoSession;

+	private final String compName;

+	private final String attrName;

+

+	private Map<String, String> asamAttrCache = new HashMap<>();

+

+	/**

+	 * @param aoSession

+	 * @param property

+	 * @throws AoException

+	 */

+	public NameHelper(AoSession aoSession, String compName, String attrName) throws AoException {

+		super();

+		this.aoSession = aoSession;

+		this.compName = compName;

+		this.attrName = attrName;

+		initCache();

+

+	}

+

+	private void initCache() throws AoException {

+		ApplicationElement testStep = this.aoSession.getApplicationStructure().getElementByName("TestStep");

+

+		InstanceElementIterator testStepInstances = testStep.getInstances("*");

+

+		List<InstanceElement> relatedIE = new ArrayList<>();

+

+		for (InstanceElement ie : testStepInstances.nextN(testStepInstances.getCount())) {

+			relatedIE.add(ie);

+			relatedIE.addAll(getParentIntances(ie));

+		}

+

+		int i = 0;

+

+	}

+

+	private List<InstanceElement> getParentIntances(InstanceElement ie) throws AoException {

+		List<InstanceElement> returnVal = new ArrayList<>();

+

+		InstanceElementIterator ieIterator = ie.getRelatedInstancesByRelationship(Relationship.FATHER, "*");

+

+		if (ieIterator != null && ieIterator.getCount() > 0) {

+			for (InstanceElement ieParent : ieIterator.nextN(ieIterator.getCount())) {

+				returnVal.add(ie);

+				returnVal.addAll(getParentIntances(ie));

+			}

+		}

+

+		return returnVal;

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/filetransfer/ATFXFileService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/filetransfer/ATFXFileService.java
new file mode 100644
index 0000000..5a00ee6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/filetransfer/ATFXFileService.java
@@ -0,0 +1,229 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+

+package org.eclipse.mdm.api.atfxadapter.filetransfer;

+

+import java.io.File;

+import java.io.FileInputStream;

+import java.io.IOException;

+import java.io.InputStream;

+import java.nio.file.Files;

+import java.nio.file.Path;

+import java.time.Duration;

+import java.time.LocalTime;

+import java.util.Collection;

+import java.util.List;

+import java.util.Map;

+import java.util.UUID;

+import java.util.concurrent.atomic.AtomicLong;

+import java.util.stream.Collectors;

+

+import org.eclipse.mdm.api.base.file.FileService;

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

+import org.eclipse.mdm.api.base.model.FileLink;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+

+/**

+ * @author akn

+ *

+ */

+public class ATFXFileService implements FileService {

+

+	private static final Logger LOGGER = LoggerFactory.getLogger(ATFXFileService.class);

+

+	private final Path parentDirectory;

+

+	public ATFXFileService(File parentDirectory) {

+		this.parentDirectory = parentDirectory.toPath();

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#downloadSequential(org.eclipse.mdm.

+	 * api.base.model.Entity, java.nio.file.Path, java.util.Collection,

+	 * org.eclipse.mdm.api.base.file.FileService.ProgressListener)

+	 */

+	@Override

+	public void downloadSequential(Entity entity, Path target, Collection<FileLink> fileLinks,

+			ProgressListener progressListener) throws IOException {

+		Map<String, List<FileLink>> groups = fileLinks.stream().filter(FileLink::isRemote)

+				.collect(Collectors.groupingBy(FileLink::getRemotePath));

+

+		long totalSize = calculateDownloadSize(groups);

+		final AtomicLong transferred = new AtomicLong();

+		LocalTime start = LocalTime.now();

+		UUID id = UUID.randomUUID();

+		LOGGER.debug("Sequential download of {} file(s) with id '{}' started.", groups.size(), id);

+		for (List<FileLink> group : groups.values()) {

+			FileLink fileLink = group.get(0);

+

+			download(entity, target, fileLink, (b, p) -> {

+				double tranferredBytes = transferred.addAndGet(b);

+				if (progressListener != null) {

+					progressListener.progress(b, (float) (tranferredBytes / totalSize));

+				}

+			});

+

+			for (FileLink other : group.subList(1, group.size())) {

+				other.setLocalStream(fileLink.getLocalStream());

+			}

+		}

+		LOGGER.debug("Sequential download with id '{}' finished in {}.", id, Duration.between(start, LocalTime.now()));

+

+	}

+

+	private long calculateDownloadSize(Map<String, List<FileLink>> groups) {

+		List<FileLink> links = groups.values().stream().map(l -> l.get(0)).collect(Collectors.toList());

+		long totalSize = 0;

+		for (FileLink fileLink : links) {

+			File f = new File(fileLink.getRemotePath());

+			// overflow may occur in case of total size exceeds 9223 PB!

+			totalSize = Math.addExact(totalSize, f.length());

+		}

+

+		return totalSize;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#downloadParallel(org.eclipse.mdm.

+	 * api.base.model.Entity, java.nio.file.Path, java.util.Collection,

+	 * org.eclipse.mdm.api.base.file.FileService.ProgressListener)

+	 */

+	@Override

+	public void downloadParallel(Entity entity, Path target, Collection<FileLink> fileLinks,

+			ProgressListener progressListener) throws IOException {

+		// TODO Auto-generated method stub

+

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#download(org.eclipse.mdm.api.base.

+	 * model.Entity, java.nio.file.Path, org.eclipse.mdm.api.base.model.FileLink,

+	 * org.eclipse.mdm.api.base.file.FileService.ProgressListener)

+	 */

+	@Override

+	public void download(Entity entity, Path target, FileLink fileLink, ProgressListener progressListener)

+			throws IOException {

+		if (Files.exists(target)) {

+			if (!Files.isDirectory(target)) {

+				throw new IllegalArgumentException("Target path is not a directory.");

+			}

+		} else {

+			Files.createDirectory(target);

+		}

+

+		try (InputStream inputStream = openStream(entity, fileLink)) {

+			Path absolutePath = target.resolve(fileLink.getFileName()).toAbsolutePath();

+			String remotePath = fileLink.getRemotePath();

+			LOGGER.debug("Starting download of file '{}' to '{}'.", remotePath, absolutePath);

+			LocalTime start = LocalTime.now();

+			Files.copy(inputStream, absolutePath);

+			LOGGER.debug("File '{}' successfully downloaded in {} to '{}'.", remotePath,

+					Duration.between(start, LocalTime.now()), absolutePath);

+		}

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#openStream(org.eclipse.mdm.api.base

+	 * .model.Entity, org.eclipse.mdm.api.base.model.FileLink,

+	 * org.eclipse.mdm.api.base.file.FileService.ProgressListener)

+	 */

+	@Override

+	public InputStream openStream(Entity entity, FileLink fileLink, ProgressListener progressListener)

+			throws IOException {

+

+		return new FileInputStream(parentDirectory.resolve(fileLink.getRemotePath()).toFile());

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#loadSize(org.eclipse.mdm.api.base.

+	 * model.Entity, org.eclipse.mdm.api.base.model.FileLink)

+	 */

+	@Override

+	public void loadSize(Entity entity, FileLink fileLink) throws IOException {

+		// TODO Auto-generated method stub

+

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#uploadSequential(org.eclipse.mdm.

+	 * api.base.model.Entity, java.util.Collection,

+	 * org.eclipse.mdm.api.base.file.FileService.ProgressListener)

+	 */

+	@Override

+	public void uploadSequential(Entity entity, Collection<FileLink> fileLinks, ProgressListener progressListener)

+			throws IOException {

+		// TODO Auto-generated method stub

+

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#uploadParallel(org.eclipse.mdm.api.

+	 * base.model.Entity, java.util.Collection,

+	 * org.eclipse.mdm.api.base.file.FileService.ProgressListener)

+	 */

+	@Override

+	public void uploadParallel(Entity entity, Collection<FileLink> fileLinks, ProgressListener progressListener)

+			throws IOException {

+		// TODO Auto-generated method stub

+

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#delete(org.eclipse.mdm.api.base.

+	 * model.Entity, java.util.Collection)

+	 */

+	@Override

+	public void delete(Entity entity, Collection<FileLink> fileLinks) {

+		// TODO Auto-generated method stub

+

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see

+	 * org.eclipse.mdm.api.base.file.FileService#delete(org.eclipse.mdm.api.base.

+	 * model.Entity, org.eclipse.mdm.api.base.model.FileLink)

+	 */

+	@Override

+	public void delete(Entity entity, FileLink fileLink) {

+		// TODO Auto-generated method stub

+

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/ATFXTransaction.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/ATFXTransaction.java
new file mode 100644
index 0000000..253d027
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/ATFXTransaction.java
@@ -0,0 +1,426 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AoException;
+import org.eclipse.mdm.api.atfxadapter.ATFXContext;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.BaseEntity;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.ScalarType;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.odsadapter.ODSContext;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ODS implementation of the {@link Transaction} interface.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.ODSTransaction
+ */
+public final class ATFXTransaction implements Transaction {
+
+	// TODO: it should be possible to a attach a progress listener
+	// -> progress notification updates while uploading files
+	// -> any other useful informations?!
+	// -> splitting of tasks into subtasks may be required...
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(ATFXTransaction.class);
+
+	// this one is used to access the application model and execute queries
+	// instance is decoupled from its parent
+	private final ATFXContext context;
+
+	// only for logging
+	private final String id = UUID.randomUUID().toString();
+
+	// need to write version == instanceID -> update after create
+	private final List<ContextRoot> contextRoots = new ArrayList<>();
+
+	// reset instance IDs on abort
+	private final List<Core> created = new ArrayList<>();
+
+	// apply changes
+	private final List<Core> modified = new ArrayList<>();
+
+	private CatalogManager catalogManager;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param parentModelManager Used to access the persistence.
+	 * @param entity             Used for security checks
+	 * @param transfer           The file transfer type.
+	 * @throws AoException Thrown if unable to start a co-session.
+	 */
+	public ATFXTransaction(ATFXContext context) throws AoException {
+		this.context = context;
+		this.context.getAoSession().startTransaction();
+		LOGGER.debug("Transaction '{}' started.", id);
+	}
+
+	<T extends Entity> T removeReferencesToTemplates(T e) {
+		for (Class<? extends Entity> clazz : Arrays.asList(TemplateTest.class, TemplateTestStep.class,
+				TemplateRoot.class, TemplateComponent.class, TemplateAttribute.class, TemplateSensor.class)) {
+			ODSEntityFactory.getMutableStore((BaseEntity) e).remove(clazz);
+			ODSEntityFactory.extract((BaseEntity) e).apply();
+		}
+		return e;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public <T extends Entity> void create(Collection<T> entities) throws DataAccessException {
+		if (entities.isEmpty()) {
+			return;
+		} else if (entities.stream().filter(e -> ODSUtils.isValidID(e.getID())).findAny().isPresent()) {
+			throw new IllegalArgumentException("At least one given entity is already persisted.");
+		}
+
+		entities = entities.stream().map(this::removeReferencesToTemplates).collect(Collectors.toList());
+
+		try {
+			Map<Class<?>, List<T>> entitiesByClassType = entities.stream()
+					.collect(Collectors.groupingBy(e -> e.getClass()));
+
+			List<CatalogComponent> catalogComponents = (List<CatalogComponent>) entitiesByClassType
+					.get(CatalogComponent.class);
+			if (catalogComponents != null) {
+				getCatalogManager().createCatalogComponents(catalogComponents);
+			}
+
+			List<CatalogSensor> catalogSensors = (List<CatalogSensor>) entitiesByClassType.get(CatalogSensor.class);
+			if (catalogSensors != null) {
+				// TODO anehmer on 2017-11-16: avalon 4.3b throws an exception in
+				// AoSession.commitTransaction() if multiple
+				// catalog sensors have been deleted and leaves the application
+				// model in a broken state. This is also stated in the documentation. This
+				// comment should be removed later.
+				getCatalogManager().createCatalogSensors(catalogSensors);
+			}
+
+			List<CatalogAttribute> catalogAttributes = (List<CatalogAttribute>) entitiesByClassType
+					.get(CatalogAttribute.class);
+			if (catalogAttributes != null) {
+				getCatalogManager().createCatalogAttributes(catalogAttributes);
+			}
+
+			List<TestStep> testSteps = (List<TestStep>) entitiesByClassType.get(TestStep.class);
+			if (testSteps != null) {
+				create(testSteps.stream().map(ContextRoot::of).collect(ArrayList::new, List::addAll, List::addAll));
+			}
+
+			List<Measurement> measurements = (List<Measurement>) entitiesByClassType.get(Measurement.class);
+			if (measurements != null) {
+				// Use set here, since measurement siblings point to the same
+				// context roots. Only create those ContextRoots that haven't been created yet:
+				create(measurements.stream().map(ContextRoot::of)
+						.collect(HashSet<ContextRoot>::new, Set<ContextRoot>::addAll, Set<ContextRoot>::addAll).stream()
+						.filter(cr -> !ODSUtils.isValidID(cr.getID())).collect(Collectors.toSet()));
+			}
+
+			executeStatements(et -> new InsertStatement(this, et), entities);
+
+			List<ContextRoot> roots = (List<ContextRoot>) entitiesByClassType.get(ContextRoot.class);
+			if (roots != null) {
+				roots.forEach(contextRoot -> {
+					contextRoot.setVersion(contextRoot.getID().toString());
+				});
+
+				// this will restore the ASAM path of each context root
+				executeStatements(et -> new UpdateStatement(this, et, true), roots);
+				contextRoots.addAll(roots);
+			}
+		} catch (AoException e) {
+			throw new DataAccessException("Unable to write new entities due to: " + e.reason, e);
+		} catch (IOException e) {
+			throw new DataAccessException("Unable to write new entities due to: " + e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public <T extends Entity> void update(Collection<T> entities) throws DataAccessException {
+		if (entities.isEmpty()) {
+			return;
+		} else if (entities.stream().filter(e -> !ODSUtils.isValidID(e.getID())).findAny().isPresent()) {
+			throw new IllegalArgumentException("At least one given entity is not yet persisted.");
+		}
+
+		entities = entities.stream().map(this::removeReferencesToTemplates).collect(Collectors.toList());
+
+		try {
+			Map<Class<?>, List<T>> entitiesByClassType = entities.stream()
+					.collect(Collectors.groupingBy(e -> e.getClass()));
+			List<CatalogAttribute> catalogAttributes = (List<CatalogAttribute>) entitiesByClassType
+					.get(CatalogAttribute.class);
+			if (catalogAttributes != null) {
+				getCatalogManager().updateCatalogAttributes(catalogAttributes);
+			}
+
+			executeStatements(et -> new UpdateStatement(this, et, false), entities);
+		} catch (AoException e) {
+			throw new DataAccessException("Unable to update entities due to: " + e.reason, e);
+		} catch (IOException e) {
+			throw new DataAccessException("Unable to update entities due to: " + e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public <T extends Deletable> void delete(Collection<T> entities) throws DataAccessException {
+		if (entities.isEmpty()) {
+			return;
+		}
+
+		entities = entities.stream().map(this::removeReferencesToTemplates).collect(Collectors.toList());
+
+		List<T> filteredEntities = entities.stream().filter(e -> ODSUtils.isValidID(e.getID()))
+				.collect(Collectors.toList());
+
+		try {
+			Map<Class<?>, List<T>> entitiesByClassType = filteredEntities.stream()
+					.collect(Collectors.groupingBy(e -> e.getClass()));
+
+			List<CatalogComponent> catalogComponents = (List<CatalogComponent>) entitiesByClassType
+					.get(CatalogComponent.class);
+			if (catalogComponents != null) {
+				getCatalogManager().deleteCatalogComponents(catalogComponents);
+			}
+
+			List<CatalogSensor> catalogSensors = (List<CatalogSensor>) entitiesByClassType.get(CatalogSensor.class);
+			if (catalogSensors != null) {
+				// TODO anehmer on 2017-11-16: avalon 4.3b throws an exception in
+				// AoSession.commitTransaction() if multiple
+				// catalog sensors have been deleted and leaves the application
+				// model in a broken state. This is also stated in the documentation. This
+				// comment should be removed later.
+				getCatalogManager().deleteCatalogSensors(catalogSensors);
+			}
+
+			List<CatalogAttribute> catalogAttributes = (List<CatalogAttribute>) entitiesByClassType
+					.get(CatalogAttribute.class);
+			if (catalogAttributes != null) {
+				getCatalogManager().deleteCatalogAttributes(catalogAttributes);
+			}
+
+			/*
+			 * TODO: for any template that has to be deleted it is required to ensure there
+			 * are no links to it...
+			 */
+
+			executeStatements(et -> new DeleteStatement(this, et, true), filteredEntities);
+		} catch (AoException e) {
+			throw new DataAccessException("Unable to delete entities due to: " + e.reason, e);
+		} catch (IOException e) {
+			throw new DataAccessException("Unable to delete entities due to: " + e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void writeMeasuredValues(Collection<WriteRequest> writeRequests) throws DataAccessException {
+		if (writeRequests.isEmpty()) {
+			return;
+		}
+
+		try {
+			Map<ScalarType, List<WriteRequest>> writeRequestsByRawType = writeRequests.stream()
+					.collect(Collectors.groupingBy(WriteRequest::getRawScalarType));
+
+			for (List<WriteRequest> writeRequestGroup : writeRequestsByRawType.values()) {
+				WriteRequestHandler writeRequestHandler = new WriteRequestHandler(this);
+				List<Channel> channels = new ArrayList<>();
+
+				for (WriteRequest writeRequest : writeRequestGroup) {
+					Channel channel = writeRequest.getChannel();
+					channel.setScalarType(writeRequest.getCalculatedScalarType());
+					// TODO it might be required to change relation to another
+					// unit?!??
+					channels.add(channel);
+					writeRequestHandler.addRequest(writeRequest);
+				}
+
+				update(channels);
+				writeRequestHandler.execute();
+			}
+		} catch (AoException e) {
+			throw new DataAccessException("Unable to write measured values due to: " + e.reason, e);
+		} catch (IOException e) {
+			throw new DataAccessException("Unable to write measured values due to: " + e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void commit() throws DataAccessException {
+		try {
+			context.getAoSession().commitTransaction();
+
+			// commit succeed -> apply changes in entity cores
+			modified.forEach(Core::apply);
+
+			if (catalogManager != null) {
+				// application model has been modified -> reload
+				// context.getODSModelManager().reloadApplicationModel();
+				// TODO
+			}
+
+			LOGGER.debug("Transaction '{}' committed.", id);
+		} catch (AoException e) {
+			throw new DataAccessException("Unable to commit transaction '" + id + "' due to: " + e.reason, e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void abort() {
+		try {
+			// reset version, since creation failed or was aborted
+			contextRoots.forEach(cr -> cr.setVersion(null));
+
+			// reset instance IDs
+			String virtualID = "0";
+			created.forEach(c -> c.setID(virtualID));
+
+			context.getAoSession().abortTransaction();
+
+			LOGGER.debug("Transaction '{}' aborted.", id);
+		} catch (AoException e) {
+			LOGGER.error("Unable to abort transaction '" + id + "' due to: " + e.reason, e);
+		}
+	}
+
+	/**
+	 * Once {@link #abort()} is called instance ID of given {@link Core} will be
+	 * reset to {@code 0} which indicates a virtual {@link Entity}, not yet
+	 * persisted, entity.
+	 *
+	 * @param core The {@code Core} of a newly written {@code Entity}.
+	 */
+	void addCreated(Core core) {
+		created.add(core);
+	}
+
+	/**
+	 * Once {@link #commit()} is {@link Core#apply()} will be called to apply
+	 * modified {@link Value} contents and removed related entities.
+	 *
+	 * @param core The {@code Core} of an updated {@code Entity}.
+	 */
+	void addModified(Core core) {
+		modified.add(core);
+	}
+
+	/**
+	 * Returns the {@link ODSContext}.
+	 *
+	 * @return The {@code ODSContext} is returned.
+	 */
+	ATFXContext getContext() {
+		return context;
+	}
+
+	/**
+	 * Returns the {@link ODSModelManager}.
+	 *
+	 * @return The {@code ODSModelManager} is returned.
+	 */
+	ODSModelManager getModelManager() {
+		return context.getODSModelManager();
+	}
+
+	/**
+	 * Returns the {@link CatalogManager}.
+	 *
+	 * @return The {@code CatalogManager} is returned.
+	 */
+	private CatalogManager getCatalogManager() {
+		if (catalogManager == null) {
+			catalogManager = new CatalogManager(this);
+		}
+
+		return catalogManager;
+	}
+
+	/**
+	 * Executes statements for given entities by using given statement factory.
+	 *
+	 * @param <T>              The entity type.
+	 * @param statementFactory Used to create a new statement for a given
+	 *                         {@link EntityType}.
+	 * @param entities         The processed {@code Entity}s.
+	 * @throws AoException         Thrown if the execution fails.
+	 * @throws DataAccessException Thrown if the execution fails.
+	 * @throws IOException         Thrown if a file transfer operation fails.
+	 */
+	private <T extends Entity> void executeStatements(Function<EntityType, BaseStatement> statementFactory,
+			Collection<T> entities) throws AoException, DataAccessException, IOException {
+		Map<EntityType, List<Entity>> entitiesByType = entities.stream()
+				.collect(Collectors.groupingBy(context.getODSModelManager()::getEntityType));
+		for (Entry<EntityType, List<Entity>> entry : entitiesByType.entrySet()) {
+			statementFactory.apply(entry.getKey()).execute(entry.getValue());
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/BaseStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/BaseStatement.java
new file mode 100644
index 0000000..4e28895
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/BaseStatement.java
@@ -0,0 +1,108 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.asam.ods.AoException;
+import org.asam.ods.ApplElemAccess;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+
+/**
+ * A base implementation for execution statements (CREATE, UPDATE, DELETE).
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.BaseStatement
+ */
+abstract class BaseStatement {
+
+	private final ATFXTransaction transaction;
+	private final ODSEntityType entityType;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param transaction The owning {@link ATFXTransaction}.
+	 * @param entityType  The associated {@link EntityType}.
+	 */
+	protected BaseStatement(ATFXTransaction transaction, EntityType entityType) {
+		this.transaction = transaction;
+		this.entityType = (ODSEntityType) entityType;
+	}
+
+	/**
+	 * Executes this statement for given {@link Entity}s.
+	 *
+	 * @param entities The processed {@code Entity}s.
+	 * @throws AoException         Thrown if the execution fails.
+	 * @throws DataAccessException Thrown if the execution fails.
+	 * @throws IOException         Thrown if a file transfer operation fails.
+	 */
+	public abstract void execute(Collection<Entity> entities) throws AoException, DataAccessException, IOException;
+
+	/**
+	 * Returns the {@link ATFXTransaction}.
+	 *
+	 * @return The {@code ODSTransaction} is returned.
+	 */
+	protected ATFXTransaction getTransaction() {
+		return transaction;
+	}
+
+	/**
+	 * Returns the {@link ODSModelManager}.
+	 *
+	 * @return The {@code ODSModelManager} is returned.
+	 */
+	protected ODSModelManager getModelManager() {
+		return transaction.getModelManager();
+	}
+
+	/**
+	 * Returns the {@link QueryService}.
+	 *
+	 * @return The {@code QueryService} is returned.
+	 */
+	protected QueryService getQueryService() {
+		return transaction.getContext().getQueryService()
+				.orElseThrow(() -> new ServiceNotProvidedException(QueryService.class));
+	}
+
+	/**
+	 * Returns the {@link ApplElemAccess}.
+	 *
+	 * @return The {@code ApplElemAccess} is returned.
+	 * @throws AoException Thrown in case of errors.
+	 */
+	protected ApplElemAccess getApplElemAccess() throws AoException {
+		return transaction.getContext().getODSModelManager().getApplElemAccess();
+	}
+
+	/**
+	 * Returns the associated {@link EntityType}.
+	 *
+	 * @return The associated {@code EntityType} is returned.
+	 */
+	protected ODSEntityType getEntityType() {
+		return entityType;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/CatalogManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/CatalogManager.java
new file mode 100644
index 0000000..612c083
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/CatalogManager.java
@@ -0,0 +1,548 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AoException;
+import org.asam.ods.ApplicationAttribute;
+import org.asam.ods.ApplicationElement;
+import org.asam.ods.ApplicationRelation;
+import org.asam.ods.ApplicationStructure;
+import org.asam.ods.BaseAttribute;
+import org.asam.ods.BaseElement;
+import org.asam.ods.BaseStructure;
+import org.asam.ods.DataType;
+import org.asam.ods.RelationRange;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.eclipse.mdm.api.odsadapter.utils.ODSEnumerations;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+
+/**
+ * Used to create, update or delete {@link CatalogComponent},
+ * {@link CatalogSensor} and {@link CatalogAttribute} entities. Modifications of
+ * the listed types results in modifications of the application model.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.CatalogManager
+ */
+final class CatalogManager {
+
+	private final ATFXTransaction transaction;
+
+	private ApplicationStructure applicationStructure;
+	private BaseStructure baseStructure;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param transaction The {@link ATFXTransaction}.
+	 */
+	CatalogManager(ATFXTransaction transaction) {
+		this.transaction = transaction;
+	}
+
+	/**
+	 * Creates for each given {@link CatalogComponent} a corresponding application
+	 * element including all required application relations.
+	 *
+	 * @param catalogComponents The {@code CatalogComponent}s.
+	 * @throws AoException Thrown in case of errors.
+	 */
+	public void createCatalogComponents(Collection<CatalogComponent> catalogComponents) throws AoException {
+		Map<ContextType, List<CatalogComponent>> catalogComponentsByContextType = catalogComponents.stream()
+				.collect(Collectors.groupingBy(CatalogComponent::getContextType));
+
+		for (Entry<ContextType, List<CatalogComponent>> entry : catalogComponentsByContextType.entrySet()) {
+			String odsContextTypeName = ODSUtils.CONTEXTTYPES.get(entry.getKey());
+			ApplicationElement contextRootApplicationElement = getApplicationStructure()
+					.getElementByName(odsContextTypeName);
+			BaseElement contextRootBaseElement = contextRootApplicationElement.getBaseElement();
+			ApplicationElement contextTemplateComponentApplicationElement = getApplicationStructure()
+					.getElementByName("Tpl" + odsContextTypeName + "Comp");
+			BaseElement baseElement = getBaseStructure().getElementByType("Ao" + odsContextTypeName + "Part");
+
+			for (CatalogComponent catalogComponent : entry.getValue()) {
+				ApplicationElement applicationElement = createApplicationElement(catalogComponent.getName(),
+						baseElement);
+
+				// relation context root to context component
+				ApplicationRelation applicationRelation = getApplicationStructure().createRelation();
+				applicationRelation.setElem1(contextRootApplicationElement);
+				applicationRelation.setElem2(applicationElement);
+				applicationRelation.setRelationName(catalogComponent.getName());
+				applicationRelation.setInverseRelationName(odsContextTypeName);
+				applicationRelation
+						.setBaseRelation(getBaseStructure().getRelation(contextRootBaseElement, baseElement));
+				applicationRelation._release();
+
+				// relation template component to context component
+				applicationRelation = getApplicationStructure().createRelation();
+				applicationRelation.setElem1(contextTemplateComponentApplicationElement);
+				applicationRelation.setElem2(applicationElement);
+				applicationRelation.setRelationName(catalogComponent.getName());
+				applicationRelation.setInverseRelationName("Tpl" + odsContextTypeName + "Comp");
+				applicationRelation.setRelationRange(new RelationRange((short) 0, (short) -1));
+				applicationRelation.setInverseRelationRange(new RelationRange((short) 1, (short) 1));
+
+				// release resources
+				applicationElement._release();
+				applicationRelation._release();
+			}
+
+			// release resources
+			contextTemplateComponentApplicationElement._release();
+			contextRootApplicationElement._release();
+			contextRootBaseElement._release();
+			baseElement._release();
+		}
+	}
+
+	/**
+	 * Creates for each given {@link CatalogSensor} a corresponding application
+	 * element including all required application relations.
+	 *
+	 * @param catalogSensors The {@code CatalogSensor}s.
+	 * @throws AoException Thrown in case of errors.
+	 */
+	public void createCatalogSensors(Collection<CatalogSensor> catalogSensors) throws AoException {
+		Map<String, List<CatalogSensor>> catalogSensorsByCatalogComponent = catalogSensors.stream()
+				.collect(Collectors.groupingBy(cs -> cs.getCatalogComponent().getName()));
+
+		ApplicationElement channelApplicationElement = getApplicationStructure().getElementByName("MeaQuantity");
+		BaseElement channelBaseElement = channelApplicationElement.getBaseElement();
+
+		for (Entry<String, List<CatalogSensor>> entry : catalogSensorsByCatalogComponent.entrySet()) {
+			ApplicationElement contextComponentApplicationElement = getApplicationStructure()
+					.getElementByName(entry.getKey());
+			BaseElement contextComponentBaseElement = contextComponentApplicationElement.getBaseElement();
+			ApplicationElement contextTemplateSensorApplicationElement = getApplicationStructure()
+					.getElementByName("TplSensor");
+			BaseElement baseElement = getBaseStructure().getElementByType("AoTestEquipmentPart");
+
+			for (CatalogSensor catalogSensor : entry.getValue()) {
+				ApplicationElement applicationElement = createApplicationElement(catalogSensor.getName(), baseElement);
+
+				// relation context component to context sensor
+				ApplicationRelation applicationRelation = getApplicationStructure().createRelation();
+				applicationRelation.setElem1(contextComponentApplicationElement);
+				applicationRelation.setElem2(applicationElement);
+				applicationRelation.setRelationName(catalogSensor.getName());
+				applicationRelation.setInverseRelationName(entry.getKey());
+				applicationRelation
+						.setBaseRelation(getBaseStructure().getRelation(contextComponentBaseElement, baseElement));
+				applicationRelation._release();
+
+				// relation template sensor to context sensor
+				applicationRelation = getApplicationStructure().createRelation();
+				applicationRelation.setElem1(contextTemplateSensorApplicationElement);
+				applicationRelation.setElem2(applicationElement);
+				applicationRelation.setRelationName(catalogSensor.getName());
+				applicationRelation.setInverseRelationName("TplSensor");
+				applicationRelation.setRelationRange(new RelationRange((short) 0, (short) -1));
+				applicationRelation.setInverseRelationRange(new RelationRange((short) 1, (short) 1));
+				applicationRelation._release();
+
+				// relation channel to context sensor
+				applicationRelation = getApplicationStructure().createRelation();
+				applicationRelation.setElem1(channelApplicationElement);
+				applicationRelation.setElem2(applicationElement);
+				applicationRelation.setRelationName(catalogSensor.getName());
+				applicationRelation.setInverseRelationName("MeaQuantity");
+				applicationRelation.setBaseRelation(getBaseStructure().getRelation(channelBaseElement, baseElement));
+
+				// release resources
+				applicationElement._release();
+				applicationRelation._release();
+			}
+
+			// release resources
+			contextComponentApplicationElement._release();
+			contextTemplateSensorApplicationElement._release();
+			contextComponentBaseElement._release();
+			baseElement._release();
+		}
+
+		// release resources
+		channelApplicationElement._release();
+		channelBaseElement._release();
+	}
+
+	/**
+	 * Creates for each given {@link CatalogAttribute} a corresponding application
+	 * attribute.
+	 *
+	 * @param catalogAttributes The {@code CatalogAttribute}s.
+	 * @throws AoException Thrown in case of errors.
+	 */
+	public void createCatalogAttributes(Collection<CatalogAttribute> catalogAttributes) throws AoException {
+		Map<String, List<CatalogAttribute>> catalogAttributesByCatalogComponent = catalogAttributes.stream()
+				.collect(Collectors.groupingBy(CatalogManager::getParentName));
+
+		for (Entry<String, List<CatalogAttribute>> entry : catalogAttributesByCatalogComponent.entrySet()) {
+			ApplicationElement applicationElement = getApplicationStructure().getElementByName(entry.getKey());
+
+			for (CatalogAttribute catalogAttribute : entry.getValue()) {
+
+				ApplicationAttribute applicationAttribute = applicationElement.createAttribute();
+				DataType dataType = ODSUtils.VALUETYPES.get(catalogAttribute.getValueType());
+				applicationAttribute.setDataType(dataType);
+				applicationAttribute.setName(catalogAttribute.getName());
+				if (dataType == DataType.DT_ENUM) {
+					applicationAttribute.setEnumerationDefinition(getApplicationStructure().getEnumerationDefinition(
+							ODSEnumerations.getEnumName(catalogAttribute.getEnumerationObject())));
+				}
+				Optional<Unit> unit = catalogAttribute.getUnit();
+				if (unit.isPresent()) {
+					applicationAttribute.setUnit(ODSConverter.toODSID(unit.get().getID()));
+				}
+
+				// release resources
+				applicationAttribute._release();
+			}
+
+			// release resources
+			applicationElement._release();
+		}
+	}
+
+	/**
+	 * Updates the application attribute for each given {@link CatalogAttribute}.
+	 *
+	 * @param catalogAttributes The {@code CatalogAttribute}s.
+	 * @throws AoException Thrown in case of errors.
+	 */
+	public void updateCatalogAttributes(List<CatalogAttribute> catalogAttributes) throws AoException {
+		Map<String, List<CatalogAttribute>> catalogAttributesByCatalogComponent = catalogAttributes.stream()
+				.collect(Collectors.groupingBy(CatalogManager::getParentName));
+
+		for (Entry<String, List<CatalogAttribute>> entry : catalogAttributesByCatalogComponent.entrySet()) {
+			ApplicationElement applicationElement = getApplicationStructure().getElementByName(entry.getKey());
+
+			for (CatalogAttribute catalogAttribute : entry.getValue()) {
+
+				ApplicationAttribute applicationAttribute = applicationElement
+						.getAttributeByName(catalogAttribute.getName());
+
+				Optional<Unit> unit = catalogAttribute.getUnit();
+				if (unit.isPresent()) {
+					applicationAttribute.setUnit(ODSConverter.toODSID(unit.get().getID()));
+				}
+
+				// release resources
+				applicationAttribute._release();
+			}
+
+			// release resources
+			applicationElement._release();
+		}
+	}
+
+	/**
+	 * Deletes the corresponding application element for each given
+	 * {@link CatalogComponent}. Deleting a {@code CatalogComponent} is only allowed
+	 * if it is not used in templates and all of its children could be deleted. So
+	 * at first it is tried to delete its {@link CatalogAttribute}s and
+	 * {@link CatalogSensor}s. On success it is ensured none of the given {@code
+	 * CatalogComponent}s is used in templates. Finally the corresponding
+	 * application elements are deleted.
+	 *
+	 * @param catalogComponents The {@code CatalogComponent}s.
+	 * @throws AoException         Thrown in case of errors.
+	 * @throws DataAccessException Thrown in case of errors.
+	 */
+	public void deleteCatalogComponents(Collection<CatalogComponent> catalogComponents)
+			throws AoException, DataAccessException {
+		List<CatalogAttribute> attributes = new ArrayList<>();
+		List<CatalogSensor> sensors = new ArrayList<>();
+		for (CatalogComponent catalogComponent : catalogComponents) {
+			attributes.addAll(catalogComponent.getCatalogAttributes());
+			sensors.addAll(catalogComponent.getCatalogSensors());
+		}
+		transaction.delete(sensors);
+		transaction.delete(attributes);
+
+		if (areReferencedInTemplates(catalogComponents)) {
+			throw new DataAccessException(
+					"Unable to delete given catalog components since at least " + "one is used in templates.");
+		}
+
+		for (CatalogComponent catalogComponent : catalogComponents) {
+			ApplicationElement applicationElement = getApplicationStructure()
+					.getElementByName(catalogComponent.getName());
+			for (ApplicationRelation applicationRelation : applicationElement.getAllRelations()) {
+				getApplicationStructure().removeRelation(applicationRelation);
+
+				// release resources
+				applicationRelation._release();
+			}
+			getApplicationStructure().removeElement(applicationElement);
+
+			// release resources
+			applicationElement._release();
+		}
+	}
+
+	/**
+	 * Deletes the corresponding application element for each given
+	 * {@link CatalogSensor}. Deleting a {@code CatalogSensor} is only allowed if it
+	 * is not used in templates and all of its children could be deleted. So at
+	 * first it is tried to delete its {@link CatalogAttribute}s. On success it is
+	 * ensured none of the given {@code CatalogSensor}s is used in templates.
+	 * Finally the corresponding application elements are deleted.
+	 *
+	 * @param catalogSensors The {@code CatalogSensor}s.
+	 * @throws AoException         Thrown in case of errors.
+	 * @throws DataAccessException Thrown in case of errors.
+	 */
+	public void deleteCatalogSensors(Collection<CatalogSensor> catalogSensors) throws AoException, DataAccessException {
+		List<CatalogAttribute> attributes = new ArrayList<>();
+		for (CatalogSensor catalogSensor : catalogSensors) {
+			attributes.addAll(catalogSensor.getCatalogAttributes());
+		}
+		transaction.delete(attributes);
+
+		if (areReferencedInTemplates(catalogSensors)) {
+			throw new DataAccessException(
+					"Unable to delete given catalog sensors since at " + "least one is used in templates.");
+		}
+
+		for (CatalogSensor catalogSensor : catalogSensors) {
+			ApplicationElement applicationElement = getApplicationStructure().getElementByName(catalogSensor.getName());
+			for (ApplicationRelation applicationRelation : applicationElement.getAllRelations()) {
+				getApplicationStructure().removeRelation(applicationRelation);
+
+				// release resources
+				applicationRelation._release();
+			}
+			getApplicationStructure().removeElement(applicationElement);
+
+			// release resources
+			applicationElement._release();
+		}
+
+	}
+
+	/**
+	 * Deletes the corresponding application attributes for each given
+	 * {@link CatalogAttribute}. Deleting a {@code CatalogAttribute} is only allowed
+	 * if it is not used in templates. So at first it is ensured none of the given
+	 * {@code CatalogAttribute}s is used in templates and finally the corresponding
+	 * application attributes are deleted.
+	 *
+	 * @param catalogAttributes The {@code CatalogAttribute}s.
+	 * @throws AoException         Thrown in case of errors.
+	 * @throws DataAccessException Thrown in case of errors.
+	 */
+	public void deleteCatalogAttributes(Collection<CatalogAttribute> catalogAttributes)
+			throws AoException, DataAccessException {
+		if (areReferencedInTemplates(catalogAttributes)) {
+			throw new DataAccessException(
+					"Unable to delete given catalog attributes since at least " + "one is used in templates.");
+		}
+
+		Map<String, List<CatalogAttribute>> catalogAttributesByParent = catalogAttributes.stream()
+				.collect(Collectors.groupingBy(CatalogManager::getParentName));
+
+		for (Entry<String, List<CatalogAttribute>> entry : catalogAttributesByParent.entrySet()) {
+			ApplicationElement applicationElement = getApplicationStructure().getElementByName(entry.getKey());
+
+			for (CatalogAttribute catalogAttribute : entry.getValue()) {
+				ApplicationAttribute applicationAttribute = applicationElement
+						.getAttributeByName(catalogAttribute.getName());
+				applicationElement.removeAttribute(applicationAttribute);
+
+				// release resources
+				applicationAttribute._release();
+			}
+
+			// release resources
+			applicationElement._release();
+		}
+	}
+
+	/**
+	 * Releases cached resources.
+	 */
+	public void clear() {
+		if (applicationStructure != null) {
+			applicationStructure._release();
+		}
+
+		if (baseStructure != null) {
+			baseStructure._release();
+		}
+	}
+
+	/**
+	 * Creates a new {@link ApplicationElement} with given name and
+	 * {@link BaseElement}. The returned {@code ApplicationElement} will be created
+	 * with the three mandatory {@link ApplicationAttribute}s for 'Id', 'Name' and
+	 * 'MimeType'.
+	 *
+	 * @param name        The name of the application element.
+	 * @param baseElement The {@code BaseElement} the created {@code
+	 * 		ApplicationElement} will be derived from.
+	 * @return The created {@code ApplicationElement} is returned.
+	 * @throws AoException Thrown in case of errors.
+	 */
+	private ApplicationElement createApplicationElement(String name, BaseElement baseElement) throws AoException {
+		ApplicationElement applicationElement = getApplicationStructure().createElement(baseElement);
+		applicationElement.setName(name);
+
+		// Id
+		ApplicationAttribute idApplicationAttribute = applicationElement.getAttributeByBaseName("id");
+		idApplicationAttribute.setName("Id");
+		idApplicationAttribute.setDataType(DataType.DT_LONGLONG);
+		idApplicationAttribute.setIsAutogenerated(true);
+
+		// Name
+		ApplicationAttribute nameApplicationAttribute = applicationElement.getAttributeByBaseName("name");
+		nameApplicationAttribute.setName("Name");
+		nameApplicationAttribute.setLength(50);
+
+		// MimeType
+		BaseAttribute mimeTypeBaseAttribute = baseElement.getAttributes("mime_type")[0];
+		ApplicationAttribute mimeTypeApplicationAttribute = applicationElement.createAttribute();
+		mimeTypeApplicationAttribute.setBaseAttribute(mimeTypeBaseAttribute);
+		mimeTypeApplicationAttribute.setName("MimeType");
+		mimeTypeApplicationAttribute.setDataType(DataType.DT_STRING);
+		mimeTypeApplicationAttribute.setLength(256);
+		mimeTypeApplicationAttribute.setIsObligatory(true);
+
+		// release resources
+		idApplicationAttribute._release();
+		nameApplicationAttribute._release();
+		mimeTypeApplicationAttribute._release();
+		mimeTypeBaseAttribute._release();
+
+		return applicationElement;
+	}
+
+	/**
+	 * Returns the cached {@link ApplicationStructure}.
+	 *
+	 * @return The {@code ApplicationStructure} is returned.
+	 * @throws AoException Thrown if unable to access the {@code
+	 * 		ApplicationStructure}.
+	 */
+	private ApplicationStructure getApplicationStructure() throws AoException {
+		if (applicationStructure == null) {
+			applicationStructure = transaction.getModelManager().getAoSession().getApplicationStructure();
+		}
+
+		return applicationStructure;
+	}
+
+	/**
+	 * Returns the cached {@link BaseStructure}.
+	 *
+	 * @return The {@code BaseStructure} is returned.
+	 * @throws AoException Thrown if unable to access the {@code
+	 * 		BaseStructure}.
+	 */
+	private BaseStructure getBaseStructure() throws AoException {
+		if (baseStructure == null) {
+			baseStructure = transaction.getModelManager().getAoSession().getBaseStructure();
+		}
+
+		return baseStructure;
+	}
+
+	/**
+	 * Checks whether given {@link Entity}s are referenced in templates.
+	 *
+	 * @param entities The checked entities ({@link CatalogComponent},
+	 *                 {@link CatalogSensor} or {@link CatalogAttribute}).
+	 * @return Returns {@code true} if at least one entity is referenced in a
+	 *         template.
+	 * @throws AoException         Thrown on errors.
+	 * @throws DataAccessException Thrown on errors.
+	 */
+	private boolean areReferencedInTemplates(Collection<? extends Entity> entities)
+			throws AoException, DataAccessException {
+		Map<EntityType, List<Entity>> entitiesByEntityType = entities.stream()
+				.collect(Collectors.groupingBy(transaction.getModelManager()::getEntityType));
+
+		for (Entry<EntityType, List<Entity>> entry : entitiesByEntityType.entrySet()) {
+			EntityType source = entry.getKey();
+			EntityType target = transaction.getModelManager().getEntityType(source.getName().replace("Cat", "Tpl"));
+
+			Query query = transaction.getContext().getQueryService()
+					.orElseThrow(() -> new ServiceNotProvidedException(QueryService.class)).createQuery()
+					.selectID(target).join(source, target);
+
+			List<Result> results = query.fetch(Filter.and().add(
+					ComparisonOperator.IN_SET.create(source.getIDAttribute(), collectInstanceIDs(entry.getValue()))));
+			if (results.size() > 0) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Collect the instance IDs of all given {@link Entity}s.
+	 *
+	 * @param entities The {@link Entity}s.
+	 * @return The instance IDs a {@code String[]} are turned.
+	 */
+	private static String[] collectInstanceIDs(List<Entity> entities) {
+		String[] ids = new String[entities.size()];
+
+		for (int i = 0; i < ids.length; i++) {
+			ids[i] = entities.get(i).getID();
+		}
+
+		return ids;
+	}
+
+	/**
+	 * Returns the parent name for given {@link CatalogAttribute}.
+	 *
+	 * @param catalogAttribute The {@code CatalogAttribute}.
+	 * @return The parent name is returned.
+	 */
+	private static String getParentName(CatalogAttribute catalogAttribute) {
+		Optional<CatalogComponent> catalogComponent = catalogAttribute.getCatalogComponent();
+		if (catalogComponent.isPresent()) {
+			return catalogComponent.get().getName();
+		}
+
+		return catalogAttribute.getCatalogSensor()
+				.orElseThrow(() -> new IllegalStateException("Parent entity is unknown.")).getName();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/DeleteStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/DeleteStatement.java
new file mode 100644
index 0000000..08b7fdf
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/DeleteStatement.java
@@ -0,0 +1,227 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AoException;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FilesAttachable;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.ParameterSet;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.JoinType;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Delete statement is used to delete entities with their children.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.DeleteStatement
+ */
+final class DeleteStatement extends BaseStatement {
+
+	private static final List<String> AUTO_DELETABLE = Arrays.asList("MeaQuantity", "SubMatrix", "LocalColumn",
+			"ExternalComponent");
+	private static final Logger LOGGER = LoggerFactory.getLogger(DeleteStatement.class);
+
+	private final boolean useAutoDelete;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param transaction   The owning {@link ATFXTransaction}.
+	 * @param entityType    The associated {@link EntityType}.
+	 * @param useAutoDelete If {@code true} child relations of {@link Measurement}
+	 *                      entities are not followed.
+	 */
+	DeleteStatement(ATFXTransaction transaction, EntityType entityType, boolean useAutoDelete) {
+		super(transaction, entityType);
+		this.useAutoDelete = useAutoDelete;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void execute(Collection<Entity> entities) throws AoException, DataAccessException {
+		if (entities.stream().filter(e -> !e.getTypeName().equals(getEntityType().getName())).findAny().isPresent()) {
+			throw new IllegalArgumentException("At least one given entity is of incompatible type.");
+		}
+
+		long start = System.currentTimeMillis();
+		int amount = delete(getEntityType(), entities.stream().map(Entity::getID).collect(Collectors.toSet()), false);
+		LOGGER.debug("{} instances deleted in {} ms.", amount, System.currentTimeMillis() - start);
+	}
+
+	/**
+	 * Recursively follows child relations of given entities and deletes all child
+	 * entities before deleting parent entities.
+	 *
+	 * @param entityType     {@link EntityType} of the deleted entities.
+	 * @param instanceIDs    Instance IDs of entities which have to be deleted.
+	 * @param ignoreSiblings Is it required to check whether {@link Measurement}
+	 *                       siblings share a common {@link ContextRoot}s.
+	 * @return Returns the total number of deleted instances.
+	 * @throws AoException         Thrown if unable to delete entities.
+	 * @throws DataAccessException Thrown if unable to query child entities.
+	 */
+	private int delete(EntityType entityType, Collection<String> instanceIDs, boolean ignoreSiblings)
+			throws AoException, DataAccessException {
+		if (instanceIDs.isEmpty()) {
+			return 0;
+		}
+
+		Query query = getQueryService().createQuery().selectID(entityType);
+		for (Relation relation : entityType.getChildRelations()) {
+			if (useAutoDelete && AUTO_DELETABLE.contains(relation.getTarget().getName())) {
+				continue;
+			}
+
+			if (!relation.getTarget().equals(relation.getSource())) {
+				query.join(relation, JoinType.OUTER).selectID(relation.getTarget());
+			}
+		}
+
+		// select attributes containing file links only for entity types
+		// implementing FilesAttachable
+		EntityConfig<?> entityConfig = getModelManager().getEntityConfig(entityType);
+		if (FilesAttachable.class.isAssignableFrom(entityConfig.getEntityClass())) {
+			entityType.getAttributes().stream().filter(a -> a.getValueType().isFileLinkType()).forEach(query::select);
+		}
+
+		EntityType testStep = getModelManager().getEntityType(TestStep.class);
+		EntityType measurement = getModelManager().getEntityType(Measurement.class);
+		EntityType channel = getModelManager().getEntityType(Channel.class);
+
+		EntityType unitUnderTest = getModelManager().getEntityType(ContextRoot.class, ContextType.UNITUNDERTEST);
+		EntityType testSequence = getModelManager().getEntityType(ContextRoot.class, ContextType.TESTSEQUENCE);
+		EntityType testEquipment = getModelManager().getEntityType(ContextRoot.class, ContextType.TESTEQUIPMENT);
+
+		// type in this list must be deleted AFTER this this instances have been
+		// deleted
+		// informative relation is considered as a child relation
+		List<EntityType> delayedDelete = new ArrayList<>();
+
+		// join context roots
+		if (measurement.equals(entityType) || testStep.equals(entityType)) {
+			query.join(entityType.getRelation(unitUnderTest), JoinType.OUTER).selectID(unitUnderTest);
+			query.join(entityType.getRelation(testSequence), JoinType.OUTER).selectID(testSequence);
+			query.join(entityType.getRelation(testEquipment), JoinType.OUTER).selectID(testEquipment);
+			delayedDelete.addAll(Arrays.asList(unitUnderTest, testSequence, testEquipment));
+		}
+
+		// join parameter sets
+		if (measurement.equals(entityType) || channel.equals(entityType)) {
+			EntityType parameterSet = getModelManager().getEntityType(ParameterSet.class);
+			query.join(entityType.getRelation(parameterSet), JoinType.OUTER).selectID(parameterSet);
+		}
+
+		Filter filter = Filter.or().ids(entityType, instanceIDs);
+		entityType.getParentRelations().stream().filter(r -> r.getTarget().equals(entityType))
+				.forEach(relation -> filter.ids(relation, instanceIDs));
+
+		// query child IDs
+		Map<EntityType, Set<String>> children = new HashMap<>();
+		for (Result result : query.fetch(filter)) {
+			// load children of other types
+			result.stream().filter(r -> r.getID() != null && r.getID().length() > 0).forEach(r -> {
+				children.computeIfAbsent(r.getEntityType(), k -> new HashSet<>()).add(r.getID());
+			});
+		}
+
+		// omit context roots with references to not removed measurements
+		if (!ignoreSiblings && measurement.equals(entityType)) {
+			for (EntityType contextRoot : Arrays.asList(unitUnderTest, testSequence, testEquipment)) {
+				Set<String> contextRootIDs = children.getOrDefault(contextRoot, Collections.emptySet());
+				if (contextRootIDs.isEmpty()) {
+					continue;
+				}
+
+				Query contextQuery = getQueryService().createQuery();
+				contextQuery.selectID(contextRoot, measurement);
+				contextQuery.join(contextRoot, measurement);
+
+				for (Result result : contextQuery.fetch(Filter.idsOnly(contextRoot, contextRootIDs))) {
+					if (instanceIDs.contains(result.getRecord(measurement).getID())) {
+						continue;
+					}
+
+					// context root references a not removed measurement
+					contextRootIDs.remove(result.getRecord(contextRoot).getID());
+				}
+			}
+		}
+
+		int amount = 0;
+		// delete real children
+		List<Entry<EntityType, Set<String>>> consideredChildren = new ArrayList<>();
+		for (Entry<EntityType, Set<String>> entry : children.entrySet()) {
+			EntityType childType = entry.getKey();
+			Set<String> childInstanceIDs = entry.getValue();
+			if (entityType.equals(childType)) {
+				childInstanceIDs.removeAll(instanceIDs);
+			} else if (delayedDelete.contains(entry.getKey())) {
+				consideredChildren.add(entry);
+				continue;
+			}
+			amount += delete(entry.getKey(), childInstanceIDs, true);
+		}
+
+		getApplElemAccess().deleteInstances(((ODSEntityType) entityType).getODSID(), toODSIDs(instanceIDs));
+
+		// delete considered children (informative relation)
+		for (Entry<EntityType, Set<String>> entry : consideredChildren) {
+			amount += delete(entry.getKey(), entry.getValue(), true);
+		}
+
+		return amount + instanceIDs.size();
+	}
+
+	/**
+	 * Converts given {@code Collection} of instance IDs to ODS a {@link T_LONGLONG}
+	 * array.
+	 *
+	 * @param instanceIDs The instance IDs.
+	 * @return The corresponding ODS {@code T_LONGLONG[]} is returned.
+	 */
+	private T_LONGLONG[] toODSIDs(Collection<String> instanceIDs) {
+		return instanceIDs.stream().map(ODSConverter::toODSID).toArray(T_LONGLONG[]::new);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/InsertStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/InsertStatement.java
new file mode 100644
index 0000000..f71916c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/InsertStatement.java
@@ -0,0 +1,277 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.asam.ods.AIDName;
+import org.asam.ods.AIDNameValueSeqUnitId;
+import org.asam.ods.AoException;
+import org.asam.ods.ElemId;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.Sortable;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.Aggregation;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Insert statement is used to write new entities and their children.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.InsertStatement
+ */
+final class InsertStatement extends BaseStatement {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(InsertStatement.class);
+
+	private final Map<Class<? extends Entity>, List<Entity>> childrenMap = new HashMap<>();
+	private final List<Core> cores = new ArrayList<>();
+	private final Map<String, List<Value>> insertMap = new HashMap<>();
+
+	private final List<FileLink> fileLinkToUpload = new ArrayList<>();
+
+	private final Map<String, SortIndexTestSteps> sortIndexTestSteps = new HashMap<>();
+	private boolean loadSortIndex;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param transaction The owning {@link ATFXTransaction}.
+	 * @param entityType  The associated {@link EntityType}.
+	 */
+	InsertStatement(ATFXTransaction transaction, EntityType entityType) {
+		super(transaction, entityType);
+
+		loadSortIndex = getModelManager().getEntityType(TestStep.class).equals(getEntityType());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void execute(Collection<Entity> entities) throws AoException, DataAccessException, IOException {
+		entities.stream().map(ODSEntityFactory::extract).forEach(this::readEntityCore);
+		execute();
+	}
+
+	/**
+	 * Executes this statement for given {@link Core}s.
+	 *
+	 * @param cores The processed {@code Core}s.
+	 * @throws AoException         Thrown if the execution fails.
+	 * @throws DataAccessException Thrown if the execution fails.
+	 * @throws IOException         Thrown if a file transfer operation fails.
+	 */
+	public void executeWithCores(Collection<Core> cores) throws AoException, DataAccessException, IOException {
+		cores.forEach(this::readEntityCore);
+		execute();
+	}
+
+	/**
+	 * Uploads new {@link FileLink}s, adjusts sort indices for new {@link TestStep}
+	 * entities and writes collected insertion data at once. Once new entities are
+	 * written their children are created by delegation to the
+	 * {@link ATFXTransaction}.
+	 *
+	 * @throws AoException         Thrown if the execution fails.
+	 * @throws DataAccessException Thrown if the execution fails.
+	 * @throws IOException         Thrown if a file transfer operation fails.
+	 */
+	private void execute() throws AoException, DataAccessException, IOException {
+		List<AIDNameValueSeqUnitId> anvsuList = new ArrayList<>();
+		T_LONGLONG aID = getEntityType().getODSID();
+
+		// TODO tracing progress in this method...
+
+		if (loadSortIndex && !sortIndexTestSteps.isEmpty()) {
+			adjustMissingSortIndices();
+		}
+
+		for (Entry<String, List<Value>> entry : insertMap.entrySet()) {
+			Attribute attribute = getEntityType().getAttribute(entry.getKey());
+
+			AIDNameValueSeqUnitId anvsu = new AIDNameValueSeqUnitId();
+			anvsu.attr = new AIDName(aID, entry.getKey());
+			anvsu.unitId = ODSConverter.toODSLong(0);
+			anvsu.values = ODSConverter.toODSValueSeq(attribute, entry.getValue());
+			anvsuList.add(anvsu);
+		}
+
+		long start = System.currentTimeMillis();
+		ElemId[] elemIds = getApplElemAccess()
+				.insertInstances(anvsuList.toArray(new AIDNameValueSeqUnitId[anvsuList.size()]));
+		for (int i = 0; i < elemIds.length; i++) {
+			cores.get(i).setID(Long.toString(ODSConverter.fromODSLong(elemIds[i].iid)));
+		}
+		long stop = System.currentTimeMillis();
+
+		LOGGER.debug("{} " + getEntityType() + " instances created in {} ms.", elemIds.length, stop - start);
+
+		for (List<Entity> children : childrenMap.values()) {
+			getTransaction().create(children);
+		}
+	}
+
+	/**
+	 * Reads given {@link Core} and prepares its data to be written:
+	 *
+	 * <ul>
+	 * <li>collect new {@link FileLink}s</li>
+	 * <li>trace missing sort indices of TestSteps</li>
+	 * <li>collect property {@link Value}s</li>
+	 * <li>collect foreign key {@code Value}s</li>
+	 * <li>collect child entities for recursive creation</li>
+	 * </ul>
+	 *
+	 * @param core The {@code Core}.
+	 */
+	private void readEntityCore(Core core) {
+		if (!core.getTypeName().equals(getEntityType().getName())) {
+			throw new IllegalArgumentException("Entity core '" + core.getTypeName()
+					+ "' is incompatible with current insert statement for entity type '" + getEntityType() + "'.");
+		}
+
+		cores.add(core);
+
+		if (loadSortIndex) {
+			if ((Integer) core.getValues().get(Sortable.ATTR_SORT_INDEX).extract() < 0) {
+				sortIndexTestSteps.computeIfAbsent(core.getPermanentStore().get(Test.class).getID(),
+						k -> new SortIndexTestSteps()).testStepCores.add(core);
+			}
+		}
+
+		// add all entity values
+		for (Value value : core.getAllValues().values()) {
+			insertMap.computeIfAbsent(value.getName(), k -> new ArrayList<>()).add(value);
+		}
+
+		// collect file links
+		fileLinkToUpload.addAll(core.getAddedFileLinks());
+
+		// define "empty" values for informative relations
+		for (Relation relation : getEntityType().getInfoRelations()) {
+			insertMap.computeIfAbsent(relation.getName(), k -> new ArrayList<>()).add(relation.createValue());
+		}
+
+		// define "empty" values for parent relations
+		for (Relation relation : getEntityType().getParentRelations()) {
+			insertMap.computeIfAbsent(relation.getName(), k -> new ArrayList<>()).add(relation.createValue());
+		}
+
+		// replace "empty" relation values with corresponding instance IDs
+		setRelationIDs(core.getMutableStore().getCurrent());
+		setRelationIDs(core.getPermanentStore().getCurrent());
+
+		for (Entry<Class<? extends Deletable>, List<? extends Deletable>> entry : core.getChildrenStore().getCurrent()
+				.entrySet()) {
+			childrenMap.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(entry.getValue());
+		}
+
+		getTransaction().addModified(core);
+		getTransaction().addCreated(core);
+	}
+
+	/**
+	 * Overwrites empty foreign key {@link Value} containers.
+	 *
+	 * @param relatedEntities The related {@link Entity}s.
+	 */
+	private void setRelationIDs(Collection<Entity> relatedEntities) {
+		for (Entity relatedEntity : relatedEntities) {
+			if (!ODSUtils.isValidID(relatedEntity.getID())) {
+				throw new IllegalArgumentException("Related entity must be a persited entity.");
+			}
+
+			Relation relation = getEntityType().getRelation(getModelManager().getEntityType(relatedEntity));
+			List<Value> relationValues = insertMap.get(relation.getName());
+			if (relationValues == null) {
+				throw new IllegalStateException("Relation '" + relation + "' is incompatible with insert statement "
+						+ "for entity type '" + getEntityType() + "'");
+			}
+			relationValues.get(relationValues.size() - 1).set(relatedEntity.getID());
+		}
+	}
+
+	/**
+	 * Adjusts missing sort indices for {@link TestStep}s by querying last used max
+	 * sort index.
+	 *
+	 * @throws DataAccessException Thrown if unable to query used sort indices.
+	 */
+	private void adjustMissingSortIndices() throws DataAccessException {
+		EntityType testStep = getEntityType();
+		EntityType test = getModelManager().getEntityType(Test.class);
+		Relation parentRelation = testStep.getRelation(test);
+
+		Attribute attrSortIndex = testStep.getAttribute(Sortable.ATTR_SORT_INDEX);
+		Query query = getQueryService().createQuery().select(parentRelation.getAttribute())
+				.select(attrSortIndex, Aggregation.MAXIMUM).group(parentRelation.getAttribute());
+
+		Filter filter = Filter.idsOnly(parentRelation, sortIndexTestSteps.keySet());
+		for (Result result : query.fetch(filter)) {
+			Record record = result.getRecord(testStep);
+			int sortIndex = result.getValue(attrSortIndex, Aggregation.MAXIMUM).extract();
+			sortIndexTestSteps.remove(record.getID(parentRelation).get()).setIndices(sortIndex + 1);
+		}
+
+		// start at 1 for all remaining
+		sortIndexTestSteps.values().forEach(tss -> tss.setIndices(0));
+	}
+
+	/**
+	 * Utility class to write missing sort index of new {@link TestStep}s.
+	 */
+	private static final class SortIndexTestSteps {
+
+		private List<Core> testStepCores = new ArrayList<>();
+
+		/**
+		 * Assigns sort indices to {@link Core}s starting at given index.
+		 *
+		 * @param startIndex The start index.
+		 */
+		private void setIndices(int startIndex) {
+			int index = startIndex;
+			for (Core core : testStepCores) {
+				core.getValues().get(Sortable.ATTR_SORT_INDEX).set(index++);
+			}
+		}
+
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/UpdateStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/UpdateStatement.java
new file mode 100644
index 0000000..c8b0a28
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/UpdateStatement.java
@@ -0,0 +1,225 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AIDName;
+import org.asam.ods.AIDNameValueSeqUnitId;
+import org.asam.ods.AoException;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityStore;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Insert statement is used to update entities and their children.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.UpdateStatement
+ */
+final class UpdateStatement extends BaseStatement {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(UpdateStatement.class);
+
+	private final Map<Class<? extends Entity>, List<Entity>> childrenToCreate = new HashMap<>();
+	private final Map<Class<? extends Entity>, List<Entity>> childrenToUpdate = new HashMap<>();
+	private final Map<Class<? extends Deletable>, List<Deletable>> childrenToRemove = new HashMap<>();
+	private Map<String, List<Value>> updateMap = new HashMap<>();
+
+	private final List<String> nonUpdatableRelationNames;
+	private final boolean ignoreChildren;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param transaction    The owning {@link ATFXTransaction}.
+	 * @param entityType     The associated {@link EntityType}.
+	 * @param ignoreChildren If {@code true}, then child entities won't be
+	 *                       processed.
+	 */
+	UpdateStatement(ATFXTransaction transaction, EntityType entityType, boolean ignoreChildren) {
+		super(transaction, entityType);
+
+		nonUpdatableRelationNames = entityType.getInfoRelations().stream().map(Relation::getName)
+				.collect(Collectors.toList());
+		this.ignoreChildren = ignoreChildren;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void execute(Collection<Entity> entities) throws AoException, DataAccessException, IOException {
+		for (Entity entity : entities) {
+			readEntityCore(ODSEntityFactory.extract(entity));
+		}
+
+		// TODO tracing progress in this method...
+
+		List<AIDNameValueSeqUnitId> anvsuList = new ArrayList<>();
+		T_LONGLONG aID = getEntityType().getODSID();
+
+		for (Entry<String, List<Value>> entry : updateMap.entrySet()) {
+			if (nonUpdatableRelationNames.contains(entry.getKey())) {
+				// skip "empty" informative relation sequence
+				continue;
+			}
+
+			Attribute attribute = getEntityType().getAttribute(entry.getKey());
+
+			AIDNameValueSeqUnitId anvsu = new AIDNameValueSeqUnitId();
+			anvsu.attr = new AIDName(aID, entry.getKey());
+			anvsu.unitId = ODSConverter.toODSLong(0);
+			anvsu.values = ODSConverter.toODSValueSeq(attribute, entry.getValue());
+			anvsuList.add(anvsu);
+		}
+
+		long start = System.currentTimeMillis();
+		getApplElemAccess().updateInstances(anvsuList.toArray(new AIDNameValueSeqUnitId[anvsuList.size()]));
+		long stop = System.currentTimeMillis();
+
+		LOGGER.debug("{} " + getEntityType() + " instances updated in {} ms.", entities.size(), stop - start);
+
+		// delete first to make sure naming collisions do not occur!
+		for (List<Deletable> children : childrenToRemove.values()) {
+			getTransaction().delete(children);
+		}
+		for (List<Entity> children : childrenToCreate.values()) {
+			getTransaction().create(children);
+		}
+		for (List<Entity> children : childrenToUpdate.values()) {
+			getTransaction().update(children);
+		}
+	}
+
+	/**
+	 * Reads given {@link Core} and prepares its data to be written:
+	 *
+	 * <ul>
+	 * <li>collect new and removed {@link FileLink}s</li>
+	 * <li>collect property {@link Value}s</li>
+	 * <li>collect foreign key {@code Value}s</li>
+	 * <li>collect child entities for recursive create/update/delete</li>
+	 * </ul>
+	 *
+	 * @param core The {@code Core}.
+	 * @throws DataAccessException Thrown in case of errors.
+	 */
+	private void readEntityCore(Core core) throws DataAccessException {
+		if (!core.getTypeName().equals(getEntityType().getName())) {
+			throw new IllegalArgumentException("Entity core '" + core.getTypeName()
+					+ "' is incompatible with current update statement for entity type '" + getEntityType() + "'.");
+		}
+
+		// add all entity values
+		for (Value value : core.getAllValues().values()) {
+			updateMap.computeIfAbsent(value.getName(), k -> new ArrayList<>()).add(value);
+		}
+
+		updateMap.computeIfAbsent(getEntityType().getIDAttribute().getName(), k -> new ArrayList<>())
+				.add(getEntityType().getIDAttribute().createValue(core.getID()));
+
+		// define "empty" values for ALL informative relations
+		for (Relation relation : getEntityType().getInfoRelations()) {
+			updateMap.computeIfAbsent(relation.getName(), k -> new ArrayList<>()).add(relation.createValue());
+		}
+
+		// preserve "empty" relation values for removed related entities
+		EntityStore mutableStore = core.getMutableStore();
+		mutableStore.getRemoved().stream().map(e -> getModelManager().getEntityType(e))
+				.map(getEntityType()::getRelation).map(Relation::getName).forEach(nonUpdatableRelationNames::remove);
+
+		// replace "empty" relation values with corresponding instance IDs
+		setRelationIDs(mutableStore.getCurrent());
+
+		collectChildEntities(core);
+
+		getTransaction().addModified(core);
+	}
+
+	/**
+	 * Collects child entities for recursive processing.
+	 *
+	 * @param core The {@link Core}.
+	 */
+	private void collectChildEntities(Core core) {
+		if (ignoreChildren) {
+			return;
+		}
+
+		for (Entry<Class<? extends Deletable>, List<? extends Deletable>> entry : core.getChildrenStore().getCurrent()
+				.entrySet()) {
+			Map<Boolean, List<Entity>> partition = entry.getValue().stream()
+					.collect(Collectors.partitioningBy(e -> ODSUtils.isValidID(e.getID())));
+			List<Entity> virtualEntities = partition.get(Boolean.FALSE);
+			if (virtualEntities != null && !virtualEntities.isEmpty()) {
+				childrenToCreate.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(virtualEntities);
+			}
+			List<Entity> existingEntities = partition.get(Boolean.TRUE);
+			if (existingEntities != null && !existingEntities.isEmpty()) {
+				childrenToUpdate.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(existingEntities);
+			}
+		}
+
+		for (Entry<Class<? extends Deletable>, List<? extends Deletable>> entry : core.getChildrenStore().getRemoved()
+				.entrySet()) {
+			List<Deletable> toDelete = entry.getValue().stream().filter(e -> ODSUtils.isValidID(e.getID()))
+					.collect(Collectors.toList());
+			childrenToRemove.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(toDelete);
+		}
+	}
+
+	/**
+	 * Overwrites empty foreign key {@link Value} containers.
+	 *
+	 * @param relatedEntities The related {@link Entity}s.
+	 */
+	private void setRelationIDs(Collection<Entity> relatedEntities) {
+		for (Entity relatedEntity : relatedEntities) {
+			if (!ODSUtils.isValidID(relatedEntity.getID())) {
+				throw new IllegalArgumentException("Related entity must be a persited entity.");
+			}
+
+			Relation relation = getEntityType().getRelation(getModelManager().getEntityType(relatedEntity));
+			List<Value> relationValues = updateMap.get(relation.getName());
+			if (relationValues == null) {
+				throw new IllegalStateException("Relation '" + relation
+						+ "' is incompatible with update statement for entity type '" + getEntityType() + "'");
+			}
+			relationValues.get(relationValues.size() - 1).set(relatedEntity.getID());
+			nonUpdatableRelationNames.remove(relation.getName());
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/WriteRequestHandler.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/WriteRequestHandler.java
new file mode 100644
index 0000000..61cd5a0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/WriteRequestHandler.java
@@ -0,0 +1,147 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.IntStream;
+
+import org.asam.ods.AoException;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.DefaultCore;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+
+/**
+ * Writes mass data specified in {@link WriteRequest}s.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.WriteRequestHandler
+ */
+public final class WriteRequestHandler {
+
+	private static final String AE_LC_ATTR_INDEPENDENT = "IndependentFlag";
+	private static final String AE_LC_ATTR_REPRESENTATION = "SequenceRepresentation";
+	private static final String AE_LC_ATTR_PARAMETERS = "GenerationParameters";
+	private static final String AE_LC_ATTR_RAWDATATYPE = "RawDatatype";
+	private static final String AE_LC_ATTR_AXISTYPE = "axistype";
+	private static final String AE_LC_ATTR_VALUES = "Values";
+	private static final String AE_LC_ATTR_FLAGS = "Flags";
+	private static final String AE_LC_ATTR_GLOBAL_FLAG = "GlobalFlag";
+
+	private final List<Core> cores = new ArrayList<>();
+	private final EntityType localColumnEntityType;
+	private final InsertStatement insertStatement;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param transaction The owning {@link ATFXTransaction}.
+	 */
+	public WriteRequestHandler(ATFXTransaction transaction) {
+		localColumnEntityType = transaction.getModelManager().getEntityType("LocalColumn");
+		insertStatement = new InsertStatement(transaction, localColumnEntityType);
+	}
+
+	/**
+	 * Adds given {@link WriteRequest} to be processed.
+	 *
+	 * @param writeRequest The {@code WriteRequest}.
+	 */
+	public void addRequest(WriteRequest writeRequest) {
+		cores.add(createCore(writeRequest));
+	}
+
+	/**
+	 * Imports given mass data configurations.
+	 *
+	 * @throws AoException         Thrown if the execution fails.
+	 * @throws DataAccessException Thrown if the execution fails.
+	 * @throws IOException         Thrown if a file transfer operation fails.
+	 */
+	public void execute() throws AoException, DataAccessException, IOException {
+		insertStatement.executeWithCores(cores);
+	}
+
+	/**
+	 * Reads given {@link WriteRequest} and prepares a corresponding {@link Core}
+	 * for import.
+	 *
+	 * @param writeRequest The mass data configuration.
+	 * @return The created {@code Core} is returned.
+	 */
+	private Core createCore(WriteRequest writeRequest) {
+		Core core = new DefaultCore(localColumnEntityType);
+
+		core.getPermanentStore().set(writeRequest.getChannelGroup());
+		core.getMutableStore().set(writeRequest.getChannel());
+
+		Map<String, Value> values = core.getValues();
+		values.get(Entity.ATTR_NAME).set(writeRequest.getChannel().getName());
+		values.get(Entity.ATTR_MIMETYPE).set("application/x-asam.aolocalcolumn");
+		values.get(AE_LC_ATTR_INDEPENDENT).set((short) (writeRequest.isIndependent() ? 1 : 0));
+		values.get(AE_LC_ATTR_RAWDATATYPE).set(writeRequest.getRawScalarType());
+		values.get(AE_LC_ATTR_REPRESENTATION).set(writeRequest.getSequenceRepresentation());
+		values.get(AE_LC_ATTR_AXISTYPE).set(writeRequest.getAxisType());
+		values.get(AE_LC_ATTR_PARAMETERS).set(writeRequest.getGenerationParameters());
+
+		if (writeRequest.hasValues()) {
+			ValueType<?> valueType = writeRequest.getRawScalarType().toValueType();
+			String unitName = writeRequest.getChannel().getUnit().getName();
+			values.put(AE_LC_ATTR_VALUES,
+					valueType.create(AE_LC_ATTR_VALUES, unitName, true, writeRequest.getValues()));
+
+			// OpenATFX issue: For "implicit" columns, if no value for the
+			// GenerationParameters attribute is present,
+			// it is attempted to transfer the local column values (through which the
+			// generation parameters are
+			// available in these cases) to the GenerationParameters attribute without
+			// converting them to the
+			// correct DS_DOUBLE data type first (unless it is a DOUBLE or LONG column),
+			// resulting in an exception.
+			// Hence, supply correctly converted generation parameters as a workaround:
+			if (writeRequest.getSequenceRepresentation().isImplicit()) {
+				Object genParamValues = writeRequest.getValues();
+				double[] genParamD = new double[Array.getLength(genParamValues)];
+				IntStream.range(0, genParamD.length)
+						.forEach(i -> genParamD[i] = ((Number) Array.get(genParamValues, i)).doubleValue());
+				values.get(AE_LC_ATTR_PARAMETERS).set(genParamD);
+			}
+
+			// flags
+			if (writeRequest.areAllValid()) {
+				values.get(AE_LC_ATTR_GLOBAL_FLAG).set((short) 15);
+			} else {
+				short[] flags = ODSConverter.toODSValidFlagSeq(writeRequest.getFlags());
+				values.get(AE_LC_ATTR_FLAGS).set(flags);
+			}
+		} else if (writeRequest.hasExternalComponents()) {
+			// TODO
+			throw new UnsupportedOperationException("NOT YET IMPLEMENTED.");
+		} else {
+			throw new IllegalStateException("Given write request neither has measured values nor external components");
+		}
+
+		return core;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java
new file mode 100644
index 0000000..10aec8a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java
@@ -0,0 +1,225 @@
+/********************************************************************************

+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;

+

+import static org.assertj.core.api.Assertions.assertThat;

+

+import java.util.List;

+import java.util.Map;

+

+import org.assertj.core.api.Assertions;

+import org.assertj.core.groups.Tuple;

+import org.eclipse.mdm.api.base.ConnectionException;

+import org.eclipse.mdm.api.base.massdata.ReadRequest;

+import org.eclipse.mdm.api.base.model.Channel;

+import org.eclipse.mdm.api.base.model.ChannelGroup;

+import org.eclipse.mdm.api.base.model.ContextRoot;

+import org.eclipse.mdm.api.base.model.ContextType;

+import org.eclipse.mdm.api.base.model.FileLink;

+import org.eclipse.mdm.api.base.model.MeasuredValues;

+import org.eclipse.mdm.api.base.model.Measurement;

+import org.eclipse.mdm.api.base.model.MimeType;

+import org.eclipse.mdm.api.base.model.Test;

+import org.eclipse.mdm.api.base.model.TestStep;

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

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

+import org.eclipse.mdm.api.dflt.ApplicationContext;

+import org.eclipse.mdm.api.dflt.EntityManager;

+import org.eclipse.mdm.api.dflt.model.Project;

+import org.junit.AfterClass;

+import org.junit.BeforeClass;

+

+import com.google.common.collect.ImmutableMap;

+

+public class AtfxAdaperTest {

+

+	public static final String ATFX_FILE = "src/test/resources/Right_Acc.atfx";

+

+	public static ApplicationContext context;

+

+	@BeforeClass

+	public static void init() throws ConnectionException {

+		Map<String, String> map = ImmutableMap.of("atfxfile", ATFX_FILE, "freetext.active", "false");

+

+		context = new ATFXContextFactory().connect(map);

+	}

+

+	@AfterClass

+	public static void teardown() throws ConnectionException {

+		context.close();

+	}

+

+	@org.junit.Test

+	public void testLoadLoggedOnUser() {

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.loadLoggedOnUser()).isNotNull();

+		;

+	}

+

+	@org.junit.Test

+	public void testLoadEnvironment() {

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.loadEnvironment().getName()).isEqualTo("MDM");

+	}

+

+	@org.junit.Test

+	public void testLoadAllProjects() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.loadAll(Project.class)).extracting(Project::getName).contains("PMV Model P");

+	}

+

+	@org.junit.Test

+	public void testLoadAllTests() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.loadAll(Test.class)).extracting(Test::getName).contains("PBN_UNECE_R51_20140314170907");

+	}

+

+	@org.junit.Test

+	public void testLoadAllTestSteps() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.loadAll(TestStep.class)).extracting(TestStep::getName).contains("PBN_UNECE_R51_Right_Acc_70");

+	}

+

+	@org.junit.Test

+	public void testLoadTestStepWithExtRef() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.load(TestStep.class, "1").getFileLinks())

+				.extracting(FileLink::getFileName, FileLink::getDescription, FileLink::getMimeType)

+				.contains(Tuple.tuple("extref.txt", "a simple text file", new MimeType("text/plain")),

+						Tuple.tuple("openmdm.png", "openMDM Logo", new MimeType("image/png")));

+	}

+

+	@org.junit.Test

+	public void testLoadAllMeasurements() {

+

+		EntityManager em = context.getEntityManager().get();

+		assertThat(em.loadAll(Measurement.class)).extracting(Measurement::getName).contains("Channel");

+	}

+

+	@org.junit.Test

+	public void testLoadParent() {

+

+		EntityManager em = context.getEntityManager().get();

+		Measurement meaResult = em.loadAll(Measurement.class).get(0);

+

+		assertThat(em.loadParent(meaResult, TestStep.class).get()).extracting(TestStep::getName)

+				.contains("PBN_UNECE_R51_Right_Acc_70");

+	}

+

+	@org.junit.Test

+	public void testLoadChildren() {

+

+		EntityManager em = context.getEntityManager().get();

+		Test test = em.loadAll(Test.class).get(0);

+

+		assertThat(em.loadChildren(test, TestStep.class).get(0)).extracting(TestStep::getName)

+				.contains("PBN_UNECE_R51_Right_Acc_70");

+	}

+

+	@org.junit.Test

+	public void testLoadChildrenForChannelGroup() {

+

+		EntityManager em = context.getEntityManager().get();

+		ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);

+

+		assertThat(em.loadChildren(channelGroup, Channel.class)).extracting(Channel::getName).contains("X-Axis",

+				"CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08",

+				"CHANNEL09", "CHANNEL10");

+	}

+

+	@org.junit.Test

+	public void testLoadChildrenForChannelGroupWithPattern() {

+

+		EntityManager em = context.getEntityManager().get();

+		ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);

+

+		Assertions.assertThatThrownBy(() -> em.loadChildren(channelGroup, Channel.class, "*Axis"))

+				.isInstanceOf(DataAccessException.class).hasMessageContaining("not supported");

+

+		// assertThat(em.loadChildren(channelGroup, Channel.class,

+		// "*Axis")).extracting(Channel::getName)

+		// .contains("X-Axis", "CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04",

+		// "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09",

+		// "CHANNEL10");

+	}

+

+	@org.junit.Test

+	public void testLoadParentForChannel() {

+

+		EntityManager em = context.getEntityManager().get();

+		Channel channel = em.loadAll(Channel.class).get(0);

+

+		assertThat(em.loadParent(channel, ChannelGroup.class).get()).extracting(ChannelGroup::getName)

+				.contains("Channel");

+	}

+

+	@org.junit.Test

+	public void testLoadAllChannelGroups() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.loadAll(ChannelGroup.class)).extracting(ChannelGroup::getName).contains("Channel");

+	}

+

+	@org.junit.Test

+	public void testLoadAllChannels() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.loadAll(Channel.class)).extracting(Channel::getName).contains("X-Axis", "CHANNEL01", "CHANNEL02",

+				"CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09", "CHANNEL10");

+	}

+

+	@org.junit.Test

+	public void testLoadAllContext() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		List<Measurement> measurements = em.loadAll(Measurement.class);

+		assertThat(measurements).hasSize(1);

+

+		Map<ContextType, ContextRoot> context = em.loadContexts(measurements.get(0));

+		assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents()).extracting(cc -> cc.getName())

+				.contains("FL_tyre");

+

+		assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents().get(0).getValues()).hasSize(7)

+				.containsEntry("Name", ValueType.STRING.create("Name", "FL_tyre"))

+				.containsEntry("axle", ValueType.SHORT.create("axle", (short) 1))

+				.containsEntry("side", ValueType.STRING.create("side", "Left"))

+				.containsEntry("manufacturer", ValueType.STRING.create("manufacturer", "Tunnelsand"));

+

+	}

+

+	@org.junit.Test

+	public void testReadMeasuredValues() {

+		EntityManager em = context.getEntityManager().get();

+

+		List<ChannelGroup> listCg = em.loadAll(ChannelGroup.class);

+		assertThat(listCg).hasSize(1);

+

+		List<MeasuredValues> values = em

+				.readMeasuredValues(ReadRequest.create(listCg.get(0)).allChannels().allValues());

+		assertThat(values).extracting(mv -> mv.getLength()).containsOnly(3001);

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdapterTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdapterTest.java
new file mode 100644
index 0000000..2ded697
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdapterTest.java
@@ -0,0 +1,211 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+import java.util.Map;
+
+import org.assertj.core.api.Assertions;
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.common.collect.ImmutableMap;
+
+public class AtfxAdapterTest {
+
+	public static final String ATFX_FILE = "src/test/resources/Right_Acc.atfx";
+
+	public static ApplicationContext context;
+
+	@BeforeClass
+	public static void init() throws ConnectionException {
+		Map<String, String> map = ImmutableMap.of("atfxfile", ATFX_FILE, "freetext.active", "false");
+
+		context = new ATFXContextFactory().connect(map);
+	}
+
+	@AfterClass
+	public static void teardown() throws ConnectionException {
+		context.close();
+	}
+
+	@org.junit.Test
+	public void testLoadLoggedOnUser() {
+		EntityManager em = context.getEntityManager().get();
+
+		assertThat(em.loadLoggedOnUser()).isNotNull();
+		;
+	}
+
+	@org.junit.Test
+	public void testLoadEnvironment() {
+		EntityManager em = context.getEntityManager().get();
+
+		assertThat(em.loadEnvironment().getName()).isEqualTo("MDM");
+	}
+
+	@org.junit.Test
+	public void testLoadAllProjects() {
+
+		EntityManager em = context.getEntityManager().get();
+
+		assertThat(em.loadAll(Project.class)).extracting(Project::getName).contains("PMV Model P");
+	}
+
+	@org.junit.Test
+	public void testLoadAllTests() {
+
+		EntityManager em = context.getEntityManager().get();
+
+		assertThat(em.loadAll(Test.class)).extracting(Test::getName).contains("PBN_UNECE_R51_20140314170907");
+	}
+
+	@org.junit.Test
+	public void testLoadAllTestSteps() {
+
+		EntityManager em = context.getEntityManager().get();
+
+		assertThat(em.loadAll(TestStep.class)).extracting(TestStep::getName).contains("PBN_UNECE_R51_Right_Acc_70");
+	}
+
+	@org.junit.Test
+	public void testLoadAllMeasurements() {
+
+		EntityManager em = context.getEntityManager().get();
+		assertThat(em.loadAll(Measurement.class)).extracting(Measurement::getName).contains("Channel");
+	}
+
+	@org.junit.Test
+	public void testLoadParent() {
+
+		EntityManager em = context.getEntityManager().get();
+		Measurement meaResult = em.loadAll(Measurement.class).get(0);
+
+		assertThat(em.loadParent(meaResult, TestStep.class).get()).extracting(TestStep::getName)
+				.contains("PBN_UNECE_R51_Right_Acc_70");
+	}
+
+	@org.junit.Test
+	public void testLoadChildren() {
+
+		EntityManager em = context.getEntityManager().get();
+		Test test = em.loadAll(Test.class).get(0);
+
+		assertThat(em.loadChildren(test, TestStep.class).get(0)).extracting(TestStep::getName)
+				.contains("PBN_UNECE_R51_Right_Acc_70");
+	}
+
+	@org.junit.Test
+	public void testLoadChildrenForChannelGroup() {
+
+		EntityManager em = context.getEntityManager().get();
+		ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);
+
+		assertThat(em.loadChildren(channelGroup, Channel.class)).extracting(Channel::getName).contains("X-Axis",
+				"CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08",
+				"CHANNEL09", "CHANNEL10");
+	}
+
+	@org.junit.Test
+	public void testLoadChildrenForChannelGroupWithPattern() {
+
+		EntityManager em = context.getEntityManager().get();
+		ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);
+
+		Assertions.assertThatThrownBy(() -> em.loadChildren(channelGroup, Channel.class, "*Axis"))
+				.isInstanceOf(DataAccessException.class).hasMessageContaining("not supported");
+
+		// assertThat(em.loadChildren(channelGroup, Channel.class,
+		// "*Axis")).extracting(Channel::getName)
+		// .contains("X-Axis", "CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04",
+		// "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09",
+		// "CHANNEL10");
+	}
+
+	@org.junit.Test
+	public void testLoadParentForChannel() {
+
+		EntityManager em = context.getEntityManager().get();
+		Channel channel = em.loadAll(Channel.class).get(0);
+
+		assertThat(em.loadParent(channel, ChannelGroup.class).get()).extracting(ChannelGroup::getName)
+				.contains("Channel");
+	}
+
+	@org.junit.Test
+	public void testLoadAllChannelGroups() {
+
+		EntityManager em = context.getEntityManager().get();
+
+		assertThat(em.loadAll(ChannelGroup.class)).extracting(ChannelGroup::getName).contains("Channel");
+	}
+
+	@org.junit.Test
+	public void testLoadAllChannels() {
+
+		EntityManager em = context.getEntityManager().get();
+
+		assertThat(em.loadAll(Channel.class)).extracting(Channel::getName).contains("X-Axis", "CHANNEL01", "CHANNEL02",
+				"CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09", "CHANNEL10");
+	}
+
+	@org.junit.Test
+	public void testLoadAllContext() {
+
+		EntityManager em = context.getEntityManager().get();
+
+		List<Measurement> measurements = em.loadAll(Measurement.class);
+		assertThat(measurements).hasSize(1);
+
+		Map<ContextType, ContextRoot> context = em.loadContexts(measurements.get(0));
+		assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents()).extracting(cc -> cc.getName())
+				.contains("FL_tyre");
+
+		assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents().get(0).getValues()).hasSize(7)
+				.containsEntry("Name", ValueType.STRING.create("Name", "FL_tyre"))
+				.containsEntry("axle", ValueType.SHORT.create("axle", (short) 1))
+				.containsEntry("side", ValueType.STRING.create("side", "Left"))
+				.containsEntry("manufacturer", ValueType.STRING.create("manufacturer", "Tunnelsand"));
+
+	}
+
+	@org.junit.Test
+	public void testReadMeasuredValues() {
+		EntityManager em = context.getEntityManager().get();
+
+		List<ChannelGroup> listCg = em.loadAll(ChannelGroup.class);
+		assertThat(listCg).hasSize(1);
+
+		List<MeasuredValues> values = em
+				.readMeasuredValues(ReadRequest.create(listCg.get(0)).allChannels().allValues());
+		assertThat(values).extracting(mv -> mv.getLength()).containsOnly(3001);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdapterWriteTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdapterWriteTest.java
new file mode 100644
index 0000000..182a5e5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdapterWriteTest.java
@@ -0,0 +1,69 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.rules.TemporaryFolder;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.io.Files;
+
+public class AtfxAdapterWriteTest {
+
+	public static final String ATFX_FILE = "src/test/resources/mdm_complete_application_model_500.xml";
+
+	public static ApplicationContext context;
+
+	@ClassRule
+	public static TemporaryFolder tmpFolder = new TemporaryFolder();
+
+	@BeforeClass
+	public static void init() throws ConnectionException, IOException {
+
+		File f = tmpFolder.newFile("open.atfx");
+		Files.copy(new File(ATFX_FILE), f);
+
+		Map<String, String> map = ImmutableMap.of("atfxfile", f.getAbsolutePath(), "freetext.active", "false",
+				"includeCatalog", "true");
+
+		context = new ATFXContextFactory().connect(map);
+	}
+
+	@AfterClass
+	public static void teardown() throws ConnectionException {
+		context.close();
+	}
+
+	@org.junit.Test
+	public void test() {
+		CatalogComponent catComp = context.getEntityFactory().get().createCatalogComponent(ContextType.UNITUNDERTEST,
+				"MyComp");
+
+		Transaction t = context.getEntityManager().get().startTransaction();
+		t.create(Arrays.asList(catComp));
+		t.commit();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx
new file mode 100644
index 0000000..f9594cc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx
@@ -0,0 +1,3509 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<atfx_file version="atfx_file: V1.2.0" xmlns="http://www.asam.net/ODS/5.2.0/Schema">
+  <documentation>
+    <exported_by>openATFX</exported_by>
+    <exporter>openATFX</exporter>
+    <export_date_time>20140317155010</export_date_time>
+    <exporter_version>0.4.3</exporter_version>
+  </documentation>
+  <base_model_version>asam30</base_model_version>
+  <application_model>
+    <application_enumeration>
+      <name>valid_enum</name>
+      <item>
+        <name>editing</name>
+        <value>0</value>
+      </item>
+      <item>
+        <name>valid</name>
+        <value>1</value>
+      </item>
+      <item>
+        <name>archive</name>
+        <value>2</value>
+      </item>
+    </application_enumeration>
+    <application_enumeration>
+      <name>axistype</name>
+      <item>
+        <name>Xaxis</name>
+        <value>0</value>
+      </item>
+      <item>
+        <name>Yaxis</name>
+        <value>1</value>
+      </item>
+      <item>
+        <name>Both</name>
+        <value>2</value>
+      </item>
+    </application_enumeration>
+    <application_element>
+      <name>Environment</name>
+      <basetype>AoEnvironment</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <obligatory>true</obligatory>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Max_test_level</name>
+        <base_attribute>max_test_level</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Base_model_version</name>
+        <base_attribute>base_model_version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>AppModelType</name>
+        <base_attribute>application_model_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>AppModelVersion</name>
+        <base_attribute>application_model_version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Timezone</name>
+        <base_attribute>timezone</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeaningOfAliases</name>
+        <base_attribute>meaning_of_aliases</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+    </application_element>
+    <application_element>
+      <name>Project</name>
+      <basetype>AoTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>StructureLevel</name>
+        <ref_to>StructureLevel</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Project</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>StructureLevel</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Tests</name>
+        <ref_to>Test</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>StructureLevel</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Project</name>
+        <ref_to>Project</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>StructureLevel</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Test</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateClosed</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>ResponsiblePerson</name>
+        <ref_to>User</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Tests</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>StructureLevel</name>
+        <ref_to>StructureLevel</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Tests</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Test</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestStep</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Optional</name>
+        <datatype>DT_BOOLEAN</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>Sortindex</name>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Test</name>
+        <ref_to>Test</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestStep</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>MeaResult</name>
+      <basetype>AoMeasurement</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeasurementBegin</name>
+        <base_attribute>measurement_begin</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeasurementEnd</name>
+        <base_attribute>measurement_end</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>equipments</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>units_under_test</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestStep</name>
+        <ref_to>TestStep</ref_to>
+        <base_relation>test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SubMatrices</name>
+        <ref_to>SubMatrix</ref_to>
+        <base_relation>submatrices</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>sequences</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>UnitUnderTest</name>
+      <basetype>AoUnitUnderTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>engine</name>
+        <ref_to>engine</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>gearbox</name>
+        <ref_to>gearbox</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>tyre</name>
+        <ref_to>tyre</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>noise_reduction_system</name>
+        <ref_to>noise_reduction_system</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>vehicle</name>
+        <ref_to>vehicle</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>exhaust_piping</name>
+        <ref_to>exhaust_piping</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>expansion_chamber</name>
+        <ref_to>expansion_chamber</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>air_filter</name>
+        <ref_to>air_filter</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>silencer</name>
+        <ref_to>silencer</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>engine</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>power</name>
+        <datatype>DT_SHORT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>model</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>engine</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>gearbox</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>no_forward_gears</name>
+        <datatype>DT_SHORT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>transmission</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>gearbox</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>noise_reduction_system</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>design_family</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>noise_reduction_system</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>tyre</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>axle</name>
+        <datatype>DT_SHORT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>side</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>size</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>tread_depth</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>tyre</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>air_filter</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>min_bulk_material_density</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>air_filter</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>expansion_chamber</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>volume</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>expansion_chamber</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>exhaust_piping</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>material</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>length</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>exhaust_piping</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>vehicle</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>maximum_authorized_mass</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>vehicle_type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>vehicle_category</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>model</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>length</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>reference_point</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>mass_in_running_order</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>vehicle</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>silencer</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>location</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>model</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>fibre_type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>silencer</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestEquipment</name>
+      <basetype>AoTestEquipment</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>sound_measurement</name>
+        <ref_to>sound_measurement</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>vehicle_measurement</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>speed</name>
+        <ref_to>speed</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>parent_equipment</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>rotational_speed</name>
+        <ref_to>rotational_speed</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>acceleration</name>
+        <ref_to>acceleration</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>speed</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>direction</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>speed</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>speed</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>rotational_speed</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>rotational_speed</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>rotational_speed</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>acceleration</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type_code</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>last_calibration</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>location</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>direction</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>acceleration</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>acceleration</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>meteorological_measurement</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>temperature</name>
+        <ref_to>temperature</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>barometric_pressure</name>
+        <ref_to>barometric_pressure</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>parent_equipment</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>relative_humidity</name>
+        <ref_to>relative_humidity</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>wind_speed</name>
+        <ref_to>wind_speed</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>barometric_pressure</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type_code</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>last_calibration</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>height_above_ground</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>barometric_pressure</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>barometric_pressure</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>temperature</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>temperature</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>temperature</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>relative_humidity</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>relative_humidity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>relative_humidity</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>wind_speed</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>wind_direction</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>wind_speed</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>wind_speed</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>sound_measurement</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>microphone</name>
+        <ref_to>microphone</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>sound_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>parent_equipment</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>sound_measurement</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>microphone</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type_code</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>height_above_ground</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>last_calibration</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>distance_from_target</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>windscreen_applied</name>
+        <datatype>DT_BOOLEAN</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>sound_measurement</name>
+        <ref_to>sound_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>microphone</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>microphone</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>MeaQuantity</name>
+      <basetype>AoMeasurementQuantity</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DataType</name>
+        <base_attribute>datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Interpolation</name>
+        <base_attribute>interpolation</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Rank</name>
+        <base_attribute>rank</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Dimension</name>
+        <base_attribute>dimension</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>TypeSize</name>
+        <base_attribute>type_size</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Minimum</name>
+        <base_attribute>minimum</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Maximum</name>
+        <base_attribute>maximum</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Average</name>
+        <base_attribute>average</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Deviation</name>
+        <base_attribute>standard_deviation</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>non_reference_channel_name</name>
+        <datatype>DT_STRING</datatype>
+        <length>128</length>
+      </application_attribute>
+      <application_attribute>
+        <name>reference_channel_name</name>
+        <datatype>DT_STRING</datatype>
+        <length>128</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meq-for-ref-user-window-fct</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>reference-user-window-function</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>speed</name>
+        <ref_to>speed</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-forequalization-
+filter</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>equalization-filter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>barometric_pressure</name>
+        <ref_to>barometric_pressure</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>relative_humidity</name>
+        <ref_to>relative_humidity</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>non_reference_channel_quantity</name>
+        <ref_to>Quantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-non_ref_chan_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>equalization-filter</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-forequalization-
+filter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>wind_speed</name>
+        <ref_to>wind_speed</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>user-window-function</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-user-window-fct</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>temperature</name>
+        <ref_to>temperature</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>microphone</name>
+        <ref_to>microphone</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>LocalColumns</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_columns</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>rotational_speed</name>
+        <ref_to>rotational_speed</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>reference-user-window-function</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-ref-user-window-fct</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-for-user-window-fct</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>user-window-function</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>reference_channel_quantity</name>
+        <ref_to>Quantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-ref_chan_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Quantity</name>
+        <ref_to>Quantity</ref_to>
+        <base_relation>quantity</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>acceleration</name>
+        <ref_to>acceleration</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Unit</name>
+      <basetype>AoUnit</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Factor</name>
+        <base_attribute>factor</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Offset</name>
+        <base_attribute>offset</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>dB</name>
+        <datatype>DT_BOOLEAN</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>dB_reference_factor</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>Quantities</name>
+        <ref_to>Quantity</ref_to>
+        <base_relation>quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>PhysDimension</name>
+        <ref_to>PhysDimension</ref_to>
+        <base_relation>phys_dimension</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Units</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameter</name>
+        <ref_to>ResultParameter</ref_to>
+        <base_relation>parameters</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>PhysDimension</name>
+      <basetype>AoPhysicalDimension</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Length</name>
+        <base_attribute>length_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Mass</name>
+        <base_attribute>mass_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Time</name>
+        <base_attribute>time_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Current</name>
+        <base_attribute>current_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Temperature</name>
+        <base_attribute>temperature_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MolarAmount</name>
+        <base_attribute>molar_amount_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>LuminousIntensity</name>
+        <base_attribute>luminous_intensity_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>angle</name>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <relation_attribute>
+        <name>Units</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>units</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>PhysDimension</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Quantity</name>
+      <basetype>AoQuantity</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DefaultRank</name>
+        <base_attribute>default_rank</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>DefDimension</name>
+        <base_attribute>default_dimension</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>DefTypeSize</name>
+        <base_attribute>default_type_size</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>DefMQName</name>
+        <base_attribute>default_mq_name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DefDataType</name>
+        <base_attribute>default_datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>ValidFlag</name>
+        <datatype>DT_ENUM</datatype>
+        <enumeration_type>valid_enum</enumeration_type>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>default_unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Quantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-for-non_ref_chan_quantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>non_reference_channel_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-for-ref_chan_quantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>reference_channel_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Quantity</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ResultParameterSet</name>
+      <basetype>AoParameterSet</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>ResultParameter</name>
+        <ref_to>ResultParameter</ref_to>
+        <base_relation>parameters</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ResultParameter</name>
+      <basetype>AoParameter</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DataType</name>
+        <base_attribute>parameter_datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Value</name>
+        <base_attribute>pvalue</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <base_relation>parameter_set</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameter</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>LocalColumn</name>
+      <basetype>AoLocalColumn</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>IndependentFlag</name>
+        <base_attribute>independent</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>SequenceRepresentation</name>
+        <base_attribute>sequence_representation</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>GlobalFlag</name>
+        <base_attribute>global_flag</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Values</name>
+        <base_attribute>values</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Flags</name>
+        <base_attribute>flags</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>GenerationParameters</name>
+        <base_attribute>generation_parameters</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>RawDatatype</name>
+        <base_attribute>raw_datatype</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>axistype</name>
+        <datatype>DT_ENUM</datatype>
+        <enumeration_type>axistype</enumeration_type>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantity</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>LocalColumns</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SubMatrix</name>
+        <ref_to>SubMatrix</ref_to>
+        <base_relation>submatrix</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>LocalColumns</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ExternalComponent</name>
+        <ref_to>ExternalComponent</ref_to>
+        <base_relation>external_component</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>LocalColumn</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>SubMatrix</name>
+      <basetype>AoSubmatrix</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>SubMatrixNoRows</name>
+        <base_attribute>number_of_rows</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>y-axis-for-z-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>z-axis-for-y-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>y-axis-for-x-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>x-axis-for-y-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>LocalColumns</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_columns</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>SubMatrix</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>z-axis-for-y-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>y-axis-for-z-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>SubMatrices</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>x-axis-for-y-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>y-axis-for-x-axis</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ExternalComponent</name>
+      <basetype>AoExternalComponent</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>FilenameURL</name>
+        <base_attribute>filename_url</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>TypeSpecification</name>
+        <base_attribute>value_type</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Length</name>
+        <base_attribute>component_length</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>StartOffset</name>
+        <base_attribute>start_offset</base_attribute>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Blocksize</name>
+        <base_attribute>block_size</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>ValuesPerBlock</name>
+        <base_attribute>valuesperblock</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>ValueOffset</name>
+        <base_attribute>value_offset</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>OrdinalNumber</name>
+        <base_attribute>ordinal_number</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>FlagsFilenameURL</name>
+        <base_attribute>flags_filename_url</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>FlagsStartOffset</name>
+        <base_attribute>flags_start_offset</base_attribute>
+        <datatype>DT_LONG</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>LocalColumn</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_column</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ExternalComponent</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestSequence</name>
+      <basetype>AoTestSequence</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>PBN_test_conduction</name>
+        <ref_to>PBN_test_conduction</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>track</name>
+        <ref_to>track</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SVN_test_conduction</name>
+        <ref_to>SVN_test_conduction</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>testsite</name>
+        <ref_to>testsite</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>PBN_test_conduction</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>v_test</name>
+        <datatype>DT_FLOAT</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>PMR</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>accelerated</name>
+        <datatype>DT_BOOLEAN</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>tested_vehicle_side</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>PBN_test_conduction</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>track</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>residual_voids_content</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>sound_absorption_coefficient</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>texture_depth</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>surface_homogeneity</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>last_check_texture_depth</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>track</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>SVN_test_conduction</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>SVN_test_conduction</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>testsite</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>track_id</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>testsite</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>User</name>
+      <basetype>AoUser</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>GivenName</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Surname</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Department</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Telephone</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>E-Mail</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>users2groups</name>
+        <ref_to>Role</ref_to>
+        <base_relation>groups</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>groups2users</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Tests</name>
+        <ref_to>Test</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>ResponsiblePerson</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Role</name>
+      <basetype>AoUserGroup</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>SuperuserFlag</name>
+        <base_attribute>superuser_flag</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>groups2users</name>
+        <ref_to>User</ref_to>
+        <base_relation>users</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>users2groups</inverse_name>
+      </relation_attribute>
+    </application_element>
+  </application_model>
+  <instance_data>
+    <Environment>
+      <Id>1</Id>
+      <Name>MDM</Name>
+      <MimeType>application/x-asam.aoenvironment</MimeType>
+      <Description>MDM Environment</Description>
+      <DateCreated>20120214120000</DateCreated>
+      <Max_test_level>4</Max_test_level>
+      <Base_model_version>asam30</Base_model_version>
+      <AppModelType>ASAM_SECURITY,ASAM_NVH,ASAM_WORKFLOW,MDM</AppModelType>
+      <AppModelVersion>4.4.1</AppModelVersion>
+      <Timezone>GMT</Timezone>
+      <MeaningOfAliases>
+        <s>,language=en</s>
+        <s>,language=de</s>
+      </MeaningOfAliases>
+    </Environment>
+    <Project>
+      <Id>1</Id>
+      <Name>PMV Model P</Name>
+      <MimeType>application/x-asam.aotest</MimeType>
+      <StructureLevel>1</StructureLevel>
+    </Project>
+    <StructureLevel>
+      <Id>1</Id>
+      <Name>PBN Measurements</Name>
+      <MimeType>application/x-asam.aosubtest.structurelevel</MimeType>
+      <Tests>1</Tests>
+      <Project>1</Project>
+    </StructureLevel>
+    <Test>
+      <Id>1</Id>
+      <Name>PBN_UNECE_R51_20140314170907</Name>
+      <MimeType>application/x-asam.aosubtest.test</MimeType>
+      <DateCreated>20140314170907</DateCreated>
+      <DateClosed>20140314170908</DateClosed>
+      <StructureLevel>1</StructureLevel>
+      <ResponsiblePerson>1</ResponsiblePerson>
+      <TestSteps>1</TestSteps>
+    </Test>
+    <TestStep>
+      <Id>1</Id>
+      <Name>PBN_UNECE_R51_Right_Acc_70</Name>
+      <MimeType>application/x-asam.aosubtest.teststep</MimeType>
+      <DateCreated>20140314170908</DateCreated>
+      <Optional>true</Optional>
+      <Sortindex>40</Sortindex>
+      <MDMLinks>
+        <external_reference>
+          <description>a simple text file</description>
+          <mimetype>text/plain</mimetype>
+          <location>extref.txt</location>
+        </external_reference>
+        <external_reference>
+          <description>openMDM Logo</description>
+          <mimetype>image/png</mimetype>
+          <location>openmdm.png</location>
+        </external_reference>
+      </MDMLinks>
+      <Test>1</Test>
+      <MeaResults>1</MeaResults>
+    </TestStep>
+    <MeaResult>
+      <Id>1</Id>
+      <Name>Channel</Name>
+      <MimeType>application/x-asam.aomeasurement</MimeType>
+      <DateCreated>20140317154822</DateCreated>
+      <TestEquipment>1</TestEquipment>
+      <UnitUnderTest>1</UnitUnderTest>
+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10 11</MeaQuantities>
+      <TestStep>1</TestStep>
+      <SubMatrices>1</SubMatrices>
+      <TestSequence>1</TestSequence>
+    </MeaResult>
+    <UnitUnderTest>
+      <Id>1</Id>
+      <Name>PBN_vehicle</Name>
+      <Version>57</Version>
+      <MimeType>application/x-asam.aounitundertest.unitundertest</MimeType>
+      <engine>1</engine>
+      <gearbox>1</gearbox>
+      <tyre>1 2 3 4</tyre>
+      <noise_reduction_system>1</noise_reduction_system>
+      <vehicle>1</vehicle>
+      <exhaust_piping>1</exhaust_piping>
+      <expansion_chamber>1</expansion_chamber>
+      <air_filter>1</air_filter>
+      <MeaResults>1</MeaResults>
+      <silencer>1 2</silencer>
+    </UnitUnderTest>
+    <engine>
+      <Id>1</Id>
+      <Name>engine</Name>
+      <MimeType>application/x-asam.aounitundertestpart.engine.engine</MimeType>
+      <power>167</power>
+      <manufacturer>Peak Motors Ltd.</manufacturer>
+      <type>Compression-ignition</type>
+      <model>Peak Turbo V16</model>
+      <UnitUnderTest>1</UnitUnderTest>
+    </engine>
+    <gearbox>
+      <Id>1</Id>
+      <Name>gearbox</Name>
+      <MimeType>application/x-asam.aounitundertestpart.gearbox.gearbox</MimeType>
+      <no_forward_gears>6</no_forward_gears>
+      <transmission>Automatic</transmission>
+      <UnitUnderTest>1</UnitUnderTest>
+    </gearbox>
+    <noise_reduction_system>
+      <Id>1</Id>
+      <Name>noise_reduction_system</Name>
+      <MimeType>application/x-asam.aounitundertestpart.noise_reduction_system.noise_reduction_system</MimeType>
+      <design_family>Whisper</design_family>
+      <UnitUnderTest>1</UnitUnderTest>
+    </noise_reduction_system>
+    <tyre>
+      <Id>1</Id>
+      <Name>FL_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.fl_tyre</MimeType>
+      <axle>1</axle>
+      <side>Left</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+      <tread_depth>2.2</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <tyre>
+      <Id>2</Id>
+      <Name>FR_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.fr_tyre</MimeType>
+      <axle>1</axle>
+      <side>Right</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+      <tread_depth>2.3</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <tyre>
+      <Id>3</Id>
+      <Name>RL_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.rl_tyre</MimeType>
+      <axle>2</axle>
+      <side>Left</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+	  <tread_depth>2.1</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <tyre>
+      <Id>4</Id>
+      <Name>RR_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.rr_tyre</MimeType>
+      <axle>2</axle>
+      <side>Right</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+      <tread_depth>2.2</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <air_filter>
+      <Id>1</Id>
+      <Name>air_filter</Name>
+      <MimeType>application/x-asam.aounitundertestpart.air_filter.air_filter</MimeType>
+      <min_bulk_material_density>0.83</min_bulk_material_density>
+      <UnitUnderTest>1</UnitUnderTest>
+    </air_filter>
+    <expansion_chamber>
+      <Id>1</Id>
+      <Name>expansion_chamber</Name>
+      <MimeType>application/x-asam.aounitundertestpart.expansion_chamber.expansion_chamber</MimeType>
+      <volume>0.53</volume>
+      <UnitUnderTest>1</UnitUnderTest>
+    </expansion_chamber>
+    <exhaust_piping>
+      <Id>1</Id>
+      <Name>exhaust_piping</Name>
+      <MimeType>application/x-asam.aounitundertestpart.exhaust_piping.exhaust_piping</MimeType>
+      <material>Stainless steel</material>
+      <length>3.79</length>
+      <UnitUnderTest>1</UnitUnderTest>
+    </exhaust_piping>
+    <vehicle>
+      <Id>1</Id>
+      <Name>vehicle</Name>
+      <MimeType>application/x-asam.aounitundertestpart.vehicle.vehicle</MimeType>
+      <maximum_authorized_mass>1950.0</maximum_authorized_mass>
+      <vehicle_type>Cabrio</vehicle_type>
+      <vehicle_category>Passenger transport</vehicle_category>
+      <manufacturer>Peak Motor Vehicles</manufacturer>
+      <model>Model P</model>
+      <length>3.96</length>
+      <reference_point>Rear end</reference_point>
+      <mass_in_running_order>1463.0</mass_in_running_order>
+      <UnitUnderTest>1</UnitUnderTest>
+    </vehicle>
+    <silencer>
+      <Id>1</Id>
+      <Name>exhaust_silencer</Name>
+      <MimeType>application/x-asam.aounitundertestpart.silencer.exhaust_silencer</MimeType>
+      <location>exhaust</location>
+      <manufacturer>Peak Silencers Ltd.</manufacturer>
+      <model>Lion's Roar 2013</model>
+      <type>Quadruple pipe</type>
+      <fibre_type>Biosil wool</fibre_type>
+      <UnitUnderTest>1</UnitUnderTest>
+    </silencer>
+    <silencer>
+      <Id>2</Id>
+      <Name>intake_silencer</Name>
+      <MimeType>application/x-asam.aounitundertestpart.silencer.intake_silencer</MimeType>
+      <location>intake</location>
+      <manufacturer>Peak Silencers Ltd.</manufacturer>
+      <model>Snake's Hiss 2013</model>
+      <fibre_type>Etype wool</fibre_type>
+      <UnitUnderTest>1</UnitUnderTest>
+    </silencer>
+    <TestEquipment>
+      <Id>1</Id>
+      <Name>PBN_setup</Name>
+      <Version>56</Version>
+      <MimeType>application/x-asam.aotestequipment.testequipment</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+      <meteorological_measurement>1</meteorological_measurement>
+      <sound_measurement>1</sound_measurement>
+      <MeaResults>1</MeaResults>
+    </TestEquipment>
+    <vehicle_measurement>
+      <Id>1</Id>
+      <Name>vehicle_measurement</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.vehicle_measurement.vehicle_measurement</MimeType>
+      <speed>1</speed>
+      <TestEquipment>1</TestEquipment>
+      <rotational_speed>1</rotational_speed>
+      <acceleration>1</acceleration>
+    </vehicle_measurement>
+    <speed>
+      <Id>1</Id>
+      <Name>vehicle_speed</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.speed</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+    </speed>
+    <rotational_speed>
+      <Id>1</Id>
+      <Name>rotational_speed</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.rotational_speed</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+    </rotational_speed>
+    <acceleration>
+      <Id>1</Id>
+      <Name>vehicle_acceleration</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.acceleration</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+    </acceleration>
+    <meteorological_measurement>
+      <Id>1</Id>
+      <Name>meteorological_measurement</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.meteorological_measurement.meteorological_measurement</MimeType>
+      <temperature>1 2</temperature>
+      <barometric_pressure>1</barometric_pressure>
+      <TestEquipment>1</TestEquipment>
+      <relative_humidity>1</relative_humidity>
+      <wind_speed>1</wind_speed>
+    </meteorological_measurement>
+    <barometric_pressure>
+      <Id>1</Id>
+      <Name>atmospheric_pressure</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.barometric_pressure</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </barometric_pressure>
+    <temperature>
+      <Id>1</Id>
+      <Name>ambient_air_temperature</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </temperature>
+    <temperature>
+      <Id>2</Id>
+      <Name>track_surface_temperature</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </temperature>
+    <relative_humidity>
+      <Id>1</Id>
+      <Name>humidity</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.relative_humidity</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </relative_humidity>
+    <wind_speed>
+      <Id>1</Id>
+      <Name>wind_speed</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.wind_speed</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </wind_speed>
+    <sound_measurement>
+      <Id>1</Id>
+      <Name>sound_measurement</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.sound_measurement.sound_measurement</MimeType>
+      <microphone>1 2</microphone>
+      <TestEquipment>1</TestEquipment>
+    </sound_measurement>
+    <microphone>
+      <Id>1</Id>
+      <Name>background_noise</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>
+      <sound_measurement>1</sound_measurement>
+    </microphone>
+    <microphone>
+      <Id>2</Id>
+      <Name>vehicle_noise</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>
+      <sound_measurement>1</sound_measurement>
+    </microphone>
+    <MeaQuantity>
+      <Id>1</Id>
+      <Name>CHANNEL05</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8136</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>2</Id>
+      <Name>CHANNEL08</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8137</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>3</Id>
+      <Name>CHANNEL03</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8138</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>4</Id>
+      <Name>CHANNEL01</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8139</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>5</Id>
+      <Name>CHANNEL06</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8140</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>6</Id>
+      <Name>CHANNEL04</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8141</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>7</Id>
+      <Name>CHANNEL07</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8142</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>8</Id>
+      <Name>CHANNEL02</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8143</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>9</Id>
+      <Name>CHANNEL09</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8144</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>10</Id>
+      <Name>CHANNEL10</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8145</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>11</Id>
+      <Name>X-Axis</Name>
+      <DataType>DT_LONG</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>2</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8146</LocalColumns>
+      <Quantity>2</Quantity>
+    </MeaQuantity>
+    <Unit>
+      <Id>1</Id>
+      <Name>Pa</Name>
+      <Factor>1.0</Factor>
+      <Offset>0.0</Offset>
+      <MimeType>application/x-asam.aounit</MimeType>
+      <dB>false</dB>
+      <Quantities>1</Quantities>
+      <PhysDimension>1</PhysDimension>
+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>
+    </Unit>
+    <Unit>
+      <Id>2</Id>
+      <Name>s</Name>
+      <Factor>1.0</Factor>
+      <Offset>0.0</Offset>
+      <MimeType>application/x-asam.aounit</MimeType>
+      <dB>false</dB>
+      <Quantities>2</Quantities>
+      <PhysDimension>2</PhysDimension>
+      <MeaQuantities>11</MeaQuantities>
+    </Unit>
+    <PhysDimension>
+      <Id>1</Id>
+      <Name>pressure</Name>
+      <Length>-1</Length>
+      <Mass>1</Mass>
+      <Time>-2</Time>
+      <Current>0</Current>
+      <Temperature>0</Temperature>
+      <MolarAmount>0</MolarAmount>
+      <LuminousIntensity>0</LuminousIntensity>
+      <MimeType>application/x-asam.aophysicaldimension</MimeType>
+      <Description>unit: pascal</Description>
+      <angle>0</angle>
+      <Units>1</Units>
+    </PhysDimension>
+    <PhysDimension>
+      <Id>2</Id>
+      <Name>time</Name>
+      <Length>0</Length>
+      <Mass>0</Mass>
+      <Time>1</Time>
+      <Current>0</Current>
+      <Temperature>0</Temperature>
+      <MolarAmount>0</MolarAmount>
+      <LuminousIntensity>0</LuminousIntensity>
+      <MimeType>application/x-asam.aophysicaldimension</MimeType>
+      <angle>0</angle>
+      <Units>2</Units>
+    </PhysDimension>
+    <Quantity>
+      <Id>1</Id>
+      <Name>Noise</Name>
+      <Version>1</Version>
+      <MimeType>application/x-asam.aoquantity</MimeType>
+      <DateCreated>20140211133954</DateCreated>
+      <DefaultRank>1</DefaultRank>
+      <DefDimension>0</DefDimension>
+      <DefTypeSize>1</DefTypeSize>
+      <DefMQName>Noise</DefMQName>
+      <DefDataType>DT_FLOAT</DefDataType>
+      <ValidFlag>valid</ValidFlag>
+      <Unit>1</Unit>
+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>
+    </Quantity>
+    <Quantity>
+      <Id>2</Id>
+      <Name>Time</Name>
+      <Version>1</Version>
+      <MimeType>application/x-asam.aoquantity</MimeType>
+      <DateCreated>20140303190409</DateCreated>
+      <DefaultRank>1</DefaultRank>
+      <DefDimension>0</DefDimension>
+      <DefTypeSize>1</DefTypeSize>
+      <DefMQName>Time</DefMQName>
+      <DefDataType>DT_FLOAT</DefDataType>
+      <ValidFlag>valid</ValidFlag>
+      <Unit>2</Unit>
+      <MeaQuantities>11</MeaQuantities>
+    </Quantity>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8136</Id>
+      <Name>CHANNEL05</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>1</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>1</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8137</Id>
+      <Name>CHANNEL08</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>2</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>2</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8138</Id>
+      <Name>CHANNEL03</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>3</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>3</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8139</Id>
+      <Name>CHANNEL01</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>4</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>4</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8140</Id>
+      <Name>CHANNEL06</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>5</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>5</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8141</Id>
+      <Name>CHANNEL04</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>6</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>6</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8142</Id>
+      <Name>CHANNEL07</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>7</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>7</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8143</Id>
+      <Name>CHANNEL02</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>8</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>8</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8144</Id>
+      <Name>CHANNEL09</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>9</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>9</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8145</Id>
+      <Name>CHANNEL10</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>10</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>10</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8146</Id>
+      <Name>X-Axis</Name>
+      <IndependentFlag>1</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Xaxis</axistype>
+      <MeaQuantity>11</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>11</ExternalComponent>
+    </LocalColumn>
+    <SubMatrix>
+      <Id>1</Id>
+      <Name>Channel</Name>
+      <SubMatrixNoRows>3001</SubMatrixNoRows>
+      <MimeType>application/x-asam.aosubmatrix</MimeType>
+      <LocalColumns>8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146</LocalColumns>
+      <MeaResult>1</MeaResult>
+    </SubMatrix>
+    <ExternalComponent>
+      <Id>1</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>0</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8136</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>2</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>24008</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8137</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>3</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>48016</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8138</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>4</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>72024</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8139</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>5</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>96032</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8140</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>6</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>120040</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8141</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>7</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>144048</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8142</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>8</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>168056</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8143</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>9</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>192064</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8144</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>10</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>216072</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8145</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>11</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>data_1.bin</FilenameURL>
+      <TypeSpecification>dt_long</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>240080</StartOffset>
+      <Blocksize>4</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8146</LocalColumn>
+    </ExternalComponent>
+    <TestSequence>
+      <Id>1</Id>
+      <Name>PBN_emission_testing</Name>
+      <Version>41</Version>
+      <MimeType>application/x-asam.aotestsequence.testsequence</MimeType>
+      <PBN_test_conduction>1</PBN_test_conduction>
+      <track>1</track>
+      <testsite>1</testsite>
+      <MeaResults>1</MeaResults>
+    </TestSequence>
+    <PBN_test_conduction>
+      <Id>1</Id>
+      <Name>test_conduction</Name>
+      <MimeType>application/x-asam.aotestsequencepart.pbn_test_conduction.test_conduction</MimeType>
+      <v_test>70.0</v_test>
+      <PMR>114</PMR>
+      <accelerated>true</accelerated>
+      <tested_vehicle_side>Right</tested_vehicle_side>
+      <TestSequence>1</TestSequence>
+    </PBN_test_conduction>
+    <track>
+      <Id>1</Id>
+      <Name>track</Name>
+      <MimeType>application/x-asam.aotestsequencepart.track.track</MimeType>
+      <residual_voids_content>7.8</residual_voids_content>
+      <sound_absorption_coefficient>0.093</sound_absorption_coefficient>
+      <texture_depth>0.3</texture_depth>
+      <surface_homogeneity>homogenous</surface_homogeneity>
+      <last_check_texture_depth>20140220000000</last_check_texture_depth>
+      <TestSequence>1</TestSequence>
+    </track>
+    <testsite>
+      <Id>1</Id>
+      <Name>testsite</Name>
+      <MimeType>application/x-asam.aotestsequencepart.testsite.testsite</MimeType>
+      <track_id>PBN Area 51</track_id>
+      <TestSequence>1</TestSequence>
+    </testsite>
+    <User>
+      <Id>1</Id>
+      <Name>dummy</Name>
+      <MimeType>application/x-asam.aouser</MimeType>
+      <GivenName>dummy</GivenName>
+      <Surname>dummy</Surname>
+      <users2groups>1</users2groups>
+      <Tests>1</Tests>
+    </User>
+    <Role>
+      <Id>1</Id>
+      <Name>DummyRole</Name>
+      <SuperuserFlag>0</SuperuserFlag>
+      <MimeType>application/x-asam.aorole</MimeType>
+      <groups2users>1</groups2users>
+    </Role>
+  </instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/data_1.bin b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/data_1.bin
new file mode 100644
index 0000000..1cece2d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/data_1.bin
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/extref.txt b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/extref.txt
new file mode 100644
index 0000000..9097b52
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/extref.txt
@@ -0,0 +1 @@
+This is a external reference file.
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_complete_application_model_500.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_complete_application_model_500.xml
new file mode 100644
index 0000000..341fef8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_complete_application_model_500.xml
@@ -0,0 +1,2495 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<atfx_file version="atfx_file: V1.1.0"  xmlns="http://www.asam.net/ODS/5.2/Schema"
+                                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                                         xsi:schemaLocation="http://www.asam.net/ODS/5.2/Schema http://www.asam.net/ODS/5.2/Schema.xsd">
+<!--
+***************************************************************************************************************
+* Based on ODS Base Model version *
+***************************************************************************************************************
+ -->
+   <base_model_version>asam30</base_model_version>
+<!-- 
+***************************************************************************************************************
+* declare application model meta data *
+***************************************************************************************************************
+ -->
+
+   <application_model>
+<!--
+***************************************************************************************************************
+* declare enumeration definitions *
+***************************************************************************************************************
+ -->
+      <application_enumeration>
+         <name>valid_enum</name>
+         <item><name>editing</name><value>0</value></item>
+         <item><name>valid</name><value>1</value></item>
+         <item><name>archive</name><value>2</value></item>
+      </application_enumeration>
+      <application_enumeration>
+         <name>axistype</name>
+         <item><name>Xaxis</name><value>0</value></item>
+         <item><name>Yaxis</name><value>1</value></item>
+         <item><name>Both</name><value>2</value></item>
+      </application_enumeration>
+
+      <application_element><name>Environment</name><basetype>AoEnvironment</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>Max_test_level</name><base_attribute>max_test_level</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Base_model_version</name><base_attribute>base_model_version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>AppModelType</name><base_attribute>application_model_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>AppModelVersion</name><base_attribute>application_model_version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>Timezone</name><base_attribute>timezone</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MeaningOfAliases</name><base_attribute>meaning_of_aliases</base_attribute><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+      </application_element>
+      <application_element><name>CatSensor</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatSensorAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensorAttr</name><ref_to>TplSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestEquipmentComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestEquipmentAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentAttr</name><ref_to>TplTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestSequenceComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceComp</name><ref_to>TplTestSequenceComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestSequenceAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestSequenceComp</name><ref_to>CatTestSequenceComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceAttr</name><ref_to>TplTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatUnitUnderTestComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestComp</name><ref_to>TplUnitUnderTestComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatUnitUnderTestAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestComp</name><ref_to>CatUnitUnderTestComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestAttr</name><ref_to>TplUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Domain</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Domain</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ExtSystem</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>ExtSystemAttr</name><ref_to>ExtSystemAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ExtSystem</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ExtSystemAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ConverterClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ConverterParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>ExtSystem</name><ref_to>ExtSystem</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ExtSystemAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMAttr</name><ref_to>MDMAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ExtSystemAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>FavouriteLists</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ASAMPaths</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>User</name><ref_to>User</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>FavouriteLists</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>CompType</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>CompName</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <application_attribute><name>AttrName</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <relation_attribute><name>ExtSystemAttr</name><ref_to>ExtSystemAttr</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>MDMAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMFunction</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>Role</name><ref_to>Role</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMFunction</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMGroup</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>Role</name><ref_to>Role</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMGroup</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMLocalization</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>300</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>AliasNames</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+      </application_element>
+      <application_element><name>MDMRole</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>Role</name><ref_to>Role</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMRole</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMTag</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>MDMTagParameterSet</name><ref_to>MDMTagParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMTag</inverse_name></relation_attribute>
+         <relation_attribute><name>Test</name><ref_to>Test</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMTag</inverse_name></relation_attribute>
+         <relation_attribute><name>TestStep</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMTag</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMTag</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ProjectDomain</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ProjectDomain</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Status</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Status</inverse_name></relation_attribute>
+         <relation_attribute><name>StatusValidity</name><ref_to>StatusValidity</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Status</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Classification</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>ProjectDomain</name><ref_to>ProjectDomain</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>Status</name><ref_to>Status</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>Domain</name><ref_to>Domain</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>Project</name><ref_to>Project</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>StructureLevel</name><ref_to>StructureLevel</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>Test</name><ref_to>Test</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>TestStep</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantity</name><ref_to>MeaQuantity</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Classification</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>StatusValidity</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>IsFinal</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>Status</name><ref_to>Status</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>StatusValidity</inverse_name></relation_attribute>
+         <application_attribute><name>ValidForMimeType</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+      </application_element>
+      <application_element><name>SystemParameter</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Value</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>References</name><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>UserParameter</name><ref_to>UserParameter</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>SystemParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplGroup</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplGroupParent</name><ref_to>TplGroup</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplGroupChild</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroupChild</name><ref_to>TplGroup</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroupParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTest</name><ref_to>TplTest</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplMeaResult</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultMimeType</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultName</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplSubMatrix</name><ref_to>TplSubMatrix</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplParameterSet</name><ref_to>TplParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplSensor</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>Quantity</name><ref_to>Quantity</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensorAttr</name><ref_to>TplSensorAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>MeaQuantityValuesEditable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MeaQuantityIndependent</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MeaQuantityAxisType</name><datatype>DT_ENUM</datatype><enumeration_type>axistype</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MeaQuantityEditorPlugin</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplParameterSet</name><ref_to>TplParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplSensorAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensorAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensorAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplSubMatrix</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>MinNoRows</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MaxNoRows</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSubMatrix</inverse_name></relation_attribute>
+         <relation_attribute><name>SubMatrix</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplSubMatrix</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTest</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>NameHelperClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DataSourcePluginClassnames</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>TestOrderActionClassnames</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>Tests</name><ref_to>Test</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTest</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStepUsage</name><ref_to>TplTestStepUsage</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTest</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTest</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestEquipmentAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestEquipmentRoot</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TestEquipment</name><ref_to>TestEquipment</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestEquipmentComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TestStepSeriesVariable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompParent</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplCompChildren</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompChildren</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplCompParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentAttr</name><ref_to>TplTestEquipmentAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestSequenceAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceComp</name><ref_to>TplTestSequenceComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestSequenceRoot</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceComp</name><ref_to>TplTestSequenceComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSequence</name><ref_to>TestSequence</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestSequenceComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TestStepSeriesVariable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompParent</name><ref_to>TplTestSequenceComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplCompChildren</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestSequenceComp</name><ref_to>CatTestSequenceComp</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompChildren</name><ref_to>TplTestSequenceComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplCompParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceAttr</name><ref_to>TplTestSequenceAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestStepUsage</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTest</name><ref_to>TplTest</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStepUsage</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStepUsage</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplUnitUnderTestAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestComp</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplUnitUnderTestRoot</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestComp</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>UnitUnderTest</name><ref_to>UnitUnderTest</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestStep</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStepUsage</name><ref_to>TplTestStepUsage</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplUnitUnderTestComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TestStepSeriesVariable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompParent</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplCompChildren</inverse_name></relation_attribute>
+         <relation_attribute><name>CatUnitUnderTestComp</name><ref_to>CatUnitUnderTestComp</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompChildren</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplCompParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestAttr</name><ref_to>TplUnitUnderTestAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>UserParameter</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Value</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>References</name><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>SystemParameter</name><ref_to>SystemParameter</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>UserParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>User</name><ref_to>User</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>UserParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMLog</name><basetype>AoLog</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>100</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>User</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Application</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Priority</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Message</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>4000</length></application_attribute>
+      </application_element>
+      <application_element><name>MDMTagParameterSet</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>MDMTag</name><ref_to>MDMTag</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MDMTagParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMTagParameter</name><ref_to>MDMTagParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMTagParameterSet</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>NameMap</name><basetype>AoNameMap</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>EntityName</name><base_attribute>entity_name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>AliasNames</name><base_attribute>alias_names</base_attribute><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <relation_attribute><name>AttributeMap</name><ref_to>AttributeMap</ref_to><base_relation>attribute_mapping</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>NameMap</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>PhysDimension</name><basetype>AoPhysicalDimension</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>Length</name><base_attribute>length_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Mass</name><base_attribute>mass_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Time</name><base_attribute>time_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Current</name><base_attribute>current_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Temperature</name><base_attribute>temperature_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MolarAmount</name><base_attribute>molar_amount_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>LuminousIntensity</name><base_attribute>luminous_intensity_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>angle</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>Units</name><ref_to>Unit</ref_to><base_relation>units</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>PhysDimension</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Project</name><basetype>AoTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>StructureLevel</name><ref_to>StructureLevel</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Project</inverse_name></relation_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Project</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ResultParameterSet</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantity</name><ref_to>MeaQuantity</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameter</name><ref_to>ResultParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ResultParameterSet</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Role</name><basetype>AoUserGroup</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>SuperuserFlag</name><base_attribute>superuser_flag</base_attribute><datatype>DT_SHORT</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>MDMRole</name><ref_to>MDMRole</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Role</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMGroup</name><ref_to>MDMGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Role</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMFunction</name><ref_to>MDMFunction</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Role</inverse_name></relation_attribute>
+         <relation_attribute><name>groups2users</name><ref_to>User</ref_to><base_relation>users</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>users2groups</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TestEquipment</name><basetype>AoTestEquipment</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestEquipment</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestEquipment</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestEquipment</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TestSequence</name><basetype>AoTestSequence</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSequence</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestSequence</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestSequence</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplParameterSet</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>TplParameter</name><ref_to>TplParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameterSet</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Unit</name><basetype>AoUnit</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>Factor</name><base_attribute>factor</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Offset</name><base_attribute>offset</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>dB</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>dB_reference_factor</name><datatype>DT_FLOAT</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>PhysDimension</name><ref_to>PhysDimension</ref_to><base_relation>phys_dimension</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>Units</inverse_name></relation_attribute>
+         <relation_attribute><name>Quantities</name><ref_to>Quantity</ref_to><base_relation>quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantities</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameter</name><ref_to>ResultParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMTagParameter</name><ref_to>MDMTagParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>TplParameter</name><ref_to>TplParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>WorkflowParameter</name><ref_to>WorkflowParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Quantity</name><basetype>AoQuantity</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>DefaultRank</name><base_attribute>default_rank</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefDimension</name><base_attribute>default_dimension</base_attribute><datatype>DS_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefTypeSize</name><base_attribute>default_type_size</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefMQName</name><base_attribute>default_mq_name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>DefDataType</name><base_attribute>default_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>default_unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Quantities</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantities</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Quantity</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Quantity</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>UnitUnderTest</name><basetype>AoUnitUnderTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>UnitUnderTest</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>UnitUnderTest</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>UnitUnderTest</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>User</name><basetype>AoUser</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>Password</name><base_attribute>password</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>GivenName</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Surname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Department</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Telephone</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>E-Mail</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <relation_attribute><name>Tests</name><ref_to>Test</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ResponsiblePerson</inverse_name></relation_attribute>
+         <relation_attribute><name>UserParameter</name><ref_to>UserParameter</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>User</inverse_name></relation_attribute>
+         <relation_attribute><name>FavouriteLists</name><ref_to>FavouriteLists</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>User</inverse_name></relation_attribute>
+         <relation_attribute><name>users2groups</name><ref_to>Role</ref_to><base_relation>groups</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>groups2users</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ValueList</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <relation_attribute><name>ValueListValue</name><ref_to>ValueListValue</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Workflow</name><basetype>AoTestSequence</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique></application_attribute>
+		 <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>actions</name><ref_to>Action</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflow</inverse_name></relation_attribute>
+         <relation_attribute><name>conditions</name><ref_to>Condition</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflow</inverse_name></relation_attribute>
+         <relation_attribute><name>toActions</name><ref_to>ToAction</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflow</inverse_name></relation_attribute>
+         <relation_attribute><name>toConditions</name><ref_to>ToCondition</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflow</inverse_name></relation_attribute>
+         <relation_attribute><name>initTokens</name><ref_to>InitToken</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflow</inverse_name></relation_attribute>
+         <relation_attribute><name>tokenTypes</name><ref_to>TokenType</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflow</inverse_name></relation_attribute>
+         <relation_attribute><name>workflowRuns</name><ref_to>WorkflowRun</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflow</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>WorkflowParameterSet</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	     <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>WorkflowParameter</name><ref_to>WorkflowParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>WorkflowParameterSet</inverse_name></relation_attribute>
+        <relation_attribute><name>Action</name><ref_to>Action</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>WorkflowParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>UsedVia</name><ref_to>ActionRun</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>UsedParameters</inverse_name></relation_attribute>
+		 </application_element>
+      <application_element><name>Action</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>action_performer</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>action_parameter</name><datatype>DT_BLOB</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <relation_attribute><name>actionRuns</name><ref_to>ActionRun</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ExecutedAction</inverse_name></relation_attribute>
+         <relation_attribute><name>workflow</name><ref_to>Workflow</ref_to><base_relation>parent_sequence</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>actions</inverse_name></relation_attribute>
+         <relation_attribute><name>toConditions</name><ref_to>ToCondition</ref_to><min_occurs>1</min_occurs><max_occurs>Many</max_occurs><inverse_name>action</inverse_name></relation_attribute>
+         <relation_attribute><name>fromConditions</name><ref_to>ToAction</ref_to><min_occurs>1</min_occurs><max_occurs>Many</max_occurs><inverse_name>action</inverse_name></relation_attribute>
+         <relation_attribute><name>WorkflowParameterSet</name><ref_to>WorkflowParameterSet</ref_to><min_occurs>1</min_occurs><max_occurs>Many</max_occurs><inverse_name>Action</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>AttributeMap</name><basetype>AoAttributeMap</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>AttributeName</name><base_attribute>attribute_name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>AliasNames</name><base_attribute>alias_names</base_attribute><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <relation_attribute><name>NameMap</name><ref_to>NameMap</ref_to><base_relation>name_mapping</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>AttributeMap</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Condition</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>capacity</name><datatype>DS_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>tokentype_name</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <relation_attribute><name>workflow</name><ref_to>Workflow</ref_to><base_relation>parent_sequence</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>conditions</inverse_name></relation_attribute>
+         <relation_attribute><name>toActions</name><ref_to>ToAction</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>condition</inverse_name></relation_attribute>
+         <relation_attribute><name>fromActions</name><ref_to>ToCondition</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>condition</inverse_name></relation_attribute>
+         <relation_attribute><name>initTokens</name><ref_to>InitToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>condition</inverse_name></relation_attribute>
+         <relation_attribute><name>dynTokens</name><ref_to>DynToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>condition</inverse_name></relation_attribute>
+         <relation_attribute><name>tokenTypes</name><ref_to>TokenType</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>conditions</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>InitToken</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>workflow</name><ref_to>Workflow</ref_to><base_relation>parent_sequence</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>initTokens</inverse_name></relation_attribute>
+         <relation_attribute><name>tokenType</name><ref_to>TokenType</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>initTokens</inverse_name></relation_attribute>
+         <relation_attribute><name>condition</name><ref_to>Condition</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>initTokens</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMTagParameter</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Value</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>MDMTagParameterSet</name><ref_to>MDMTagParameterSet</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>MDMTagParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MDMTagParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ResultParameter</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Value</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>ResultParameterSet</name><ref_to>ResultParameterSet</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>SubMatrix</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>StructureLevel</name><basetype>AoSubTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>Project</name><ref_to>Project</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>StructureLevel</inverse_name></relation_attribute>
+         <relation_attribute><name>Tests</name><ref_to>Test</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>StructureLevel</inverse_name></relation_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>StructureLevel</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ToAction</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>regular</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>inhibiting</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>consumption</name><datatype>DS_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>tokentype_name</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <relation_attribute><name>workflow</name><ref_to>Workflow</ref_to><base_relation>parent_sequence</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>toActions</inverse_name></relation_attribute>
+         <relation_attribute><name>condition</name><ref_to>Condition</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>toActions</inverse_name></relation_attribute>
+         <relation_attribute><name>action</name><ref_to>Action</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fromConditions</inverse_name></relation_attribute>
+         <relation_attribute><name>tokenTypes</name><ref_to>TokenType</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>toActions</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ToCondition</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>production</name><datatype>DS_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>tokentype_name</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <relation_attribute><name>workflow</name><ref_to>Workflow</ref_to><base_relation>parent_sequence</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>toConditions</inverse_name></relation_attribute>
+         <relation_attribute><name>action</name><ref_to>Action</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>toConditions</inverse_name></relation_attribute>
+         <relation_attribute><name>condition</name><ref_to>Condition</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fromActions</inverse_name></relation_attribute>
+         <relation_attribute><name>tokenTypes</name><ref_to>TokenType</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>toConditions</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TokenType</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>workflow</name><ref_to>Workflow</ref_to><base_relation>parent_sequence</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>tokenTypes</inverse_name></relation_attribute>
+         <relation_attribute><name>initTokens</name><ref_to>InitToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>tokenType</inverse_name></relation_attribute>
+         <relation_attribute><name>dynTokens</name><ref_to>DynToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>tokenType</inverse_name></relation_attribute>
+         <relation_attribute><name>conditions</name><ref_to>Condition</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>tokenTypes</inverse_name></relation_attribute>
+         <relation_attribute><name>toActions</name><ref_to>ToAction</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>tokenTypes</inverse_name></relation_attribute>
+         <relation_attribute><name>toConditions</name><ref_to>ToCondition</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>tokenTypes</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplParameter</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>DefaultDataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplParameterSet</name><ref_to>TplParameterSet</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ValueListValue</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Value</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ValueListValue</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>WorkflowParameter</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Value</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>WorkflowParameterSet</name><ref_to>WorkflowParameterSet</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>WorkflowParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>WorkflowParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>WorkflowRun</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>time_started</name><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <relation_attribute><name>Workflow</name><ref_to>Workflow</ref_to><base_relation>parent_sequence</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>workflowRuns</inverse_name></relation_attribute>
+         <relation_attribute><name>dynTokens</name><ref_to>DynToken</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>workflowRun</inverse_name></relation_attribute>
+         <relation_attribute><name>actionRuns</name><ref_to>ActionRun</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>WorkflowRun</inverse_name></relation_attribute>
+	  </application_element>
+      <application_element><name>DynToken</name><basetype>AoTestSequencePart</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>time_produced</name><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>time_consumed</name><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+		 <application_attribute><name>NonMDMData</name><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique></application_attribute>
+         <relation_attribute><name>workflowRun</name><ref_to>WorkflowRun</ref_to><base_relation>parent_sequence_part</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>dynTokens</inverse_name></relation_attribute>
+         <relation_attribute><name>ConsumedVia</name><ref_to>ActionRun</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>InputTokens</inverse_name></relation_attribute>
+         <relation_attribute><name>ProducedVia</name><ref_to>ActionRun</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>OutputTokens</inverse_name></relation_attribute>
+         <relation_attribute><name>tokenType</name><ref_to>TokenType</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>dynTokens</inverse_name></relation_attribute>
+         <relation_attribute><name>condition</name><ref_to>Condition</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>dynTokens</inverse_name></relation_attribute>
+         <relation_attribute><name>Test</name><ref_to>Test</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>DynToken</inverse_name></relation_attribute>
+         <relation_attribute><name>TestStep</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>DynToken</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>DynToken</inverse_name></relation_attribute>
+      </application_element> 
+	  <application_element><name>ActionRun</name><basetype>AoTestSequencePart</basetype>
+		 <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique></application_attribute>
+		 <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+		 <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+		 <relation_attribute><name>ExecutedAction</name><ref_to>Action</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>actionRuns</inverse_name></relation_attribute>			
+		 <relation_attribute><name>InputTokens</name><ref_to>DynToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ConsumedVia</inverse_name></relation_attribute>
+		 <relation_attribute><name>OutputTokens</name><ref_to>DynToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ProducedVia</inverse_name></relation_attribute>
+		 <relation_attribute><name>UsedParameters</name><ref_to>WorkflowParameterSet</ref_to><min_occurs>1</min_occurs><max_occurs>Many</max_occurs><inverse_name>UsedVia</inverse_name></relation_attribute>								
+		 <relation_attribute><name>WorkflowRun</name><ref_to>WorkflowRun</ref_to><base_relation>parent_sequence_part</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>actionRuns</inverse_name></relation_attribute>
+ 	  </application_element>
+      <application_element><name>Test</name><basetype>AoSubTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>DateClosed</name><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MDMLinks</name><base_attribute>external_references</base_attribute><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>StructureLevel</name><ref_to>StructureLevel</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>Tests</inverse_name></relation_attribute>        
+         <relation_attribute><name>ResponsiblePerson</name><ref_to>User</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Tests</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTest</name><ref_to>TplTest</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Tests</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Test</inverse_name></relation_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Test</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMTag</name><ref_to>MDMTag</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Test</inverse_name></relation_attribute>
+         <relation_attribute><name>DynToken</name><ref_to>DynToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Test</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TestStep</name><basetype>AoSubTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MDMLinks</name><base_attribute>external_references</base_attribute><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>Test</name><ref_to>Test</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>         
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>TestEquipment</name><ref_to>TestEquipment</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>UnitUnderTest</name><ref_to>UnitUnderTest</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSequence</name><ref_to>TestSequence</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMTag</name><ref_to>MDMTag</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>DynToken</name><ref_to>DynToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestStep</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MeaResult</name><basetype>AoMeasurement</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MeasurementBegin</name><base_attribute>measurement_begin</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MeasurementEnd</name><base_attribute>measurement_end</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MDMLinks</name><base_attribute>external_references</base_attribute><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>TestStep</name><ref_to>TestStep</ref_to><base_relation>test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>TestEquipment</name><ref_to>TestEquipment</ref_to><base_relation>equipments</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>UnitUnderTest</name><ref_to>UnitUnderTest</ref_to><base_relation>units_under_test</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSequence</name><ref_to>TestSequence</ref_to><base_relation>sequences</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantities</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>SubMatrices</name><ref_to>SubMatrix</ref_to><base_relation>submatrices</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameterSet</name><ref_to>ResultParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>MDMTag</name><ref_to>MDMTag</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>DynToken</name><ref_to>DynToken</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MeaQuantity</name><basetype>AoMeasurementQuantity</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>Interpolation</name><base_attribute>interpolation</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>interpolation_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Rank</name><base_attribute>rank</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Dimension</name><base_attribute>dimension</base_attribute><datatype>DS_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TypeSize</name><base_attribute>type_size</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Minimum</name><base_attribute>minimum</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Maximum</name><base_attribute>maximum</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Average</name><base_attribute>average</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Deviation</name><base_attribute>standard_deviation</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>non_reference_channel_name</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>128</length></application_attribute>
+         <application_attribute><name>reference_channel_name</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>128</length></application_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaQuantities</inverse_name></relation_attribute>
+         <relation_attribute><name>Quantity</name><ref_to>Quantity</ref_to><base_relation>quantity</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaQuantities</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaQuantities</inverse_name></relation_attribute>
+         <relation_attribute><name>LocalColumns</name><ref_to>LocalColumn</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaQuantity</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameterSet</name><ref_to>ResultParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaQuantity</inverse_name></relation_attribute>
+         <relation_attribute><name>Classification</name><ref_to>Classification</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaQuantity</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>SubMatrix</name><basetype>AoSubmatrix</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>SubMatrixNoRows</name><base_attribute>number_of_rows</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>SubMatrices</inverse_name></relation_attribute>
+         <relation_attribute><name>x-axis-for-y-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-x-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>z-axis-for-y-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-z-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>y-axis-for-x-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>x-axis-for-y-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>y-axis-for-z-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>z-axis-for-y-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameter</name><ref_to>ResultParameter</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>SubMatrix</inverse_name></relation_attribute>
+         <relation_attribute><name>LocalColumns</name><ref_to>LocalColumn</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>SubMatrix</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSubMatrix</name><ref_to>TplSubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>SubMatrix</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>LocalColumn</name><basetype>AoLocalColumn</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>IndependentFlag</name><base_attribute>independent</base_attribute><datatype>DT_SHORT</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>SequenceRepresentation</name><base_attribute>sequence_representation</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>seq_rep_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>GlobalFlag</name><base_attribute>global_flag</base_attribute><datatype>DT_SHORT</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Values</name><base_attribute>values</base_attribute></application_attribute>
+         <application_attribute><name>Flags</name><base_attribute>flags</base_attribute></application_attribute>
+         <application_attribute><name>GenerationParameters</name><base_attribute>generation_parameters</base_attribute><datatype>DS_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>RawDatatype</name><base_attribute>raw_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>axistype</name><datatype>DT_ENUM</datatype><enumeration_type>axistype</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>SubMatrix</name><ref_to>SubMatrix</ref_to><base_relation>submatrix</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>LocalColumns</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantity</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantity</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>LocalColumns</inverse_name></relation_attribute>
+         <relation_attribute><name>ExternalComponent</name><ref_to>ExternalComponent</ref_to><base_relation>external_component</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>LocalColumn</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ExternalComponent</name><basetype>AoExternalComponent</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>OrdinalNumber</name><base_attribute>ordinal_number</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TypeSpecification</name><base_attribute>value_type</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>typespec_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Length</name><base_attribute>component_length</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>StartOffset</name><base_attribute>start_offset</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Blocksize</name><base_attribute>block_size</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValuesPerBlock</name><base_attribute>valuesperblock</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueOffset</name><base_attribute>value_offset</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>FilenameURL</name><base_attribute>filename_url</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>FlagsFilenameURL</name><base_attribute>flags_filename_url</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>FlagsStartOffset</name><base_attribute>flags_start_offset</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>LocalColumn</name><ref_to>LocalColumn</ref_to><base_relation>local_column</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ExternalComponent</inverse_name></relation_attribute>
+      </application_element>
+   </application_model>
+<!-- 
+***************************************************************************************************************
+* end application model meta data *
+***************************************************************************************************************
+ -->
+<!--
+***************************************************************************************************************
+* Instance Data is NOT validated with Base Schema *
+***************************************************************************************************************
+ -->
+
+   <instance_data>
+      <Environment><Id>1</Id><Name>MDM</Name><MimeType>application/x-asam.aoenvironment</MimeType><Description>MDM Environment</Description><DateCreated>20120214120000</DateCreated><Max_test_level>4</Max_test_level><Base_model_version>asam30</Base_model_version><AppModelType>ASAM_SECURITY,ASAM_NVH,ASAM_WORKFLOW,MDM</AppModelType><AppModelVersion>4.4.1</AppModelVersion><Timezone>GMT</Timezone>
+         <MeaningOfAliases><s>,language=en</s><s>,language=de</s>
+         </MeaningOfAliases>
+      </Environment>
+      <Domain><Id>1</Id><Name>Default</Name><MimeType>application/x-asam.aoany.domain</MimeType><Description>Default domain</Description>
+      </Domain>
+     <MDMLocalization>
+<Id>1</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.cattestsequencecomp</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sequence component</s>
+<s>Betriebsgrößen-Komponente</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>2</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplunitundertestroot</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit under test template</s>
+<s>Prüflings-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>3</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tpltestsequenceroot</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sequence template</s>
+<s>Betriebsgrößen-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>4</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tpltestequipmentroot</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Setup template</s>
+<s>Setup-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>5</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aophysicaldimension</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Physical dimension</s>
+<s>Physikalische Dimension</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>6</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.cattestequipmentattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Setup attribute</s>
+<s>Setup-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>7</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.cattestsequencetattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sequence attribute</s>
+<s>Betriebsgrößen-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>8</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.catsensor</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sensor component</s>
+<s>Sensor-Komponente</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>9</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.catunitundertestattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit under test attribute</s>
+<s>Prüflings-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>10</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.catsensorattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sensor attribute</s>
+<s>Sensor-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>11</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aounit</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit</s>
+<s>Einheit</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>12</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoquantity</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Quantity</s>
+<s>Messgrösse</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>13</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.mdmtag</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Tag</s>
+<s>Tag</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>14</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.catunitundertestcomp</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit under test component</s>
+<s>Prüflings-Komponente</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>15</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplgroup</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Template group</s>
+<s>Vorlagen-Gruppe</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>16</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tpltestequipmentcomp</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Setup component</s>
+<s>Setup-Komponente</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>17</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tpltestequipmentattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Setup attribute</s>
+<s>Setup-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>18</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tpltestsequencecomp</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sequence component</s>
+<s>Betriebsgrößen-Komponente</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>19</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplunitundertestattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit under test attribute</s>
+<s>Prüflings-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>20</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplunitundertestcomp</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit under test component</s>
+<s>Prüflings-Komponente</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>21</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tpltestsequenceattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sequence attribute</s>
+<s>Betriebsgrößen-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>22</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.cattestequipmentcomp</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Setup component</s>
+<s>Setup-Komponente</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>23</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoenvironment</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Environment</s>
+<s>Umgebung</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>24</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aouser</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>User</s>
+<s>Benutzer</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>25</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aomeasurement</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Measurement result</s>
+<s>Messergebnis</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>26</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aomeasurementquantity</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Measurement quantity</s>
+<s>Kanal</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>27</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoparameter.resultparameter</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Parameter</s>
+<s>Parameter</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>28</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoparameterset.resultparameterset</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Parameterset</s>
+<s>Parameterset</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>29</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aosubtest.structurelevel</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Subproject</s>
+<s>Unterprojekt</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>30</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aosubtest.test</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Test</s>
+<s>Versuch</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>31</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aosubtest.teststep</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Test step</s>
+<s>Messschritt</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>32</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aotest</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Project</s>
+<s>Projekt</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>33</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aotestsequence.testsequence</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sequence</s>
+<s>Betriebsgrößen</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>34</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aotestequipment.testequipment</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Setup</s>
+<s>Setup</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>35</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aounitundertest.unitundertest</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit under test</s>
+<s>Prüfling</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>36</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplsensor</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sensor template</s>
+<s>Sensor-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>37</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplsensorattr</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sensor template attribut</s>
+<s>Sensor-Attribut</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>90</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplmearesult</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Measurement result template</s>
+<s>Messergebnis-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>91</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplsubmatrix</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Submatrix template</s>
+<s>Submatrix-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>38</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/name</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Name</s>
+<s>Name</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>39</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/description</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Description</s>
+<s>Beschreibung</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>40</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aoenvironment/appmodeltype</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Data model type</s>
+<s>Datenmodell-Typ</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>41</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aoenvironment/appmodelversion</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Data model version</s>
+<s>Datenmodell-Version</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>42</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/status</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Status</s>
+<s>Status</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>43</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/version</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Version</s>
+<s>Version</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>44</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/datecreated</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Created</s>
+<s>Angelegt</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>45</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/dateclosed</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Closed</s>
+<s>Abgeschlossen</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>46</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aosubtest.test/responsibleperson</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Responsible person</s>
+<s>Verantwortlicher</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>47</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aosubtest.test/tpltest</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Template</s>
+<s>Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>48</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aosubtest.teststep/tplteststep</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Template</s>
+<s>Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>49</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aomeasurement/measurementbegin</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Measurement begin</s>
+<s>Messbeginn</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>50</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aomeasurement/measurementend</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Measurement end</s>
+<s>Messende</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>51</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/sortindex</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Sortindex</s>
+<s>Sortindex</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>52</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tpltest</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Test template</s>
+<s>Versuchs-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>53</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplteststep</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Test step template</s>
+<s>Messschritt-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>54</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/optional</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Optional</s>
+<s>Optional</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>55</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aouser/givenname</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Given name</s>
+<s>Vorname</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>56</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aouser/surname</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Surname</s>
+<s>Nachname</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>57</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aouser/department</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Department</s>
+<s>Abteilung</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>58</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aouser/telephone</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Telephone</s>
+<s>Telefon</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>59</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aouser/e-mail</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>E-Mail</s>
+<s>E-Mail</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>60</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aomeasurementquantity/average</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Average</s>
+<s>Durchschnitt</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>61</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/datatype</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Data type</s>
+<s>Datentyp</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>62</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/deviation</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Deviation</s>
+<s>Std.-Abweichung</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>63</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/maximum</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Maximum</s>
+<s>Maximum</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>64</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/minimum</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Minimum</s>
+<s>Minimum</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>65</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/quantity</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Quantity</s>
+<s>Messgröße</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>66</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/unit</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Unit</s>
+<s>Einheit</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>67</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/value</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Value</s>
+<s>Wert</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>68</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aorole</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Role</s>
+<s>Rolle</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>69</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.valuelist</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Value list</s>
+<s>Werteliste</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>70</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.valuelistvalue</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Value list value</s>
+<s>Wertelisten-Wert</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>71</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aounit/factor</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Factor</s>
+<s>Faktor</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>72</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aounit/offset</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Offset</s>
+<s>Offset</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>73</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aounit/db</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>dB</s>
+<s>dB</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>74</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aounit/db_reference_factor</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>dB reference factor</s>
+<s>dB Referenz Faktor</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>75</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/validflag</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Valid flag</s>
+<s>Gültigkeit</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>76</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/defaultactive</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Default active</s>
+<s>Default-Aktiv</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>77</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/defaultvalue</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Default value</s>
+<s>Standard-Wert</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>78</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/valuereadonly</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Read only</s>
+<s>Schreibgeschützt</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>79</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/obligatory</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Obligatory</s>
+<s>Pflichtfeld</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>80</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/mdmlinks</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>File attachments</s>
+<s>Dateianhänge</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>81</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam/mimetype</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Mimetype</s>
+<s>Mimetype</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>82</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/length</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Length</s>
+<s>Länge</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>83</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/mass</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Mass</s>
+<s>Masse</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>84</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/time</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Time</s>
+<s>Zeit</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>85</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/current</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Current</s>
+<s>Stromstärke</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>86</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/temperature</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Temperature</s>
+<s>Temperatur</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>87</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/molaramount</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Molar amount</s>
+<s>Stoffmenge</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>88</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/luminousintensity</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Luminous intensity</s>
+<s>Lichtstärke</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>89</Id>
+<Name>mdm://i18n/attr/application%2Fx-asam.aophysicaldimension/angle</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Angle</s>
+<s>Winkel</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>92</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aosubmatrix</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Submatrix</s>
+<s>Submatrix</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>93</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aolocalcolumn</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Localcolumn</s>
+<s>Localcolumn</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>94</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoexternalcomponent</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>External component</s>
+<s>External component</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>95</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplparameterset</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Parameterset template</s>
+<s>Parameterset-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>96</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.tplparameter</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Parameter template</s>
+<s>Parameter-Vorlage</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>97</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.domain</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Domain</s>
+<s>Domäne</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>98</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.classification</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Classification</s>
+<s>Klassifizierung</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>99</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.status</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Status</s>
+<s>Status</s>
+</AliasNames>
+</MDMLocalization>
+<MDMLocalization>
+<Id>100</Id>
+<Name>mdm://i18n/mt/application%2Fx-asam.aoany.statusvalidity</Name>
+<MimeType>application/x-asam.aoany.mdmlocalization</MimeType>
+<AliasNames>
+<s>Status validity</s>
+<s>Status-Gültigkeit</s>
+</AliasNames>
+</MDMLocalization>
+      <Status><Id>1</Id><Name>Checked</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>imported to MDM and reviewed - has substates - frozen:
+				no further result data can be added - published: has to be available
+				because is prerequisite to an publication</Description>
+         <StatusValidity>1 2 </StatusValidity>
+      </Status>
+      <Status><Id>2</Id><Name>Defining</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>the context is being defined</Description>
+         <StatusValidity>3 4 </StatusValidity>
+      </Status>
+      <Status><Id>3</Id><Name>Rejected</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>has been rejected by the executing units due to any conflict</Description>
+         <StatusValidity>5 6 </StatusValidity>
+      </Status>
+      <Status><Id>4</Id><Name>Cancelled</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>request has been cancelled</Description>
+         <StatusValidity>7 8 </StatusValidity>
+      </Status>
+      <Status><Id>5</Id><Name>Active</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>is being executed</Description>
+         <StatusValidity>9 10 </StatusValidity>
+      </Status>
+      <Status><Id>6</Id><Name>Importing</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>is being imported to the MDM system</Description>
+         <StatusValidity>11 12 </StatusValidity>
+      </Status>
+      <Status><Id>7</Id><Name>Done</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>has been executed and is ready for import to the MDM system</Description>
+         <StatusValidity>13 14 </StatusValidity>
+      </Status>
+      <Status><Id>8</Id><Name>Closed</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>closed, no further data item can be attached.</Description>
+         <StatusValidity>15 </StatusValidity>
+      </Status>
+      <Status><Id>9</Id><Name>Imported</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>imported to the MDM system</Description>
+         <StatusValidity>16 17 </StatusValidity>
+      </Status>
+      <Status><Id>10</Id><Name>Released</Name><MimeType>application/x-asam.aoany.status</MimeType><Description>released for execution</Description>
+         <StatusValidity>18 19 </StatusValidity>
+      </Status>    
+      <StatusValidity><Id>1</Id><Name>Test_Checked</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>1</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>2</Id><Name>TestStep_Checked</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>1</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>3</Id><Name>Test_Defining</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>2</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>4</Id><Name>TestStep_Defining</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>2</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>5</Id><Name>Test_Rejected</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>3</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>6</Id><Name>TestStep_Rejected</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>3</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>7</Id><Name>Test_Cancelled</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>4</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>8</Id><Name>TestStep_Cancelled</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>4</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>9</Id><Name>Test_Active</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>5</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>10</Id><Name>TestStep_Active</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>5</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>11</Id><Name>Test_Importing</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>6</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>12</Id><Name>TestStep_Importing</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>6</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>13</Id><Name>Test_Done</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>7</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>14</Id><Name>TestStep_Done</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>7</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>15</Id><Name>Test_Closed</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>8</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>16</Id><Name>Test_Imported</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>9</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>17</Id><Name>TestStep_Imported</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>9</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>18</Id><Name>Test_Released</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>10</Status><ValidForMimeType>application/x-asam.aosubtest.test</ValidForMimeType>
+      </StatusValidity>
+      <StatusValidity><Id>19</Id><Name>TestStep_Released</Name><MimeType>application/x-asam.aoany.statusvalidity</MimeType><IsFinal>FALSE</IsFinal><Status>10</Status><ValidForMimeType>application/x-asam.aosubtest.teststep</ValidForMimeType>
+      </StatusValidity>
+      <NameMap><Id>1</Id><Name>Project</Name><MimeType>application/x-asam.aonamemap.namemap</MimeType><EntityName>Project</EntityName>
+         <AliasNames><s>Project</s><s>Projekt</s>
+         </AliasNames>
+         <AttributeMap>1 </AttributeMap>
+      </NameMap>
+      <NameMap><Id>2</Id><Name>StructureLevel</Name><MimeType>application/x-asam.aonamemap.namemap</MimeType><EntityName>Project</EntityName>
+         <AliasNames><s>Level</s><s>Ebene</s>
+         </AliasNames>
+         <AttributeMap>2 </AttributeMap>
+      </NameMap>
+      <NameMap><Id>3</Id><Name>Test</Name><MimeType>application/x-asam.aonamemap.namemap</MimeType><EntityName>Test</EntityName>
+         <AliasNames><s>Test</s><s>Versuch</s>
+         </AliasNames>
+         <AttributeMap>3 4 </AttributeMap>
+      </NameMap>
+      <NameMap><Id>4</Id><Name>TestStep</Name><MimeType>application/x-asam.aonamemap.namemap</MimeType><EntityName>TestStep</EntityName>
+         <AliasNames><s>Test step</s><s>Messschritt</s>
+         </AliasNames>
+      </NameMap>
+      <NameMap><Id>5</Id><Name>MeaResult</Name><MimeType>application/x-asam.aonamemap.namemap</MimeType><EntityName>MeaResult</EntityName>
+         <AliasNames><s>Measurement result</s><s>Messergebnis</s>
+         </AliasNames>
+      </NameMap>
+      <NameMap><Id>6</Id><Name>MeaQuantity</Name><MimeType>application/x-asam.aonamemap.namemap</MimeType><EntityName>MeaQuantity</EntityName>
+         <AliasNames><s>Measurement quantity</s><s>Kanal</s>
+         </AliasNames>
+      </NameMap>
+      <PhysDimension><Id>1</Id><Name>time</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>3 30 31 32 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>2</Id><Name>mass</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>2 22 23 24 25 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>3</Id><Name>length</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>1 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>4</Id><Name>current</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>4 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>5</Id><Name>temperature</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>5 83 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>6</Id><Name>amount_of_substance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>6 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>7</Id><Name>luminous_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>7 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>8</Id><Name>plane_angle</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>8 9 10 11 12 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>9</Id><Name>solid_angle</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>66 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>10</Id><Name>refraction_power</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;diopter&quot;, &quot;dioptre&quot;</Description><Length>-1</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>13 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>11</Id><Name>area</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>14 15 16 17 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>12</Id><Name>volume</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>18 19 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>13</Id><Name>volume_flow_rate</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>20 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>14</Id><Name>specific_volume</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>-1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>21 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>15</Id><Name>fiber_coarseness</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>26 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>16</Id><Name>area_related_mass</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>area-related mass = grammage</Description><Length>-2</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>27 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>17</Id><Name>mass_flow</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>28 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>18</Id><Name>density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>29 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>19</Id><Name>frequency</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>33 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>20</Id><Name>rotational_frequency</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>1/s</Description><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>34 35 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>21</Id><Name>velocity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>36 37 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>22</Id><Name>acceleration</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>38 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>23</Id><Name>angular_velocity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>39 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>24</Id><Name>force</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>40 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>25</Id><Name>momentum</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;impulse&quot;, &quot;impetus&quot;</Description><Length>1</Length><Mass>1</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>41 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>26</Id><Name>acoustic_pressure</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>42 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>27</Id><Name>acoustic_power</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>43 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>28</Id><Name>sound_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>W/(m^2)</Description><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>44 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>29</Id><Name>noise_dose</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;laermdosis&quot;</Description><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>96 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>30</Id><Name>pressure</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>unit: pascal</Description><Length>-1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>45 46 47 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>31</Id><Name>dynamic_viscosity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>48 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>32</Id><Name>kinematic_viscosity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>49 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>33</Id><Name>energy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>unit: joule</Description><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>50 51 52 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>34</Id><Name>heat_capacity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>= entropy</Description><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>53 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>35</Id><Name>energy_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>54 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>36</Id><Name>specific_energy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>55 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>37</Id><Name>output</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>unit: watt</Description><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>58 59 60 61 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>38</Id><Name>thermal_conductivity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>62 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>39</Id><Name>thermal_transmission_coefficient</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>63 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>40</Id><Name>heat_flow_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+      </PhysDimension>
+      <PhysDimension><Id>41</Id><Name>radiant_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>65 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>42</Id><Name>radiance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>67 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>43</Id><Name>voltage</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>77 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>44</Id><Name>electrical_resistance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>-2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>68 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>45</Id><Name>electrical_conductance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>-1</Mass><Time>3</Time><Current>2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>69 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>46</Id><Name>electric_charge</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>70 71 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>47</Id><Name>charge_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>0</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>72 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>48</Id><Name>electrical_displacement_field</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>0</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>73 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>49</Id><Name>capacitance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>-1</Mass><Time>4</Time><Current>2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>74 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>50</Id><Name>permittivity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>-1</Mass><Time>4</Time><Current>2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>75 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>51</Id><Name>electric_field_strength</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>1</Mass><Time>-3</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>76 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>52</Id><Name>magnetic_flux</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>78 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>53</Id><Name>magnetic_field_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-2</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>79 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>54</Id><Name>inductance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>-2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>80 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>55</Id><Name>permeability</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>electromagnetic</Description><Length>1</Length><Mass>1</Mass><Time>-2</Time><Current>-2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>81 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>56</Id><Name>magnetic_field_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>0</Mass><Time>0</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>82 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>57</Id><Name>luminance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>84 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>58</Id><Name>luminous_flux</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>85 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>59</Id><Name>activity_of_a_radioactive_substance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>87 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>60</Id><Name>absorbed_dose</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>88 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>61</Id><Name>equivalent_dose</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>89 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>62</Id><Name>absorbed_dose_power</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;energiedosisleistung&quot;</Description><Length>2</Length><Mass>0</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>90 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>63</Id><Name>equivalent_dose_rate</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>98 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>64</Id><Name>exposure_as_a_quantity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;ionendosis&quot;</Description><Length>0</Length><Mass>-1</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>99 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>65</Id><Name>molar_concentration</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>91 92 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>66</Id><Name>molar_volume</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>-1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>93 94 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>67</Id><Name>molar_entropy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>-1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>57 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>68</Id><Name>molar_internal_energy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;molare innere energie&quot;</Description><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>-1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>56 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>69</Id><Name>mass_fraction</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+      </PhysDimension>
+      <PhysDimension><Id>70</Id><Name>catalytic_activity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>95 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>71</Id><Name>catalytic_concentration</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;katalytische konzentration&quot;</Description><Length>-3</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>97 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>72</Id><Name>illumination</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>86 </Units>
+      </PhysDimension>
+      <Role><Id>1</Id><Name>MDMSystemAdministrator</Name><MimeType>application/x-asam.aorole</MimeType><Description>system administrator of the MDM system.</Description><SuperuserFlag>1</SuperuserFlag>
+         <groups2users>3 </groups2users>
+      </Role>
+      <Role><Id>2</Id><Name>MDMMethodsAdministrator</Name><MimeType>application/x-asam.aorole</MimeType><Description>administers (creates, changes, deletes) the description
+				patterns (MDM catalogue and MDM Templates) of the MDM system as well
+				as the interfacing with contextual systems.</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>2 </groups2users>
+      </Role>
+      <Role><Id>3</Id><Name>MDMTestPlanner</Name><MimeType>application/x-asam.aorole</MimeType><Description>defines the desired boundary conditions
+				(MDM:UnitUnderTest, MDM:TestEquipment, MDM: TestSequence) of a test.
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>4 </groups2users>
+      </Role>
+      <Role><Id>4</Id><Name>MDMDataProcessor</Name><MimeType>application/x-asam.aorole</MimeType><Description>retrieves data from the MDM system, generates derived
+				data and stores it back to the MDM system</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>5 </groups2users>
+      </Role>
+      <Role><Id>5</Id><Name>MDMTestConditioner</Name><MimeType>application/x-asam.aorole</MimeType><Description>sets up the MDM:TestEquipment and assembles it with the
+				MDM:UnitUnderTest to complete the Test setup for executing the
+				MDM:TestStep</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>6 </groups2users>
+      </Role>
+      <Role><Id>6</Id><Name>MDMTestObjectConditioner</Name><MimeType>application/x-asam.aorole</MimeType><Description>prepares the MDM:UnitUnderTest for the MDM:TestStep.
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>7 </groups2users>
+      </Role>
+      <Role><Id>7</Id><Name>MDMTestOperator</Name><MimeType>application/x-asam.aorole</MimeType><Description>executes the MDM:TestSteps and generates the Test Data
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>8 </groups2users>
+      </Role>
+      <Role><Id>8</Id><Name>MDMDataCustomer</Name><MimeType>application/x-asam.aorole</MimeType><Description>retrieves data from the MDM system for any use
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>9 </groups2users>
+      </Role>
+      <Role><Id>9</Id><Name>MDMTestReviewer</Name><MimeType>application/x-asam.aorole</MimeType><Description>checks the Test results for correctness, completeness
+				and relevancy and imports them from an external test bed system e.g.
+				to the MDM System.</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>1 </groups2users>
+      </Role>
+      <Role><Id>10</Id><Name>MDMMethodsPlanner</Name><MimeType>application/x-asam.aorole</MimeType><Description>defines the standards for testing and functional design
+				which have to be met by the tests documented in the mdm system
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>10 </groups2users>
+      </Role>
+      <Unit><Id>1</Id><Name>m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>3</PhysDimension>
+      </Unit>
+      <Unit><Id>2</Id><Name>kg</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>3</Id><Name>s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>4</Id><Name>A</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>4</PhysDimension>
+      </Unit>
+      <Unit><Id>5</Id><Name>K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>5</PhysDimension>
+      </Unit>
+      <Unit><Id>6</Id><Name>mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>6</PhysDimension>
+      </Unit>
+      <Unit><Id>7</Id><Name>cd</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>7</PhysDimension>
+      </Unit>
+      <Unit><Id>8</Id><Name>rad</Name><MimeType>application/x-asam.aounit</MimeType><Description>1 rad = 360° / (2*pi)</Description><Factor>57.29580000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>9</Id><Name>grad</Name><MimeType>application/x-asam.aounit</MimeType><Description>(pi/180) * rad</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>10</Id><Name>&apos;</Name><MimeType>application/x-asam.aounit</MimeType><Description>1/60°</Description><Factor>0.016670</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>11</Id><Name>&apos;&apos;</Name><MimeType>application/x-asam.aounit</MimeType><Description>1/3600°</Description><Factor>0.000278</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>12</Id><Name>gon</Name><MimeType>application/x-asam.aounit</MimeType><Description>1 gon = 0.9°</Description><Factor>0.900000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>13</Id><Name>dpt</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>10</PhysDimension>
+      </Unit>
+      <Unit><Id>14</Id><Name>m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>15</Id><Name>a</Name><MimeType>application/x-asam.aounit</MimeType><Factor>100.0000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>16</Id><Name>ha</Name><MimeType>application/x-asam.aounit</MimeType><Factor>10000.00000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>17</Id><Name>b</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>18</Id><Name>m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>12</PhysDimension>
+      </Unit>
+      <Unit><Id>19</Id><Name>L</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.001000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>12</PhysDimension>
+      </Unit>
+      <Unit><Id>20</Id><Name>m^3/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>13</PhysDimension>
+      </Unit>
+      <Unit><Id>21</Id><Name>m^3/kg</Name><MimeType>application/x-asam.aounit</MimeType><Description>m^3/kg</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>14</PhysDimension>
+      </Unit>
+      <Unit><Id>22</Id><Name>g</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.001000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>23</Id><Name>t</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1000.000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>24</Id><Name>carat</Name><MimeType>application/x-asam.aounit</MimeType><Description>metric carat</Description><Factor>0.000200</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>25</Id><Name>u</Name><MimeType>application/x-asam.aounit</MimeType><Description>&quot;1 u&quot;</Description><Factor>0.000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>26</Id><Name>tex</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.000001</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>15</PhysDimension>
+      </Unit>
+      <Unit><Id>27</Id><Name>kg/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>16</PhysDimension>
+      </Unit>
+      <Unit><Id>28</Id><Name>kg/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>17</PhysDimension>
+      </Unit>
+      <Unit><Id>29</Id><Name>kg/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>18</PhysDimension>
+      </Unit>
+      <Unit><Id>30</Id><Name>min</Name><MimeType>application/x-asam.aounit</MimeType><Factor>60.00000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>31</Id><Name>h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3600.000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>32</Id><Name>d</Name><MimeType>application/x-asam.aounit</MimeType><Factor>86400.00000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>33</Id><Name>Hz</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>19</PhysDimension>
+      </Unit>
+      <Unit><Id>34</Id><Name>1/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>20</PhysDimension>
+      </Unit>
+      <Unit><Id>35</Id><Name>1/min</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.016670</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>20</PhysDimension>
+      </Unit>
+      <Unit><Id>36</Id><Name>m/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>21</PhysDimension>
+      </Unit>
+      <Unit><Id>37</Id><Name>km/h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3.600000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>21</PhysDimension>
+      </Unit>
+      <Unit><Id>38</Id><Name>m/s^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>22</PhysDimension>
+      </Unit>
+      <Unit><Id>39</Id><Name>rad/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>57.29580000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>23</PhysDimension>
+      </Unit>
+      <Unit><Id>40</Id><Name>N</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>24</PhysDimension>
+      </Unit>
+      <Unit><Id>41</Id><Name>N/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>25</PhysDimension>
+      </Unit>
+      <Unit><Id>42</Id><Name>N/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Description>= 1 pascal</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>26</PhysDimension>
+      </Unit>
+      <Unit><Id>43</Id><Name>Watt</Name><MimeType>application/x-asam.aounit</MimeType><Description>watt gibts schon</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>27</PhysDimension>
+      </Unit>
+      <Unit><Id>44</Id><Name>W/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Description>W/(m^2) = kg/(s^3)</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>28</PhysDimension>
+      </Unit>
+      <Unit><Id>45</Id><Name>Pa</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>30</PhysDimension>
+      </Unit>
+      <Unit><Id>46</Id><Name>bar</Name><MimeType>application/x-asam.aounit</MimeType><Factor>100000.0000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>30</PhysDimension>
+      </Unit>
+      <Unit><Id>47</Id><Name>Torr</Name><MimeType>application/x-asam.aounit</MimeType><Description>1 torr = 1 mmHg</Description><Factor>133.3220000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>30</PhysDimension>
+      </Unit>
+      <Unit><Id>48</Id><Name>Pa*s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>31</PhysDimension>
+      </Unit>
+      <Unit><Id>49</Id><Name>m^2/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>32</PhysDimension>
+      </Unit>
+      <Unit><Id>50</Id><Name>J</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>33</PhysDimension>
+      </Unit>
+      <Unit><Id>51</Id><Name>kW*h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3600000.000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>33</PhysDimension>
+      </Unit>
+      <Unit><Id>52</Id><Name>eV</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>33</PhysDimension>
+      </Unit>
+      <Unit><Id>53</Id><Name>J/K</Name><MimeType>application/x-asam.aounit</MimeType><Description>= 1 m^2*kg/(s^2*K)</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>34</PhysDimension>
+      </Unit>
+      <Unit><Id>54</Id><Name>J/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Description>= 1 kg/(m*(s^2))</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>35</PhysDimension>
+      </Unit>
+      <Unit><Id>55</Id><Name>m^2/s^2</Name><MimeType>application/x-asam.aounit</MimeType><Description>= J/kg</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>36</PhysDimension>
+      </Unit>
+      <Unit><Id>56</Id><Name>J/mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>68</PhysDimension>
+      </Unit>
+      <Unit><Id>57</Id><Name>J/mol*K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>67</PhysDimension>
+      </Unit>
+      <Unit><Id>58</Id><Name>W</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>59</Id><Name>V*A</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>60</Id><Name>var</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>61</Id><Name>PS</Name><MimeType>application/x-asam.aounit</MimeType><Factor>735.4987500000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>62</Id><Name>W/m*K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>38</PhysDimension>
+      </Unit>
+      <Unit><Id>63</Id><Name>W/m^2*K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>39</PhysDimension>
+      </Unit>
+      <Unit><Id>65</Id><Name>W/sr</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>41</PhysDimension>
+      </Unit>
+      <Unit><Id>66</Id><Name>sr</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>9</PhysDimension>
+      </Unit>
+      <Unit><Id>67</Id><Name>W/(m^2*sr)</Name><MimeType>application/x-asam.aounit</MimeType><Description>doppelt, wenn steradian dimensionslos ist</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>42</PhysDimension>
+      </Unit>
+      <Unit><Id>68</Id><Name>ohm</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>44</PhysDimension>
+      </Unit>
+      <Unit><Id>69</Id><Name>S</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>45</PhysDimension>
+      </Unit>
+      <Unit><Id>70</Id><Name>C</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>46</PhysDimension>
+      </Unit>
+      <Unit><Id>71</Id><Name>A*h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3600.000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>46</PhysDimension>
+      </Unit>
+      <Unit><Id>72</Id><Name>C/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>47</PhysDimension>
+      </Unit>
+      <Unit><Id>73</Id><Name>C/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>48</PhysDimension>
+      </Unit>
+      <Unit><Id>74</Id><Name>F</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>49</PhysDimension>
+      </Unit>
+      <Unit><Id>75</Id><Name>F/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>50</PhysDimension>
+      </Unit>
+      <Unit><Id>76</Id><Name>V/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>51</PhysDimension>
+      </Unit>
+      <Unit><Id>77</Id><Name>V</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>43</PhysDimension>
+      </Unit>
+      <Unit><Id>78</Id><Name>Wb</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>52</PhysDimension>
+      </Unit>
+      <Unit><Id>79</Id><Name>T</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>53</PhysDimension>
+      </Unit>
+      <Unit><Id>80</Id><Name>H</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>54</PhysDimension>
+      </Unit>
+      <Unit><Id>81</Id><Name>H/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>55</PhysDimension>
+      </Unit>
+      <Unit><Id>82</Id><Name>A/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>56</PhysDimension>
+      </Unit>
+      <Unit><Id>83</Id><Name>gradC</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>273.1500000000000</Offset><dB>FALSE</dB><PhysDimension>5</PhysDimension>
+      </Unit>
+      <Unit><Id>84</Id><Name>cd/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>57</PhysDimension>
+      </Unit>
+      <Unit><Id>85</Id><Name>lm</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>58</PhysDimension>
+      </Unit>
+      <Unit><Id>86</Id><Name>lx</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>72</PhysDimension>
+      </Unit>
+      <Unit><Id>87</Id><Name>Bq</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>59</PhysDimension>
+      </Unit>
+      <Unit><Id>88</Id><Name>Gy</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>60</PhysDimension>
+      </Unit>
+      <Unit><Id>89</Id><Name>Sv</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>61</PhysDimension>
+      </Unit>
+      <Unit><Id>90</Id><Name>Gy/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>62</PhysDimension>
+      </Unit>
+      <Unit><Id>91</Id><Name>mol/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>65</PhysDimension>
+      </Unit>
+      <Unit><Id>92</Id><Name>mol/L</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1000.000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>65</PhysDimension>
+      </Unit>
+      <Unit><Id>93</Id><Name>m^3/mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>66</PhysDimension>
+      </Unit>
+      <Unit><Id>94</Id><Name>L/mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.001000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>66</PhysDimension>
+      </Unit>
+      <Unit><Id>95</Id><Name>kat</Name><MimeType>application/x-asam.aounit</MimeType><Description>mol/s</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>70</PhysDimension>
+      </Unit>
+      <Unit><Id>96</Id><Name>Pa^2*s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>29</PhysDimension>
+      </Unit>
+      <Unit><Id>97</Id><Name>kat/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>71</PhysDimension>
+      </Unit>
+      <Unit><Id>98</Id><Name>Sv/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>63</PhysDimension>
+      </Unit>
+      <Unit><Id>99</Id><Name>A*s/kg</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><dB>FALSE</dB><PhysDimension>64</PhysDimension>
+      </Unit>
+      <User><Id>1</Id><Name>tr</Name><Password>tr</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestReviewer</Description><GivenName>MDM basic example</GivenName><Surname>tr</Surname>
+         <users2groups>9 </users2groups>
+      </User>
+      <User><Id>2</Id><Name>ma</Name><Password>ma</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMMethodsAdministrator</Description><GivenName>MDM basic example</GivenName><Surname>ma</Surname>
+         <users2groups>2 </users2groups>
+      </User>
+      <User><Id>3</Id><Name>sa</Name><Password>sa</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMSystemAdministrator</Description><GivenName>MDM basic example</GivenName><Surname>sa</Surname>
+         <users2groups>1 </users2groups>
+      </User>
+      <User><Id>4</Id><Name>tp</Name><Password>tp</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestPlanner</Description><GivenName>MDM basic example</GivenName><Surname>tp</Surname>
+         <users2groups>3 </users2groups>
+      </User>
+      <User><Id>5</Id><Name>dp</Name><Password>dp</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMDataProcessor</Description><GivenName>MDM basic example</GivenName><Surname>dp</Surname>
+         <users2groups>4 </users2groups>
+      </User>
+      <User><Id>6</Id><Name>tc</Name><Password>tc</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestConditioner</Description><GivenName>MDM basic example</GivenName><Surname>tc</Surname>
+         <users2groups>5 </users2groups>
+      </User>
+      <User><Id>7</Id><Name>oc</Name><Password>oc</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestObjectConditioner</Description><GivenName>MDM basic example</GivenName><Surname>oc</Surname>
+         <users2groups>6 </users2groups>
+      </User>
+      <User><Id>8</Id><Name>to</Name><Password>to</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestOperator</Description><GivenName>MDM basic example</GivenName><Surname>to</Surname>
+         <users2groups>7 </users2groups>
+      </User>
+      <User><Id>9</Id><Name>dc</Name><Password>dc</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMDataCustomer</Description><GivenName>MDM basic example</GivenName><Surname>dc</Surname>
+         <users2groups>8 </users2groups>
+      </User>
+      <User><Id>10</Id><Name>mp</Name><Password>mp</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMMethodsPlanner</Description><GivenName>MDM basic example</GivenName><Surname>mp</Surname>
+         <users2groups>10 </users2groups>
+      </User>
+      <AttributeMap><Id>1</Id><Name>Name</Name><MimeType>application/x-asam.aoattributemap.attributemap</MimeType><AttributeName>Name</AttributeName>
+         <AliasNames><s>Name</s><s>Name</s>
+         </AliasNames><NameMap>1</NameMap>
+      </AttributeMap>
+      <AttributeMap><Id>2</Id><Name>Name</Name><MimeType>application/x-asam.aoattributemap.attributemap</MimeType><AttributeName>Name</AttributeName>
+         <AliasNames><s>Name</s><s>Name</s>
+         </AliasNames><NameMap>2</NameMap>
+      </AttributeMap>
+      <AttributeMap><Id>3</Id><Name>Name</Name><MimeType>application/x-asam.aoattributemap.attributemap</MimeType><AttributeName>Name</AttributeName>
+         <AliasNames><s>Name</s><s>Name</s>
+         </AliasNames><NameMap>3</NameMap>
+      </AttributeMap>
+      <AttributeMap><Id>4</Id><Name>Description</Name><MimeType>application/x-asam.aoattributemap.attributemap</MimeType><AttributeName>Description</AttributeName>
+         <AliasNames><s>Description</s><s>Beschreibung</s>
+         </AliasNames><NameMap>3</NameMap>
+      </AttributeMap>
+   </instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_500.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_500.xml
new file mode 100644
index 0000000..e601fab
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_500.xml
@@ -0,0 +1,1431 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<atfx_file version="atfx_file: V1.2.0" xmlns="http://www.asam.net/ODS/5.2.0/Schema">
+  <documentation>
+    <exported_by>openATFX</exported_by>
+    <exporter>openATFX</exporter>
+    <export_date_time>20181022101553</export_date_time>
+    <exporter_version>0.7.3</exporter_version>
+  </documentation>
+  <base_model_version>asam30</base_model_version>
+  <application_model>
+    <application_enumeration>
+      <name>axistype</name>
+      <item>
+        <name>Xaxis</name>
+        <value>0</value>
+      </item>
+      <item>
+        <name>Yaxis</name>
+        <value>1</value>
+      </item>
+      <item>
+        <name>Both</name>
+        <value>2</value>
+      </item>
+    </application_enumeration>
+    <application_enumeration>
+      <name>valid_enum</name>
+      <item>
+        <name>editing</name>
+        <value>0</value>
+      </item>
+      <item>
+        <name>valid</name>
+        <value>1</value>
+      </item>
+      <item>
+        <name>archive</name>
+        <value>2</value>
+      </item>
+    </application_enumeration>
+      <application_element><name>CatSensor</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute> -->
+      </application_element>
+      <application_element><name>CatSensorAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplSensorAttr</name><ref_to>TplSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute> -->
+      </application_element>
+      <application_element><name>CatTestEquipmentComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute> -->
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestEquipmentAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplTestEquipmentAttr</name><ref_to>TplTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute> -->
+      </application_element>
+      <application_element><name>CatTestSequenceComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceComp</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplTestSequenceComp</name><ref_to>TplTestSequenceComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceComp</inverse_name></relation_attribute> -->
+      </application_element>
+      <application_element><name>CatTestSequenceAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestSequenceComp</name><ref_to>CatTestSequenceComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplTestSequenceAttr</name><ref_to>TplTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute> -->
+      </application_element>
+      <application_element><name>CatUnitUnderTestComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestComp</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplUnitUnderTestComp</name><ref_to>TplUnitUnderTestComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestComp</inverse_name></relation_attribute> -->
+      </application_element>
+      <application_element><name>CatUnitUnderTestAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestComp</name><ref_to>CatUnitUnderTestComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+<!--          <relation_attribute><name>TplUnitUnderTestAttr</name><ref_to>TplUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute> -->
+      </application_element>
+      <application_element><name>ValueList</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ValueListValue</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Value</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ValueListValue</inverse_name></relation_attribute>
+      </application_element>
+    <application_element>
+      <name>MeaQuantity</name>
+      <basetype>AoMeasurementQuantity</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DataType</name>
+        <base_attribute>datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Interpolation</name>
+        <base_attribute>interpolation</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Rank</name>
+        <base_attribute>rank</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Dimension</name>
+        <base_attribute>dimension</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>TypeSize</name>
+        <base_attribute>type_size</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Minimum</name>
+        <base_attribute>minimum</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Maximum</name>
+        <base_attribute>maximum</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Average</name>
+        <base_attribute>average</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Deviation</name>
+        <base_attribute>standard_deviation</base_attribute>
+      </application_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Quantity</name>
+        <ref_to>Quantity</ref_to>
+        <base_relation>quantity</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>LocalColumns</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_columns</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>StructureLevel</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Project</name>
+        <ref_to>Project</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>StructureLevel</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Tests</name>
+        <ref_to>Test</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>StructureLevel</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>PhysDimension</name>
+      <basetype>AoPhysicalDimension</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Length</name>
+        <base_attribute>length_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Mass</name>
+        <base_attribute>mass_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Time</name>
+        <base_attribute>time_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Current</name>
+        <base_attribute>current_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Temperature</name>
+        <base_attribute>temperature_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MolarAmount</name>
+        <base_attribute>molar_amount_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>LuminousIntensity</name>
+        <base_attribute>luminous_intensity_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>angle</name>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <relation_attribute>
+        <name>Units</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>units</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>PhysDimension</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Project</name>
+      <basetype>AoTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>StructureLevel</name>
+        <ref_to>StructureLevel</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Project</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Environment</name>
+      <basetype>AoEnvironment</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Max_test_level</name>
+        <base_attribute>max_test_level</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Base_model_version</name>
+        <base_attribute>base_model_version</base_attribute>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>AppModelType</name>
+        <base_attribute>application_model_type</base_attribute>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>AppModelVersion</name>
+        <base_attribute>application_model_version</base_attribute>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Timezone</name>
+        <base_attribute>timezone</base_attribute>
+        <length>20</length>
+      </application_attribute>
+    </application_element>
+    <application_element>
+      <name>User</name>
+      <basetype>AoUser</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Password</name>
+        <base_attribute>password</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>GivenName</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Surname</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Department</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Telephone</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>E-Mail</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>users2groups</name>
+        <ref_to>Role</ref_to>
+        <base_relation>groups</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>groups2users</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Tests</name>
+        <ref_to>Test</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>ResponsiblePerson</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>SubMatrix</name>
+      <basetype>AoSubmatrix</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>SubMatrixNoRows</name>
+        <base_attribute>number_of_rows</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>y-axis-for-x-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>x-axis-for-y-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameter</name>
+        <ref_to>ResultParameter</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>SubMatrix</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>y-axis-for-z-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>z-axis-for-y-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>x-axis-for-y-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>y-axis-for-x-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>LocalColumns</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_columns</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>SubMatrix</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>z-axis-for-y-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>y-axis-for-z-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>SubMatrices</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Unit</name>
+      <basetype>AoUnit</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Factor</name>
+        <base_attribute>factor</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Offset</name>
+        <base_attribute>offset</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>ResultParameter</name>
+        <ref_to>ResultParameter</ref_to>
+        <base_relation>parameters</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>PhysDimension</name>
+        <ref_to>PhysDimension</ref_to>
+        <base_relation>phys_dimension</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Units</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Quantities</name>
+        <ref_to>Quantity</ref_to>
+        <base_relation>quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestEquipment</name>
+      <basetype>AoTestEquipment</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestStep</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Optional</name>
+        <datatype>DT_BOOLEAN</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>Sortindex</name>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestStep</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Test</name>
+        <ref_to>Test</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestSequence</name>
+      <basetype>AoTestSequence</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ExternalComponent</name>
+      <basetype>AoExternalComponent</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>FilenameURL</name>
+        <base_attribute>filename_url</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>TypeSpecification</name>
+        <base_attribute>value_type</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Length</name>
+        <base_attribute>component_length</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>StartOffset</name>
+        <base_attribute>start_offset</base_attribute>
+        <datatype>DT_LONGLONG</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>Blocksize</name>
+        <base_attribute>block_size</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>ValuesPerBlock</name>
+        <base_attribute>valuesperblock</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>ValueOffset</name>
+        <base_attribute>value_offset</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>OrdinalNumber</name>
+        <base_attribute>ordinal_number</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>FlagsFilenameURL</name>
+        <base_attribute>flags_filename_url</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>FlagsStartOffset</name>
+        <base_attribute>flags_start_offset</base_attribute>
+        <datatype>DT_LONGLONG</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>LocalColumn</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_column</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ExternalComponent</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>MeaResult</name>
+      <basetype>AoMeasurement</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeasurementBegin</name>
+        <base_attribute>measurement_begin</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeasurementEnd</name>
+        <base_attribute>measurement_end</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestStep</name>
+        <ref_to>TestStep</ref_to>
+        <base_relation>test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SubMatrices</name>
+        <ref_to>SubMatrix</ref_to>
+        <base_relation>submatrices</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>sequences</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>units_under_test</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>equipments</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Test</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateClosed</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Test</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResponsiblePerson</name>
+        <ref_to>User</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Tests</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>StructureLevel</name>
+        <ref_to>StructureLevel</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Tests</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>UnitUnderTest</name>
+      <basetype>AoUnitUnderTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Role</name>
+      <basetype>AoUserGroup</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>SuperuserFlag</name>
+        <base_attribute>superuser_flag</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>groups2users</name>
+        <ref_to>User</ref_to>
+        <base_relation>users</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>users2groups</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Quantity</name>
+      <basetype>AoQuantity</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DefaultRank</name>
+        <base_attribute>default_rank</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>DefDimension</name>
+        <base_attribute>default_dimension</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>DefTypeSize</name>
+        <base_attribute>default_type_size</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>DefMQName</name>
+        <base_attribute>default_mq_name</base_attribute>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DefDataType</name>
+        <base_attribute>default_datatype</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>ValidFlag</name>
+        <datatype>DT_ENUM</datatype>
+        <enumeration_type>valid_enum</enumeration_type>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>default_unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Quantities</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>LocalColumn</name>
+      <basetype>AoLocalColumn</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>IndependentFlag</name>
+        <base_attribute>independent</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>SequenceRepresentation</name>
+        <base_attribute>sequence_representation</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>GlobalFlag</name>
+        <base_attribute>global_flag</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Values</name>
+        <base_attribute>values</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Flags</name>
+        <base_attribute>flags</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>GenerationParameters</name>
+        <base_attribute>generation_parameters</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>RawDatatype</name>
+        <base_attribute>raw_datatype</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>axistype</name>
+        <datatype>DT_ENUM</datatype>
+        <enumeration_type>axistype</enumeration_type>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantity</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>LocalColumns</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ExternalComponent</name>
+        <ref_to>ExternalComponent</ref_to>
+        <base_relation>external_component</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>LocalColumn</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SubMatrix</name>
+        <ref_to>SubMatrix</ref_to>
+        <base_relation>submatrix</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>LocalColumns</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ResultParameterSet</name>
+      <basetype>AoParameterSet</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameter</name>
+        <ref_to>ResultParameter</ref_to>
+        <base_relation>parameters</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ResultParameter</name>
+      <basetype>AoParameter</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DataType</name>
+        <base_attribute>parameter_datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Value</name>
+        <base_attribute>pvalue</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <base_relation>parameter_set</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SubMatrix</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameter</inverse_name>
+      </relation_attribute>
+    </application_element>
+  </application_model>
+  <instance_data>
+    <Environment>
+      <Id>1</Id>
+      <Name>MDM</Name>
+      <MimeType>application/x-asam.aoenvironment</MimeType>
+      <Description>MDM Environment</Description>
+      <DateCreated>20120703120000</DateCreated>
+      <Max_test_level>4</Max_test_level>
+      <Base_model_version>asam30</Base_model_version>
+      <AppModelType>MDM</AppModelType>
+      <AppModelVersion>4.4.1_mod_prototype</AppModelVersion>
+      <Timezone>GMT</Timezone>
+    </Environment>
+    <User>
+      <Id>1</Id>
+      <Name>dummy</Name>
+      <Password>dummy</Password>
+      <MimeType>application/x-asam.aouser</MimeType>
+      <GivenName>dummy</GivenName>
+      <Surname>dummy</Surname>
+      <users2groups>1</users2groups>
+    </User>
+    <Role>
+      <Id>1</Id>
+      <Name>DummyRole</Name>
+      <SuperuserFlag>0</SuperuserFlag>
+      <MimeType>application/x-asam.aorole</MimeType>
+      <groups2users>1</groups2users>
+    </Role>
+  </instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_with_templates_500.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_with_templates_500.xml
new file mode 100644
index 0000000..e383902
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_with_templates_500.xml
@@ -0,0 +1,1172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<atfx_file version="atfx_file: V1.1.0"  xmlns="http://www.asam.net/ODS/5.2/Schema"
+                                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                                         xsi:schemaLocation="http://www.asam.net/ODS/5.2/Schema http://www.asam.net/ODS/5.2/Schema.xsd">
+<!--
+***************************************************************************************************************
+* Based on ODS Base Model version *
+***************************************************************************************************************
+ -->
+   <base_model_version>asam30</base_model_version>
+<!-- 
+***************************************************************************************************************
+* declare application model meta data *
+***************************************************************************************************************
+ -->
+
+   <application_model>
+<!--
+***************************************************************************************************************
+* declare enumeration definitions *
+***************************************************************************************************************
+ -->
+      <application_enumeration>
+         <name>valid_enum</name>
+         <item><name>editing</name><value>0</value></item>
+         <item><name>valid</name><value>1</value></item>
+         <item><name>archive</name><value>2</value></item>
+      </application_enumeration>
+      <application_enumeration>
+         <name>axistype</name>
+         <item><name>Xaxis</name><value>0</value></item>
+         <item><name>Yaxis</name><value>1</value></item>
+         <item><name>Both</name><value>2</value></item>
+      </application_enumeration>
+
+      <application_element><name>Environment</name><basetype>AoEnvironment</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>Max_test_level</name><base_attribute>max_test_level</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Base_model_version</name><base_attribute>base_model_version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>AppModelType</name><base_attribute>application_model_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>AppModelVersion</name><base_attribute>application_model_version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>Timezone</name><base_attribute>timezone</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MeaningOfAliases</name><base_attribute>meaning_of_aliases</base_attribute><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+      </application_element>
+      <application_element><name>CatSensor</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensor</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatSensorAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensorAttr</name><ref_to>TplSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatSensorAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestEquipmentComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestEquipmentAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentAttr</name><ref_to>TplTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestEquipmentAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestSequenceComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceComp</name><ref_to>TplTestSequenceComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatTestSequenceAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatTestSequenceComp</name><ref_to>CatTestSequenceComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceAttr</name><ref_to>TplTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatTestSequenceAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatUnitUnderTestComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestComp</name><ref_to>TplUnitUnderTestComp</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>CatUnitUnderTestAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1500</length></application_attribute>
+         <application_attribute><name>ValueListRef</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueCopyable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ActionRequestClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>ActionRequestParameter</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestComp</name><ref_to>CatUnitUnderTestComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>ValueList</name><ref_to>ValueList</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestAttr</name><ref_to>TplUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CatUnitUnderTestAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>FavouriteLists</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ASAMPaths</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>User</name><ref_to>User</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>FavouriteLists</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MDMFunction</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <relation_attribute><name>Role</name><ref_to>Role</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MDMFunction</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>SystemParameter</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Value</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>References</name><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>UserParameter</name><ref_to>UserParameter</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>SystemParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplGroup</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplGroupParent</name><ref_to>TplGroup</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplGroupChild</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroupChild</name><ref_to>TplGroup</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroupParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTest</name><ref_to>TplTest</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplGroup</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplMeaResult</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultMimeType</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultName</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplSubMatrix</name><ref_to>TplSubMatrix</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplParameterSet</name><ref_to>TplParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplMeaResult</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplSensor</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensor</name><ref_to>CatSensor</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>Quantity</name><ref_to>Quantity</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensorAttr</name><ref_to>TplSensorAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>MeaQuantityValuesEditable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MeaQuantityIndependent</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MeaQuantityAxisType</name><datatype>DT_ENUM</datatype><enumeration_type>axistype</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MeaQuantityEditorPlugin</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplParameterSet</name><ref_to>TplParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplSensor</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplSensorAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensorAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSensorAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplSubMatrix</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>MinNoRows</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MaxNoRows</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplSubMatrix</inverse_name></relation_attribute>
+         <relation_attribute><name>SubMatrix</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplSubMatrix</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTest</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>NameHelperClassname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DataSourcePluginClassnames</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>TestOrderActionClassnames</name><datatype>DS_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>Tests</name><ref_to>Test</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTest</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStepUsage</name><ref_to>TplTestStepUsage</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTest</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTest</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestEquipmentAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestEquipmentRoot</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentComp</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TestEquipment</name><ref_to>TestEquipment</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentRoot</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestEquipmentComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TestStepSeriesVariable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompParent</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplCompChildren</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestEquipmentComp</name><ref_to>CatTestEquipmentComp</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompChildren</name><ref_to>TplTestEquipmentComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplCompParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentAttr</name><ref_to>TplTestEquipmentAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestEquipmentComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestSequenceAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceComp</name><ref_to>TplTestSequenceComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestSequenceRoot</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceComp</name><ref_to>TplTestSequenceComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSequence</name><ref_to>TestSequence</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceRoot</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestSequenceComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TestStepSeriesVariable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompParent</name><ref_to>TplTestSequenceComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplCompChildren</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestSequenceComp</name><ref_to>CatTestSequenceComp</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestSequenceComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompChildren</name><ref_to>TplTestSequenceComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplCompParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceAttr</name><ref_to>TplTestSequenceAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestSequenceComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestStepUsage</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplTest</name><ref_to>TplTest</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStepUsage</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStepUsage</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplUnitUnderTestAttr</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>ValueReadonly</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Obligatory</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestComp</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestAttr</inverse_name></relation_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestAttr</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplUnitUnderTestRoot</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestComp</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>UnitUnderTest</name><ref_to>UnitUnderTest</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestRoot</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplTestStep</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTestStepUsage</name><ref_to>TplTestStepUsage</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplGroup</name><ref_to>TplGroup</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplTestStep</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplUnitUnderTestComp</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultActive</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TestStepSeriesVariable</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompParent</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplCompChildren</inverse_name></relation_attribute>
+         <relation_attribute><name>CatUnitUnderTestComp</name><ref_to>CatUnitUnderTestComp</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplUnitUnderTestComp</inverse_name></relation_attribute>
+         <relation_attribute><name>TplCompChildren</name><ref_to>TplUnitUnderTestComp</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplCompParent</inverse_name></relation_attribute>
+         <relation_attribute><name>TplUnitUnderTestAttr</name><ref_to>TplUnitUnderTestAttr</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplUnitUnderTestComp</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>UserParameter</name><basetype>AoAny</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Value</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>References</name><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>SystemParameter</name><ref_to>SystemParameter</ref_to><base_relation>parent</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>UserParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>User</name><ref_to>User</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>UserParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>PhysDimension</name><basetype>AoPhysicalDimension</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>Length</name><base_attribute>length_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Mass</name><base_attribute>mass_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Time</name><base_attribute>time_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Current</name><base_attribute>current_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Temperature</name><base_attribute>temperature_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MolarAmount</name><base_attribute>molar_amount_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>LuminousIntensity</name><base_attribute>luminous_intensity_exp</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>angle</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>Units</name><ref_to>Unit</ref_to><base_relation>units</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>PhysDimension</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Project</name><basetype>AoTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>StructureLevel</name><ref_to>StructureLevel</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Project</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ResultParameterSet</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantity</name><ref_to>MeaQuantity</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameter</name><ref_to>ResultParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ResultParameterSet</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Role</name><basetype>AoUserGroup</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>SuperuserFlag</name><base_attribute>superuser_flag</base_attribute><datatype>DT_SHORT</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>MDMFunction</name><ref_to>MDMFunction</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Role</inverse_name></relation_attribute>
+         <relation_attribute><name>groups2users</name><ref_to>User</ref_to><base_relation>users</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>users2groups</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TestEquipment</name><basetype>AoTestEquipment</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplTestEquipmentRoot</name><ref_to>TplTestEquipmentRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestEquipment</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestEquipment</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestEquipment</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TestSequence</name><basetype>AoTestSequence</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplTestSequenceRoot</name><ref_to>TplTestSequenceRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSequence</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestSequence</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestSequence</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplParameterSet</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>TplParameter</name><ref_to>TplParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TplParameterSet</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameterSet</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Unit</name><basetype>AoUnit</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>Factor</name><base_attribute>factor</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Offset</name><base_attribute>offset</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>PhysDimension</name><ref_to>PhysDimension</ref_to><base_relation>phys_dimension</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>Units</inverse_name></relation_attribute>
+         <relation_attribute><name>Quantities</name><ref_to>Quantity</ref_to><base_relation>quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantities</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameter</name><ref_to>ResultParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+         <relation_attribute><name>TplParameter</name><ref_to>TplParameter</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Unit</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Quantity</name><basetype>AoQuantity</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>DefaultRank</name><base_attribute>default_rank</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefDimension</name><base_attribute>default_dimension</base_attribute><datatype>DS_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefTypeSize</name><base_attribute>default_type_size</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefMQName</name><base_attribute>default_mq_name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>DefDataType</name><base_attribute>default_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValidFlag</name><datatype>DT_ENUM</datatype><enumeration_type>valid_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>default_unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Quantities</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantities</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Quantity</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSensor</name><ref_to>TplSensor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Quantity</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>UnitUnderTest</name><basetype>AoUnitUnderTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>Version</name><base_attribute>version</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>20</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplUnitUnderTestRoot</name><ref_to>TplUnitUnderTestRoot</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>UnitUnderTest</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>UnitUnderTest</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>UnitUnderTest</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>User</name><basetype>AoUser</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>Password</name><base_attribute>password</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>GivenName</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Surname</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Department</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>Telephone</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>E-Mail</name><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <relation_attribute><name>Tests</name><ref_to>Test</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ResponsiblePerson</inverse_name></relation_attribute>
+         <relation_attribute><name>UserParameter</name><ref_to>UserParameter</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>User</inverse_name></relation_attribute>
+         <relation_attribute><name>FavouriteLists</name><ref_to>FavouriteLists</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>User</inverse_name></relation_attribute>
+         <relation_attribute><name>users2groups</name><ref_to>Role</ref_to><base_relation>groups</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>groups2users</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ValueList</name><basetype>AoParameterSet</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>true</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <relation_attribute><name>CatUnitUnderTestAttr</name><ref_to>CatUnitUnderTestAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestEquipmentAttr</name><ref_to>CatTestEquipmentAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatTestSequenceAttr</name><ref_to>CatTestSequenceAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+         <relation_attribute><name>CatSensorAttr</name><ref_to>CatSensorAttr</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ValueList</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ResultParameter</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Value</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>ResultParameterSet</name><ref_to>ResultParameterSet</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>SubMatrix</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ResultParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>StructureLevel</name><basetype>AoSubTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>Project</name><ref_to>Project</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>StructureLevel</inverse_name></relation_attribute>
+         <relation_attribute><name>Tests</name><ref_to>Test</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>StructureLevel</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TplParameter</name><basetype>AoParameter</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+	  <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>50</length></application_attribute>
+         <application_attribute><name>DefaultDataType</name><base_attribute>parameter_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DefaultValue</name><base_attribute>pvalue</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <relation_attribute><name>TplParameterSet</name><ref_to>TplParameterSet</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameter</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TplParameter</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>Test</name><basetype>AoSubTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>DateClosed</name><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MDMLinks</name><base_attribute>external_references</base_attribute><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>StructureLevel</name><ref_to>StructureLevel</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>Tests</inverse_name></relation_attribute>        
+         <relation_attribute><name>ResponsiblePerson</name><ref_to>User</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Tests</inverse_name></relation_attribute>
+         <relation_attribute><name>TplTest</name><ref_to>TplTest</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>Tests</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSteps</name><ref_to>TestStep</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>Test</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>TestStep</name><basetype>AoSubTest</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>Optional</name><datatype>DT_BOOLEAN</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Sortindex</name><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>MDMLinks</name><base_attribute>external_references</base_attribute><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>Test</name><ref_to>Test</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>         
+         <relation_attribute><name>TplTestStep</name><ref_to>TplTestStep</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>TestEquipment</name><ref_to>TestEquipment</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>UnitUnderTest</name><ref_to>UnitUnderTest</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSequence</name><ref_to>TestSequence</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>TestSteps</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaResults</name><ref_to>MeaResult</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>TestStep</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MeaResult</name><basetype>AoMeasurement</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>100</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>DateCreated</name><base_attribute>version_date</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MeasurementBegin</name><base_attribute>measurement_begin</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MeasurementEnd</name><base_attribute>measurement_end</base_attribute><datatype>DT_DATE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>30</length></application_attribute>
+         <application_attribute><name>MDMLinks</name><base_attribute>external_references</base_attribute><datatype>DS_EXTERNALREFERENCE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>254</length></application_attribute>
+         <relation_attribute><name>TestStep</name><ref_to>TestStep</ref_to><base_relation>test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>TestEquipment</name><ref_to>TestEquipment</ref_to><base_relation>equipments</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>UnitUnderTest</name><ref_to>UnitUnderTest</ref_to><base_relation>units_under_test</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>TestSequence</name><ref_to>TestSequence</ref_to><base_relation>sequences</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResults</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantities</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>SubMatrices</name><ref_to>SubMatrix</ref_to><base_relation>submatrices</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameterSet</name><ref_to>ResultParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+         <relation_attribute><name>TplMeaResult</name><ref_to>TplMeaResult</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaResult</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>MeaQuantity</name><basetype>AoMeasurementQuantity</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>Description</name><base_attribute>description</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>500</length></application_attribute>
+         <application_attribute><name>Interpolation</name><base_attribute>interpolation</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>interpolation_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>DataType</name><base_attribute>datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Rank</name><base_attribute>rank</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Dimension</name><base_attribute>dimension</base_attribute><datatype>DS_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TypeSize</name><base_attribute>type_size</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Minimum</name><base_attribute>minimum</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Maximum</name><base_attribute>maximum</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Average</name><base_attribute>average</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Deviation</name><base_attribute>standard_deviation</base_attribute><datatype>DT_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaQuantities</inverse_name></relation_attribute>
+         <relation_attribute><name>Quantity</name><ref_to>Quantity</ref_to><base_relation>quantity</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaQuantities</inverse_name></relation_attribute>
+         <relation_attribute><name>Unit</name><ref_to>Unit</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>MeaQuantities</inverse_name></relation_attribute>
+         <relation_attribute><name>LocalColumns</name><ref_to>LocalColumn</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaQuantity</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameterSet</name><ref_to>ResultParameterSet</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>MeaQuantity</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>SubMatrix</name><basetype>AoSubmatrix</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>SubMatrixNoRows</name><base_attribute>number_of_rows</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>MeaResult</name><ref_to>MeaResult</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>SubMatrices</inverse_name></relation_attribute>
+         <relation_attribute><name>x-axis-for-y-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-x-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>z-axis-for-y-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-z-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>y-axis-for-x-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>x-axis-for-y-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>y-axis-for-z-axis</name><ref_to>SubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>z-axis-for-y-axis</inverse_name></relation_attribute>
+         <relation_attribute><name>ResultParameter</name><ref_to>ResultParameter</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>SubMatrix</inverse_name></relation_attribute>
+         <relation_attribute><name>LocalColumns</name><ref_to>LocalColumn</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>SubMatrix</inverse_name></relation_attribute>
+         <relation_attribute><name>TplSubMatrix</name><ref_to>TplSubMatrix</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>SubMatrix</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>LocalColumn</name><basetype>AoLocalColumn</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>MimeType</name><base_attribute>mime_type</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>IndependentFlag</name><base_attribute>independent</base_attribute><datatype>DT_SHORT</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>SequenceRepresentation</name><base_attribute>sequence_representation</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>seq_rep_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>GlobalFlag</name><base_attribute>global_flag</base_attribute><datatype>DT_SHORT</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Values</name><base_attribute>values</base_attribute></application_attribute>
+         <application_attribute><name>Flags</name><base_attribute>flags</base_attribute></application_attribute>
+         <application_attribute><name>GenerationParameters</name><base_attribute>generation_parameters</base_attribute><datatype>DS_DOUBLE</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>RawDatatype</name><base_attribute>raw_datatype</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>datatype_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>axistype</name><datatype>DT_ENUM</datatype><enumeration_type>axistype</enumeration_type><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>SubMatrix</name><ref_to>SubMatrix</ref_to><base_relation>submatrix</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>LocalColumns</inverse_name></relation_attribute>
+         <relation_attribute><name>MeaQuantity</name><ref_to>MeaQuantity</ref_to><base_relation>measurement_quantity</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>LocalColumns</inverse_name></relation_attribute>
+         <relation_attribute><name>ExternalComponent</name><ref_to>ExternalComponent</ref_to><base_relation>external_component</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>LocalColumn</inverse_name></relation_attribute>
+      </application_element>
+      <application_element><name>ExternalComponent</name><basetype>AoExternalComponent</basetype>
+         <application_attribute><name>Id</name><base_attribute>id</base_attribute><datatype>DT_LONGLONG</datatype><autogenerate>true</autogenerate><obligatory>true</obligatory><unique>true</unique><length>1</length></application_attribute>
+         <application_attribute><name>Name</name><base_attribute>name</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>150</length></application_attribute>
+         <application_attribute><name>OrdinalNumber</name><base_attribute>ordinal_number</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>TypeSpecification</name><base_attribute>value_type</base_attribute><datatype>DT_ENUM</datatype><enumeration_type>typespec_enum</enumeration_type><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Length</name><base_attribute>component_length</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>StartOffset</name><base_attribute>start_offset</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>Blocksize</name><base_attribute>block_size</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValuesPerBlock</name><base_attribute>valuesperblock</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>ValueOffset</name><base_attribute>value_offset</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <application_attribute><name>FilenameURL</name><base_attribute>filename_url</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>true</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>FlagsFilenameURL</name><base_attribute>flags_filename_url</base_attribute><datatype>DT_STRING</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>256</length></application_attribute>
+         <application_attribute><name>FlagsStartOffset</name><base_attribute>flags_start_offset</base_attribute><datatype>DT_LONG</datatype><autogenerate>false</autogenerate><obligatory>false</obligatory><unique>false</unique><length>1</length></application_attribute>
+         <relation_attribute><name>LocalColumn</name><ref_to>LocalColumn</ref_to><base_relation>local_column</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ExternalComponent</inverse_name></relation_attribute>
+      </application_element>
+   </application_model>
+<!-- 
+***************************************************************************************************************
+* end application model meta data *
+***************************************************************************************************************
+ -->
+<!--
+***************************************************************************************************************
+* Instance Data is NOT validated with Base Schema *
+***************************************************************************************************************
+ -->
+
+   <instance_data>
+      <Environment><Id>1</Id><Name>MDM</Name><MimeType>application/x-asam.aoenvironment</MimeType><Description>MDM Environment</Description><DateCreated>20120214120000</DateCreated><Max_test_level>4</Max_test_level><Base_model_version>asam30</Base_model_version><AppModelType>ASAM_SECURITY,ASAM_NVH,MDM</AppModelType><AppModelVersion>4.4.1</AppModelVersion><Timezone>GMT</Timezone>
+         <MeaningOfAliases><s>,language=en</s><s>,language=de</s>
+         </MeaningOfAliases>
+      </Environment>
+      <PhysDimension><Id>1</Id><Name>time</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>3 30 31 32 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>2</Id><Name>mass</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>2 22 23 24 25 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>3</Id><Name>length</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>1 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>4</Id><Name>current</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>4 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>5</Id><Name>temperature</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>5 83 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>6</Id><Name>amount_of_substance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>6 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>7</Id><Name>luminous_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>7 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>8</Id><Name>plane_angle</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>8 9 10 11 12 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>9</Id><Name>solid_angle</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>66 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>10</Id><Name>refraction_power</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;diopter&quot;, &quot;dioptre&quot;</Description><Length>-1</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>13 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>11</Id><Name>area</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>14 15 16 17 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>12</Id><Name>volume</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>18 19 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>13</Id><Name>volume_flow_rate</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>20 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>14</Id><Name>specific_volume</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>-1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>21 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>15</Id><Name>fiber_coarseness</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>26 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>16</Id><Name>area_related_mass</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>area-related mass = grammage</Description><Length>-2</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>27 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>17</Id><Name>mass_flow</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>28 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>18</Id><Name>density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>1</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>29 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>19</Id><Name>frequency</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>33 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>20</Id><Name>rotational_frequency</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>1/s</Description><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>34 35 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>21</Id><Name>velocity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>36 37 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>22</Id><Name>acceleration</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>38 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>23</Id><Name>angular_velocity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>39 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>24</Id><Name>force</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>40 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>25</Id><Name>momentum</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;impulse&quot;, &quot;impetus&quot;</Description><Length>1</Length><Mass>1</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>41 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>26</Id><Name>acoustic_pressure</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>42 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>27</Id><Name>acoustic_power</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>43 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>28</Id><Name>sound_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>W/(m^2)</Description><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>44 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>29</Id><Name>noise_dose</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;laermdosis&quot;</Description><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>96 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>30</Id><Name>pressure</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>unit: pascal</Description><Length>-1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>45 46 47 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>31</Id><Name>dynamic_viscosity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>48 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>32</Id><Name>kinematic_viscosity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>49 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>33</Id><Name>energy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>unit: joule</Description><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>50 51 52 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>34</Id><Name>heat_capacity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>= entropy</Description><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>53 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>35</Id><Name>energy_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>54 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>36</Id><Name>specific_energy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>55 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>37</Id><Name>output</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>unit: watt</Description><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>58 59 60 61 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>38</Id><Name>thermal_conductivity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>62 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>39</Id><Name>thermal_transmission_coefficient</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>63 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>40</Id><Name>heat_flow_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+      </PhysDimension>
+      <PhysDimension><Id>41</Id><Name>radiant_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>65 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>42</Id><Name>radiance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>67 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>43</Id><Name>voltage</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>77 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>44</Id><Name>electrical_resistance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-3</Time><Current>-2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>68 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>45</Id><Name>electrical_conductance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>-1</Mass><Time>3</Time><Current>2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>69 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>46</Id><Name>electric_charge</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>70 71 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>47</Id><Name>charge_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>0</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>72 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>48</Id><Name>electrical_displacement_field</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>0</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>73 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>49</Id><Name>capacitance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>-1</Mass><Time>4</Time><Current>2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>74 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>50</Id><Name>permittivity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>-1</Mass><Time>4</Time><Current>2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>75 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>51</Id><Name>electric_field_strength</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>1</Length><Mass>1</Mass><Time>-3</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>76 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>52</Id><Name>magnetic_flux</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>78 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>53</Id><Name>magnetic_field_density</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>1</Mass><Time>-2</Time><Current>-1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>79 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>54</Id><Name>inductance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>-2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>80 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>55</Id><Name>permeability</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>electromagnetic</Description><Length>1</Length><Mass>1</Mass><Time>-2</Time><Current>-2</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>81 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>56</Id><Name>magnetic_field_intensity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-1</Length><Mass>0</Mass><Time>0</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>82 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>57</Id><Name>luminance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>84 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>58</Id><Name>luminous_flux</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>85 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>59</Id><Name>activity_of_a_radioactive_substance</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>87 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>60</Id><Name>absorbed_dose</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>88 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>61</Id><Name>equivalent_dose</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>89 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>62</Id><Name>absorbed_dose_power</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;energiedosisleistung&quot;</Description><Length>2</Length><Mass>0</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>90 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>63</Id><Name>equivalent_dose_rate</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>0</Mass><Time>-3</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>98 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>64</Id><Name>exposure_as_a_quantity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;ionendosis&quot;</Description><Length>0</Length><Mass>-1</Mass><Time>1</Time><Current>1</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>99 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>65</Id><Name>molar_concentration</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-3</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>91 92 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>66</Id><Name>molar_volume</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>3</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>-1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>93 94 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>67</Id><Name>molar_entropy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>-1</Temperature><MolarAmount>-1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>57 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>68</Id><Name>molar_internal_energy</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;molare innere energie&quot;</Description><Length>2</Length><Mass>1</Mass><Time>-2</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>-1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>56 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>69</Id><Name>mass_fraction</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+      </PhysDimension>
+      <PhysDimension><Id>70</Id><Name>catalytic_activity</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>0</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>95 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>71</Id><Name>catalytic_concentration</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Description>&quot;katalytische konzentration&quot;</Description><Length>-3</Length><Mass>0</Mass><Time>-1</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>1</MolarAmount><LuminousIntensity>0</LuminousIntensity><angle>0</angle>
+         <Units>97 </Units>
+      </PhysDimension>
+      <PhysDimension><Id>72</Id><Name>illumination</Name><MimeType>application/x-asam.aophysicaldimension</MimeType><Length>-2</Length><Mass>0</Mass><Time>0</Time><Current>0</Current><Temperature>0</Temperature><MolarAmount>0</MolarAmount><LuminousIntensity>1</LuminousIntensity><angle>0</angle>
+         <Units>86 </Units>
+      </PhysDimension>
+      <Role><Id>1</Id><Name>MDMSystemAdministrator</Name><MimeType>application/x-asam.aorole</MimeType><Description>system administrator of the MDM system.</Description><SuperuserFlag>1</SuperuserFlag>
+         <groups2users>3 </groups2users>
+      </Role>
+      <Role><Id>2</Id><Name>MDMMethodsAdministrator</Name><MimeType>application/x-asam.aorole</MimeType><Description>administers (creates, changes, deletes) the description
+				patterns (MDM catalogue and MDM Templates) of the MDM system as well
+				as the interfacing with contextual systems.</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>2 </groups2users>
+      </Role>
+      <Role><Id>3</Id><Name>MDMTestPlanner</Name><MimeType>application/x-asam.aorole</MimeType><Description>defines the desired boundary conditions
+				(MDM:UnitUnderTest, MDM:TestEquipment, MDM: TestSequence) of a test.
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>4 </groups2users>
+      </Role>
+      <Role><Id>4</Id><Name>MDMDataProcessor</Name><MimeType>application/x-asam.aorole</MimeType><Description>retrieves data from the MDM system, generates derived
+				data and stores it back to the MDM system</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>5 </groups2users>
+      </Role>
+      <Role><Id>5</Id><Name>MDMTestConditioner</Name><MimeType>application/x-asam.aorole</MimeType><Description>sets up the MDM:TestEquipment and assembles it with the
+				MDM:UnitUnderTest to complete the Test setup for executing the
+				MDM:TestStep</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>6 </groups2users>
+      </Role>
+      <Role><Id>6</Id><Name>MDMTestObjectConditioner</Name><MimeType>application/x-asam.aorole</MimeType><Description>prepares the MDM:UnitUnderTest for the MDM:TestStep.
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>7 </groups2users>
+      </Role>
+      <Role><Id>7</Id><Name>MDMTestOperator</Name><MimeType>application/x-asam.aorole</MimeType><Description>executes the MDM:TestSteps and generates the Test Data
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>8 </groups2users>
+      </Role>
+      <Role><Id>8</Id><Name>MDMDataCustomer</Name><MimeType>application/x-asam.aorole</MimeType><Description>retrieves data from the MDM system for any use
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>9 </groups2users>
+      </Role>
+      <Role><Id>9</Id><Name>MDMTestReviewer</Name><MimeType>application/x-asam.aorole</MimeType><Description>checks the Test results for correctness, completeness
+				and relevancy and imports them from an external test bed system e.g.
+				to the MDM System.</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>1 </groups2users>
+      </Role>
+      <Role><Id>10</Id><Name>MDMMethodsPlanner</Name><MimeType>application/x-asam.aorole</MimeType><Description>defines the standards for testing and functional design
+				which have to be met by the tests documented in the mdm system
+			</Description><SuperuserFlag>0</SuperuserFlag>
+         <groups2users>10 </groups2users>
+      </Role>
+      <Unit><Id>1</Id><Name>m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>3</PhysDimension>
+      </Unit>
+      <Unit><Id>2</Id><Name>kg</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>3</Id><Name>s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>4</Id><Name>A</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>4</PhysDimension>
+      </Unit>
+      <Unit><Id>5</Id><Name>K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>5</PhysDimension>
+      </Unit>
+      <Unit><Id>6</Id><Name>mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>6</PhysDimension>
+      </Unit>
+      <Unit><Id>7</Id><Name>cd</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>7</PhysDimension>
+      </Unit>
+      <Unit><Id>8</Id><Name>rad</Name><MimeType>application/x-asam.aounit</MimeType><Description>1 rad = 360° / (2*pi)</Description><Factor>57.29580000000000</Factor><Offset>0.000000</Offset><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>9</Id><Name>grad</Name><MimeType>application/x-asam.aounit</MimeType><Description>(pi/180) * rad</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>10</Id><Name>&apos;</Name><MimeType>application/x-asam.aounit</MimeType><Description>1/60°</Description><Factor>0.016670</Factor><Offset>0.000000</Offset><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>11</Id><Name>&apos;&apos;</Name><MimeType>application/x-asam.aounit</MimeType><Description>1/3600°</Description><Factor>0.000278</Factor><Offset>0.000000</Offset><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>12</Id><Name>gon</Name><MimeType>application/x-asam.aounit</MimeType><Description>1 gon = 0.9°</Description><Factor>0.900000000000000</Factor><Offset>0.000000</Offset><PhysDimension>8</PhysDimension>
+      </Unit>
+      <Unit><Id>13</Id><Name>dpt</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>10</PhysDimension>
+      </Unit>
+      <Unit><Id>14</Id><Name>m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>15</Id><Name>a</Name><MimeType>application/x-asam.aounit</MimeType><Factor>100.0000000000000</Factor><Offset>0.000000</Offset><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>16</Id><Name>ha</Name><MimeType>application/x-asam.aounit</MimeType><Factor>10000.00000000000</Factor><Offset>0.000000</Offset><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>17</Id><Name>b</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.000000</Factor><Offset>0.000000</Offset><PhysDimension>11</PhysDimension>
+      </Unit>
+      <Unit><Id>18</Id><Name>m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>12</PhysDimension>
+      </Unit>
+      <Unit><Id>19</Id><Name>L</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.001000</Factor><Offset>0.000000</Offset><PhysDimension>12</PhysDimension>
+      </Unit>
+      <Unit><Id>20</Id><Name>m^3/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>13</PhysDimension>
+      </Unit>
+      <Unit><Id>21</Id><Name>m^3/kg</Name><MimeType>application/x-asam.aounit</MimeType><Description>m^3/kg</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>14</PhysDimension>
+      </Unit>
+      <Unit><Id>22</Id><Name>g</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.001000</Factor><Offset>0.000000</Offset><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>23</Id><Name>t</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1000.000000000000</Factor><Offset>0.000000</Offset><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>24</Id><Name>carat</Name><MimeType>application/x-asam.aounit</MimeType><Description>metric carat</Description><Factor>0.000200</Factor><Offset>0.000000</Offset><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>25</Id><Name>u</Name><MimeType>application/x-asam.aounit</MimeType><Description>&quot;1 u&quot;</Description><Factor>0.000000</Factor><Offset>0.000000</Offset><PhysDimension>2</PhysDimension>
+      </Unit>
+      <Unit><Id>26</Id><Name>tex</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.000001</Factor><Offset>0.000000</Offset><PhysDimension>15</PhysDimension>
+      </Unit>
+      <Unit><Id>27</Id><Name>kg/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>16</PhysDimension>
+      </Unit>
+      <Unit><Id>28</Id><Name>kg/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>17</PhysDimension>
+      </Unit>
+      <Unit><Id>29</Id><Name>kg/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>18</PhysDimension>
+      </Unit>
+      <Unit><Id>30</Id><Name>min</Name><MimeType>application/x-asam.aounit</MimeType><Factor>60.00000000000000</Factor><Offset>0.000000</Offset><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>31</Id><Name>h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3600.000000000000</Factor><Offset>0.000000</Offset><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>32</Id><Name>d</Name><MimeType>application/x-asam.aounit</MimeType><Factor>86400.00000000000</Factor><Offset>0.000000</Offset><PhysDimension>1</PhysDimension>
+      </Unit>
+      <Unit><Id>33</Id><Name>Hz</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>19</PhysDimension>
+      </Unit>
+      <Unit><Id>34</Id><Name>1/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>20</PhysDimension>
+      </Unit>
+      <Unit><Id>35</Id><Name>1/min</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.016670</Factor><Offset>0.000000</Offset><PhysDimension>20</PhysDimension>
+      </Unit>
+      <Unit><Id>36</Id><Name>m/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>21</PhysDimension>
+      </Unit>
+      <Unit><Id>37</Id><Name>km/h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3.600000000000000</Factor><Offset>0.000000</Offset><PhysDimension>21</PhysDimension>
+      </Unit>
+      <Unit><Id>38</Id><Name>m/s^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>22</PhysDimension>
+      </Unit>
+      <Unit><Id>39</Id><Name>rad/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>57.29580000000000</Factor><Offset>0.000000</Offset><PhysDimension>23</PhysDimension>
+      </Unit>
+      <Unit><Id>40</Id><Name>N</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>24</PhysDimension>
+      </Unit>
+      <Unit><Id>41</Id><Name>N/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>25</PhysDimension>
+      </Unit>
+      <Unit><Id>42</Id><Name>N/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Description>= 1 pascal</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>26</PhysDimension>
+      </Unit>
+      <Unit><Id>43</Id><Name>Watt</Name><MimeType>application/x-asam.aounit</MimeType><Description>watt gibts schon</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>27</PhysDimension>
+      </Unit>
+      <Unit><Id>44</Id><Name>W/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Description>W/(m^2) = kg/(s^3)</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>28</PhysDimension>
+      </Unit>
+      <Unit><Id>45</Id><Name>Pa</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>30</PhysDimension>
+      </Unit>
+      <Unit><Id>46</Id><Name>bar</Name><MimeType>application/x-asam.aounit</MimeType><Factor>100000.0000000000</Factor><Offset>0.000000</Offset><PhysDimension>30</PhysDimension>
+      </Unit>
+      <Unit><Id>47</Id><Name>Torr</Name><MimeType>application/x-asam.aounit</MimeType><Description>1 torr = 1 mmHg</Description><Factor>133.3220000000000</Factor><Offset>0.000000</Offset><PhysDimension>30</PhysDimension>
+      </Unit>
+      <Unit><Id>48</Id><Name>Pa*s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>31</PhysDimension>
+      </Unit>
+      <Unit><Id>49</Id><Name>m^2/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>32</PhysDimension>
+      </Unit>
+      <Unit><Id>50</Id><Name>J</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>33</PhysDimension>
+      </Unit>
+      <Unit><Id>51</Id><Name>kW*h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3600000.000000000</Factor><Offset>0.000000</Offset><PhysDimension>33</PhysDimension>
+      </Unit>
+      <Unit><Id>52</Id><Name>eV</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.000000</Factor><Offset>0.000000</Offset><PhysDimension>33</PhysDimension>
+      </Unit>
+      <Unit><Id>53</Id><Name>J/K</Name><MimeType>application/x-asam.aounit</MimeType><Description>= 1 m^2*kg/(s^2*K)</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>34</PhysDimension>
+      </Unit>
+      <Unit><Id>54</Id><Name>J/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Description>= 1 kg/(m*(s^2))</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>35</PhysDimension>
+      </Unit>
+      <Unit><Id>55</Id><Name>m^2/s^2</Name><MimeType>application/x-asam.aounit</MimeType><Description>= J/kg</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>36</PhysDimension>
+      </Unit>
+      <Unit><Id>56</Id><Name>J/mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>68</PhysDimension>
+      </Unit>
+      <Unit><Id>57</Id><Name>J/mol*K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>67</PhysDimension>
+      </Unit>
+      <Unit><Id>58</Id><Name>W</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>59</Id><Name>V*A</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>60</Id><Name>var</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>61</Id><Name>PS</Name><MimeType>application/x-asam.aounit</MimeType><Factor>735.4987500000000</Factor><Offset>0.000000</Offset><PhysDimension>37</PhysDimension>
+      </Unit>
+      <Unit><Id>62</Id><Name>W/m*K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>38</PhysDimension>
+      </Unit>
+      <Unit><Id>63</Id><Name>W/m^2*K</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>39</PhysDimension>
+      </Unit>
+      <Unit><Id>65</Id><Name>W/sr</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>41</PhysDimension>
+      </Unit>
+      <Unit><Id>66</Id><Name>sr</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>9</PhysDimension>
+      </Unit>
+      <Unit><Id>67</Id><Name>W/(m^2*sr)</Name><MimeType>application/x-asam.aounit</MimeType><Description>doppelt, wenn steradian dimensionslos ist</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>42</PhysDimension>
+      </Unit>
+      <Unit><Id>68</Id><Name>ohm</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>44</PhysDimension>
+      </Unit>
+      <Unit><Id>69</Id><Name>S</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>45</PhysDimension>
+      </Unit>
+      <Unit><Id>70</Id><Name>C</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>46</PhysDimension>
+      </Unit>
+      <Unit><Id>71</Id><Name>A*h</Name><MimeType>application/x-asam.aounit</MimeType><Factor>3600.000000000000</Factor><Offset>0.000000</Offset><PhysDimension>46</PhysDimension>
+      </Unit>
+      <Unit><Id>72</Id><Name>C/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>47</PhysDimension>
+      </Unit>
+      <Unit><Id>73</Id><Name>C/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>48</PhysDimension>
+      </Unit>
+      <Unit><Id>74</Id><Name>F</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>49</PhysDimension>
+      </Unit>
+      <Unit><Id>75</Id><Name>F/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>50</PhysDimension>
+      </Unit>
+      <Unit><Id>76</Id><Name>V/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>51</PhysDimension>
+      </Unit>
+      <Unit><Id>77</Id><Name>V</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>43</PhysDimension>
+      </Unit>
+      <Unit><Id>78</Id><Name>Wb</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>52</PhysDimension>
+      </Unit>
+      <Unit><Id>79</Id><Name>T</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>53</PhysDimension>
+      </Unit>
+      <Unit><Id>80</Id><Name>H</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>54</PhysDimension>
+      </Unit>
+      <Unit><Id>81</Id><Name>H/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>55</PhysDimension>
+      </Unit>
+      <Unit><Id>82</Id><Name>A/m</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>56</PhysDimension>
+      </Unit>
+      <Unit><Id>83</Id><Name>gradC</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>273.1500000000000</Offset><PhysDimension>5</PhysDimension>
+      </Unit>
+      <Unit><Id>84</Id><Name>cd/m^2</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>57</PhysDimension>
+      </Unit>
+      <Unit><Id>85</Id><Name>lm</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>58</PhysDimension>
+      </Unit>
+      <Unit><Id>86</Id><Name>lx</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>72</PhysDimension>
+      </Unit>
+      <Unit><Id>87</Id><Name>Bq</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>59</PhysDimension>
+      </Unit>
+      <Unit><Id>88</Id><Name>Gy</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>60</PhysDimension>
+      </Unit>
+      <Unit><Id>89</Id><Name>Sv</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>61</PhysDimension>
+      </Unit>
+      <Unit><Id>90</Id><Name>Gy/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>62</PhysDimension>
+      </Unit>
+      <Unit><Id>91</Id><Name>mol/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>65</PhysDimension>
+      </Unit>
+      <Unit><Id>92</Id><Name>mol/L</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1000.000000000000</Factor><Offset>0.000000</Offset><PhysDimension>65</PhysDimension>
+      </Unit>
+      <Unit><Id>93</Id><Name>m^3/mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>66</PhysDimension>
+      </Unit>
+      <Unit><Id>94</Id><Name>L/mol</Name><MimeType>application/x-asam.aounit</MimeType><Factor>0.001000</Factor><Offset>0.000000</Offset><PhysDimension>66</PhysDimension>
+      </Unit>
+      <Unit><Id>95</Id><Name>kat</Name><MimeType>application/x-asam.aounit</MimeType><Description>mol/s</Description><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>70</PhysDimension>
+      </Unit>
+      <Unit><Id>96</Id><Name>Pa^2*s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>29</PhysDimension>
+      </Unit>
+      <Unit><Id>97</Id><Name>kat/m^3</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>71</PhysDimension>
+      </Unit>
+      <Unit><Id>98</Id><Name>Sv/s</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>63</PhysDimension>
+      </Unit>
+      <Unit><Id>99</Id><Name>A*s/kg</Name><MimeType>application/x-asam.aounit</MimeType><Factor>1.000000000000000</Factor><Offset>0.000000</Offset><PhysDimension>64</PhysDimension>
+      </Unit>
+      <User><Id>1</Id><Name>tr</Name><Password>tr</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestReviewer</Description><GivenName>MDM basic example</GivenName><Surname>tr</Surname>
+         <users2groups>9 </users2groups>
+      </User>
+      <User><Id>2</Id><Name>ma</Name><Password>ma</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMMethodsAdministrator</Description><GivenName>MDM basic example</GivenName><Surname>ma</Surname>
+         <users2groups>2 </users2groups>
+      </User>
+      <User><Id>3</Id><Name>sa</Name><Password>sa</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMSystemAdministrator</Description><GivenName>MDM basic example</GivenName><Surname>sa</Surname>
+         <users2groups>1 </users2groups>
+      </User>
+      <User><Id>4</Id><Name>tp</Name><Password>tp</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestPlanner</Description><GivenName>MDM basic example</GivenName><Surname>tp</Surname>
+         <users2groups>3 </users2groups>
+      </User>
+      <User><Id>5</Id><Name>dp</Name><Password>dp</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMDataProcessor</Description><GivenName>MDM basic example</GivenName><Surname>dp</Surname>
+         <users2groups>4 </users2groups>
+      </User>
+      <User><Id>6</Id><Name>tc</Name><Password>tc</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestConditioner</Description><GivenName>MDM basic example</GivenName><Surname>tc</Surname>
+         <users2groups>5 </users2groups>
+      </User>
+      <User><Id>7</Id><Name>oc</Name><Password>oc</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestObjectConditioner</Description><GivenName>MDM basic example</GivenName><Surname>oc</Surname>
+         <users2groups>6 </users2groups>
+      </User>
+      <User><Id>8</Id><Name>to</Name><Password>to</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMTestOperator</Description><GivenName>MDM basic example</GivenName><Surname>to</Surname>
+         <users2groups>7 </users2groups>
+      </User>
+      <User><Id>9</Id><Name>dc</Name><Password>dc</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMDataCustomer</Description><GivenName>MDM basic example</GivenName><Surname>dc</Surname>
+         <users2groups>8 </users2groups>
+      </User>
+      <User><Id>10</Id><Name>mp</Name><Password>mp</Password><MimeType>application/x-asam.aouser</MimeType><Description>MDMMethodsPlanner</Description><GivenName>MDM basic example</GivenName><Surname>mp</Surname>
+         <users2groups>10 </users2groups>
+      </User>
+   </instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/openmdm.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/openmdm.png
new file mode 100644
index 0000000..437bb58
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/openmdm.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/.gitignore
new file mode 100644
index 0000000..03be9c1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/.gitignore
@@ -0,0 +1,3 @@
+/.gradle/
+/build/
+/bin/
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/build.gradle
new file mode 100644
index 0000000..8a6f180
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/build.gradle
@@ -0,0 +1,38 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+description = 'atfx file importer'
+
+dependencies {
+	compile 'org.glassfish.jersey.media:jersey-media-multipart:2.23.2'
+	compileOnly 'org.slf4j:slf4j-api:1.7.25'
+	compileOnly 'javax:javaee-api:7.0'
+	runtime 'ch.qos.logback:logback-classic:1.2.3'
+
+	// MDM5 API
+	compile project(':org.eclipse.mdm.application')
+	compile project(':org.eclipse.mdm.businessobjects')
+
+	testImplementation project(':org.eclipse.mdm.api.atfxadapter')
+	testCompile 'junit:junit:4.12'
+	testCompile 'org.mockito:mockito-core:2.13.0'
+	testCompile 'org.assertj:assertj-core:3.6.2'
+	testCompile 'org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2:2.23.2'
+	testCompile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.23.2'
+}
+
+jar {
+	metaInf { from 'NOTICE.txt' }
+	metaInf { from 'LICENSE.txt' }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ExportResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ExportResource.java
new file mode 100644
index 0000000..d323460
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ExportResource.java
@@ -0,0 +1,145 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.boundary;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+
+import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasket;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@Tag(name = "Export")
+@javax.ws.rs.Path("/export")
+public class ExportResource {
+	private static final Logger LOG = LoggerFactory.getLogger(ExportResource.class);
+
+	@EJB
+	private ExportService exportService;
+
+	/**
+	 * Default public constructor for JAX-RS
+	 */
+	public ExportResource() {
+	}
+
+	/**
+	 * Used to provide service for unit tests
+	 * 
+	 * @param exportService
+	 */
+	protected ExportResource(ExportService exportService) {
+		this.exportService = exportService;
+	}
+
+	@POST
+	@Consumes(MediaType.APPLICATION_XML)
+	@Produces(MediaType.APPLICATION_XML)
+	public Response exportAtfx(ShoppingBasket basket) throws IOException {
+
+		final Path exportAtfx = exportService.exportAtfx(basket);
+
+		List<File> files = Files.list(exportAtfx).map(p -> p.toFile()).collect(Collectors.toList());
+		if (files.size() == 1) {
+			StreamingOutput output = new StreamingOutput() {
+				@Override
+				public void write(OutputStream out) throws IOException {
+					try (final InputStream responseStream = new FileInputStream(files.get(0))) {
+						int length;
+						byte[] buffer = new byte[1024];
+						while ((length = responseStream.read(buffer)) != -1) {
+							out.write(buffer, 0, length);
+						}
+						out.flush();
+					} finally {
+						if (exportAtfx != null) {
+							try {
+								deleteDirectory(exportAtfx);
+							} catch (IOException e) {
+								LOG.warn("Could not delete temporary directory "
+										+ exportAtfx.getParent().toFile().getAbsolutePath(), e);
+							}
+						}
+					}
+				}
+			};
+
+			return Response.ok(output, MediaType.APPLICATION_XML).build();
+		} else {
+			StreamingOutput out = new StreamingOutput() {
+				@Override
+				public void write(OutputStream output) throws IOException, WebApplicationException {
+					try (ZipOutputStream out = new ZipOutputStream(output)) {
+						List<File> files = Files.list(exportAtfx).map(p -> p.toFile()).collect(Collectors.toList());
+						for (File f : files) {
+							out.putNextEntry(new ZipEntry(f.getName()));
+							try (InputStream in = new FileInputStream(f)) {
+								int read = 0;
+								byte[] bytes = new byte[1024];
+
+								while ((read = in.read(bytes)) != -1) {
+									out.write(bytes, 0, read);
+								}
+							}
+						}
+					} catch (Exception e) {
+						e.printStackTrace();
+					} finally {
+						if (exportAtfx != null) {
+							try {
+								deleteDirectory(exportAtfx);
+							} catch (IOException e) {
+								LOG.warn(
+										"Could not delete temporary directory " + exportAtfx.toFile().getAbsolutePath(),
+										e);
+							}
+						}
+					}
+				}
+			};
+			return Response.ok(out, "application/zip").build();
+		}
+	}
+
+	/**
+	 * Deletes a directory.
+	 * 
+	 * @param pathToBeDeleted directory to delete
+	 * @throws IOException
+	 */
+	private void deleteDirectory(java.nio.file.Path pathToBeDeleted) throws IOException {
+		Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ExportService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ExportService.java
new file mode 100644
index 0000000..f090501
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ExportService.java
@@ -0,0 +1,194 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.boundary;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.ApplicationContextFactory;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.apicopy.control.ApiCopyException;
+import org.eclipse.mdm.apicopy.control.ExportTask;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.shoppingbasket.entity.MDMItem;
+import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasket;
+
+import com.google.common.collect.BiMap;
+import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Service for importing an ATFX file into a MDM datasource.
+ *
+ */
+@Stateless
+public class ExportService {
+
+	// TODO make temp path configurable
+	private static final Path TMP = Paths.get(System.getProperty("java.io.tmpdir"));
+
+	@Inject
+	private ConnectorService connectorService;
+
+	private final String atfxContextFactoryClassname = "org.eclipse.mdm.api.atfxadapter.ATFXContextFactory";
+
+	/**
+	 * Default public constructor
+	 */
+	public ExportService() {
+	}
+
+	/**
+	 * Imports an ATFX file into the provided datasource.
+	 *
+	 * @param atfxFileSupplier returns a {@link Path} to an ATFX file. Accompanying
+	 *                         binary files are expected to be on the same folder.
+	 * @return
+	 */
+	public Path exportAtfx(ShoppingBasket basket) {
+
+		try {
+			Path tmpDir = Files.createTempDirectory(TMP, "atfxexport");
+			Path atfxFile = tmpDir.resolve("export.atfx");
+			writeToFile(atfxFile, ExportTask.class.getResourceAsStream("/emptyAtfx.xml"));
+
+			Map<String, String> params = ImmutableMap.of("atfxfile", atfxFile.toFile().getAbsolutePath(),
+					"freetext.active", "false", "includeCatalog", "true");
+			ApplicationContext contextDst = connectContext(atfxContextFactoryClassname, params);
+
+			Map<String, List<MDMItem>> map = basket.getItems().stream().map(i -> i.getRestURI().getPath())
+					.map(p -> split(p)).collect(Collectors.groupingBy(p -> p.getSource()));
+			if (map.size() != 1) {
+				throw new ApiCopyException("Currently only exports from exactly one application context are allowed!");
+			}
+			String srcContextName = map.keySet().iterator().next();
+
+			ApplicationContext contextSrc = connectorService.getContextByName(srcContextName);
+			List<? extends Entity> entities = loadEntities(contextSrc, basket);
+
+			/*
+			 * Copy the catalog (which involves creating the ContextComponts).
+			 */
+			ExportTask task = new ExportTask(contextSrc, contextDst);
+			task.copyCatalog();
+			contextDst.close();
+
+			/*
+			 * After creating the ContextComponents, the application model has to be
+			 * reloaded. This is normally done in a co-session, but openATFX does not
+			 * support co-sessions. Thus we have to create a new session by creating a new
+			 * application context.
+			 */
+			contextDst = connectContext(atfxContextFactoryClassname, params);
+			task = new ExportTask(contextSrc, contextDst);
+			task.copy(entities);
+			contextDst.close();
+
+			return tmpDir;
+		} catch (ServiceNotProvidedException e) {
+			throw new ApiCopyException("Could not retrive all required services from ATFX application context!", e);
+		} catch (ConnectionException e) {
+			throw new ApiCopyException("Could not create ATFX application context!", e);
+		} catch (IOException e) {
+			throw new ApiCopyException("Cold not create temporary directory!", e);
+		}
+	}
+
+	private List<? extends Entity> loadEntities(ApplicationContext contextSrc, ShoppingBasket basket)
+			throws ServiceNotProvidedException, DataAccessException {
+		EntityManager em = contextSrc.getEntityManager()
+				.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+
+		return basket.getItems().stream().map(i -> i.getRestURI().getPath()).map(p -> split(p))
+				.map(i -> em.load(typeToClass(i.getType()), i.getId())).collect(Collectors.toList());
+	}
+
+	private Class<? extends Entity> typeToClass(String s) {
+		return ENTITY2FRAGMENT_URI.inverse().get(s);
+	}
+
+	private static final BiMap<Class<? extends Entity>, String> ENTITY2FRAGMENT_URI = ImmutableBiMap
+			.<Class<? extends Entity>, String>builder().put(Project.class, "projects").put(Pool.class, "pools")
+			.put(Test.class, "tests").put(TestStep.class, "teststeps").put(Measurement.class, "measurements")
+			.put(ChannelGroup.class, "channelgroups").put(Channel.class, "channels").build();
+
+	private MDMItem split(String path) {
+
+		String[] splitted = path.split("/");
+		MDMItem item = new MDMItem();
+		item.setId(splitted[splitted.length - 1]);
+		item.setType(splitted[splitted.length - 2]);
+		item.setSource(splitted[splitted.length - 3]);
+		return item;
+	}
+
+	/**
+	 * Connects to a {@link ApplicationContext}.
+	 * 
+	 * @param contextFactoryClassname classname of the
+	 *                                {@link ApplicationContextFactory}
+	 * @param parameters              connection parameters
+	 * @return connected {@link ApplicationContext}
+	 * @throws ConnectionException
+	 */
+	private ApplicationContext connectContext(String contextFactoryClassname, Map<String, String> parameters)
+			throws ConnectionException {
+		try {
+
+			Class<? extends ApplicationContextFactory> contextFactoryClass = Thread.currentThread()
+					.getContextClassLoader().loadClass(contextFactoryClassname)
+					.asSubclass(ApplicationContextFactory.class);
+
+			ApplicationContextFactory contextFactory = contextFactoryClass.newInstance();
+			return contextFactory.connect(parameters);
+		} catch (Exception e) {
+			throw new ConnectionException(
+					"failed to initialize entity manager using factory '" + contextFactoryClassname + "'", e);
+		}
+	}
+
+	private static void writeToFile(Path resolve, InputStream entityAs) throws IOException {
+		try (OutputStream out = new FileOutputStream(resolve.toFile())) {
+			int read = 0;
+			byte[] bytes = new byte[1024];
+
+			while ((read = entityAs.read(bytes)) != -1) {
+				out.write(bytes, 0, read);
+			}
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ImportResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ImportResource.java
new file mode 100644
index 0000000..4eb141e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ImportResource.java
@@ -0,0 +1,270 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.eclipse.mdm.apicopy.control.ApiCopyException;
+import org.glassfish.jersey.media.multipart.FormDataBodyPart;
+import org.glassfish.jersey.media.multipart.FormDataMultiPart;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * Provides endpoints for importing ATFX files to a specific datasource.
+ *
+ */
+@Tag(name = "Import")
+@javax.ws.rs.Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/import")
+public class ImportResource {
+	private static final Logger LOG = LoggerFactory.getLogger(ImportResource.class);
+
+	private static final String ATFX_EXTENSION = ".atfx";
+
+	@EJB
+	private ImportService importService;
+
+	/**
+	 * Default public constructor for JAX-RS
+	 */
+	public ImportResource() {
+	}
+
+	/**
+	 * Used to provide service for unit tests
+	 * 
+	 * @param importService
+	 */
+	protected ImportResource(ImportService importService) {
+		this.importService = importService;
+	}
+
+	/**
+	 * Imports an ATFX file. The ATFX file is provided in the body of the POST
+	 * request. Note that, this method is not suitable for importing a ATFX file
+	 * with accompanying binary files. In this case, use
+	 * {@link ImportResource#importMultiPart(FormDataMultiPart, String)} or
+	 * {@link ImportResource#importZip(InputStream, String)}
+	 *
+	 * @param atfxInputStream  the content of the ATFX file
+	 * @param targetSourceName name of the target datasource
+	 * @return
+	 */
+	@POST
+	@Consumes(MediaType.APPLICATION_XML)
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response importXml(InputStream atfxInputStream,
+			@PathParam(REQUESTPARAM_SOURCENAME) String targetSourceName) {
+		return importService.importAtfx(tmpDir -> extractDataFromInputStream(tmpDir, atfxInputStream),
+				targetSourceName);
+	}
+
+	/**
+	 * Imports an ATFX file. The ATFX file and its binary files are provided as
+	 * multipart form data. The field name represents the original file name and the
+	 * field value the contents of the file. The ATFX file is detected by its file
+	 * extension 'atfx' or the media type 'application/xml'. Only one ATFX file can
+	 * be set at a time.
+	 *
+	 * @param multiPart        form data as described above
+	 * @param targetSourceName name of the target datasource
+	 * @return
+	 */
+	@POST
+	@Consumes(MediaType.MULTIPART_FORM_DATA)
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response importMultiPart(@Parameter(hidden = true) FormDataMultiPart multiPart,
+			@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return importService.importAtfx(tmpDir -> extractDataFromMultiPart(tmpDir, multiPart), sourceName);
+	}
+
+	/**
+	 * Imports an ATFX file. The ATFX file and its binary files are provided as a
+	 * zip file. The ATFX file is detected by its file extension 'atfx'. Only one
+	 * ATFX file can be included in the zip file.
+	 *
+	 * @param zipFile          the ATFX file and its binary files as zip compressed
+	 *                         {@link InputStream}
+	 * @param targetSourceName name of the target datasource
+	 * @return
+	 */
+	@POST
+	@Consumes("application/zip")
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response importZip(InputStream zipFile, @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return importService.importAtfx(tmpDir -> extractDataFromZip(tmpDir, zipFile), sourceName);
+	}
+
+	/**
+	 * Writes the provided {@link InputStream} into the folder <code>tmpDir</code>
+	 * and returns the path to this file.
+	 * 
+	 * @param tmpDir          temporary folder
+	 * @param atfxInputStream stream to be written into a file in tmpDir
+	 * @return Path referencing the written file.
+	 */
+	private Path extractDataFromInputStream(Path tmpDir, InputStream atfxInputStream) {
+		try {
+			Path atfxFile = tmpDir.resolve("tmp.atfx");
+			;
+
+			writeToFile(atfxFile, atfxInputStream);
+
+			LOG.debug("Received ATFX file {}.", atfxFile);
+			return atfxFile;
+		} catch (IOException e) {
+			throw new ApiCopyException("Could not extract data from request body.", e);
+		}
+	}
+
+	/**
+	 * Writes the files provided as multi part form data into the folder
+	 * <code>tmpDir</code> and returns the path to the ATFX file.
+	 * 
+	 * @param tmpDir    temporary folder
+	 * @param multiPart multi part form data with files
+	 * @return Path referencing the extracted ATFX file.
+	 * @throws ApiCopyException if there is no or more than one ATFX file is found
+	 */
+	private Path extractDataFromMultiPart(Path tmpDir, FormDataMultiPart multiPart) {
+		try {
+			if (multiPart.getBodyParts().isEmpty()) {
+				throw new ApiCopyException(
+						"MultiPart message does not contain any parts. Atleast an ATFX file is expected.");
+			}
+
+			Path atfxFile = null;
+			List<Path> binFiles = new ArrayList<>();
+
+			for (Entry<String, List<FormDataBodyPart>> entry : multiPart.getFields().entrySet()) {
+				if (entry.getValue().size() != 1) {
+					throw new ApiCopyException("Expecting exactly one part per field.");
+				}
+
+				String fileName = entry.getKey();
+				Path filePath = tmpDir.resolve(fileName);
+				FormDataBodyPart data = entry.getValue().get(0);
+
+				writeToFile(filePath, data.getEntityAs(InputStream.class));
+
+				if (fileName.toLowerCase().endsWith(ATFX_EXTENSION)
+						|| data.getMediaType().equals(MediaType.APPLICATION_XML_TYPE)) {
+					if (atfxFile == null) {
+						atfxFile = filePath;
+					} else {
+						throw new ApiCopyException("Expecting exactly one part with Content-Type '"
+								+ MediaType.APPLICATION_XML + "', but multiple parts were found.");
+					}
+
+				} else {
+					binFiles.add(filePath);
+				}
+			}
+			if (atfxFile == null) {
+				throw new ApiCopyException("Expecting exactly one part with Content-Type '" + MediaType.APPLICATION_XML
+						+ "', but zero parts were found.");
+			}
+
+			LOG.debug("Received ATFX file {} and binary files {}.", atfxFile, binFiles);
+
+			return atfxFile;
+		} catch (IOException e) {
+			throw new ApiCopyException("Could not extract data from multipart data.", e);
+		}
+	}
+
+	/**
+	 * Extracts the zip archive provided by {@link InputStream} into the folder
+	 * <code>tmpDir</code> and returns the path to the ATFX file.
+	 * 
+	 * @param tmpDir temporary folder
+	 * @param in     zip file to be extracted into a file in tmpDir
+	 * @return Path referencing the extracted ATFX file.
+	 * @throws ApiCopyException if there is no or more than one ATFX file is found
+	 */
+	private Path extractDataFromZip(Path tmpDir, InputStream in) {
+		try {
+			Path atfxFile = null;
+			List<Path> binFiles = new ArrayList<>();
+
+			ZipInputStream zipIn = new ZipInputStream(in);
+			ZipEntry entry;
+			while ((entry = zipIn.getNextEntry()) != null) {
+				String fileName = entry.getName();
+				Path file = tmpDir.resolve(fileName);
+				writeToFile(file, zipIn);
+
+				if (fileName.endsWith(ATFX_EXTENSION)) {
+					if (atfxFile == null) {
+						atfxFile = file;
+					} else {
+						throw new ApiCopyException(
+								"Expecting exactly one file with extension 'atfx', but files were found.");
+					}
+				} else {
+					binFiles.add(file);
+				}
+			}
+			if (atfxFile == null) {
+				throw new ApiCopyException(
+						"Expecting exactly one file with extension 'atfx', but zero parts were found.");
+			}
+
+			LOG.debug("Received ATFX file {} and binary files {}.", atfxFile, binFiles);
+			return atfxFile;
+		} catch (IOException e) {
+			throw new ApiCopyException("Could not extract data from zip file.", e);
+		}
+	}
+
+	/**
+	 * Writes inputstream to file
+	 * 
+	 * @param file
+	 * @param inputstream
+	 * @throws IOException
+	 */
+	private void writeToFile(Path file, InputStream inputstream) throws IOException {
+		try (OutputStream out = new FileOutputStream(file.toFile())) {
+			int read = 0;
+			byte[] bytes = new byte[1024];
+
+			while ((read = inputstream.read(bytes)) != -1) {
+				out.write(bytes, 0, read);
+			}
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ImportService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ImportService.java
new file mode 100644
index 0000000..caa286f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/boundary/ImportService.java
@@ -0,0 +1,160 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.boundary;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.ws.rs.core.Response;
+
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.ApplicationContextFactory;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.apicopy.control.ApiCopyException;
+import org.eclipse.mdm.apicopy.control.ApiCopyService;
+import org.eclipse.mdm.apicopy.control.ApiCopyServiceImpl;
+import org.eclipse.mdm.apicopy.entity.CopyStatusResponse;
+import org.eclipse.mdm.apicopy.entity.CopyStatusResponse.State;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Service for importing an ATFX file into a MDM datasource.
+ *
+ */
+@Stateless
+public class ImportService {
+
+	private static final Logger LOG = LoggerFactory.getLogger(ImportService.class);
+
+	// TODO make temp path configurable
+	private static final Path TMP = Paths.get(System.getProperty("java.io.tmpdir"));
+
+	@Inject
+	private ConnectorService connectorService;
+
+	private ApiCopyService apiCopyService = new ApiCopyServiceImpl();
+
+	private final String atfxContextFactoryClassname = "org.eclipse.mdm.api.atfxadapter.ATFXContextFactory";
+
+	/**
+	 * Default public constructor
+	 */
+	public ImportService() {
+	}
+
+	/**
+	 * Imports an ATFX file into the provided datasource.
+	 *
+	 * @param atfxFileSupplier returns a {@link Path} to an ATFX file. Accompanying
+	 *                         binary files are expected to be on the same folder.
+	 * @param dstContextName   target datasource of the import
+	 * @return
+	 */
+	public Response importAtfx(Function<Path, Path> atfxFileSupplier, String dstContextName) {
+		ApplicationContext contextDst = connectorService.getContextByName(dstContextName);
+		ApplicationContext contextSrc = null;
+
+		Path tmpDir = null;
+		try {
+			tmpDir = Files.createTempDirectory(TMP, "atfximport");
+
+			Path atfxFile = atfxFileSupplier.apply(tmpDir);
+
+			Map<String, String> params = ImmutableMap.of("atfxfile", atfxFile.toFile().getAbsolutePath(),
+					"freetext.active", "false");
+
+			contextSrc = connectContext(atfxContextFactoryClassname, params);
+			List<Project> projects = contextSrc.getEntityManager()
+					.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class)).loadAll(Project.class);
+
+			apiCopyService.newApiCopyTask(contextSrc, contextDst).copy(projects);
+
+			CopyStatusResponse response = new CopyStatusResponse();
+			response.setState(State.OK);
+			return Response.ok(response).build();
+		} catch (ServiceNotProvidedException e) {
+			throw new ApiCopyException("Could not retrive all required services from ATFX application context!", e);
+		} catch (ConnectionException e) {
+			throw new ApiCopyException("Could not create ATFX application context!", e);
+		} catch (IOException e) {
+			throw new ApiCopyException("Cold not create temporary directory!", e);
+		} finally {
+			if (contextSrc != null) {
+				try {
+					contextSrc.close();
+				} catch (ConnectionException e) {
+					LOG.warn("Could not close application context!", e);
+				}
+			}
+			if (tmpDir != null) {
+				try {
+					deleteDirectory(tmpDir);
+				} catch (IOException e) {
+					LOG.warn("Could not delete temporary directory " + tmpDir.toFile().getAbsolutePath(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Deletes a directory.
+	 * 
+	 * @param pathToBeDeleted directory to delete
+	 * @throws IOException
+	 */
+	private void deleteDirectory(java.nio.file.Path pathToBeDeleted) throws IOException {
+		Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+	}
+
+	/**
+	 * Connects to a {@link ApplicationContext}.
+	 * 
+	 * @param contextFactoryClassname classname of the
+	 *                                {@link ApplicationContextFactory}
+	 * @param parameters              connection parameters
+	 * @return connected {@link ApplicationContext}
+	 * @throws ConnectionException
+	 */
+	private ApplicationContext connectContext(String contextFactoryClassname, Map<String, String> parameters)
+			throws ConnectionException {
+		try {
+
+			Class<? extends ApplicationContextFactory> contextFactoryClass = Thread.currentThread()
+					.getContextClassLoader().loadClass(contextFactoryClassname)
+					.asSubclass(ApplicationContextFactory.class);
+
+			ApplicationContextFactory contextFactory = contextFactoryClass.newInstance();
+			return contextFactory.connect(parameters);
+		} catch (Exception e) {
+			throw new ConnectionException(
+					"failed to initialize entity manager using factory '" + contextFactoryClassname + "'", e);
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyException.java
new file mode 100644
index 0000000..b262caa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyException.java
@@ -0,0 +1,27 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+public class ApiCopyException extends RuntimeException {
+
+	private static final long serialVersionUID = 6120223578891046326L;
+
+	public ApiCopyException(String message) {
+		super(message);
+	}
+
+	public ApiCopyException(String message, Throwable t) {
+		super(message, t);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyService.java
new file mode 100644
index 0000000..bbac60e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyService.java
@@ -0,0 +1,23 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+
+public interface ApiCopyService {
+	ApiCopyTask newApiCopyTask(ApplicationContext src, ApplicationContext dst);
+
+	ApiCopyTask newApiCopyTask(ApplicationContext src, ApplicationContext dst, TemplateManager templateManager);
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyServiceImpl.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyServiceImpl.java
new file mode 100644
index 0000000..b05e47a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyServiceImpl.java
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import javax.ejb.Stateless;
+
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+
+@Stateless
+public class ApiCopyServiceImpl implements ApiCopyService {
+
+	@Override
+	public ApiCopyTask newApiCopyTask(ApplicationContext src, ApplicationContext dst) {
+		return newApiCopyTask(src, dst, new DefaultTemplateManager());
+	}
+
+	@Override
+	public ApiCopyTask newApiCopyTask(ApplicationContext src, ApplicationContext dst, TemplateManager templateManager) {
+		return new ImportTask(src, dst, templateManager);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyTask.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyTask.java
new file mode 100644
index 0000000..b6e61b0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ApiCopyTask.java
@@ -0,0 +1,46 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.model.Entity;
+
+public interface ApiCopyTask {
+
+	void copy(List<? extends Entity> entities);
+
+	/**
+	 * Setting a optional mapping of source unit names to target unit names
+	 * 
+	 * @param unitMapping key = source unit name, value = target unit name
+	 */
+	void setUnitMapping(Map<String, String> unitMapping);
+
+	/**
+	 * Setting a optional mapping of source quantity names to target quantity names
+	 * 
+	 * @param quantityMapping key = source quantity name, value = target quantity
+	 *                        name
+	 */
+	void setQuantityMapping(Map<String, String> quantityMapping);
+
+	/**
+	 * setting a map with properties to configure the transfer task
+	 * 
+	 * @param properties
+	 */
+	void setProperties(Map<String, String> properties);
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ClassificationUtil.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ClassificationUtil.java
new file mode 100644
index 0000000..f4f504a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ClassificationUtil.java
@@ -0,0 +1,204 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.Condition;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Classification;
+import org.eclipse.mdm.api.dflt.model.Domain;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.ProjectDomain;
+import org.eclipse.mdm.api.dflt.model.Status;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Creates Classification instances, because openMDM4 clients checks them and
+ * does not show any data if classifications are absent. As soon as
+ * Classification can be created through standard MDM5 API this class becomes
+ * obsolete.
+ */
+public class ClassificationUtil {
+
+	private Transaction transaction;
+	private EntityFactory entityFactoryDst;
+	private EntityManager entityManagerDst;
+	private ModelManager modelManagerDst;
+	private QueryService queryService;
+
+	private Map<String, ProjectDomain> projectDomainCache = new HashMap<>();
+	private Map<String, Classification> classificationCache = new HashMap<>();
+
+	/**
+	 * 
+	 * @param transaction
+	 * @param transferBase
+	 * @param contextDst
+	 * @param entityFactoryDst
+	 * @param entityManagerDst
+	 * @param modelManagerDst
+	 */
+	public ClassificationUtil(Transaction transaction, ApplicationContext contextDst) {
+		super();
+		this.transaction = transaction;
+
+		if (contextDst.getEntityFactory().isPresent()) {
+			this.entityFactoryDst = contextDst.getEntityFactory().get();
+		} else {
+			throw new ApiCopyException("EntityFactory not found!");
+		}
+
+		if (contextDst.getEntityManager().isPresent()) {
+			this.entityManagerDst = contextDst.getEntityManager().get();
+		} else {
+			throw new ApiCopyException("EntityManager not found!");
+		}
+
+		if (contextDst.getModelManager().isPresent()) {
+			this.modelManagerDst = contextDst.getModelManager().get();
+		} else {
+			throw new ApiCopyException("ModelManager not found!");
+		}
+
+		if (contextDst.getQueryService().isPresent()) {
+			this.queryService = contextDst.getQueryService().get();
+		} else {
+			throw new IllegalStateException("QueryService not found!");
+		}
+	}
+
+	public Classification getClassification(String rootProjectName) {
+		Domain domain = getDomain();
+		Status status = getStatus();
+		ProjectDomain projectDomain = getProjectDomain(rootProjectName);
+		return getClassification(domain, status, projectDomain);
+	}
+
+	public Classification getClassification(Domain domain, Status status, ProjectDomain projectDomain) {
+		String cacheKey = Arrays.asList(domain.getName(), status.getName(), projectDomain.getName()).stream()
+				.collect(Collectors.joining("_"));
+
+		Classification classification = classificationCache.get(cacheKey);
+
+		if (classification == null) {
+			EntityType entityType = modelManagerDst.getEntityType(Classification.class);
+			Condition condClass1 = ComparisonOperator.CASE_INSENSITIVE_EQUAL
+					.create(entityType.getAttribute("ProjectDomain"), projectDomain.getID());
+			Condition condClass2 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("Domain"),
+					domain.getID());
+			Condition condClass3 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("Status"),
+					status.getID());
+
+			java.util.List<Result> fetch = queryService.createQuery().selectID(entityType)
+					.fetch(Filter.and().addAll(condClass1, condClass2, condClass3));
+
+			List<String> classificationIds = fetch.stream().map(r -> r.getRecord(entityType)).map(Record::getID)
+					.collect(Collectors.toList());
+
+			if (classificationIds.isEmpty()) {
+				String classificationName = String.format("ProjDomainId_%s.DomainId_%s.StatusId_%s",
+						projectDomain.getID(), domain.getID(), status.getID());
+				classification = entityFactoryDst.createClassification(classificationName, status, projectDomain,
+						domain);
+				transaction.create(Lists.newArrayList(classification));
+			} else {
+				classification = entityManagerDst.load(Classification.class, classificationIds.get(0));
+			}
+
+			classificationCache.put(cacheKey, classification);
+		}
+
+		return classification;
+	}
+
+	public ProjectDomain getProjectDomain(String rootProjectName) {
+		ProjectDomain projectDomain = projectDomainCache.get(rootProjectName);
+
+		if (projectDomain == null) {
+			EntityType entityTypeProjectDomain = modelManagerDst.getEntityType(ProjectDomain.class);
+			Condition condProjectDomainName = ComparisonOperator.CASE_INSENSITIVE_EQUAL
+					.create(entityTypeProjectDomain.getAttribute("Name"), rootProjectName);
+			List<Result> fetchProjectDomain = queryService.createQuery().selectID(entityTypeProjectDomain)
+					.fetch(Filter.and().addAll(condProjectDomainName));
+
+			List<String> projectDomainIds = fetchProjectDomain.stream().map(r -> r.getRecord(entityTypeProjectDomain))
+					.map(Record::getID).collect(Collectors.toList());
+
+			if (projectDomainIds.size() > 1) {
+				throw new IllegalStateException(
+						String.format("More than one ProjectDomain instance with name \"%s\" found in destination!",
+								rootProjectName));
+			} else if (projectDomainIds.isEmpty()) {
+				projectDomain = entityFactoryDst.createProjectDomain(rootProjectName);
+				transaction.create(Lists.newArrayList(projectDomain));
+			} else {
+				projectDomain = entityManagerDst.load(ProjectDomain.class, projectDomainIds.get(0));
+			}
+
+			projectDomainCache.put(rootProjectName, projectDomain);
+		}
+
+		return projectDomain;
+	}
+
+	public Domain getDomain() {
+		List<Domain> domains = entityManagerDst.loadAll(Domain.class);
+
+		if (domains.size() != 1) {
+			throw new IllegalStateException("No or more than one Domain instance found in destination!");
+		}
+
+		Domain domain = domains.get(0);
+		return domain;
+	}
+
+	public Status getStatus() {
+		EntityType entityTypeStatus = modelManagerDst.getEntityType(Status.class);
+		Condition condStatusName = ComparisonOperator.CASE_INSENSITIVE_EQUAL
+				.create(entityTypeStatus.getAttribute("Name"), "Imported");
+
+		List<Result> fetchStatus = queryService.createQuery().selectID(entityTypeStatus)
+				.fetch(Filter.and().addAll(condStatusName));
+
+		List<String> statusIds = fetchStatus.stream().map(r -> r.getRecord(entityTypeStatus)).map(Record::getID)
+				.collect(Collectors.toList());
+
+		if (statusIds.size() != 1) {
+			throw new IllegalStateException(
+					"No or more than one Status instance with name \"Imported\" found in destination!");
+		}
+
+		return entityManagerDst.load(Status.class, statusIds.get(0));
+	}
+
+	public void clearCache() {
+		projectDomainCache.clear();
+		classificationCache.clear();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/DefaultTemplateManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/DefaultTemplateManager.java
new file mode 100644
index 0000000..91bce5f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/DefaultTemplateManager.java
@@ -0,0 +1,62 @@
+/*******************************************************************************

+ * Copyright (c) 2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+/**

+ * 

+ */

+package org.eclipse.mdm.apicopy.control;

+

+import org.eclipse.mdm.api.base.model.Test;

+import org.eclipse.mdm.api.base.model.TestStep;

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

+import org.eclipse.mdm.api.dflt.ApplicationContext;

+

+/**

+ * Default implementation of the templatemanager. It read the template names

+ * from the attribute 'template' of the source test and test step

+ *

+ */

+public class DefaultTemplateManager implements TemplateManager {

+

+	private static final String TESTATTR_TEMPLATE = "template";

+

+	@Override

+	public void setSourceContext(ApplicationContext source) throws ApiCopyException {

+	}

+

+	@Override

+	public String getTemplateTestName(Test test) throws ApiCopyException {

+		String returnVal = null;

+

+		try {

+			returnVal = test.getValue(TESTATTR_TEMPLATE).extract(ValueType.STRING);

+		} catch (Exception e) {

+			// if attribute not exists return null

+		}

+

+		return returnVal;

+	}

+

+	@Override

+	public String getTemplateTestStepName(TestStep testStep) throws ApiCopyException {

+		String returnVal = null;

+

+		try {

+			returnVal = testStep.getValue(TESTATTR_TEMPLATE).extract(ValueType.STRING);

+		} catch (Exception e) {

+			// if attribute not exists return null

+		}

+

+		return returnVal;

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/EntityHolder.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/EntityHolder.java
new file mode 100644
index 0000000..01d4eac
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/EntityHolder.java
@@ -0,0 +1,143 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+
+import com.google.common.base.Strings;
+
+public class EntityHolder {
+	private final Entity entity;
+	private final EntityManager entityManager;
+	private String name;
+	private String path;
+	private String key;
+
+	public EntityHolder(Entity entity, EntityManager entityManager) {
+		this.entity = entity;
+		this.entityManager = entityManager;
+	}
+
+	public String getName() {
+		if (null == name) {
+			name = entity.getName();
+		}
+
+		return name;
+	}
+
+	public Entity getEntity() {
+		return entity;
+	}
+
+	public String getKey() {
+		if (null == key) {
+			key = String.format("%s:%s", entity.getTypeName(), entity.getID());
+		}
+
+		return key;
+	}
+
+	public String getPath() {
+		if (null == path) {
+			EntityHolder parent = this;
+			List<String> listNames = new LinkedList<>();
+			while (null != parent) {
+				listNames.add(parent.getName());
+				parent = parent.getParent();
+			}
+			Collections.reverse(listNames);
+
+			path = listNames.stream().collect(Collectors.joining(" / "));
+		}
+
+		return path;
+	}
+
+	public EntityHolder getParent() {
+		if (entity instanceof Environment) {
+			return null;
+		} else if (entity instanceof Project) {
+			return null;
+		} else if (entity instanceof Pool) {
+			return new EntityHolder(entityManager.loadParent(entity, Project.class).get(), entityManager);
+		} else if (entity instanceof Test) {
+			return new EntityHolder(entityManager.loadParent(entity, Pool.class).get(), entityManager);
+		} else if (entity instanceof TestStep) {
+			return new EntityHolder(entityManager.loadParent(entity, Test.class).get(), entityManager);
+		} else if (entity instanceof Measurement) {
+			return new EntityHolder(entityManager.loadParent(entity, TestStep.class).get(), entityManager);
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see java.lang.Object#hashCode()
+	 */
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + (Strings.nullToEmpty(getKey()).hashCode());
+		return result;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		final EntityHolder other = (EntityHolder) obj;
+		String k = getKey();
+		if (null == k) {
+			if (other.getKey() != null) {
+				return false;
+			}
+		} else if (!k.equals(other.getKey())) {
+			return false;
+		}
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return String.format("%s.%s.%s", getEntity().getSourceName(), getEntity().getTypeName(), getEntity().getID());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ExportTask.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ExportTask.java
new file mode 100644
index 0000000..43261e4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ExportTask.java
@@ -0,0 +1,484 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.massdata.ReadRequest.ValuesMode;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+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.ContextSensor;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.PhysicalDimension;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ListMultimap;
+
+public class ExportTask extends TransferBase implements ApiCopyTask {
+	private static final Logger LOG = LoggerFactory.getLogger(ExportTask.class);
+
+	public ExportTask(ApplicationContext src, ApplicationContext dst) {
+		super(src, dst);
+	}
+
+	@Override
+	public void copy(List<? extends Entity> entities) {
+		Transaction transaction = entityManagerDst.startTransaction();
+		try {
+			mapSrcDstEntities.clear();
+
+			ListMultimap<Class<? extends Entity>, Entity> parents = loadParents(entities);
+			LOG.trace("Resolved parents: {}", parents);
+			supportedRootEntities.forEach(ec -> parents.get(ec).forEach(e -> copyEntity(e, false, transaction)));
+
+			LOG.trace("Importing entities: {}", entities);
+			entities.forEach(e -> copyEntity(e, true, transaction));
+
+			transaction.commit();
+		} catch (Exception exc) {
+			try {
+				transaction.abort();
+			} catch (Exception exc2) {
+				LOG.error("Could not abort transaction!");
+			}
+
+			throw new ApiCopyException("Could not copy data.", exc);
+		}
+	}
+
+	private Entity copyEntity(Entity entity, boolean recursive, Transaction transaction) {
+		if (entity instanceof Project) {
+			return copyProject((Project) entity, recursive, transaction);
+		} else if (entity instanceof Pool) {
+			return copyPool((Pool) entity, recursive, transaction);
+		} else if (entity instanceof Test) {
+			return copyTest((Test) entity, recursive, transaction);
+		} else if (entity instanceof TestStep) {
+			return copyTestStep((TestStep) entity, recursive, transaction);
+		} else if (entity instanceof Measurement) {
+			return copyMeasurement((Measurement) entity, recursive, transaction);
+		} else {
+			throw new ApiCopyException("Unsupported entity: '" + entity.getClass().getName() + "'");
+		}
+	}
+
+	private Project copyProject(Project projectSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(projectSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Exporting Project '{}'", projectSrc.getName());
+			Project projectDst = entityFactoryDst.createProject(projectSrc.getName());
+
+			copyValues(projectSrc, projectDst, Arrays.asList("Id", "Name"), false, false);
+
+			persist(transaction, projectDst);
+
+			ehDst = new EntityHolder(projectDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				entityManagerSrc.loadChildren(projectSrc, Pool.class)
+						.forEach(pool -> copyPool(pool, recursive, transaction));
+			}
+		}
+
+		return (Project) ehDst.getEntity();
+	}
+
+	private Pool copyPool(Pool poolSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(poolSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Exporting Pool '{}'", poolSrc.getName());
+			Project projectParentDst = (Project) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(poolSrc, Project.class).get(), entityManagerSrc))
+					.getEntity();
+
+			Pool poolDst = entityFactoryDst.createPool(poolSrc.getName(), projectParentDst);
+
+			copyValues(poolSrc, poolDst, Arrays.asList("Id", "Name"), false, false);
+
+			persist(transaction, poolDst);
+
+			ehDst = new EntityHolder(poolDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				entityManagerSrc.loadChildren(poolSrc, Test.class)
+						.forEach(test -> copyTest(test, recursive, transaction));
+			}
+		}
+
+		return (Pool) ehDst.getEntity();
+	}
+
+	private Test copyTest(Test testSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(testSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Exporting Test '{}'", testSrc.getName());
+			Pool poolParentDst = (Pool) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(testSrc, Pool.class).get(), entityManagerSrc))
+					.getEntity();
+
+			Test testDst = entityFactoryDst.createTest(testSrc.getName(), poolParentDst);
+
+			copyValues(testSrc, testDst, Arrays.asList("Id", "Name"), false, false);
+
+			persist(transaction, testDst);
+
+			ehDst = new EntityHolder(testDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				entityManagerSrc.loadChildren(testSrc, TestStep.class)
+						.forEach(testStep -> copyTestStep(testStep, recursive, transaction));
+			}
+		}
+
+		return (Test) ehDst.getEntity();
+	}
+
+	private TestStep copyTestStep(TestStep testStepSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(testStepSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Exporting TestStep '{}'", testStepSrc.getName());
+			Test testParentDst = (Test) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(testStepSrc, Test.class).get(), entityManagerSrc))
+					.getEntity();
+
+			TestStep testStepDst = entityFactoryDst.createTestStep(testStepSrc.getName(), testParentDst);
+
+			copyValues(testStepSrc, testStepDst, Arrays.asList("Id", "Name"), false, false);
+
+			persist(transaction, testStepDst);
+
+			TemplateTestStep tpl = entityManagerSrc.loadTemplate(testStepSrc).orElseThrow(() -> new ApiCopyException(
+					"Could not retrieve TemplateTestStep for TestStep " + testStepSrc.getID()));
+
+			copyContext(testStepSrc, testStepDst, tpl, transaction);
+
+			ehDst = new EntityHolder(testStepDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				entityManagerSrc.loadChildren(testStepSrc, Measurement.class)
+						.forEach(measurement -> copyMeasurement(measurement, recursive, transaction));
+			}
+		}
+
+		return (TestStep) ehDst.getEntity();
+	}
+
+	private Measurement copyMeasurement(Measurement measurementSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(measurementSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Exporting Measurement '{}'", measurementSrc.getName());
+			TestStep testStepParentSrc = entityManagerSrc.loadParent(measurementSrc, TestStep.class).get();
+
+			TestStep testStepParentDst = (TestStep) mapSrcDstEntities
+					.get(new EntityHolder(testStepParentSrc, entityManagerSrc)).getEntity();
+
+			Measurement measurementDst = entityFactoryDst.createMeasurement(measurementSrc.getName(),
+					testStepParentDst);
+
+			copyValues(measurementSrc, measurementDst, Arrays.asList("Id", "Name"), false, false);
+
+			persist(transaction, measurementDst);
+
+			TemplateTestStep tpl = entityManagerSrc.loadTemplate(testStepParentSrc)
+					.orElseThrow(() -> new ApiCopyException(
+							"Could not retrieve TemplateTestStep for Measurement + " + measurementSrc.getID()));
+
+			copyContext(measurementSrc, measurementDst, tpl, transaction);
+
+			ehDst = new EntityHolder(measurementDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				List<WriteRequest> listWriteRequests = new ArrayList<>();
+
+				Map<String, Channel> mapChannels = new HashMap<>();
+
+				for (Channel channel : entityManagerSrc.loadChildren(measurementSrc, Channel.class)) {
+					Channel channelDst = copyChannel(channel, transaction);
+					mapChannels.put(channel.getName(), channelDst);
+				}
+
+				for (ChannelGroup channelGroup : entityManagerSrc.loadChildren(measurementSrc, ChannelGroup.class)) {
+					ChannelGroup channelGroupDst = copyChannelGroup(channelGroup, transaction);
+
+					for (MeasuredValues measuredValues : entityManagerSrc.readMeasuredValues(ReadRequest
+							.create(channelGroup).valuesMode(ValuesMode.STORAGE).allChannels().allValues())) {
+						LOG.trace("Exporting MeasuredValues '{}'", measuredValues.getName());
+						if (!mapChannels.containsKey(measuredValues.getName())) {
+							throw new ApiCopyException(
+									String.format("Cannot find Channel %s in destination!", measuredValues.getName()));
+						}
+
+						Channel channelDst = mapChannels.get(measuredValues.getName());
+
+						listWriteRequests.add(createWriteRequest(channelGroupDst, channelDst, measuredValues));
+					}
+				}
+
+				transaction.writeMeasuredValues(listWriteRequests);
+			}
+		}
+
+		return (Measurement) ehDst.getEntity();
+	}
+
+	private void copyContext(ContextDescribable entitySrc, ContextDescribable entityDst, TemplateTestStep tpl,
+			Transaction transaction) {
+
+		for (ContextRoot root : entitySrc.loadContexts(entityManagerSrc).values()) {
+			LOG.trace("Exporting ContextRoot '{}'", root.getName());
+			TemplateRoot tplRoot = tpl.getTemplateRoot(root.getContextType())
+					.orElseThrow(() -> new ApiCopyException("Could not retrieve TemplateRoot " + root.getContextType()
+							+ " for TestStep + " + entitySrc.getID()));
+
+			ContextRoot rootDst;
+			if (entityDst instanceof TestStep) {
+				rootDst = entityFactoryDst.createContextRoot((TestStep) entityDst, tplRoot);
+			} else if (entityDst instanceof Measurement) {
+				rootDst = entityFactoryDst.createContextRoot((Measurement) entityDst, tplRoot);
+			} else {
+				throw new ApiCopyException("ContextDescribable must be of instance TestStep or Measurement!");
+			}
+
+			copyValues(root, rootDst, Arrays.asList("Id", "Name"), false, false);
+			persist(transaction, rootDst);
+
+			for (ContextComponent comp : root.getContextComponents()) {
+				LOG.trace("Exporting ContextComponent '{}'", comp.getName());
+				rootDst.getContextComponent(comp.getName()).ifPresent(c -> {
+					copyValues(comp, c, Arrays.asList("Id", "Name"), false, false);
+					persist(transaction, c);
+				});
+			}
+			for (ContextSensor sensor : root.getContextSensors()) {
+				LOG.trace("Exporting ContextSensor '{}'", sensor.getName());
+				// Parent should be already created above
+				ContextComponent parentDst = rootDst.getContextComponent(sensor.getContextComponent().getName())
+						.orElseThrow(() -> new ApiCopyException(
+								"Parent ContextComponent of sensor " + sensor.getName() + " not found!"));
+
+				ContextSensor sensorDst = parentDst.getContextSensor(sensor.getName()).orElseThrow(
+						() -> new ApiCopyException("ContextSensor '" + sensor.getName() + "' not found in target!"));
+				copyValues(sensor, sensorDst, Arrays.asList("Id", "Name"), false, false);
+				persist(transaction, sensorDst);
+			}
+		}
+
+		persist(transaction, entityDst);
+	}
+
+	private Channel copyChannel(Channel channelSrc, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(channelSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Exporting Channel '{}'", channelSrc.getName());
+			Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(channelSrc, Measurement.class).get(),
+							entityManagerSrc))
+					.getEntity();
+
+			Quantity quantitySrc = channelSrc.getQuantity();
+			Unit unitSrc = quantitySrc.getDefaultUnit();
+			PhysicalDimension physicalDimensionSrc = unitSrc.getPhysicalDimension();
+
+			PhysicalDimension physicalDimensionDst = fetchOne(entityManagerDst, PhysicalDimension.class,
+					physicalDimensionSrc.getName())
+							.orElseGet(() -> entityFactoryDst.createPhysicalDimension(physicalDimensionSrc.getName()));
+
+			if (isNewEntity(physicalDimensionDst)) {
+				copyValues(physicalDimensionSrc, physicalDimensionDst, Arrays.asList("Id", "Name"), false, false);
+				persist(transaction, physicalDimensionDst);
+			}
+
+			Unit unitDst = fetchOne(entityManagerDst, Unit.class, unitSrc.getName())
+					.orElseGet(() -> entityFactoryDst.createUnit(unitSrc.getName(), physicalDimensionDst));
+
+			if (isNewEntity(unitDst)) {
+				copyValues(unitSrc, unitDst, Arrays.asList("Id", "Name"), false, false);
+				persist(transaction, unitDst);
+			}
+
+			Quantity quantityDst = fetchOne(entityManagerDst, Quantity.class, quantitySrc.getName())
+					.orElseGet(() -> entityFactoryDst.createQuantity(quantitySrc.getName(), unitDst));
+
+			if (isNewEntity(quantityDst)) {
+				copyValues(quantitySrc, quantityDst, Arrays.asList("Id", "Name"), false, false);
+				persist(transaction, quantityDst);
+			}
+
+			Channel channelDst = entityFactoryDst.createChannel(channelSrc.getName(), measurementParentDst,
+					quantityDst);
+
+			copyValues(channelSrc, channelDst, Arrays.asList("Id", "Name"), false, false);
+
+			persist(transaction, channelDst);
+
+			ehDst = new EntityHolder(channelDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+		}
+
+		return (Channel) ehDst.getEntity();
+	}
+
+	private ChannelGroup copyChannelGroup(ChannelGroup channelGroupSrc, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(channelGroupSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Exporting ChannelGroup '{}'", channelGroupSrc.getName());
+			Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(channelGroupSrc, Measurement.class).get(),
+							entityManagerSrc))
+					.getEntity();
+
+			ChannelGroup channelGroupDst = entityFactoryDst.createChannelGroup(channelGroupSrc.getName(),
+					channelGroupSrc.getNumberOfValues(), measurementParentDst);
+
+			copyValues(channelGroupSrc, channelGroupDst, Arrays.asList("Id", "Name"), false, false);
+
+			persist(transaction, channelGroupDst);
+
+			ehDst = new EntityHolder(channelGroupDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+		}
+
+		return (ChannelGroup) ehDst.getEntity();
+	}
+
+	/**
+	 * Copy the MDM catalog.
+	 */
+	public void copyCatalog() {
+		Transaction catTransaction = entityManagerDst.startTransaction();
+		try {
+			mapSrcDstEntities.clear();
+
+			LOG.trace("Exporting Catalog");
+			// Copy catalog
+			List<CatalogComponent> catComps = new ArrayList<>();
+			for (ContextType contextType : ContextType.values()) {
+				for (CatalogComponent catComp : entityManagerSrc.loadAll(CatalogComponent.class, contextType)) {
+					LOG.trace("Exporting CatalogComponent '{}'", catComp.getName());
+					CatalogComponent catCompDst = entityFactoryDst.createCatalogComponent(catComp.getContextType(),
+							catComp.getName());
+					for (CatalogAttribute catAttr : catComp.getCatalogAttributes()) {
+						if (catAttr.getValueType().isEnumerationType()) {
+							entityFactoryDst.createCatalogAttribute(catAttr.getName(), catAttr.getEnumerationObject(),
+									catCompDst);
+						} else {
+							entityFactoryDst.createCatalogAttribute(catAttr.getName(), catAttr.getValueType(),
+									catCompDst);
+						}
+					}
+
+					for (CatalogSensor catSensor : catComp.getCatalogSensors()) {
+						LOG.trace("Exporting CatalogSensor '{}'", catComp.getName());
+						CatalogSensor catSensorDst = entityFactoryDst.createCatalogSensor(catSensor.getName(),
+								catCompDst);
+						for (CatalogAttribute catAttr : catSensor.getCatalogAttributes()) {
+							entityFactoryDst.createCatalogSensorAttribute(catAttr.getName(), catAttr.getValueType(),
+									catSensorDst);
+						}
+					}
+
+					catComps.add(catCompDst);
+				}
+			}
+
+			catTransaction.create(catComps);
+			catTransaction.commit();
+		} catch (Exception exc) {
+			try {
+				catTransaction.abort();
+			} catch (Exception exc2) {
+				LOG.error("Could not abort transaction!");
+			}
+
+			throw new ApiCopyException("Could not copy data.", exc);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.mdm.apicopy.control.ApiCopyTask#setUnitMapping(java.util.Map)
+	 */
+	@Override
+	public void setUnitMapping(Map<String, String> unitMapping) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.mdm.apicopy.control.ApiCopyTask#setQuantityMapping(java.util.Map)
+	 */
+	@Override
+	public void setQuantityMapping(Map<String, String> quantityMapping) {
+	}
+
+	@Override
+	public void setProperties(Map<String, String> properties) {
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
new file mode 100644
index 0000000..698518d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
@@ -0,0 +1,1054 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.massdata.ReadRequest.ValuesMode;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.VersionState;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.dflt.model.Versionable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ListMultimap;
+
+public class ImportTask extends TransferBase implements ApiCopyTask {
+
+	/**
+	 * Property to configure to overwrite the existing test step
+	 * 
+	 * Default: false
+	 * 
+	 * If true and the matching target test step exists, context data will be
+	 * overwriten and the measurements will be imported as childs of the existing
+	 * teststep.
+	 * 
+	 * Otherwise a new test step will be created
+	 */
+	private static final String PROPERTY_OVERWRITE_EXISTING_ELEMENTS = "overwriteExistingElements";
+	private static final String DEFAULT_OVERWRITE_EXISTING_ELEMENTS = "false";
+
+	/**
+	 * Property to configure that existing measured values will be appended
+	 * 
+	 * Default: false
+	 * 
+	 * If true the measured value of the import data set will be appended to the
+	 * existing. That means, if the target measurement already exists the importer
+	 * will add the measured values of the source column to the target column. If at
+	 * the the target measurement the column not exists, the importer create a new
+	 * one, add first invalid values with the count of the target submatrix size,
+	 * and add there the source values.
+	 * 
+	 * If false and the target measurement already exists, the import task will be
+	 * canceled
+	 */
+	private static final String PROPERTY_APPEND = "append";
+	private static final String DEFAULT_APPEND = "false";
+
+	/**
+	 * Property to configure that existing file links will be replaced
+	 * 
+	 * Default: false
+	 * 
+	 * If true, file links of the target entities will be replaced, if in the source
+	 * the file link exists
+	 * 
+	 * Otherwise new file links will be added to the existing sequence.
+	 */
+	private static final String PROPERTY_REPLACE_FILELINKS = "replaceFileLinks";
+	private static final String DEFAULT_REPLACE_FILES = "false";
+
+	private static final Logger LOG = LoggerFactory.getLogger(ImportTask.class);
+
+	private SearchService searchServiceDst;
+	private ClassificationUtil classificationUtil;
+	private TemplateManager templateManager;
+
+	private Map<String, String> quantityMapping = new HashMap<>();
+
+	private Map<String, String> unitMapping = new HashMap<>();
+
+	private Map<String, String> properties = new HashMap<>();
+
+	private boolean replaceFileLinks = false;
+
+	public ImportTask(ApplicationContext src, ApplicationContext dst, TemplateManager templateManager) {
+		super(src, dst);
+
+		searchServiceDst = contextDst.getSearchService()
+				.orElseThrow(() -> new ServiceNotProvidedException(SearchService.class));
+
+		if (templateManager == null) {
+			this.templateManager = new DefaultTemplateManager();
+		} else {
+			this.templateManager = templateManager;
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.mdm.apicopy.control.ApiCopyTask#setUnitMapping(java.util.Map)
+	 */
+	@Override
+	public void setUnitMapping(Map<String, String> unitMapping) {
+		this.unitMapping = unitMapping;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.mdm.apicopy.control.ApiCopyTask#setQuantityMapping(java.util.Map)
+	 */
+	@Override
+	public void setQuantityMapping(Map<String, String> quantityMapping) {
+		this.quantityMapping = quantityMapping;
+	}
+
+	@Override
+	public void copy(List<? extends Entity> entities) {
+		Transaction transaction = entityManagerDst.startTransaction();
+		classificationUtil = new ClassificationUtil(transaction, contextDst);
+		try {
+			mapSrcDstEntities.clear();
+
+			ListMultimap<Class<? extends Entity>, Entity> parents = loadParents(entities);
+			LOG.trace("Resolved parents: {}", parents);
+			supportedRootEntities.forEach(ec -> parents.get(ec).forEach(e -> copyEntity(e, false, transaction)));
+
+			LOG.trace("Export entities: {}", entities);
+			entities.forEach(e -> copyEntity(e, true, transaction));
+			transaction.commit();
+			deleteFilesOfReplacedFileLinks();
+		} catch (Exception exc) {
+			try {
+				transaction.abort();
+			} catch (Exception exc2) {
+				LOG.error("Could not abort transaction!");
+			}
+			deleteFilesOfUploadedFileLinks();
+
+			throw new ApiCopyException("Could not copy data: " + exc.getMessage(), exc);
+		} finally {
+			classificationUtil.clearCache();
+			clearReplacedFileLinkCache();
+			clearUploadedFileLinkCache();
+		}
+	}
+
+	private Entity copyEntity(Entity entity, boolean recursive, Transaction transaction) {
+		if (entity instanceof Project) {
+			return copyProject((Project) entity, recursive, transaction);
+		} else if (entity instanceof Pool) {
+			return copyPool((Pool) entity, recursive, transaction);
+		} else if (entity instanceof Test) {
+			return copyTest((Test) entity, recursive, transaction);
+		} else if (entity instanceof TestStep) {
+			return copyTestStep((TestStep) entity, recursive, transaction);
+		} else if (entity instanceof Measurement) {
+			return copyMeasurement((Measurement) entity, new ArrayList<ContextRoot>(), recursive, transaction);
+		} else {
+			throw new ApiCopyException("Unsupported entity: '" + entity.getClass().getName() + "'");
+		}
+	}
+
+	private Project copyProject(Project projectSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(projectSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Importing Project '{}'", projectSrc.getName());
+			EntityType etProject = modelManagerDst.getEntityType(Project.class);
+
+			Filter filter = Filter.nameOnly(etProject, projectSrc.getName());
+
+			Project projectDst = fetchOne(searchServiceDst, Project.class, filter)
+					.orElseGet(() -> entityFactoryDst.createProject(projectSrc.getName()));
+
+			copyValues(projectSrc, projectDst, Arrays.asList("Id", "Name"), false, replaceFileLinks);
+
+			persist(transaction, projectDst);
+
+			ehDst = new EntityHolder(projectDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				entityManagerSrc.loadChildren(projectSrc, Pool.class)
+						.forEach(pool -> copyPool(pool, recursive, transaction));
+			}
+		}
+
+		return (Project) ehDst.getEntity();
+	}
+
+	private Pool copyPool(Pool poolSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(poolSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Importing Pool '{}'", poolSrc.getName());
+
+			Project projectParentDst = (Project) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(poolSrc, Project.class).get(), entityManagerSrc))
+					.getEntity();
+
+			EntityType etPool = modelManagerDst.getEntityType(Pool.class);
+			EntityType etProject = modelManagerDst.getEntityType(Project.class);
+
+			Relation relProject = etPool.getRelation(etProject);
+
+			if (null == relProject) {
+				throw new ApiCopyException("No relation to Project found at Pool!");
+			}
+
+			Filter filter = Filter.nameOnly(etPool, poolSrc.getName()).id(relProject, projectParentDst.getID());
+			Pool poolDst = fetchOne(searchServiceDst, Pool.class, filter)
+					.orElseGet(() -> entityFactoryDst.createPool(poolSrc.getName(), projectParentDst));
+
+			copyValues(poolSrc, poolDst, Arrays.asList("Id", "Name"), false, replaceFileLinks);
+
+			persist(transaction, poolDst);
+
+			ehDst = new EntityHolder(poolDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				entityManagerSrc.loadChildren(poolSrc, Test.class)
+						.forEach(test -> copyTest(test, recursive, transaction));
+			}
+		}
+
+		return (Pool) ehDst.getEntity();
+	}
+
+	private Test copyTest(Test testSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(testSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+
+			Pool poolParentDst = (Pool) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(testSrc, Pool.class).get(), entityManagerSrc))
+					.getEntity();
+
+			EntityType etTest = modelManagerDst.getEntityType(Test.class);
+			EntityType etPool = modelManagerDst.getEntityType(Pool.class);
+
+			Relation relPool = etTest.getRelation(etPool);
+
+			if (null == relPool) {
+				throw new ApiCopyException("No relation to StructureLevel found at Test!");
+			}
+
+			Optional<TemplateTest> templateTestDst = loadTemplateTest(testSrc);
+
+			Filter filter = Filter.nameOnly(etTest, testSrc.getName()).id(relPool, poolParentDst.getID());
+
+			String rootProjectName = getProjectName(testSrc);
+
+			Test testDst;
+
+			if (templateTestDst.isPresent()) {
+				LOG.trace("Importing Test '{}' using TestTemplate '{}'", testSrc.getName(),
+						templateTestDst.get().getName());
+				testDst = fetchOne(searchServiceDst, Test.class, filter)
+						.orElseGet(() -> entityFactoryDst.createTest(testSrc.getName(), poolParentDst,
+								templateTestDst.get(), classificationUtil.getClassification(rootProjectName), false));
+			} else {
+				LOG.trace("Importing Test '{}' using no TestTemplate", testSrc.getName());
+				testDst = fetchOne(searchServiceDst, Test.class, filter)
+						.orElseGet(() -> entityFactoryDst.createTest(testSrc.getName(), poolParentDst, null,
+								classificationUtil.getClassification(rootProjectName), false));
+			}
+
+			copyValues(testSrc, testDst, Arrays.asList("Id", "Name"), true, replaceFileLinks);
+
+			// copy responsible person:
+			Optional<User> userSrc = testSrc.getResponsiblePerson();
+			if (userSrc.isPresent()) {
+				User userDst = entityManagerDst.loadAll(User.class, userSrc.get().getName()).stream().findFirst()
+						.orElseThrow(() -> new ApiCopyException(String.format(
+								"No User instance with name %s found in destination!", userSrc.get().getName())));
+
+				testDst.setResponsiblePerson(userDst);
+			}
+
+			persist(transaction, testDst);
+
+			ehDst = new EntityHolder(testDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			if (recursive) {
+				EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+				Relation relTest = etTestStep.getRelation(etTest);
+
+				if (null == relTest) {
+					throw new ApiCopyException("No relation to Test found at TestStep!");
+				}
+
+				copyTestSteps(testSrc, recursive, templateTestDst, testDst, transaction);
+				entityManagerSrc.loadChildren(testSrc, TestStep.class)
+						.forEach(testStep -> copyTestStep(testStep, recursive, transaction));
+			}
+		}
+
+		return (Test) ehDst.getEntity();
+	}
+
+	private TestStep copyTestStep(TestStep testStepSrc, boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(testStepSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Importing TestStep '{}'", testStepSrc.getName());
+			EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+			EntityType etTest = modelManagerDst.getEntityType(Test.class);
+
+			Relation relTest = etTestStep.getRelation(etTest);
+
+			if (null == relTest) {
+				throw new ApiCopyException("No relation to Test found at TestStep!");
+			}
+
+			Test testDst = (Test) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(testStepSrc, Test.class).get(), entityManagerSrc))
+					.getEntity();
+
+			Optional<TemplateTestStep> templateTestStep = loadTemplateTestStep(testStepSrc);
+
+			Filter filter = Filter.nameOnly(etTestStep, testStepSrc.getName()).id(relTest, testDst.getID());
+
+			String rootProjectName = getProjectName(testStepSrc);
+
+			TestStep testStepDst = fetchOne(searchServiceDst, TestStep.class, filter).orElseGet(() -> {
+				if (templateTestStep.isPresent() && hasContextData(testStepSrc)) {
+					LOG.trace("Importing TestStep '{}' using TestStepTemplate '{}' and create context roots",
+							testStepSrc.getName(), templateTestStep.get().getName());
+					return entityFactoryDst.createTestStep(testDst, templateTestStep.get(),
+							classificationUtil.getClassification(rootProjectName));
+				} else if (templateTestStep.isPresent()) {
+					LOG.trace("Importing TestStep '{}' using TestStepTemplate '{}'", testStepSrc.getName(),
+							templateTestStep.get().getName());
+					return entityFactoryDst.createTestStepWithOutContextRoots(testDst, templateTestStep.get(),
+							classificationUtil.getClassification(rootProjectName));
+				} else {
+					LOG.trace("Importing TestStep '{}' using no TestStepTemplate", testStepSrc.getName());
+					TestStep createdTestStep = entityFactoryDst.createTestStep(testStepSrc.getName(), testDst,
+							classificationUtil.getClassification(rootProjectName));
+					Value value = createdTestStep.getValue("TplTestStep");
+					return createdTestStep;
+				}
+			});
+
+			copyValues(testStepSrc, testStepDst, Arrays.asList("Id"), true, replaceFileLinks);
+
+			persist(transaction, testStepDst);
+
+			ehDst = new EntityHolder(testStepDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			Map<ContextType, ContextRoot> mapContextRootsSrc = testStepSrc.loadContexts(entityManagerSrc,
+					ContextType.values());
+			Map<ContextType, ContextRoot> mapContextRootsDst = testStepDst.loadContexts(entityManagerDst,
+					ContextType.values());
+
+			copyContext(mapContextRootsSrc, mapContextRootsDst, templateTestStep, transaction);
+
+			if (recursive) {
+				List<ContextRoot> listContextRoots = new ArrayList<>();
+				entityManagerSrc.loadChildren(testStepSrc, Measurement.class)
+						.forEach(measurement -> copyMeasurement(measurement, listContextRoots, recursive, transaction));
+			}
+		}
+		return (TestStep) ehDst.getEntity();
+	}
+
+	private String getProjectName(TestStep testStepSrc) {
+		Optional<Test> parentTest = entityManagerSrc.loadParent(testStepSrc, Test.class);
+
+		if (!parentTest.isPresent()) {
+			throw new ApiCopyException("Parent of source teststep not found!");
+		}
+
+		return getProjectName(parentTest.get());
+	}
+
+	private String getProjectName(Test testSrc) {
+
+		Optional<Pool> parentPool = entityManagerSrc.loadParent(testSrc, Pool.class);
+
+		if (!parentPool.isPresent()) {
+			throw new ApiCopyException("Parent of source test not found!");
+		}
+
+		Optional<Project> parentProject = entityManagerSrc.loadParent(parentPool.get(), Project.class);
+
+		if (!parentProject.isPresent()) {
+			throw new ApiCopyException("Parent of source pool not found!");
+		}
+
+		return parentProject.get().getName();
+	}
+
+	/**
+	 * Check if the teststep has context data
+	 * 
+	 * @param testStepSrc
+	 * @return true if the teststep has conteyt data
+	 */
+	private boolean hasContextData(TestStep testStepSrc) {
+		boolean hasContextData = false;
+
+		Optional<EntityManager> entityManager = contextSrc.getEntityManager();
+		if (entityManager.isPresent()) {
+			Map<ContextType, ContextRoot> loadContexts = entityManager.get().loadContexts(testStepSrc,
+					ContextType.UNITUNDERTEST, ContextType.TESTEQUIPMENT, ContextType.TESTSEQUENCE);
+			if (!loadContexts.isEmpty()) {
+				hasContextData = true;
+			}
+		}
+
+		return hasContextData;
+
+	}
+
+	private List<TestStep> copyTestSteps(Test testSrc, boolean recursive, Optional<TemplateTest> templateTestDst,
+			Test testDst, Transaction transaction) {
+		EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+		EntityType etTest = modelManagerDst.getEntityType(Test.class);
+
+		Relation relTest = etTestStep.getRelation(etTest);
+
+		if (null == relTest) {
+			throw new ApiCopyException("No relation to Test found at TestStep!");
+		}
+
+		List<TestStep> listTestStepsSrc = entityManagerSrc.loadChildren(testSrc, TestStep.class);
+
+		List<TestStep> listTestStepsDst = new ArrayList<>();
+		for (int i = 0, len = listTestStepsSrc.size(); i < len; ++i) {
+			TestStep testStepSrc = listTestStepsSrc.get(i);
+			Optional<TemplateTestStep> templateTestStep = loadTemplateTestStep(testStepSrc);
+
+			String rootProjectName = getProjectName(testStepSrc);
+
+			Filter filter = Filter.nameOnly(etTestStep, testStepSrc.getName()).id(relTest, testDst.getID());
+			Optional<TestStep> oTestSTepDst = fetchOne(searchServiceDst, TestStep.class, filter);
+
+			TestStep testStepDst;
+
+			boolean overwriteExistingElements = Boolean.valueOf(
+					properties.getOrDefault(PROPERTY_OVERWRITE_EXISTING_ELEMENTS, DEFAULT_OVERWRITE_EXISTING_ELEMENTS));
+
+			if (!overwriteExistingElements || (overwriteExistingElements && !oTestSTepDst.isPresent())) {
+				if (templateTestStep.isPresent() && hasContextData(testStepSrc)) {
+					LOG.trace("Importing TestStep '{}' using TestStepTemplate '{}' and create context roots",
+							testStepSrc.getName(), templateTestStep.get().getName());
+					testStepDst = entityFactoryDst.createTestStep(testDst, templateTestStep.get(),
+							classificationUtil.getClassification(rootProjectName));
+					testStepDst.setName(testStepSrc.getName());
+				} else if (templateTestStep.isPresent()) {
+					LOG.trace("Importing TestStep '{}' using TestStepTemplate '{}' and create context roots",
+							testStepSrc.getName(), templateTestStep.get().getName());
+					testStepDst = entityFactoryDst.createTestStepWithOutContextRoots(testDst, templateTestStep.get(),
+							classificationUtil.getClassification(rootProjectName));
+				} else {
+					LOG.trace("Importing TestStep '{}' using no TestStepTemplate", testStepSrc.getName());
+					testStepDst = entityFactoryDst.createTestStep(testStepSrc.getName(), testDst,
+							classificationUtil.getClassification(rootProjectName));
+				}
+			} else {
+				testStepDst = oTestSTepDst.get();
+			}
+
+			copyValues(testStepSrc, testStepDst, Arrays.asList("Id"), true, replaceFileLinks);
+
+			listTestStepsDst.add(testStepDst);
+
+			mapSrcDstEntities.put(new EntityHolder(testStepSrc, entityManagerSrc),
+					new EntityHolder(testStepDst, entityManagerDst));
+		}
+
+		for (TestStep testStepSrc : listTestStepsSrc) {
+			Optional<TestStep> testStepDst = listTestStepsDst.stream()
+					.filter(n -> n.getName().equals(testStepSrc.getName())).findFirst();
+
+			if (testStepDst.isPresent()) {
+				Map<ContextType, ContextRoot> mapContextRootsSrc = testStepSrc.loadContexts(entityManagerSrc,
+						ContextType.values());
+				Map<ContextType, ContextRoot> mapContextRootsDst = testStepDst.get().loadContexts(entityManagerDst,
+						ContextType.values());
+				copyContext(mapContextRootsSrc, mapContextRootsDst, loadTemplateTestStep(testStepSrc), transaction);
+			}
+		}
+
+		persist(transaction, listTestStepsDst);
+
+		if (recursive) {
+			for (TestStep testStep : listTestStepsSrc) {
+				List<ContextRoot> listContextRoots = new ArrayList<>();
+				entityManagerSrc.loadChildren(testStep, Measurement.class)
+						.forEach(measurement -> copyMeasurement(measurement, listContextRoots, recursive, transaction));
+			}
+		}
+
+		return listTestStepsDst;
+	}
+
+	private void copyContext(Map<ContextType, ContextRoot> mapContextRootsSrc,
+			Map<ContextType, ContextRoot> mapContextRootsDst, Optional<TemplateTestStep> optTemplateTestStep,
+			Transaction transaction) {
+
+		for (Map.Entry<ContextType, ContextRoot> me : mapContextRootsSrc.entrySet()) {
+			LOG.trace("Importing ContextRoot '{}'", me.getKey());
+			ContextRoot contextRootDst = mapContextRootsDst.get(me.getKey());
+			if (null != contextRootDst && contextRootDst.getName().equals(me.getValue().getName())) {
+				ContextRoot contextRootSrc = me.getValue();
+				copyValues(contextRootSrc, contextRootDst, Arrays.asList("Id", "Name"), false, replaceFileLinks);
+
+				TemplateRoot templateRootDst = null;
+
+				if (optTemplateTestStep.isPresent()) {
+					Optional<TemplateRoot> optTemplateRoot = optTemplateTestStep.get()
+							.getTemplateRoot(contextRootDst.getContextType());
+
+					templateRootDst = optTemplateRoot.orElse(null);
+				}
+
+				for (ContextComponent contextComponentSrc : me.getValue().getContextComponents()) {
+					LOG.trace("Importing ContextComponent '{}'", contextComponentSrc.getName());
+					Optional<ContextComponent> o = contextRootDst.getContextComponent(contextComponentSrc.getName());
+
+					if (o.isPresent()) {
+						ContextComponent contextComponentDst = o.get();
+
+						copyValues(contextComponentSrc, contextComponentDst, Arrays.asList("Id", "Name"), true,
+								replaceFileLinks);
+
+					} else if (null != templateRootDst) {
+						Optional<TemplateComponent> optTemplateComponent = templateRootDst
+								.getTemplateComponent(contextComponentSrc.getName());
+
+						if (optTemplateComponent.isPresent()) {
+							TemplateComponent templateComponent = optTemplateComponent.get();
+							if (templateComponent.isOptional() && !templateComponent.isDefaultActive()) {
+								ContextComponent contextComponentDst = entityFactoryDst
+										.createContextComponent(contextComponentSrc.getName(), contextRootDst);
+
+								copyValues(contextComponentSrc, contextComponentDst, Arrays.asList("Id", "Name"), true,
+										replaceFileLinks);
+
+								persist(transaction, contextComponentDst);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	private Measurement copyMeasurement(Measurement measurementSrc, List<ContextRoot> listContextRootsDst,
+			boolean recursive, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(measurementSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		boolean append = Boolean.valueOf(properties.getOrDefault(PROPERTY_APPEND, DEFAULT_APPEND));
+
+		if (null == ehDst) {
+			LOG.trace("Importing Measurement '{}'", measurementSrc.getName());
+			TestStep testStepSrs = entityManagerSrc.loadParent(measurementSrc, TestStep.class).get();
+			TestStep testStepParentDst = (TestStep) mapSrcDstEntities
+					.get(new EntityHolder(testStepSrs, entityManagerSrc)).getEntity();
+
+			EntityType etMeasurement = modelManagerDst.getEntityType(Measurement.class);
+			EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+
+			Relation relTestStep = etMeasurement.getRelation(etTestStep);
+
+			if (null == relTestStep) {
+				throw new ApiCopyException("No relation to TestStep found at MeaResult!");
+			}
+
+			Filter filter = Filter.nameOnly(etMeasurement, measurementSrc.getName()).id(relTestStep,
+					testStepParentDst.getID());
+
+			Optional<Measurement> optMeasurement = fetchOne(searchServiceDst, Measurement.class, filter);
+			Measurement measurementDst = null;
+
+			if (optMeasurement.isPresent() && !append) {
+				throw new ApiCopyException(String.format("TestStep '%s' has already a measurement with name '%s'!",
+						testStepParentDst.getName(), measurementSrc.getName()));
+			} else if (optMeasurement.isPresent()) {
+				measurementDst = optMeasurement.get();
+			} else {
+				append = false;
+			}
+
+			Optional<TemplateTestStep> optTemplateTestStep = loadTemplateTestStep(testStepSrs);
+
+			// If no ContextRoots to use with the newly created Measurement are passed into
+			// this method, use ContextRoots
+			// of any already existing Measurement under the parent test step.
+			// First look in destination...
+			if (listContextRootsDst.isEmpty()) {
+				for (Measurement existingMeasurementDst : entityManagerDst.loadChildren(testStepParentDst,
+						Measurement.class)) {
+					listContextRootsDst.addAll(
+							existingMeasurementDst.loadContexts(entityManagerDst, ContextType.values()).values());
+
+					if (!listContextRootsDst.isEmpty()) {
+						break;
+					}
+				}
+			}
+
+			// ...then, if nothing has been found, in source and try to find destination
+			// counterpart in cache map:
+			if (listContextRootsDst.isEmpty()) {
+				for (Measurement existingMeasurementSrc : entityManagerSrc.loadChildren(testStepSrs,
+						Measurement.class)) {
+					EntityHolder eh = mapSrcDstEntities.get(new EntityHolder(existingMeasurementSrc, entityManagerSrc));
+					if (null != eh) {
+						listContextRootsDst.addAll(((Measurement) eh.getEntity())
+								.loadContexts(entityManagerDst, ContextType.values()).values());
+					}
+
+					if (!listContextRootsDst.isEmpty()) {
+						break;
+					}
+				}
+			}
+
+			// Still no ContextRoots found? Create them from the test step template:
+			if (listContextRootsDst.isEmpty() && optTemplateTestStep.isPresent()) {
+				optTemplateTestStep.get().getTemplateRoots()
+						.forEach(tr -> listContextRootsDst.add(entityFactoryDst.createContextRoot(tr)));
+			}
+
+			if (measurementDst == null) {
+				measurementDst = entityFactoryDst.createMeasurement(measurementSrc.getName(), testStepParentDst,
+						listContextRootsDst.toArray(new ContextRoot[listContextRootsDst.size()]));
+			}
+
+			copyValues(measurementSrc, measurementDst, Arrays.asList("Id", "Name"), true, replaceFileLinks);
+
+			ehDst = new EntityHolder(measurementDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+
+			Map<ContextType, ContextRoot> mapContextRootsSrc = testStepParentDst.loadContexts(entityManagerDst,
+					ContextType.values());
+			Map<ContextType, ContextRoot> mapContextRootsDst = measurementDst.loadContexts(entityManagerDst,
+					ContextType.values());
+
+			copyContext(mapContextRootsSrc, mapContextRootsDst, optTemplateTestStep, transaction);
+
+			mapContextRootsSrc = measurementSrc.loadContexts(entityManagerSrc, ContextType.values());
+			mapContextRootsDst = measurementDst.loadContexts(entityManagerDst, ContextType.values());
+			copyContext(mapContextRootsSrc, mapContextRootsDst, optTemplateTestStep, transaction);
+
+			persist(transaction, measurementDst);
+
+			Iterator<ContextRoot> contextRootIter = mapContextRootsDst.values().iterator();
+
+			while (contextRootIter.hasNext()) {
+				ContextRoot contextRootForUpdate = contextRootIter.next();
+				persist(transaction, contextRootForUpdate);
+			}
+
+			if (recursive) {
+				List<WriteRequest> listWriteRequests = new ArrayList<>();
+
+				Map<String, Channel> mapChannels = new HashMap<>();
+
+				if (append && !isSrcChannelsValid(entityManagerSrc.loadChildren(measurementSrc, Channel.class),
+						entityManagerDst.loadChildren(measurementDst, Channel.class))) {
+					throw new ApiCopyException(
+							"Appending not possible. All channels of existing measurement have to be in the source measurement");
+				}
+
+				for (Channel channel : entityManagerSrc.loadChildren(measurementSrc, Channel.class)) {
+					Channel channelDst = copyChannel(channel, transaction);
+					mapChannels.put(channel.getName(), channelDst);
+				}
+
+				for (ChannelGroup channelGroup : entityManagerSrc.loadChildren(measurementSrc, ChannelGroup.class)) {
+					Map<String, MeasuredValues> existingMeasValuesToAppend = new HashMap<>();
+
+					Integer numberOfValues = 0;
+					if (append) {
+						Optional<ChannelGroup> optChannelGroup = fetchOneChannelGroup(channelGroup);
+
+						if (optChannelGroup.isPresent()) {
+							numberOfValues = optChannelGroup.get().getNumberOfValues();
+							existingMeasValuesToAppend = getMeasurementValuesMap(entityManagerDst,
+									optChannelGroup.get());
+						}
+
+					}
+
+					ChannelGroup channelGroupDst = copyChannelGroup(channelGroup, transaction, append);
+
+					for (MeasuredValues measuredValues : entityManagerSrc.readMeasuredValues(ReadRequest
+							.create(channelGroup).valuesMode(ValuesMode.STORAGE).allChannels().allValues())) {
+						LOG.trace("Importing MeasuredValues '{}'", measuredValues.getName());
+						if (!mapChannels.containsKey(measuredValues.getName())) {
+							throw new ApiCopyException(
+									String.format("Cannot find Channel %s in destination!", measuredValues.getName()));
+						}
+
+						Channel channelDst = mapChannels.get(measuredValues.getName());
+
+						String mappedUnit = unitMapping.get(measuredValues.getUnit());
+
+						if (!Strings.isNullOrEmpty(mappedUnit)) {
+							measuredValues = MeasuredValuesHelper.mapUnitOfMeasuredValues(measuredValues, mappedUnit);
+						}
+
+						if (append) {
+
+							channelDst = replaceChannelDst(channelDst, measurementDst, ehSrc, transaction);
+
+							MeasuredValues measuredValuesOld = existingMeasValuesToAppend.get(channelDst.getName());
+
+							if (measuredValuesOld == null) {
+								measuredValuesOld = MeasuredValuesHelper.createEmptyValues(measuredValues.getName(),
+										measuredValues.getScalarType(), measuredValues.getUnit(),
+										measuredValues.getSequenceRepresentation(),
+										measuredValues.getGenerationParameters(), measuredValues.isIndependent(),
+										measuredValues.getAxisType(), numberOfValues);
+
+							}
+
+							measuredValues = MeasuredValuesHelper.appenMeasuredValues(measuredValuesOld,
+									measuredValues);
+
+						}
+
+						listWriteRequests.add(createWriteRequest(channelGroupDst, channelDst, measuredValues));
+
+					}
+				}
+
+				transaction.writeMeasuredValues(listWriteRequests);
+			}
+		}
+
+		return (Measurement) ehDst.getEntity();
+	}
+
+	private boolean isSrcChannelsValid(List<Channel> channelsSrc, List<Channel> channelsDst) {
+		boolean isSrcChannelsValid = true;
+
+		Map<String, Channel> sourceMap = new HashMap<>();
+		channelsSrc.forEach(srcChannel -> sourceMap.put(srcChannel.getName(), srcChannel));
+
+		for (Channel channelDst : channelsDst) {
+			if (sourceMap.get(channelDst.getName()) == null) {
+				isSrcChannelsValid = false;
+				break;
+			}
+		}
+
+		return isSrcChannelsValid;
+	}
+
+	private Channel replaceChannelDst(Channel channelDst, Measurement measurementDst, EntityHolder ehSrc,
+			Transaction transaction) {
+		Channel channelNew = entityFactoryDst.createChannel(channelDst.getName(), measurementDst,
+				channelDst.getQuantity());
+
+		copyValues(channelDst, channelNew, Arrays.asList("Id"), false, replaceFileLinks);
+		persist(transaction, channelNew);
+		mapSrcDstEntities.put(ehSrc, new EntityHolder(channelNew, entityManagerDst));
+
+		transaction.delete(Collections.singletonList(channelDst));
+		return channelNew;
+	}
+
+	private Map<String, MeasuredValues> getMeasurementValuesMap(EntityManager entityManager,
+			ChannelGroup channelGroup) {
+
+		Map<String, MeasuredValues> returnVal = new HashMap<>();
+
+		for (MeasuredValues measuredValues : entityManager.readMeasuredValues(
+				ReadRequest.create(channelGroup).valuesMode(ValuesMode.STORAGE).allChannels().allValues())) {
+			returnVal.put(measuredValues.getName(), measuredValues);
+		}
+		return returnVal;
+	}
+
+	private Channel copyChannel(Channel channelSrc, Transaction transaction) {
+		EntityHolder ehSrc = new EntityHolder(channelSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Importing Channel '{}'", channelSrc.getName());
+			Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(channelSrc, Measurement.class).get(),
+							entityManagerSrc))
+					.getEntity();
+
+			EntityType etChannel = modelManagerDst.getEntityType(Channel.class);
+			EntityType etMeasurement = modelManagerDst.getEntityType(Measurement.class);
+
+			Relation relMeasurement = etChannel.getRelation(etMeasurement);
+
+			if (null == relMeasurement) {
+				throw new ApiCopyException("No relation to MeaResult found at MeaQuantity!");
+			}
+
+			// Find a valid quantity with the highest version
+			/*
+			 * TODO Quantity should actually implement Versionable, then we could just use
+			 * org.eclipse.mdm.api.dflt.EntityManager.loadLatestValid(Class<T>, String) Bug:
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=553368
+			 */
+
+			Quantity quantity = entityManagerDst
+					.loadAll(Quantity.class,
+							quantityMapping.getOrDefault(channelSrc.getQuantity().getName(),
+									channelSrc.getQuantity().getName()))
+					.stream().filter(q -> q.getValue(Versionable.ATTR_VERSION_STATE).extract() == VersionState.VALID)
+					.sorted(Comparator.comparing(q -> Integer.valueOf(q.getValue(Versionable.ATTR_VERSION).extract())))
+					.findFirst().orElseThrow(() -> new ApiCopyException(String
+							.format("Cannot find Quantity with name '%s' in destination!",
+									channelSrc.getQuantity().getName())));
+
+			Filter filter = Filter.nameOnly(etChannel, channelSrc.getName()).id(relMeasurement,
+					measurementParentDst.getID());
+
+			Channel channelDst = fetchOne(searchServiceDst, Channel.class, filter).orElseGet(
+					() -> entityFactoryDst.createChannel(channelSrc.getName(), measurementParentDst, quantity));
+
+			copyValues(channelSrc, channelDst, Arrays.asList("Id"), false, replaceFileLinks);
+
+			persist(transaction, channelDst);
+
+			ehDst = new EntityHolder(channelDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+		}
+
+		return (Channel) ehDst.getEntity();
+	}
+
+	private Optional<ChannelGroup> fetchOneChannelGroup(ChannelGroup channelGroupSrc) {
+		Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+				.get(new EntityHolder(entityManagerSrc.loadParent(channelGroupSrc, Measurement.class).get(),
+						entityManagerSrc))
+				.getEntity();
+		EntityType etChannelGroup = modelManagerDst.getEntityType(ChannelGroup.class);
+		EntityType etMeasurement = modelManagerDst.getEntityType(Measurement.class);
+
+		Relation relMeasurement = etChannelGroup.getRelation(etMeasurement);
+
+		if (null == relMeasurement) {
+			throw new ApiCopyException("No relation to MeaResult found at SubMatrix!");
+		}
+
+		Filter filter = Filter.nameOnly(etChannelGroup, channelGroupSrc.getName()).id(relMeasurement,
+				measurementParentDst.getID());
+
+		return fetchOne(searchServiceDst, ChannelGroup.class, filter);
+	}
+
+	private ChannelGroup copyChannelGroup(ChannelGroup channelGroupSrc, Transaction transaction, boolean append) {
+		EntityHolder ehSrc = new EntityHolder(channelGroupSrc, entityManagerSrc);
+
+		EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+		if (null == ehDst) {
+			LOG.trace("Importing ChannelGroup '{}'", channelGroupSrc.getName());
+			Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+					.get(new EntityHolder(entityManagerSrc.loadParent(channelGroupSrc, Measurement.class).get(),
+							entityManagerSrc))
+					.getEntity();
+
+			EntityType etChannelGroup = modelManagerDst.getEntityType(ChannelGroup.class);
+			EntityType etMeasurement = modelManagerDst.getEntityType(Measurement.class);
+
+			Relation relMeasurement = etChannelGroup.getRelation(etMeasurement);
+
+			if (null == relMeasurement) {
+				throw new ApiCopyException("No relation to MeaResult found at SubMatrix!");
+			}
+
+			Optional<ChannelGroup> channelGroupOptional = fetchOneChannelGroup(channelGroupSrc);
+
+			ChannelGroup channelGroupDst = null;
+
+			if (append && channelGroupOptional.isPresent()) {
+				transaction.delete(Collections.singletonList(channelGroupOptional.get()));
+				channelGroupDst = entityFactoryDst.createChannelGroup(channelGroupSrc.getName(),
+						channelGroupSrc.getNumberOfValues(), measurementParentDst);
+			} else {
+				channelGroupDst = channelGroupOptional
+						.orElseGet(() -> entityFactoryDst.createChannelGroup(channelGroupSrc.getName(),
+								channelGroupSrc.getNumberOfValues(), measurementParentDst));
+			}
+
+			copyValues(channelGroupSrc, channelGroupDst, Arrays.asList("Id"), false, replaceFileLinks);
+
+			persist(transaction, channelGroupDst);
+
+			ehDst = new EntityHolder(channelGroupDst, entityManagerDst);
+			mapSrcDstEntities.put(ehSrc, ehDst);
+		}
+
+		return (ChannelGroup) ehDst.getEntity();
+	}
+
+	private Optional<TemplateTest> loadTemplateTest(Test testSrc) {
+		Optional<TemplateTest> returnVal = Optional.empty();
+
+		String templateTestName = templateManager.getTemplateTestName(testSrc);
+
+		if (!Strings.isNullOrEmpty(templateTestName)) {
+			returnVal = getCurrentValidTestTemplate(entityManagerDst.loadAll(TemplateTest.class, templateTestName));
+
+		}
+
+		return returnVal;
+	}
+
+	private Optional<TemplateTest> getCurrentValidTestTemplate(List<TemplateTest> listTemplateTests) {
+		Optional<TemplateTest> returnVal = Optional.empty();
+
+		if (listTemplateTests != null && !listTemplateTests.isEmpty()) {
+			int highestVersion = -1;
+			TemplateTest highestValidTemplate = null;
+
+			for (TemplateTest templateTest : listTemplateTests) {
+				Value value = templateTest.getValue(TemplateTest.ATTR_VERSION_STATE);
+
+				if (VersionState.VALID.equals(value.extract())) {
+					int version = Integer.parseInt(templateTest.getValue(TemplateTest.ATTR_VERSION).extract());
+
+					if (version > highestVersion) {
+						highestValidTemplate = templateTest;
+						highestVersion = version;
+					}
+				}
+
+			}
+
+			if (highestValidTemplate != null) {
+				returnVal = Optional.of(highestValidTemplate);
+			}
+
+		}
+		return returnVal;
+	}
+
+	private Optional<TemplateTestStep> loadTemplateTestStep(TestStep testStepSrc) {
+		Optional<TemplateTestStep> returnVal = Optional.empty();
+
+		String templateTestStepName = templateManager.getTemplateTestStepName(testStepSrc);
+
+		if (!Strings.isNullOrEmpty(templateTestStepName)) {
+			returnVal = getCurrentValidTestStepTemplate(
+					entityManagerDst.loadAll(TemplateTestStep.class, templateTestStepName));
+		}
+
+		return returnVal;
+	}
+
+	private Optional<TemplateTestStep> getCurrentValidTestStepTemplate(List<TemplateTestStep> listTemplateTestSteps) {
+		Optional<TemplateTestStep> returnVal = Optional.empty();
+
+		if (listTemplateTestSteps != null && !listTemplateTestSteps.isEmpty()) {
+			int highestVersion = -1;
+			TemplateTestStep highestValidTemplate = null;
+
+			for (TemplateTestStep templateTestStep : listTemplateTestSteps) {
+				Value value = templateTestStep.getValue(TemplateTestStep.ATTR_VERSION_STATE);
+
+				if (VersionState.VALID.equals(value.extract())) {
+					int version = Integer.parseInt(templateTestStep.getValue(TemplateTestStep.ATTR_VERSION).extract());
+
+					if (version > highestVersion) {
+						highestValidTemplate = templateTestStep;
+						highestVersion = version;
+					}
+				}
+
+			}
+
+			if (highestValidTemplate != null) {
+				returnVal = Optional.of(highestValidTemplate);
+			}
+
+		}
+		return returnVal;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.mdm.apicopy.control.ApiCopyTask#setProperties(java.util.Map)
+	 */
+	@Override
+	public void setProperties(Map<String, String> properties) {
+		this.properties = properties;
+		this.replaceFileLinks = Boolean
+				.valueOf(this.properties.getOrDefault(PROPERTY_REPLACE_FILELINKS, DEFAULT_REPLACE_FILES));
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/MeasuredValuesDTO.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/MeasuredValuesDTO.java
new file mode 100644
index 0000000..abfece9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/MeasuredValuesDTO.java
@@ -0,0 +1,51 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+/**
+ * DTO Object which holds the pair of values and the corresponding flags
+ * 
+ * @author Alexander Knoblauch
+ *
+ */
+public class MeasuredValuesDTO {
+
+	private final Object values;
+	private final boolean[] flags;
+
+	/**
+	 * @param values
+	 * @param flags
+	 */
+	public MeasuredValuesDTO(Object values, boolean[] flags) {
+		super();
+		this.values = values;
+		this.flags = flags;
+	}
+
+	/**
+	 * @return the values
+	 */
+	public Object getValues() {
+		return values;
+	}
+
+	/**
+	 * @return the flags
+	 */
+	public boolean[] getFlags() {
+		return flags;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/MeasuredValuesHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/MeasuredValuesHelper.java
new file mode 100644
index 0000000..eb12338
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/MeasuredValuesHelper.java
@@ -0,0 +1,514 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.eclipse.mdm.api.base.model.AxisType;
+import org.eclipse.mdm.api.base.model.DoubleComplex;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.FloatComplex;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.MeasuredValues.ValueIterator;
+import org.eclipse.mdm.api.base.model.ScalarType;
+import org.eclipse.mdm.api.base.model.SequenceRepresentation;
+
+/**
+ * Helper class for measured values operations
+ * 
+ * @author Alexander Knoblauch
+ *
+ */
+public class MeasuredValuesHelper {
+
+	/**
+	 * Map measurement values to given unit
+	 * 
+	 * @param measuredValues
+	 * @param unitNew
+	 * @return
+	 */
+	public static MeasuredValues mapUnitOfMeasuredValues(MeasuredValues measuredValues, String unitNew) {
+
+		ScalarType scalarType = measuredValues.getScalarType();
+
+		MeasuredValuesDTO values = null;
+
+		if (scalarType.isString()) {
+			values = getStringValues(measuredValues);
+		} else if (scalarType.isDate()) {
+			values = getDateValues(measuredValues);
+		} else if (scalarType.isBoolean()) {
+			values = getBooleanValues(measuredValues);
+		} else if (scalarType.isByte()) {
+			values = getByteValues(measuredValues);
+		} else if (scalarType.isShort()) {
+			values = getShortValues(measuredValues);
+		} else if (scalarType.isInteger()) {
+			values = getIntegerValues(measuredValues);
+		} else if (scalarType.isLong()) {
+			values = getLongValues(measuredValues);
+		} else if (scalarType.isFloat()) {
+			values = getFloatValues(measuredValues);
+		} else if (scalarType.isDouble()) {
+			values = getDoubleValues(measuredValues);
+		} else if (scalarType.isByteStream()) {
+			values = getByteStreamValues(measuredValues);
+		} else if (scalarType.isFloatComplex()) {
+			values = getFloatComplexValues(measuredValues);
+		} else if (scalarType.isDoubleComplex()) {
+			values = getDoubleComplexValues(measuredValues);
+		} else if (scalarType.isFileLink()) {
+			values = getFileLinkValues(measuredValues);
+		} else if (scalarType.isBlob()) {
+			values = getBlobValues(measuredValues);
+		} else {
+			throw new IllegalStateException(
+					String.format("Unsupported ScalarType %s in MeasuredValues!", scalarType.name()));
+		}
+
+		return scalarType.createMeasuredValues(measuredValues.getName(), unitNew,
+				measuredValues.getSequenceRepresentation(), measuredValues.getGenerationParameters(),
+				measuredValues.isIndependent(), measuredValues.getAxisType(), values.getValues(), values.getFlags());
+
+	}
+
+	/**
+	 * appending two measured values
+	 * 
+	 * @param measuredValues1
+	 * @param measuredValues2
+	 * @return appended measured values
+	 * @throws ApiCopyException if the {@link ScalarType}s or units are different
+	 */
+	public static MeasuredValues appenMeasuredValues(MeasuredValues measuredValues1, MeasuredValues measuredValues2) {
+		ScalarType scalarType = measuredValues1.getScalarType();
+
+		if (!scalarType.equals(measuredValues2.getScalarType())) {
+			throw new ApiCopyException("Error at appending measured values, ScalarType is different!");
+		}
+
+		if (!measuredValues1.getUnit().equals(measuredValues2.getUnit())) {
+			throw new ApiCopyException("Error at appending measured values, Unit is different!");
+		}
+
+		Object valuesNew = null;
+		boolean[] flagsNew = new boolean[0];
+
+		if (scalarType.isString()) {
+			MeasuredValuesDTO values1 = getStringValues(measuredValues1);
+			MeasuredValuesDTO values2 = getStringValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((String[]) values1.getValues(), (String[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isDate()) {
+			MeasuredValuesDTO values1 = getDateValues(measuredValues1);
+			MeasuredValuesDTO values2 = getDateValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((LocalDateTime[]) values1.getValues(), (LocalDateTime[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isBoolean()) {
+			MeasuredValuesDTO values1 = getBooleanValues(measuredValues1);
+			MeasuredValuesDTO values2 = getBooleanValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((boolean[]) values1.getValues(), (boolean[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isByte()) {
+			MeasuredValuesDTO values1 = getByteValues(measuredValues1);
+			MeasuredValuesDTO values2 = getByteValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((byte[]) values1.getValues(), (byte[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isShort()) {
+			MeasuredValuesDTO values1 = getShortValues(measuredValues1);
+			MeasuredValuesDTO values2 = getShortValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((short[]) values1.getValues(), (short[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isInteger()) {
+			MeasuredValuesDTO values1 = getIntegerValues(measuredValues1);
+			MeasuredValuesDTO values2 = getIntegerValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((int[]) values1.getValues(), (int[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isLong()) {
+			MeasuredValuesDTO values1 = getLongValues(measuredValues1);
+			MeasuredValuesDTO values2 = getLongValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((long[]) values1.getValues(), (long[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isFloat()) {
+			MeasuredValuesDTO values1 = getFloatValues(measuredValues1);
+			MeasuredValuesDTO values2 = getFloatValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((float[]) values1.getValues(), (float[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isDouble()) {
+			MeasuredValuesDTO values1 = getDoubleValues(measuredValues1);
+			MeasuredValuesDTO values2 = getDoubleValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((double[]) values1.getValues(), (double[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isByteStream()) {
+			MeasuredValuesDTO values1 = getByteStreamValues(measuredValues1);
+			MeasuredValuesDTO values2 = getByteStreamValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((byte[][]) values1.getValues(), (byte[][]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isFloatComplex()) {
+			MeasuredValuesDTO values1 = getFloatComplexValues(measuredValues1);
+			MeasuredValuesDTO values2 = getFloatComplexValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((FloatComplex[]) values1.getValues(), (FloatComplex[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isDoubleComplex()) {
+			MeasuredValuesDTO values1 = getDoubleComplexValues(measuredValues1);
+			MeasuredValuesDTO values2 = getDoubleComplexValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((DoubleComplex[]) values1.getValues(), (DoubleComplex[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else if (scalarType.isFileLink()) {
+			MeasuredValuesDTO values1 = getFileLinkValues(measuredValues1);
+			MeasuredValuesDTO values2 = getFileLinkValues(measuredValues2);
+
+			valuesNew = ArrayUtils.addAll((FileLink[]) values1.getValues(), (FileLink[]) values2.getValues());
+			flagsNew = ArrayUtils.addAll(values1.getFlags(), values2.getFlags());
+		} else {
+			throw new IllegalStateException(
+					String.format("Unsupported ScalarType %s in MeasuredValues!", scalarType.name()));
+		}
+
+		return scalarType.createMeasuredValues(measuredValues1.getName(), measuredValues1.getUnit(),
+				measuredValues1.getSequenceRepresentation(), measuredValues1.getGenerationParameters(),
+				measuredValues1.isIndependent(), measuredValues1.getAxisType(), valuesNew, flagsNew);
+	}
+
+	/**
+	 * Creating MeasueredValues with only invalid values
+	 * 
+	 * @param name                   of the column
+	 * @param scalarType             the {@link ScalarType}
+	 * @param unit                   of the values
+	 * @param sequenceRepresentation the {@link SequenceRepresentation}
+	 * @param generationParameters
+	 * @param independent
+	 * @param axisType               the {@link AxisType}
+	 * @param numberOfValues         the number of the measured values
+	 * @return {@link MeasuredValues} object, which includes only invalid values
+	 */
+	public static MeasuredValues createEmptyValues(String name, ScalarType scalarType, String unit,
+			SequenceRepresentation sequenceRepresentation, double[] generationParameters, boolean independent,
+			AxisType axisType, int numberOfValues) {
+		boolean[] flags = new boolean[numberOfValues];
+		Arrays.fill(flags, false);
+
+		Object values = null;
+
+		if (scalarType.isString()) {
+			values = new String[numberOfValues];
+		} else if (scalarType.isDate()) {
+			values = new LocalDateTime[numberOfValues];
+		} else if (scalarType.isBoolean()) {
+			values = new boolean[numberOfValues];
+		} else if (scalarType.isByte()) {
+			values = new byte[numberOfValues];
+		} else if (scalarType.isShort()) {
+			values = new short[numberOfValues];
+		} else if (scalarType.isInteger()) {
+			values = new int[numberOfValues];
+		} else if (scalarType.isLong()) {
+			values = new long[numberOfValues];
+		} else if (scalarType.isFloat()) {
+			values = new float[numberOfValues];
+		} else if (scalarType.isDouble()) {
+			values = new double[numberOfValues];
+		} else if (scalarType.isByteStream()) {
+			values = new byte[numberOfValues][];
+		} else if (scalarType.isFloatComplex()) {
+			values = new FloatComplex[numberOfValues];
+		} else if (scalarType.isDoubleComplex()) {
+			values = new DoubleComplex[numberOfValues];
+		} else if (scalarType.isFileLink()) {
+			values = new FileLink[numberOfValues];
+		} else {
+			throw new IllegalStateException(
+					String.format("Unsupported ScalarType %s in MeasuredValues!", scalarType.name()));
+		}
+
+		return scalarType.createMeasuredValues(name, unit, sequenceRepresentation, generationParameters, independent,
+				axisType, values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType
+	 *         {@link String}
+	 */
+	private static MeasuredValuesDTO getStringValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		String[] values = new String[length];
+		boolean[] flags = new boolean[length];
+
+		ValueIterator<String> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType
+	 *         {@link LocalDateTime}
+	 */
+	private static MeasuredValuesDTO getDateValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		LocalDateTime[] values = new LocalDateTime[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<LocalDateTime> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType boolean
+	 */
+	private static MeasuredValuesDTO getBooleanValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		boolean[] values = new boolean[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<Boolean> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType byte
+	 */
+	private static MeasuredValuesDTO getByteValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		byte[] values = new byte[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<Byte> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType short
+	 */
+	private static MeasuredValuesDTO getShortValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		short[] values = new short[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<Short> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType long
+	 */
+	private static MeasuredValuesDTO getLongValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		long[] values = new long[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<Long> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType float
+	 */
+	private static MeasuredValuesDTO getFloatValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		float[] values = new float[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<Float> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType int
+	 */
+	private static MeasuredValuesDTO getIntegerValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		int[] values = new int[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<Integer> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType double
+	 */
+	private static MeasuredValuesDTO getDoubleValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		double[] values = new double[length];
+		boolean[] flags = new boolean[length];
+		ValueIterator<Double> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType byte[]
+	 */
+	private static MeasuredValuesDTO getByteStreamValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		byte[][] values = new byte[length][];
+		boolean[] flags = new boolean[length];
+		ValueIterator<byte[]> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType
+	 *         {@link FloatComplex}
+	 */
+	private static MeasuredValuesDTO getFloatComplexValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		boolean[] flags = new boolean[length];
+		FloatComplex[] values = new FloatComplex[length];
+
+		ValueIterator<FloatComplex> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType
+	 *         {@link DoubleComplex}
+	 */
+	private static MeasuredValuesDTO getDoubleComplexValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		boolean[] flags = new boolean[length];
+		DoubleComplex[] values = new DoubleComplex[length];
+
+		ValueIterator<DoubleComplex> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	/**
+	 * 
+	 * @param measuredValues
+	 * @return {@link MeasuredValuesDTO} values is an array of DataType
+	 *         {@link FileLink}
+	 */
+	private static MeasuredValuesDTO getFileLinkValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		boolean[] flags = new boolean[length];
+		FileLink[] values = new FileLink[length];
+
+		ValueIterator<FileLink> iter = measuredValues.iterator();
+		int count = 0;
+		while (iter.hasNext()) {
+			flags[count] = iter.isValid();
+			values[count++] = iter.next();
+		}
+
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+	private static MeasuredValuesDTO getBlobValues(MeasuredValues measuredValues) {
+		int length = measuredValues.getLength();
+		boolean[] flags = new boolean[length];
+		ValueIterator<Object> iter = measuredValues.iterator();
+		Object values = null;
+		while (iter.hasNext()) {
+			values = iter.next();
+		}
+
+		return new MeasuredValuesDTO(values, flags);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TemplateManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TemplateManager.java
new file mode 100644
index 0000000..913167b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TemplateManager.java
@@ -0,0 +1,47 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+
+/**
+ * Resolves the test template and test step template name, which will be used for creating the test an test step
+ *
+ */
+public interface TemplateManager {
+
+	/**
+	 * 
+	 * @param testSrc the source test
+	 * @return the name of the template for the test
+	 * @throws ApiCopyException
+	 */
+	String getTemplateTestName(Test testSrc) throws ApiCopyException;
+
+	/**
+	 * 
+	 * @param testStepSrc the source test step
+	 * @return the name of the template of the teststep
+	 * @throws ApiCopyException
+	 */
+	String getTemplateTestStepName(TestStep testStepSrc) throws ApiCopyException;
+
+	/**
+	 * 
+	 * @param source the {@link ApplicationContext} of the apicopy source
+	 */
+	void setSourceContext(ApplicationContext source) throws ApiCopyException;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TransferBase.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TransferBase.java
new file mode 100644
index 0000000..d4f0b1e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TransferBase.java
@@ -0,0 +1,545 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.control;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.file.FileService;
+import org.eclipse.mdm.api.base.massdata.AnyTypeValuesBuilder;
+import org.eclipse.mdm.api.base.massdata.ComplexNumericalValuesBuilder;
+import org.eclipse.mdm.api.base.massdata.NumericalValuesBuilder;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.massdata.WriteRequestBuilder;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.DoubleComplex;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.FloatComplex;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.MeasuredValues.ValueIterator;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.ScalarType;
+import org.eclipse.mdm.api.base.model.SequenceRepresentation;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+
+public abstract class TransferBase {
+	List<Class<? extends Entity>> supportedRootEntities = Arrays.asList(Project.class, Pool.class, Test.class,
+			TestStep.class, Measurement.class);
+
+	ApplicationContext contextSrc;
+	EntityManager entityManagerSrc;
+
+	ApplicationContext contextDst;
+	EntityManager entityManagerDst;
+	EntityFactory entityFactoryDst;
+	ModelManager modelManagerDst;
+	FileService fileServiceDst;
+	FileService fileServiceSrc;
+
+	Map<EntityHolder, EntityHolder> mapSrcDstEntities = new HashMap<>();
+	Map<Entity, List<FileLink>> mapFileLinksReplaced = new HashMap<>();
+	Map<Entity, List<FileLink>> mapFileLinksUploaded = new HashMap<>();
+
+	public TransferBase(ApplicationContext src, ApplicationContext dst) {
+		contextSrc = src;
+		entityManagerSrc = contextSrc.getEntityManager()
+				.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+
+		contextDst = dst;
+		entityManagerDst = contextDst.getEntityManager()
+				.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+		entityFactoryDst = contextDst.getEntityFactory()
+				.orElseThrow(() -> new ServiceNotProvidedException(EntityFactory.class));
+		modelManagerDst = contextDst.getModelManager()
+				.orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+
+		if (contextDst.getFileService().isPresent()) {
+			fileServiceDst = contextDst.getFileService().get();
+		}
+
+		if (contextSrc.getFileService().isPresent()) {
+			fileServiceSrc = contextSrc.getFileService().get();
+		}
+
+	}
+
+	ListMultimap<Class<? extends Entity>, Entity> loadParents(List<? extends Entity> entities) {
+		List<Entity> list = entities.stream().filter(e -> !isSupported(e)).collect(Collectors.toList());
+		if (!list.isEmpty()) {
+			throw new ApiCopyException("Entity " + list + " not supported!");
+		}
+		LinkedListMultimap<Class<? extends Entity>, Entity> byType = LinkedListMultimap.create();
+		entities.forEach(e -> byType.put(e.getClass(), e));
+
+		byType.get(Measurement.class)
+				.forEach(e -> byType.put(TestStep.class, entityManagerSrc.loadParent(e, TestStep.class).get()));
+		byType.get(TestStep.class)
+				.forEach(e -> byType.put(Test.class, entityManagerSrc.loadParent(e, Test.class).get()));
+		byType.get(Test.class).forEach(e -> byType.put(Pool.class, entityManagerSrc.loadParent(e, Pool.class).get()));
+		byType.get(Pool.class)
+				.forEach(e -> byType.put(Project.class, entityManagerSrc.loadParent(e, Project.class).get()));
+
+		entities.forEach(e -> byType.remove(e.getClass(), e));
+		return byType;
+	}
+
+	boolean isSupported(Entity e) {
+		return supportedRootEntities.contains(e.getClass());
+	}
+
+	<T extends Entity> Optional<T> fetchOne(SearchService searchService, Class<T> entityClass, Filter filter) {
+		List<T> results = searchService.fetch(entityClass, filter);
+
+		if (results.isEmpty()) {
+			return Optional.empty();
+		} else if (results.size() == 1) {
+			return Optional.of(results.get(0));
+		} else {
+			throw new IllegalStateException(String.format("Expected at most one instance of %s, but found %s!",
+					entityClass.getName(), results.size()));
+		}
+	}
+
+	<T extends Entity> Optional<T> fetchOne(EntityManager entityManager, Class<T> entityClass, String name) {
+		List<T> results = entityManager.loadAll(entityClass).stream().filter(entity -> entity.getName().equals(name))
+				.collect(Collectors.toList());
+
+		if (results.isEmpty()) {
+			return Optional.empty();
+		} else if (results.size() == 1) {
+			return Optional.of(results.get(0));
+		} else {
+			throw new IllegalStateException(String.format("Expected at most one instance of %s, but found %s!",
+					entityClass.getName(), results.size()));
+		}
+	}
+
+	boolean isNewEntity(Entity entity) {
+		return (Strings.isNullOrEmpty(entity.getID()) || Long.valueOf(entity.getID()) <= 0);
+	}
+
+	void persist(Transaction transaction, Entity entity) {
+		if (isNewEntity(entity)) {
+			transaction.create(Lists.newArrayList(entity));
+		} else {
+			transaction.update(Lists.newArrayList(entity));
+		}
+	}
+
+	void persist(Transaction transaction, List<? extends Entity> entities) {
+		List<Entity> newEntities = new ArrayList<>();
+		List<Entity> updateEntities = new ArrayList<>();
+		for (Entity entity : entities) {
+			if (isNewEntity(entity)) {
+				newEntities.add(entity);
+			} else {
+				updateEntities.add(entity);
+			}
+		}
+		transaction.create(newEntities);
+		transaction.update(updateEntities);
+	}
+
+	void copyValues(Entity srcEntity, Entity dstEntity, List<String> ignoredAttributes, boolean replaceFileLinks) {
+		copyValues(srcEntity, dstEntity, ignoredAttributes, false, replaceFileLinks);
+	}
+
+	void copyValues(Entity srcEntity, Entity dstEntity, List<String> ignoredAttributes, boolean onlyValid,
+			boolean replaceFileLinks) {
+		Set<String> valueNamesDst = dstEntity.getValues().keySet();
+		for (Map.Entry<String, Value> me : srcEntity.getValues().entrySet()) {
+			String key = me.getKey();
+			if (!ignoredAttributes.contains(key) && valueNamesDst.contains(key)) {
+				Value valueSrc = me.getValue();
+
+				if (onlyValid && !valueSrc.isValid()) {
+					continue;
+				}
+				Value value = dstEntity.getValue(me.getKey());
+
+				if (isFileLinkDataType(valueSrc.getValueType())) {
+					collectReplacedFileLinks(dstEntity, value, replaceFileLinks);
+
+					uploadFiles(srcEntity, dstEntity, valueSrc);
+
+					if (ValueType.FILE_LINK_SEQUENCE.equals(valueSrc.getValueType()) && !replaceFileLinks) {
+						FileLink[] existingFileLinks = value.extract(ValueType.FILE_LINK_SEQUENCE);
+						FileLink[] newFileLinks = valueSrc.extract(ValueType.FILE_LINK_SEQUENCE);
+						valueSrc.set(ArrayUtils.addAll(existingFileLinks, newFileLinks));
+					}
+
+				}
+
+				try {
+					value.set(valueSrc.extract());
+				} catch (IllegalArgumentException e) {
+					throw new ApiCopyException(
+							"Cannot set value for " + dstEntity.getName() + "." + me.getKey() + ": " + e.getMessage(),
+							e);
+				}
+				value.setValid(valueSrc.isValid());
+			}
+		}
+
+	}
+
+	private void collectReplacedFileLinks(Entity dstEntity, Value value, boolean replaceFileLinks) {
+		if (ValueType.FILE_LINK.equals(value.getValueType()) && value.isValid()) {
+			FileLink fileToDelete = value.extract();
+			mapFileLinksReplaced.put(dstEntity, Collections.singletonList(fileToDelete));
+		} else if (ValueType.FILE_LINK_SEQUENCE.equals(value.getValueType()) && replaceFileLinks) {
+			FileLink[] fileLinksToDelete = value.extract();
+			mapFileLinksReplaced.put(dstEntity, Arrays.asList(fileLinksToDelete));
+		}
+	}
+
+	/**
+	 * 
+	 * @param valueType
+	 * @return
+	 */
+	private boolean isFileLinkDataType(ValueType<?> valueType) {
+		boolean isFileDataType = false;
+
+		if (ValueType.FILE_LINK_SEQUENCE.equals(valueType) || ValueType.FILE_LINK.equals(valueType)) {
+			isFileDataType = true;
+		}
+		return isFileDataType;
+	}
+
+	/**
+	 * Uploading file of srcEntity and set the filelink to the dstEntity. Collect
+	 * additionally the uploaded FileLinks in a map
+	 * 
+	 * @param srcEntity
+	 * @param dstEntity
+	 * @param valueSrc
+	 */
+	private void uploadFiles(Entity srcEntity, Entity dstEntity, Value valueSrc) {
+		try {
+			if (fileServiceSrc != null && fileServiceDst != null) {
+
+				if (ValueType.FILE_LINK_SEQUENCE.equals(valueSrc.getValueType())) {
+
+					List<FileLink> fileLinkList = downloadSourceFiles(srcEntity,
+							Arrays.asList(valueSrc.extract(ValueType.FILE_LINK_SEQUENCE)));
+					fileServiceDst.uploadSequential(dstEntity, fileLinkList, null);
+					valueSrc.set(fileLinkList.toArray(new FileLink[fileLinkList.size()]));
+					mapFileLinksUploaded.put(dstEntity, fileLinkList);
+				} else if (ValueType.FILE_LINK.equals(valueSrc.getValueType())) {
+					FileLink fileLink = downloadSourceFile(srcEntity, valueSrc.extract(ValueType.FILE_LINK));
+					fileServiceDst.uploadSequential(dstEntity, Collections.singletonList(fileLink), null);
+					valueSrc.set(fileLink);
+					mapFileLinksUploaded.put(dstEntity, Collections.singletonList(fileLink));
+				}
+			}
+
+		} catch (IOException e) {
+			throw new ApiCopyException(e.getLocalizedMessage(), e);
+		}
+
+	}
+
+	private List<FileLink> downloadSourceFiles(Entity srcEntity, List<FileLink> fileLinkList) throws IOException {
+		List<FileLink> returnList = new ArrayList<FileLink>();
+
+		for (FileLink fileLink : fileLinkList) {
+			returnList.add(downloadSourceFile(srcEntity, fileLink));
+		}
+
+		return returnList;
+	}
+
+	private FileLink downloadSourceFile(Entity srcEntity, FileLink fileLinkSrc) throws IOException {
+		Path targetPath = Files.createTempDir().toPath();
+		Path filePathAbsolute = targetPath.resolve(fileLinkSrc.getFileName());
+		fileServiceSrc.download(srcEntity, targetPath, fileLinkSrc);
+		return FileLink.newLocal(filePathAbsolute);
+	}
+
+	WriteRequest createWriteRequest(ChannelGroup channelGroupDst, Channel channelDst, MeasuredValues measuredValues) {
+		WriteRequestBuilder wrb = WriteRequest.create(channelGroupDst, channelDst, measuredValues.getAxisType());
+		NumericalValuesBuilder builder = null;
+		SequenceRepresentation seqRep = measuredValues.getSequenceRepresentation();
+		ScalarType scalarType = measuredValues.getScalarType();
+		boolean independent = measuredValues.isIndependent();
+		double[] generationParameters = measuredValues.getGenerationParameters();
+
+		if (SequenceRepresentation.EXPLICIT.equals(seqRep) || SequenceRepresentation.EXPLICIT_EXTERNAL.equals(seqRep)) {
+			builder = wrb.explicit();
+		} else if (SequenceRepresentation.IMPLICIT_CONSTANT.equals(seqRep)) {
+			checkGenerationParameters(generationParameters, 1);
+
+			return wrb.implicitConstant(scalarType, generationParameters[0]).build();
+		} else if (SequenceRepresentation.IMPLICIT_LINEAR.equals(seqRep)) {
+			checkGenerationParameters(generationParameters, 2);
+
+			return wrb.implicitLinear(scalarType, generationParameters[0], generationParameters[1])
+					.independent(independent).build();
+		} else if (SequenceRepresentation.IMPLICIT_SAW.equals(seqRep)) {
+			checkGenerationParameters(generationParameters, 3);
+
+			return wrb
+					.implicitSaw(scalarType, generationParameters[0], generationParameters[1], generationParameters[2])
+					.build();
+		} else if (SequenceRepresentation.RAW_LINEAR.equals(seqRep)
+				|| SequenceRepresentation.RAW_LINEAR_EXTERNAL.equals(seqRep)) {
+			checkGenerationParameters(generationParameters, 2);
+
+			builder = wrb.rawLinear(generationParameters[0], generationParameters[1]);
+		} else if (SequenceRepresentation.RAW_LINEAR_CALIBRATED.equals(seqRep)
+				|| SequenceRepresentation.RAW_LINEAR_CALIBRATED_EXTERNAL.equals(seqRep)) {
+			checkGenerationParameters(generationParameters, 3);
+
+			builder = wrb.rawLinearCalibrated(generationParameters[0], generationParameters[1],
+					generationParameters[2]);
+		} else if (SequenceRepresentation.RAW_POLYNOMIAL.equals(seqRep)
+				|| SequenceRepresentation.RAW_POLYNOMIAL_EXTERNAL.equals(seqRep)) {
+			builder = wrb.rawPolynomial(generationParameters);
+		}
+
+		if (scalarType.isString()) {
+			String[] values = new String[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<String> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return castBuilder(builder, AnyTypeValuesBuilder.class).stringValues(values, flags).build();
+		} else if (scalarType.isDate()) {
+			LocalDateTime[] values = new LocalDateTime[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<LocalDateTime> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return castBuilder(builder, AnyTypeValuesBuilder.class).dateValues(values, flags).independent(independent)
+					.build();
+		} else if (scalarType.isBoolean()) {
+			boolean[] values = new boolean[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<Boolean> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return castBuilder(builder, AnyTypeValuesBuilder.class).booleanValues(values, flags).build();
+		} else if (scalarType.isByte()) {
+			byte[] values = new byte[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<Byte> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return builder.byteValues(values, flags).independent(independent).build();
+		} else if (scalarType.isShort()) {
+			short[] values = new short[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<Short> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return builder.shortValues(values, flags).independent(independent).build();
+		} else if (scalarType.isInteger()) {
+			int[] values = new int[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<Integer> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return builder.integerValues(values, flags).independent(independent).build();
+		} else if (scalarType.isLong()) {
+			long[] values = new long[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<Long> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return builder.longValues(values, flags).independent(independent).build();
+		} else if (scalarType.isFloat()) {
+			float[] values = new float[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<Float> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return builder.floatValues(values, flags).independent(independent).build();
+		} else if (scalarType.isDouble()) {
+			double[] values = new double[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<Double> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return builder.doubleValues(values, flags).independent(independent).build();
+		} else if (scalarType.isByteStream()) {
+			byte[][] values = new byte[measuredValues.getLength()][];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<byte[]> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return castBuilder(builder, AnyTypeValuesBuilder.class).byteStreamValues(values, flags).build();
+		} else if (scalarType.isFloatComplex()) {
+			FloatComplex[] values = new FloatComplex[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<FloatComplex> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return castBuilder(builder, ComplexNumericalValuesBuilder.class).floatComplexValues(values, flags).build();
+		} else if (scalarType.isDoubleComplex()) {
+			DoubleComplex[] values = new DoubleComplex[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<DoubleComplex> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return castBuilder(builder, ComplexNumericalValuesBuilder.class).doubleComplexValues(values, flags).build();
+		} else if (scalarType.isFileLink()) {
+			FileLink[] values = new FileLink[measuredValues.getLength()];
+			boolean[] flags = new boolean[values.length];
+			ValueIterator<FileLink> iter = measuredValues.iterator();
+			int count = 0;
+			while (iter.hasNext()) {
+				flags[count] = iter.isValid();
+				values[count++] = iter.next();
+			}
+
+			return castBuilder(builder, AnyTypeValuesBuilder.class).fileLinkValues(values, flags).build();
+		} else if (scalarType.isBlob()) {
+			Object value = null;
+			ValueIterator<Object> iter = measuredValues.iterator();
+			while (iter.hasNext()) {
+				value = iter.next();
+			}
+
+			return castBuilder(builder, AnyTypeValuesBuilder.class).blobValue(value).build();
+		} else {
+			throw new IllegalStateException(
+					String.format("Unsupported ScalarType %s in MeasuredValues!", scalarType.name()));
+		}
+	}
+
+	void checkGenerationParameters(double[] generationParameters, int expectedLength) {
+		if (null == generationParameters || generationParameters.length < expectedLength) {
+			throw new IllegalStateException(String.format("Number of generation parameters is %d, expected %d!",
+					(null == generationParameters ? 0 : generationParameters.length), expectedLength));
+		}
+	}
+
+	<T extends NumericalValuesBuilder> T castBuilder(NumericalValuesBuilder builder, Class<T> cls) {
+		if (!cls.isInstance(builder)) {
+			throw new IllegalStateException(String.format(
+					"Error creating the write values builder, expected class is %s, actual class is %s (likely column data type and sequence representation mismatch)!",
+					cls.getName(), (null == builder ? "???" : builder.getClass().getName())));
+		}
+
+		return cls.cast(builder);
+	}
+
+	/**
+	 * Delete all replaced file links
+	 */
+	void deleteFilesOfReplacedFileLinks() {
+		mapFileLinksReplaced.forEach((entity, fileLinkList) -> {
+			fileServiceDst.delete(entity, fileLinkList);
+		});
+	}
+
+	void clearReplacedFileLinkCache() {
+		mapFileLinksReplaced.clear();
+	}
+
+	/**
+	 * Delete all uploaded files, is necessary if the Import will be canceled
+	 */
+	void deleteFilesOfUploadedFileLinks() {
+		mapFileLinksUploaded.forEach((entity, fileLinkList) -> {
+			fileServiceDst.delete(entity, fileLinkList);
+		});
+	}
+
+	void clearUploadedFileLinkCache() {
+		mapFileLinksUploaded.clear();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/ApiCopyExceptionMapper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/ApiCopyExceptionMapper.java
new file mode 100644
index 0000000..27b7280
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/ApiCopyExceptionMapper.java
@@ -0,0 +1,44 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.entity;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.ext.Provider;
+
+import org.eclipse.mdm.apicopy.control.ApiCopyException;
+import org.eclipse.mdm.apicopy.entity.CopyStatusResponse.State;
+
+import com.google.common.base.Throwables;
+
+/**
+ * Maps {@link ApiCopyException} to a HTTP BAD Request and provides
+ * {@link CopyStatusResponse} in the payload.
+ */
+@Provider
+public class ApiCopyExceptionMapper implements javax.ws.rs.ext.ExceptionMapper<ApiCopyException> {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Response toResponse(ApiCopyException e) {
+		CopyStatusResponse status = new CopyStatusResponse();
+		status.setState(State.FAILED);
+		status.setMessage(e.getMessage());
+		status.setStacktrace(Throwables.getStackTraceAsString(e));
+		return Response.status(Status.BAD_REQUEST).entity(status).build();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/CopyStatusResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/CopyStatusResponse.java
new file mode 100644
index 0000000..1dfdc39
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/CopyStatusResponse.java
@@ -0,0 +1,80 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.entity;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * DTO for encapsulating the result of an api copy request.
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class CopyStatusResponse {
+
+	public enum State {
+		OK, FAILED,
+	}
+
+	private State state;
+	private String message;
+	private String stacktrace;
+
+	public CopyStatusResponse() {
+	}
+
+	/**
+	 * @param state
+	 */
+	public void setState(State state) {
+		this.state = state;
+	}
+
+	/**
+	 * @param message
+	 */
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	/**
+	 * @param stacktrace
+	 */
+	public void setStacktrace(String stacktrace) {
+		this.stacktrace = stacktrace;
+	}
+
+	/**
+	 * @return the state
+	 */
+	public State getState() {
+		return state;
+	}
+
+	/**
+	 * @return
+	 */
+	public String getMessage() {
+		return message;
+	}
+
+	/**
+	 * @return
+	 */
+	public String getStacktrace() {
+		return stacktrace;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/DiscoverableMultiPartFeature.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/DiscoverableMultiPartFeature.java
new file mode 100644
index 0000000..161965b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/entity/DiscoverableMultiPartFeature.java
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.entity;
+
+import javax.ws.rs.core.Feature;
+import javax.ws.rs.core.FeatureContext;
+import javax.ws.rs.ext.Provider;
+
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+
+/**
+ * Enable MultiPart feature.
+ *
+ */
+@Provider
+public class DiscoverableMultiPartFeature implements Feature {
+	@Override
+	public boolean configure(FeatureContext context) {
+		context.register(MultiPartFeature.class);
+		return true;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/resources/emptyAtfx.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/resources/emptyAtfx.xml
new file mode 100644
index 0000000..77ac5b5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/resources/emptyAtfx.xml
@@ -0,0 +1,4380 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<atfx_file version="atfx_file: V1.1.0"
+	xmlns="http://www.asam.net/ODS/5.2/Schema"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.asam.net/ODS/5.2/Schema http://www.asam.net/ODS/5.2/Schema.xsd">
+	<!-- *************************************************************************************************************** 
+		* Based on ODS Base Model version * *************************************************************************************************************** -->
+	<base_model_version>asam30</base_model_version>
+	<!-- *************************************************************************************************************** 
+		* declare application model meta data * *************************************************************************************************************** -->
+
+	<application_model>
+		<!-- *************************************************************************************************************** 
+			* declare enumeration definitions * *************************************************************************************************************** -->
+		<application_enumeration>
+			<name>valid_enum</name>
+			<item>
+				<name>editing</name>
+				<value>0</value>
+			</item>
+			<item>
+				<name>valid</name>
+				<value>1</value>
+			</item>
+			<item>
+				<name>archive</name>
+				<value>2</value>
+			</item>
+		</application_enumeration>
+		<application_enumeration>
+			<name>axistype</name>
+			<item>
+				<name>Xaxis</name>
+				<value>0</value>
+			</item>
+			<item>
+				<name>Yaxis</name>
+				<value>1</value>
+			</item>
+			<item>
+				<name>Both</name>
+				<value>2</value>
+			</item>
+		</application_enumeration>
+
+		<application_element>
+			<name>Environment</name>
+			<basetype>AoEnvironment</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Max_test_level</name>
+				<base_attribute>max_test_level</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Base_model_version</name>
+				<base_attribute>base_model_version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>AppModelType</name>
+				<base_attribute>application_model_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>AppModelVersion</name>
+				<base_attribute>application_model_version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Timezone</name>
+				<base_attribute>timezone</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MeaningOfAliases</name>
+				<base_attribute>meaning_of_aliases</base_attribute>
+				<datatype>DS_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+		</application_element>
+		<application_element>
+			<name>CatSensor</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatTestEquipmentComp</name>
+				<ref_to>CatTestEquipmentComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>CatSensor</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatSensorAttr</name>
+				<ref_to>CatSensorAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatSensor</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplSensor</name>
+				<ref_to>TplSensor</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatSensor</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>CatSensorAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueListRef</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueCopyable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestClassname</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestParameter</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatSensor</name>
+				<ref_to>CatSensor</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>CatSensorAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplSensorAttr</name>
+				<ref_to>TplSensorAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatSensorAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>CatTestEquipmentComp</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatTestEquipmentAttr</name>
+				<ref_to>CatTestEquipmentAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatTestEquipmentComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentComp</name>
+				<ref_to>TplTestEquipmentComp</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatTestEquipmentComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatSensor</name>
+				<ref_to>CatSensor</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatTestEquipmentComp</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>CatTestEquipmentAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueListRef</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueCopyable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestClassname</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestParameter</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatTestEquipmentComp</name>
+				<ref_to>CatTestEquipmentComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>CatTestEquipmentAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentAttr</name>
+				<ref_to>TplTestEquipmentAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatTestEquipmentAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>CatTestSequenceComp</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatTestSequenceAttr</name>
+				<ref_to>CatTestSequenceAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatTestSequenceComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceComp</name>
+				<ref_to>TplTestSequenceComp</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatTestSequenceComp</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>CatTestSequenceAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueListRef</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueCopyable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestClassname</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestParameter</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatTestSequenceComp</name>
+				<ref_to>CatTestSequenceComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>CatTestSequenceAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceAttr</name>
+				<ref_to>TplTestSequenceAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatTestSequenceAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>CatUnitUnderTestComp</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatUnitUnderTestAttr</name>
+				<ref_to>CatUnitUnderTestAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatUnitUnderTestComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestComp</name>
+				<ref_to>TplUnitUnderTestComp</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatUnitUnderTestComp</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>CatUnitUnderTestAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueListRef</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueCopyable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestClassname</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ActionRequestParameter</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>CatUnitUnderTestComp</name>
+				<ref_to>CatUnitUnderTestComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>CatUnitUnderTestAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestAttr</name>
+				<ref_to>TplUnitUnderTestAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>CatUnitUnderTestAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplGroup</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplGroupParent</name>
+				<ref_to>TplGroup</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplGroupChild</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplGroupChild</name>
+				<ref_to>TplGroup</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplGroupParent</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestRoot</name>
+				<ref_to>TplUnitUnderTestRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplGroup</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceRoot</name>
+				<ref_to>TplTestSequenceRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplGroup</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentRoot</name>
+				<ref_to>TplTestEquipmentRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplGroup</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStep</name>
+				<ref_to>TplTestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplGroup</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTest</name>
+				<ref_to>TplTest</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplGroup</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplMeaResult</name>
+				<ref_to>TplMeaResult</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplGroup</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplMeaResult</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultMimeType</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultName</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplSubMatrix</name>
+				<ref_to>TplSubMatrix</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplMeaResult</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplGroup</name>
+				<ref_to>TplGroup</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplMeaResult</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplParameterSet</name>
+				<ref_to>TplParameterSet</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplMeaResult</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaResult</name>
+				<ref_to>MeaResult</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplMeaResult</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStep</name>
+				<ref_to>TplTestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplMeaResult</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplSensor</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Optional</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultActive</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentComp</name>
+				<ref_to>TplTestEquipmentComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplSensor</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatSensor</name>
+				<ref_to>CatSensor</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplSensor</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>Quantity</name>
+				<ref_to>Quantity</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplSensor</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplSensorAttr</name>
+				<ref_to>TplSensorAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplSensor</inverse_name>
+			</relation_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MeaQuantityValuesEditable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MeaQuantityIndependent</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MeaQuantityAxisType</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>axistype</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MeaQuantityEditorPlugin</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplParameterSet</name>
+				<ref_to>TplParameterSet</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplSensor</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplSensorAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultValue</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueReadonly</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Obligatory</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplSensor</name>
+				<ref_to>TplSensor</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplSensorAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatSensorAttr</name>
+				<ref_to>CatSensorAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplSensorAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplSubMatrix</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MinNoRows</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MaxNoRows</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplMeaResult</name>
+				<ref_to>TplMeaResult</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplSubMatrix</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>SubMatrix</name>
+				<ref_to>SubMatrix</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplSubMatrix</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTest</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>NameHelperClassname</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DataSourcePluginClassnames</name>
+				<datatype>DS_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>TestOrderActionClassnames</name>
+				<datatype>DS_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>Tests</name>
+				<ref_to>Test</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTest</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStepUsage</name>
+				<ref_to>TplTestStepUsage</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTest</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplGroup</name>
+				<ref_to>TplGroup</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTest</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestEquipmentAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultValue</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueReadonly</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Obligatory</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentComp</name>
+				<ref_to>TplTestEquipmentComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestEquipmentAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatTestEquipmentAttr</name>
+				<ref_to>CatTestEquipmentAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestEquipmentAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestEquipmentRoot</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentComp</name>
+				<ref_to>TplTestEquipmentComp</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestEquipmentRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStep</name>
+				<ref_to>TplTestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestEquipmentRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestEquipment</name>
+				<ref_to>TestEquipment</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestEquipmentRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplGroup</name>
+				<ref_to>TplGroup</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestEquipmentRoot</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestEquipmentComp</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Optional</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultActive</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>TestStepSeriesVariable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentRoot</name>
+				<ref_to>TplTestEquipmentRoot</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestEquipmentComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplCompParent</name>
+				<ref_to>TplTestEquipmentComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplCompChildren</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatTestEquipmentComp</name>
+				<ref_to>CatTestEquipmentComp</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestEquipmentComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplCompChildren</name>
+				<ref_to>TplTestEquipmentComp</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplCompParent</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentAttr</name>
+				<ref_to>TplTestEquipmentAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestEquipmentComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplSensor</name>
+				<ref_to>TplSensor</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestEquipmentComp</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestSequenceAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultValue</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueReadonly</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Obligatory</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceComp</name>
+				<ref_to>TplTestSequenceComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestSequenceAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatTestSequenceAttr</name>
+				<ref_to>CatTestSequenceAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestSequenceAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestSequenceRoot</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceComp</name>
+				<ref_to>TplTestSequenceComp</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestSequenceRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStep</name>
+				<ref_to>TplTestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestSequenceRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSequence</name>
+				<ref_to>TestSequence</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestSequenceRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplGroup</name>
+				<ref_to>TplGroup</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestSequenceRoot</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestSequenceComp</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Optional</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultActive</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>TestStepSeriesVariable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceRoot</name>
+				<ref_to>TplTestSequenceRoot</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestSequenceComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplCompParent</name>
+				<ref_to>TplTestSequenceComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplCompChildren</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatTestSequenceComp</name>
+				<ref_to>CatTestSequenceComp</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestSequenceComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplCompChildren</name>
+				<ref_to>TplTestSequenceComp</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplCompParent</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceAttr</name>
+				<ref_to>TplTestSequenceAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestSequenceComp</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestStepUsage</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultActive</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Optional</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTest</name>
+				<ref_to>TplTest</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestStepUsage</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStep</name>
+				<ref_to>TplTestStep</ref_to>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestStepUsage</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplUnitUnderTestAttr</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultValue</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueReadonly</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Obligatory</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestComp</name>
+				<ref_to>TplUnitUnderTestComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplUnitUnderTestAttr</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatUnitUnderTestAttr</name>
+				<ref_to>CatUnitUnderTestAttr</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplUnitUnderTestAttr</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplUnitUnderTestRoot</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestComp</name>
+				<ref_to>TplUnitUnderTestComp</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplUnitUnderTestRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStep</name>
+				<ref_to>TplTestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplUnitUnderTestRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>UnitUnderTest</name>
+				<ref_to>UnitUnderTest</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplUnitUnderTestRoot</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplGroup</name>
+				<ref_to>TplGroup</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplUnitUnderTestRoot</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplTestStep</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestRoot</name>
+				<ref_to>TplUnitUnderTestRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestStep</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentRoot</name>
+				<ref_to>TplTestEquipmentRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestStep</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceRoot</name>
+				<ref_to>TplTestSequenceRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestStep</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSteps</name>
+				<ref_to>TestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestStep</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStepUsage</name>
+				<ref_to>TplTestStepUsage</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestStep</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplGroup</name>
+				<ref_to>TplGroup</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplTestStep</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplMeaResult</name>
+				<ref_to>TplMeaResult</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplTestStep</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplUnitUnderTestComp</name>
+			<basetype>AoAny</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Optional</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultActive</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>TestStepSeriesVariable</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestRoot</name>
+				<ref_to>TplUnitUnderTestRoot</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplUnitUnderTestComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplCompParent</name>
+				<ref_to>TplUnitUnderTestComp</ref_to>
+				<base_relation>parent</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplCompChildren</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>CatUnitUnderTestComp</name>
+				<ref_to>CatUnitUnderTestComp</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplUnitUnderTestComp</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplCompChildren</name>
+				<ref_to>TplUnitUnderTestComp</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplCompParent</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestAttr</name>
+				<ref_to>TplUnitUnderTestAttr</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplUnitUnderTestComp</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>PhysDimension</name>
+			<basetype>AoPhysicalDimension</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Length</name>
+				<base_attribute>length_exp</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Mass</name>
+				<base_attribute>mass_exp</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Time</name>
+				<base_attribute>time_exp</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Current</name>
+				<base_attribute>current_exp</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Temperature</name>
+				<base_attribute>temperature_exp</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MolarAmount</name>
+				<base_attribute>molar_amount_exp</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>LuminousIntensity</name>
+				<base_attribute>luminous_intensity_exp</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>angle</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>Units</name>
+				<ref_to>Unit</ref_to>
+				<base_relation>units</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>PhysDimension</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>Project</name>
+			<basetype>AoTest</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>StructureLevel</name>
+				<ref_to>StructureLevel</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Project</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>ResultParameterSet</name>
+			<basetype>AoParameterSet</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>MeaResult</name>
+				<ref_to>MeaResult</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>ResultParameterSet</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaQuantity</name>
+				<ref_to>MeaQuantity</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>ResultParameterSet</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>ResultParameter</name>
+				<ref_to>ResultParameter</ref_to>
+				<base_relation>parameters</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>ResultParameterSet</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>Role</name>
+			<basetype>AoUserGroup</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>SuperuserFlag</name>
+				<base_attribute>superuser_flag</base_attribute>
+				<datatype>DT_SHORT</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>groups2users</name>
+				<ref_to>User</ref_to>
+				<base_relation>users</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>users2groups</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TestEquipment</name>
+			<basetype>AoTestEquipment</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestEquipmentRoot</name>
+				<ref_to>TplTestEquipmentRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TestEquipment</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSteps</name>
+				<ref_to>TestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TestEquipment</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaResults</name>
+				<ref_to>MeaResult</ref_to>
+				<base_relation>measurement</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TestEquipment</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TestSequence</name>
+			<basetype>AoTestSequence</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplTestSequenceRoot</name>
+				<ref_to>TplTestSequenceRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TestSequence</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSteps</name>
+				<ref_to>TestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TestSequence</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaResults</name>
+				<ref_to>MeaResult</ref_to>
+				<base_relation>measurement</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TestSequence</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplParameterSet</name>
+			<basetype>AoParameterSet</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplMeaResult</name>
+				<ref_to>TplMeaResult</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplParameterSet</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplParameter</name>
+				<ref_to>TplParameter</ref_to>
+				<base_relation>parameters</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TplParameterSet</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplSensor</name>
+				<ref_to>TplSensor</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplParameterSet</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>Unit</name>
+			<basetype>AoUnit</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Factor</name>
+				<base_attribute>factor</base_attribute>
+				<datatype>DT_DOUBLE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Offset</name>
+				<base_attribute>offset</base_attribute>
+				<datatype>DT_DOUBLE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>dB</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>dB_reference_factor</name>
+				<datatype>DT_FLOAT</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>PhysDimension</name>
+				<ref_to>PhysDimension</ref_to>
+				<base_relation>phys_dimension</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>Units</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>Quantities</name>
+				<ref_to>Quantity</ref_to>
+				<base_relation>quantities</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Unit</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaQuantities</name>
+				<ref_to>MeaQuantity</ref_to>
+				<base_relation>measurement_quantities</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Unit</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>ResultParameter</name>
+				<ref_to>ResultParameter</ref_to>
+				<base_relation>parameters</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Unit</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplParameter</name>
+				<ref_to>TplParameter</ref_to>
+				<base_relation>parameters</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Unit</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>Quantity</name>
+			<basetype>AoQuantity</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultRank</name>
+				<base_attribute>default_rank</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefDimension</name>
+				<base_attribute>default_dimension</base_attribute>
+				<datatype>DS_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefTypeSize</name>
+				<base_attribute>default_type_size</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefMQName</name>
+				<base_attribute>default_mq_name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefDataType</name>
+				<base_attribute>default_datatype</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>datatype_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValidFlag</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>valid_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>Unit</name>
+				<ref_to>Unit</ref_to>
+				<base_relation>default_unit</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>Quantities</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaQuantities</name>
+				<ref_to>MeaQuantity</ref_to>
+				<base_relation>measurement_quantities</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Quantity</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplSensor</name>
+				<ref_to>TplSensor</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Quantity</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>UnitUnderTest</name>
+			<basetype>AoUnitUnderTest</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Version</name>
+				<base_attribute>version</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>20</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplUnitUnderTestRoot</name>
+				<ref_to>TplUnitUnderTestRoot</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>UnitUnderTest</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSteps</name>
+				<ref_to>TestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>UnitUnderTest</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaResults</name>
+				<ref_to>MeaResult</ref_to>
+				<base_relation>measurement</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>UnitUnderTest</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>User</name>
+			<basetype>AoUser</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Password</name>
+				<base_attribute>password</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>GivenName</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Surname</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Department</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Telephone</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>E-Mail</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>Tests</name>
+				<ref_to>Test</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>ResponsiblePerson</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>users2groups</name>
+				<ref_to>Role</ref_to>
+				<base_relation>groups</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>groups2users</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>ResultParameter</name>
+			<basetype>AoParameter</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DataType</name>
+				<base_attribute>parameter_datatype</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>datatype_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Value</name>
+				<base_attribute>pvalue</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>ResultParameterSet</name>
+				<ref_to>ResultParameterSet</ref_to>
+				<base_relation>parameter_set</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>ResultParameter</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>SubMatrix</name>
+				<ref_to>SubMatrix</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>ResultParameter</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>Unit</name>
+				<ref_to>Unit</ref_to>
+				<base_relation>unit</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>ResultParameter</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>StructureLevel</name>
+			<basetype>AoSubTest</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>Project</name>
+				<ref_to>Project</ref_to>
+				<base_relation>parent_test</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>StructureLevel</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>Tests</name>
+				<ref_to>Test</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>StructureLevel</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TplParameter</name>
+			<basetype>AoParameter</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>50</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultDataType</name>
+				<base_attribute>parameter_datatype</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>datatype_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DefaultValue</name>
+				<base_attribute>pvalue</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>254</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TplParameterSet</name>
+				<ref_to>TplParameterSet</ref_to>
+				<base_relation>parameter_set</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplParameter</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>Unit</name>
+				<ref_to>Unit</ref_to>
+				<base_relation>unit</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TplParameter</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>Test</name>
+			<basetype>AoSubTest</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateClosed</name>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MDMLinks</name>
+				<base_attribute>external_references</base_attribute>
+				<datatype>DS_EXTERNALREFERENCE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>254</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>StructureLevel</name>
+				<ref_to>StructureLevel</ref_to>
+				<base_relation>parent_test</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>Tests</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>ResponsiblePerson</name>
+				<ref_to>User</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>Tests</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTest</name>
+				<ref_to>TplTest</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>Tests</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSteps</name>
+				<ref_to>TestStep</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>Test</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>TestStep</name>
+			<basetype>AoSubTest</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Optional</name>
+				<datatype>DT_BOOLEAN</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Sortindex</name>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MDMLinks</name>
+				<base_attribute>external_references</base_attribute>
+				<datatype>DS_EXTERNALREFERENCE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>254</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>Test</name>
+				<ref_to>Test</ref_to>
+				<base_relation>parent_test</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TestSteps</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplTestStep</name>
+				<ref_to>TplTestStep</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TestSteps</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestEquipment</name>
+				<ref_to>TestEquipment</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TestSteps</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>UnitUnderTest</name>
+				<ref_to>UnitUnderTest</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TestSteps</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSequence</name>
+				<ref_to>TestSequence</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>TestSteps</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaResults</name>
+				<ref_to>MeaResult</ref_to>
+				<base_relation>children</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>TestStep</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>MeaResult</name>
+			<basetype>AoMeasurement</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>100</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DateCreated</name>
+				<base_attribute>version_date</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MeasurementBegin</name>
+				<base_attribute>measurement_begin</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MeasurementEnd</name>
+				<base_attribute>measurement_end</base_attribute>
+				<datatype>DT_DATE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>30</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MDMLinks</name>
+				<base_attribute>external_references</base_attribute>
+				<datatype>DS_EXTERNALREFERENCE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>254</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>TestStep</name>
+				<ref_to>TestStep</ref_to>
+				<base_relation>test</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaResults</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestEquipment</name>
+				<ref_to>TestEquipment</ref_to>
+				<base_relation>equipments</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaResults</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>UnitUnderTest</name>
+				<ref_to>UnitUnderTest</ref_to>
+				<base_relation>units_under_test</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaResults</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TestSequence</name>
+				<ref_to>TestSequence</ref_to>
+				<base_relation>sequences</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaResults</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaQuantities</name>
+				<ref_to>MeaQuantity</ref_to>
+				<base_relation>measurement_quantities</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>MeaResult</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>SubMatrices</name>
+				<ref_to>SubMatrix</ref_to>
+				<base_relation>submatrices</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>MeaResult</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>ResultParameterSet</name>
+				<ref_to>ResultParameterSet</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>MeaResult</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplMeaResult</name>
+				<ref_to>TplMeaResult</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaResult</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>MeaQuantity</name>
+			<basetype>AoMeasurementQuantity</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Description</name>
+				<base_attribute>description</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>500</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Interpolation</name>
+				<base_attribute>interpolation</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>interpolation_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>DataType</name>
+				<base_attribute>datatype</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>datatype_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Rank</name>
+				<base_attribute>rank</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Dimension</name>
+				<base_attribute>dimension</base_attribute>
+				<datatype>DS_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>TypeSize</name>
+				<base_attribute>type_size</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Minimum</name>
+				<base_attribute>minimum</base_attribute>
+				<datatype>DT_DOUBLE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Maximum</name>
+				<base_attribute>maximum</base_attribute>
+				<datatype>DT_DOUBLE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Average</name>
+				<base_attribute>average</base_attribute>
+				<datatype>DT_DOUBLE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Deviation</name>
+				<base_attribute>standard_deviation</base_attribute>
+				<datatype>DT_DOUBLE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>non_reference_channel_name</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>128</length>
+			</application_attribute>
+			<application_attribute>
+				<name>reference_channel_name</name>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>128</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>MeaResult</name>
+				<ref_to>MeaResult</ref_to>
+				<base_relation>measurement</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaQuantities</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>Quantity</name>
+				<ref_to>Quantity</ref_to>
+				<base_relation>quantity</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaQuantities</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>Unit</name>
+				<ref_to>Unit</ref_to>
+				<base_relation>unit</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>MeaQuantities</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>LocalColumns</name>
+				<ref_to>LocalColumn</ref_to>
+				<base_relation>local_columns</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>MeaQuantity</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>ResultParameterSet</name>
+				<ref_to>ResultParameterSet</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>MeaQuantity</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>SubMatrix</name>
+			<basetype>AoSubmatrix</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>SubMatrixNoRows</name>
+				<base_attribute>number_of_rows</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>MeaResult</name>
+				<ref_to>MeaResult</ref_to>
+				<base_relation>measurement</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>SubMatrices</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>x-axis-for-y-axis</name>
+				<ref_to>SubMatrix</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>y-axis-for-x-axis</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>z-axis-for-y-axis</name>
+				<ref_to>SubMatrix</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>y-axis-for-z-axis</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>y-axis-for-x-axis</name>
+				<ref_to>SubMatrix</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>x-axis-for-y-axis</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>y-axis-for-z-axis</name>
+				<ref_to>SubMatrix</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>z-axis-for-y-axis</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>ResultParameter</name>
+				<ref_to>ResultParameter</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>SubMatrix</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>LocalColumns</name>
+				<ref_to>LocalColumn</ref_to>
+				<base_relation>local_columns</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>SubMatrix</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>TplSubMatrix</name>
+				<ref_to>TplSubMatrix</ref_to>
+				<min_occurs>0</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>SubMatrix</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>LocalColumn</name>
+			<basetype>AoLocalColumn</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>MimeType</name>
+				<base_attribute>mime_type</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>IndependentFlag</name>
+				<base_attribute>independent</base_attribute>
+				<datatype>DT_SHORT</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>SequenceRepresentation</name>
+				<base_attribute>sequence_representation</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>seq_rep_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>GlobalFlag</name>
+				<base_attribute>global_flag</base_attribute>
+				<datatype>DT_SHORT</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Values</name>
+				<base_attribute>values</base_attribute>
+			</application_attribute>
+			<application_attribute>
+				<name>Flags</name>
+				<base_attribute>flags</base_attribute>
+			</application_attribute>
+			<application_attribute>
+				<name>GenerationParameters</name>
+				<base_attribute>generation_parameters</base_attribute>
+				<datatype>DS_DOUBLE</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>RawDatatype</name>
+				<base_attribute>raw_datatype</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>datatype_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>axistype</name>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>axistype</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>SubMatrix</name>
+				<ref_to>SubMatrix</ref_to>
+				<base_relation>submatrix</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>LocalColumns</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>MeaQuantity</name>
+				<ref_to>MeaQuantity</ref_to>
+				<base_relation>measurement_quantity</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>LocalColumns</inverse_name>
+			</relation_attribute>
+			<relation_attribute>
+				<name>ExternalComponent</name>
+				<ref_to>ExternalComponent</ref_to>
+				<base_relation>external_component</base_relation>
+				<min_occurs>0</min_occurs>
+				<max_occurs>Many</max_occurs>
+				<inverse_name>LocalColumn</inverse_name>
+			</relation_attribute>
+		</application_element>
+		<application_element>
+			<name>ExternalComponent</name>
+			<basetype>AoExternalComponent</basetype>
+			<application_attribute>
+				<name>Id</name>
+				<base_attribute>id</base_attribute>
+				<datatype>DT_LONGLONG</datatype>
+				<autogenerate>true</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>true</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Name</name>
+				<base_attribute>name</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>150</length>
+			</application_attribute>
+			<application_attribute>
+				<name>OrdinalNumber</name>
+				<base_attribute>ordinal_number</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>TypeSpecification</name>
+				<base_attribute>value_type</base_attribute>
+				<datatype>DT_ENUM</datatype>
+				<enumeration_type>typespec_enum</enumeration_type>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Length</name>
+				<base_attribute>component_length</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>StartOffset</name>
+				<base_attribute>start_offset</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>Blocksize</name>
+				<base_attribute>block_size</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValuesPerBlock</name>
+				<base_attribute>valuesperblock</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>ValueOffset</name>
+				<base_attribute>value_offset</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<application_attribute>
+				<name>FilenameURL</name>
+				<base_attribute>filename_url</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>true</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>FlagsFilenameURL</name>
+				<base_attribute>flags_filename_url</base_attribute>
+				<datatype>DT_STRING</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>256</length>
+			</application_attribute>
+			<application_attribute>
+				<name>FlagsStartOffset</name>
+				<base_attribute>flags_start_offset</base_attribute>
+				<datatype>DT_LONG</datatype>
+				<autogenerate>false</autogenerate>
+				<obligatory>false</obligatory>
+				<unique>false</unique>
+				<length>1</length>
+			</application_attribute>
+			<relation_attribute>
+				<name>LocalColumn</name>
+				<ref_to>LocalColumn</ref_to>
+				<base_relation>local_column</base_relation>
+				<min_occurs>1</min_occurs>
+				<max_occurs>1</max_occurs>
+				<inverse_name>ExternalComponent</inverse_name>
+			</relation_attribute>
+		</application_element>
+	</application_model>
+	<!-- *************************************************************************************************************** 
+		* end application model meta data * *************************************************************************************************************** -->
+	<!-- *************************************************************************************************************** 
+		* Instance Data is NOT validated with Base Schema * *************************************************************************************************************** -->
+
+	<instance_data>
+		<Environment>
+			<Id>1</Id>
+			<Name>MDM</Name>
+			<MimeType>application/x-asam.aoenvironment</MimeType>
+			<Description>MDM Environment</Description>
+			<DateCreated>20120214120000</DateCreated>
+			<Max_test_level>4</Max_test_level>
+			<Base_model_version>asam30</Base_model_version>
+			<AppModelType>ASAM_SECURITY,ASAM_NVH,ASAM_WORKFLOW,MDM</AppModelType>
+			<AppModelVersion>4.4.1</AppModelVersion>
+			<Timezone>GMT</Timezone>
+			<MeaningOfAliases>
+				<s>,language=en</s>
+				<s>,language=de</s>
+			</MeaningOfAliases>
+		</Environment>
+	</instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/FileUtils.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/FileUtils.java
new file mode 100644
index 0000000..18dc44e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/FileUtils.java
@@ -0,0 +1,54 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.apicopy;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Comparator;
+
+public class FileUtils {
+	/**
+	 * Writes inputstream to file
+	 * 
+	 * @param file
+	 * @param inputstream
+	 * @throws IOException
+	 */
+	public static void writeToFile(Path file, InputStream inputstream) throws IOException {
+		try (OutputStream out = new FileOutputStream(file.toFile())) {
+			int read = 0;
+			byte[] bytes = new byte[1024];
+
+			while ((read = inputstream.read(bytes)) != -1) {
+				out.write(bytes, 0, read);
+			}
+		}
+	}
+
+	/**
+	 * Deletes a directory.
+	 * 
+	 * @param pathToBeDeleted directory to delete
+	 * @throws IOException
+	 */
+	public static void deleteDirectory(java.nio.file.Path pathToBeDeleted) throws IOException {
+		Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/boundary/ExportResourceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/boundary/ExportResourceTest.java
new file mode 100644
index 0000000..6a58488
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/boundary/ExportResourceTest.java
@@ -0,0 +1,175 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.boundary;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.apicopy.entity.ApiCopyExceptionMapper;
+import org.eclipse.mdm.shoppingbasket.entity.BasketItem;
+import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasket;
+import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseyTest;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class ExportResourceTest extends JerseyTest {
+
+	@Mock
+	private ExportService mockedExportService;
+
+	private static final String EXPORT_RESOURCE = "export";
+
+	@Override
+	public Application configure() {
+		MockitoAnnotations.initMocks(this);
+
+		return new ResourceConfig().register(new ExportResource(mockedExportService)).register(MultiPartFeature.class)
+				.register(ApiCopyExceptionMapper.class).register(new AbstractBinder() {
+					@Override
+					protected void configure() {
+						bind(mockedExportService).to(ExportService.class);
+					}
+				});
+	}
+
+	@Test
+	public void testExport() throws IOException {
+		Path exportFolder = Files.createTempDirectory("exportAtfx");
+		Path exportAtfx = exportFolder.resolve("export.atfx");
+		Files.write(exportAtfx, "test".getBytes());
+
+		when(mockedExportService.exportAtfx(any())).thenReturn(exportFolder);
+
+		BasketItem item = new BasketItem();
+		item.setSource("ENV");
+		item.setRestURI(URI.create("environments/ENV/tests/10"));
+		ShoppingBasket basket = new ShoppingBasket();
+		basket.setItems(Arrays.asList(item));
+
+		Response r = getClient().target(getBaseUri()).path(EXPORT_RESOURCE).request()
+				.post(Entity.entity(basket, MediaType.APPLICATION_XML_TYPE));
+
+		try {
+			assertThat(exportAtfx.toFile()).doesNotExist();
+			assertThat(r.readEntity(String.class)).isEqualTo("test");
+			assertThat(r.getStatus()).isEqualTo(Status.OK.getStatusCode());
+			assertThat(r.getMediaType().toString()).isEqualTo(MediaType.APPLICATION_XML);
+		} finally {
+			r.close();
+		}
+	}
+
+	@Test
+	public void testExportMultipleFiles() throws IOException, InterruptedException {
+		Path exportFolder = Files.createTempDirectory("exportAtfx");
+		Path exportAtfx = exportFolder.resolve("export.atfx");
+		Files.write(exportAtfx, "test".getBytes());
+		Path exportBin = exportFolder.resolve("export.bin");
+		Files.write(exportBin, "test".getBytes());
+
+		when(mockedExportService.exportAtfx(any())).thenReturn(exportFolder);
+
+		BasketItem item = new BasketItem();
+		item.setSource("ENV");
+		item.setRestURI(URI.create("environments/ENV/tests/10"));
+		ShoppingBasket basket = new ShoppingBasket();
+		basket.setItems(Arrays.asList(item));
+
+		Response r = getClient().target(getBaseUri()).path(EXPORT_RESOURCE).request()
+				.post(Entity.entity(basket, MediaType.APPLICATION_XML_TYPE));
+
+		try {
+			assertThat(r.readEntity(String.class)).isNotEmpty();
+
+			assertThat(r.getStatus()).isEqualTo(Status.OK.getStatusCode());
+			assertThat(r.getMediaType().toString()).isEqualTo("application/zip");
+		} finally {
+			r.close();
+		}
+		Thread.sleep(500L);
+		assertThat(exportAtfx.toFile()).doesNotExist();
+		assertThat(exportBin.toFile()).doesNotExist();
+	}
+
+	@Test
+	public void testExportAtfxFile() throws IOException {
+		Path exportFolder = Files.createTempDirectory("exportAtfx");
+		Path exportAtfx = exportFolder.resolve("export.atfx");
+		Files.write(exportAtfx, "test".getBytes());
+
+		when(mockedExportService.exportAtfx(any())).thenReturn(exportFolder);
+
+		BasketItem item = new BasketItem();
+		item.setSource("ENV");
+		item.setRestURI(URI.create("environments/ENV/tests/10"));
+		ShoppingBasket basket = new ShoppingBasket();
+		basket.setItems(Arrays.asList(item));
+
+		Response r = getClient().target(getBaseUri()).path(EXPORT_RESOURCE).request()
+				.post(Entity.entity(basket, MediaType.APPLICATION_XML_TYPE));
+
+		try {
+			assertThat(r.readEntity(String.class)).isEqualTo("test");
+
+			assertThat(r.getStatus()).isEqualTo(Status.OK.getStatusCode());
+			assertThat(r.getMediaType().toString()).isEqualTo(MediaType.APPLICATION_XML);
+			assertThat(exportAtfx.toFile()).doesNotExist();
+		} finally {
+			r.close();
+		}
+	}
+
+//	@Test
+//	public void testExportMixedSources() throws IOException {
+//		when(mockedExportService.exportAtfx(any())).thenReturn(Paths.get("exportAtfx"));
+//
+//		BasketItem item1 = new BasketItem();
+//		item1.setSource("ENV");
+//		BasketItem item2 = new BasketItem();
+//		item2.setSource("ENV2");
+//		ShoppingBasket basket = new ShoppingBasket();
+//		basket.setItems(Arrays.asList(item1, item2));
+//
+//		Response r = getClient().target(getBaseUri()).path(EXPORT_RESOURCE)
+//				.request()
+//				.post(Entity.entity(basket, MediaType.APPLICATION_XML_TYPE));
+//
+//		try {
+//			assertThat(r.getStatus()).isEqualTo(Status.BAD_REQUEST.getStatusCode());
+//			assertThat(r.readEntity(CopyStatusResponse.class))
+//				.hasFieldOrPropertyWithValue("state", "failed")
+//				.hasFieldOrPropertyWithValue("message", "Cannot export from multiple sources.")
+//				.hasFieldOrProperty("stacktrace");
+//		} finally {
+//			r.close();
+//		}
+//	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/boundary/ImportResourceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/boundary/ImportResourceTest.java
new file mode 100644
index 0000000..2344bee
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/boundary/ImportResourceTest.java
@@ -0,0 +1,180 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy.boundary;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.apicopy.control.ApiCopyException;
+import org.eclipse.mdm.apicopy.entity.ApiCopyExceptionMapper;
+import org.eclipse.mdm.apicopy.entity.CopyStatusResponse;
+import org.eclipse.mdm.apicopy.entity.CopyStatusResponse.State;
+import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import org.glassfish.jersey.media.multipart.FormDataMultiPart;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseyTest;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class ImportResourceTest extends JerseyTest {
+
+	@Mock
+	private ImportService mockedImportService;
+
+	private static final String IMPORT_RESOURCE = "environments/ENV/import";
+
+	private final Path resources = Paths.get("src/test/resources/");
+	private final Path atfxFile = resources.resolve("example.atfx");
+	private final Path binFile = resources.resolve("example_1.bin");
+
+	@Override
+	public Application configure() {
+		MockitoAnnotations.initMocks(this);
+
+		return new ResourceConfig().register(new ImportResource(mockedImportService)).register(MultiPartFeature.class)
+				.register(ApiCopyExceptionMapper.class).register(new AbstractBinder() {
+					@Override
+					protected void configure() {
+						bind(mockedImportService).to(ImportService.class);
+					}
+				});
+	}
+
+	@Test
+	public void testImportFile() throws IOException {
+		when(mockedImportService.importAtfx(any(), any())).thenReturn(Response.ok().build());
+
+		Response r = getClient().register(MultiPartFeature.class).target(getBaseUri()).path(IMPORT_RESOURCE).request()
+				.post(Entity.entity(new FileInputStream(atfxFile.toFile()), MediaType.APPLICATION_XML_TYPE));
+		try {
+			assertThat(r.getStatus()).isEqualTo(Status.OK.getStatusCode());
+			verify(mockedImportService, times(1)).importAtfx(any(), eq("ENV"));
+		} finally {
+			r.close();
+		}
+	}
+
+	@Test
+	public void testImportMultiPart() throws IOException {
+		when(mockedImportService.importAtfx(any(), any())).thenReturn(Response.ok().build());
+
+		try (final FormDataMultiPart multiPartEntity = new FormDataMultiPart()) {
+			multiPartEntity.field(atfxFile.getFileName().toString(), new FileInputStream(atfxFile.toFile()),
+					MediaType.APPLICATION_XML_TYPE).field(binFile.getFileName().toString(),
+							new FileInputStream(binFile.toFile()), MediaType.APPLICATION_OCTET_STREAM_TYPE);
+
+			Response r = getClient().register(MultiPartFeature.class).target(getBaseUri()).path(IMPORT_RESOURCE)
+					.request().post(Entity.entity(multiPartEntity, multiPartEntity.getMediaType()));
+			try {
+				assertThat(r.getStatus()).isEqualTo(Status.OK.getStatusCode());
+				verify(mockedImportService, times(1)).importAtfx(any(), eq("ENV"));
+			} finally {
+				r.close();
+			}
+		}
+	}
+
+	@Test
+	public void testImportZip() throws IOException {
+		when(mockedImportService.importAtfx(any(), any())).thenReturn(Response.ok().build());
+
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+		ZipOutputStream zipOut = new ZipOutputStream(out);
+
+		zipOut.putNextEntry(new ZipEntry(atfxFile.getFileName().toString()));
+		writeFileToStream(atfxFile, zipOut);
+
+		zipOut.putNextEntry(new ZipEntry(binFile.getFileName().toString()));
+		writeFileToStream(binFile, zipOut);
+		zipOut.close();
+
+		Response r = getClient().register(MultiPartFeature.class).target(getBaseUri()).path(IMPORT_RESOURCE).request()
+				.post(Entity.entity(out.toByteArray(), "application/zip"));
+		try {
+			assertThat(r.getStatus()).isEqualTo(Status.OK.getStatusCode());
+			verify(mockedImportService, times(1)).importAtfx(any(), eq("ENV"));
+		} finally {
+			r.close();
+		}
+	}
+
+	@Test
+	public void testFailedImport() throws IOException {
+		when(mockedImportService.importAtfx(any(), any())).thenThrow(new ApiCopyException("JUnit test fail"));
+
+		try (final FormDataMultiPart multiPartEntity = new FormDataMultiPart()) {
+			multiPartEntity.field(atfxFile.getFileName().toString(), new FileInputStream(atfxFile.toFile()),
+					MediaType.APPLICATION_XML_TYPE);
+			Response r = getClient().register(MultiPartFeature.class).target(getBaseUri()).path(IMPORT_RESOURCE)
+					.request().post(Entity.entity(multiPartEntity, multiPartEntity.getMediaType()));
+			try {
+				assertThat(r.getStatus()).isEqualTo(Status.BAD_REQUEST.getStatusCode());
+				assertThat(r.readEntity(CopyStatusResponse.class)).hasFieldOrPropertyWithValue("state", State.FAILED)
+						.hasFieldOrPropertyWithValue("message", "JUnit test fail").hasFieldOrProperty("stacktrace");
+			} finally {
+				r.close();
+			}
+		}
+	}
+
+	@Test
+	@Ignore
+	public void testExport() {
+		when(mockedImportService.importAtfx(any(), any())).thenReturn(Response.ok().build());
+
+		Response r = getClient().target(getBaseUri()).path("environments/mdm/export").request().get();
+		try {
+			assertThat(r.getStatus()).isEqualTo(Status.OK.getStatusCode());
+			assertThat(r.getMediaType().toString()).isEqualTo(MediaType.APPLICATION_XML);
+		} finally {
+			r.close();
+		}
+	}
+
+	private void writeFileToStream(Path atfxFile, OutputStream out) throws FileNotFoundException, IOException {
+		try (FileInputStream in = new FileInputStream(atfxFile.toFile())) {
+			int read = 0;
+			byte[] bytes = new byte[1024];
+
+			while ((read = in.read(bytes)) != -1) {
+				out.write(bytes, 0, read);
+			}
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/control/ExportTaskTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/control/ExportTaskTest.java
new file mode 100644
index 0000000..12a6991
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/control/ExportTaskTest.java
@@ -0,0 +1,120 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.apicopy.control;
+
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_PASSWORD;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_SERVICENAME;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_USER;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mdm.api.atfxadapter.ATFXContextFactory;
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.odsadapter.ODSContextFactory;
+import org.eclipse.mdm.apicopy.control.ExportTask;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.io.Files;
+
+@Ignore
+//FIXME 03.07.2019: this test needs a running ODS Server, that is not suitable for continous build in Jenkins.
+//Comment this in for local tests only.
+public class ExportTaskTest {
+	public static final String ATFX_FILE = "src/main/resources/emptyAtfx.xml";
+
+	public static ApplicationContext contextDst;
+	public static ApplicationContext contextSrc;
+
+	private static File f;
+
+	@ClassRule
+	public static TemporaryFolder tmpFolder = new TemporaryFolder();
+
+	private static final String NAME_SERVICE = "corbaloc::1.2@%s:%s/NameService";
+
+	private static final String USER = "sa";
+	private static final String PASSWORD = "sa";
+
+	@BeforeClass
+	public static void init() throws ConnectionException, IOException {
+
+		// Source context
+		String nameServiceHost = System.getProperty("host");
+		String nameServicePort = System.getProperty("port");
+		String serviceName = System.getProperty("service");
+
+		if (nameServiceHost == null || nameServiceHost.isEmpty()) {
+			throw new IllegalArgumentException("name service host is unknown: define system property 'host'");
+		}
+
+		nameServicePort = nameServicePort == null || nameServicePort.isEmpty() ? String.valueOf(2809) : nameServicePort;
+		if (nameServicePort == null || nameServicePort.isEmpty()) {
+			throw new IllegalArgumentException("name service port is unknown: define system property 'port'");
+		}
+
+		if (serviceName == null || serviceName.isEmpty()) {
+			throw new IllegalArgumentException("service name is unknown: define system property 'service'");
+		}
+
+		Map<String, String> connectionParameters = new HashMap<>();
+		connectionParameters.put(PARAM_NAMESERVICE, String.format(NAME_SERVICE, nameServiceHost, nameServicePort));
+		connectionParameters.put(PARAM_SERVICENAME, serviceName + ".ASAM-ODS");
+		connectionParameters.put(PARAM_USER, USER);
+		connectionParameters.put(PARAM_PASSWORD, PASSWORD);
+
+		contextSrc = new ODSContextFactory().connect(connectionParameters);
+
+		// target context
+		f = tmpFolder.newFile("open.atfx");
+		Files.copy(new File(ATFX_FILE), f);
+
+		Map<String, String> map = ImmutableMap.of("atfxfile", f.getAbsolutePath(), "freetext.active", "false",
+				"includeCatalog", "true");
+
+		contextDst = new ATFXContextFactory().connect(map);
+	}
+
+	@AfterClass
+	public static void teardown() throws ConnectionException {
+		contextDst.close();
+		contextSrc.close();
+	}
+
+	@Test
+	public void test() throws ConnectionException {
+		ExportTask task = new ExportTask(contextSrc, contextDst);
+		task.copyCatalog();
+		contextDst.close();
+
+		Map<String, String> map = ImmutableMap.of("atfxfile", f.getAbsolutePath(), "freetext.active", "false");
+		contextDst = new ATFXContextFactory().connect(map);
+
+		task = new ExportTask(contextSrc, contextDst);
+		task.copy(Arrays.asList(contextSrc.getEntityManager().get().load(Project.class, "1")));
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/control/ImportTaskTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/control/ImportTaskTest.java
new file mode 100644
index 0000000..bed39c4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/java/org/eclipse/mdm/apicopy/control/ImportTaskTest.java
@@ -0,0 +1,117 @@
+/*******************************************************************************

+ * Copyright (c) 2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+package org.eclipse.mdm.apicopy.control;

+

+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;

+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_PASSWORD;

+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_SERVICENAME;

+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_USER;

+

+import java.io.File;

+import java.io.IOException;

+import java.util.Arrays;

+import java.util.HashMap;

+import java.util.Map;

+

+import org.eclipse.mdm.api.atfxadapter.ATFXContextFactory;

+import org.eclipse.mdm.api.base.ConnectionException;

+import org.eclipse.mdm.api.base.model.TestStep;

+import org.eclipse.mdm.api.dflt.ApplicationContext;

+import org.eclipse.mdm.api.dflt.model.Project;

+import org.eclipse.mdm.api.odsadapter.ODSContextFactory;

+import org.junit.AfterClass;

+import org.junit.BeforeClass;

+import org.junit.Ignore;

+import org.junit.Test;

+

+import com.google.common.collect.ImmutableMap;

+

+@Ignore

+//FIXME 22.11.2019: this test needs a running ODS Server, that is not suitable for continous build in Jenkins.

+//Comment this in for local tests only.

+public class ImportTaskTest {

+	public static final String ATFX_FILE = "src/test/resources/importtasktest.atfx";

+

+	public static ApplicationContext contextDst;

+	public static ApplicationContext contextSrc;

+

+	private static final String NAME_SERVICE = "corbaloc::1.2@%s:%s/NameService";

+

+	private static final String USER = "sa";

+	private static final String PASSWORD = "sa";

+

+	@BeforeClass

+	public static void init() throws ConnectionException, IOException {

+

+		// Source context

+		String nameServiceHost = System.getProperty("host");

+		String nameServicePort = System.getProperty("port");

+		String serviceName = System.getProperty("service");

+

+		if (nameServiceHost == null || nameServiceHost.isEmpty()) {

+			throw new IllegalArgumentException("name service host is unknown: define system property 'host'");

+		}

+

+		nameServicePort = nameServicePort == null || nameServicePort.isEmpty() ? String.valueOf(2809) : nameServicePort;

+		if (nameServicePort == null || nameServicePort.isEmpty()) {

+			throw new IllegalArgumentException("name service port is unknown: define system property 'port'");

+		}

+

+		if (serviceName == null || serviceName.isEmpty()) {

+			throw new IllegalArgumentException("service name is unknown: define system property 'service'");

+		}

+

+		Map<String, String> connectionParameters = new HashMap<>();

+		connectionParameters.put(PARAM_NAMESERVICE, String.format(NAME_SERVICE, nameServiceHost, nameServicePort));

+		connectionParameters.put(PARAM_SERVICENAME, serviceName + ".ASAM-ODS");

+		connectionParameters.put(PARAM_USER, USER);

+		connectionParameters.put(PARAM_PASSWORD, PASSWORD);

+

+		contextDst = new ODSContextFactory().connect(connectionParameters);

+

+		// source context

+		File f = new File(ATFX_FILE);

+

+		Map<String, String> map = ImmutableMap.of("atfxfile", f.getAbsolutePath(), "freetext.active", "false");

+

+		contextSrc = new ATFXContextFactory().connect(map);

+	}

+

+	@AfterClass

+	public static void teardown() throws ConnectionException {

+		contextDst.close();

+		contextSrc.close();

+	}

+

+	@Test

+	public void testImport() throws ConnectionException {

+		ImportTask task = new ImportTask(contextSrc, contextDst, new TemplateManager() {

+

+			@Override

+			public void setSourceContext(ApplicationContext source) throws ApiCopyException {

+			}

+

+			@Override

+			public String getTemplateTestStepName(TestStep testStepSrc) throws ApiCopyException {

+				return "PBN_UNECE_R51_RUN";

+			}

+

+			@Override

+			public String getTemplateTestName(org.eclipse.mdm.api.base.model.Test testSrc) throws ApiCopyException {

+				return "PBN_UNECE_R51";

+			}

+		});

+

+		task.copy(Arrays.asList(contextSrc.getEntityManager().get().load(Project.class, "1")));

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/example.atfx b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/example.atfx
new file mode 100644
index 0000000..2def4d2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/example.atfx
@@ -0,0 +1,3544 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<atfx_file version="atfx_file: V1.2.0" xmlns="http://www.asam.net/ODS/5.2.0/Schema">
+  <documentation>
+    <exported_by>openATFX</exported_by>
+    <exporter>openATFX</exporter>
+    <export_date_time>20140317155010</export_date_time>
+    <exporter_version>0.4.3</exporter_version>
+  </documentation>
+  <base_model_version>asam30</base_model_version>
+  <application_model>
+    <application_enumeration>
+      <name>valid_enum</name>
+      <item>
+        <name>editing</name>
+        <value>0</value>
+      </item>
+      <item>
+        <name>valid</name>
+        <value>1</value>
+      </item>
+      <item>
+        <name>archive</name>
+        <value>2</value>
+      </item>
+    </application_enumeration>
+    <application_enumeration>
+      <name>axistype</name>
+      <item>
+        <name>Xaxis</name>
+        <value>0</value>
+      </item>
+      <item>
+        <name>Yaxis</name>
+        <value>1</value>
+      </item>
+      <item>
+        <name>Both</name>
+        <value>2</value>
+      </item>
+    </application_enumeration>
+    <application_element>
+      <name>Environment</name>
+      <basetype>AoEnvironment</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <obligatory>true</obligatory>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Max_test_level</name>
+        <base_attribute>max_test_level</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Base_model_version</name>
+        <base_attribute>base_model_version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>AppModelType</name>
+        <base_attribute>application_model_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>AppModelVersion</name>
+        <base_attribute>application_model_version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Timezone</name>
+        <base_attribute>timezone</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeaningOfAliases</name>
+        <base_attribute>meaning_of_aliases</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+    </application_element>
+    <application_element>
+      <name>Project</name>
+      <basetype>AoTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>StructureLevel</name>
+        <ref_to>StructureLevel</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Project</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>StructureLevel</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Tests</name>
+        <ref_to>Test</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>StructureLevel</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Project</name>
+        <ref_to>Project</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>StructureLevel</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Test</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateClosed</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>StructureLevel</name>
+        <ref_to>StructureLevel</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Tests</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Test</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResponsiblePerson</name>
+        <ref_to>User</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Tests</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestStep</name>
+      <basetype>AoSubTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Optional</name>
+        <datatype>DT_BOOLEAN</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>Sortindex</name>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Test</name>
+        <ref_to>Test</ref_to>
+        <base_relation>parent_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestStep</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>TestSteps</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>MeaResult</name>
+      <basetype>AoMeasurement</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeasurementBegin</name>
+        <base_attribute>measurement_begin</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MeasurementEnd</name>
+        <base_attribute>measurement_end</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MDMLinks</name>
+        <base_attribute>external_references</base_attribute>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>equipments</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>units_under_test</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>sequences</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestStep</name>
+        <ref_to>TestStep</ref_to>
+        <base_relation>test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaResults</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SubMatrices</name>
+        <ref_to>SubMatrix</ref_to>
+        <base_relation>submatrices</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaResult</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>UnitUnderTest</name>
+      <basetype>AoUnitUnderTest</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>engine</name>
+        <ref_to>engine</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>gearbox</name>
+        <ref_to>gearbox</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>tyre</name>
+        <ref_to>tyre</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>noise_reduction_system</name>
+        <ref_to>noise_reduction_system</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>vehicle</name>
+        <ref_to>vehicle</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>exhaust_piping</name>
+        <ref_to>exhaust_piping</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>expansion_chamber</name>
+        <ref_to>expansion_chamber</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>air_filter</name>
+        <ref_to>air_filter</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>silencer</name>
+        <ref_to>silencer</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>UnitUnderTest</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>engine</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>power</name>
+        <datatype>DT_SHORT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>model</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>engine</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>gearbox</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>no_forward_gears</name>
+        <datatype>DT_SHORT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>transmission</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>gearbox</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>noise_reduction_system</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>design_family</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>noise_reduction_system</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>tyre</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>axle</name>
+        <datatype>DT_SHORT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>side</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>size</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>tread_depth</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>tyre</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>air_filter</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>min_bulk_material_density</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>air_filter</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>expansion_chamber</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>volume</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>expansion_chamber</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>exhaust_piping</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>material</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>length</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>exhaust_piping</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>vehicle</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>maximum_authorized_mass</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>vehicle_type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>vehicle_category</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>model</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>length</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>reference_point</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>mass_in_running_order</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>vehicle</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>silencer</name>
+      <basetype>AoUnitUnderTestPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>location</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>model</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>fibre_type</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>UnitUnderTest</name>
+        <ref_to>UnitUnderTest</ref_to>
+        <base_relation>parent_unit_under_test</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>silencer</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestEquipment</name>
+      <basetype>AoTestEquipment</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>sound_measurement</name>
+        <ref_to>sound_measurement</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestEquipment</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>vehicle_measurement</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>speed</name>
+        <ref_to>speed</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>parent_equipment</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>rotational_speed</name>
+        <ref_to>rotational_speed</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>acceleration</name>
+        <ref_to>acceleration</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>vehicle_measurement</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>speed</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>direction</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>speed</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>speed</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>rotational_speed</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>rotational_speed</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>rotational_speed</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>acceleration</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type_code</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>last_calibration</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>location</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>direction</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>vehicle_measurement</name>
+        <ref_to>vehicle_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>acceleration</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>acceleration</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>meteorological_measurement</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>temperature</name>
+        <ref_to>temperature</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>barometric_pressure</name>
+        <ref_to>barometric_pressure</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>parent_equipment</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>relative_humidity</name>
+        <ref_to>relative_humidity</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>wind_speed</name>
+        <ref_to>wind_speed</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>meteorological_measurement</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>barometric_pressure</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type_code</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>last_calibration</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>height_above_ground</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>barometric_pressure</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>barometric_pressure</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>temperature</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>temperature</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>temperature</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>relative_humidity</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>relative_humidity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>relative_humidity</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>wind_speed</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>wind_direction</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meteorological_measurement</name>
+        <ref_to>meteorological_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>wind_speed</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>wind_speed</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>sound_measurement</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>microphone</name>
+        <ref_to>microphone</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>sound_measurement</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestEquipment</name>
+        <ref_to>TestEquipment</ref_to>
+        <base_relation>parent_equipment</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>sound_measurement</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>microphone</name>
+      <basetype>AoTestEquipmentPart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>manufacturer</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>type_code</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>height_above_ground</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>last_calibration</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>distance_from_target</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>windscreen_applied</name>
+        <datatype>DT_BOOLEAN</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>sound_measurement</name>
+        <ref_to>sound_measurement</ref_to>
+        <base_relation>parent_equipment_part</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>microphone</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>microphone</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>MeaQuantity</name>
+      <basetype>AoMeasurementQuantity</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DataType</name>
+        <base_attribute>datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Interpolation</name>
+        <base_attribute>interpolation</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Rank</name>
+        <base_attribute>rank</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Dimension</name>
+        <base_attribute>dimension</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>TypeSize</name>
+        <base_attribute>type_size</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Minimum</name>
+        <base_attribute>minimum</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Maximum</name>
+        <base_attribute>maximum</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Average</name>
+        <base_attribute>average</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Deviation</name>
+        <base_attribute>standard_deviation</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>non_reference_channel_name</name>
+        <datatype>DT_STRING</datatype>
+        <length>128</length>
+      </application_attribute>
+      <application_attribute>
+        <name>reference_channel_name</name>
+        <datatype>DT_STRING</datatype>
+        <length>128</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>meq-for-ref-user-window-fct</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>reference-user-window-function</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>speed</name>
+        <ref_to>speed</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-forequalization-
+filter</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>equalization-filter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>barometric_pressure</name>
+        <ref_to>barometric_pressure</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>relative_humidity</name>
+        <ref_to>relative_humidity</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>non_reference_channel_quantity</name>
+        <ref_to>Quantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-non_ref_chan_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>equalization-filter</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-forequalization-
+filter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>wind_speed</name>
+        <ref_to>wind_speed</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>user-window-function</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-user-window-fct</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>temperature</name>
+        <ref_to>temperature</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>microphone</name>
+        <ref_to>microphone</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>LocalColumns</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_columns</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>rotational_speed</name>
+        <ref_to>rotational_speed</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>reference-user-window-function</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-ref-user-window-fct</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-for-user-window-fct</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>user-window-function</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>reference_channel_quantity</name>
+        <ref_to>Quantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>meq-for-ref_chan_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>Quantity</name>
+        <ref_to>Quantity</ref_to>
+        <base_relation>quantity</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>acceleration</name>
+        <ref_to>acceleration</ref_to>
+        <base_relation>channel</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>MeaQuantity</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Unit</name>
+      <basetype>AoUnit</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Factor</name>
+        <base_attribute>factor</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Offset</name>
+        <base_attribute>offset</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>dB</name>
+        <datatype>DT_BOOLEAN</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>dB_reference_factor</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>Quantities</name>
+        <ref_to>Quantity</ref_to>
+        <base_relation>quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>PhysDimension</name>
+        <ref_to>PhysDimension</ref_to>
+        <base_relation>phys_dimension</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Units</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameter</name>
+        <ref_to>ResultParameter</ref_to>
+        <base_relation>parameters</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Unit</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>PhysDimension</name>
+      <basetype>AoPhysicalDimension</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Length</name>
+        <base_attribute>length_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Mass</name>
+        <base_attribute>mass_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Time</name>
+        <base_attribute>time_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Current</name>
+        <base_attribute>current_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Temperature</name>
+        <base_attribute>temperature_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MolarAmount</name>
+        <base_attribute>molar_amount_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>LuminousIntensity</name>
+        <base_attribute>luminous_intensity_exp</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>angle</name>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <relation_attribute>
+        <name>Units</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>units</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>PhysDimension</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Quantity</name>
+      <basetype>AoQuantity</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DateCreated</name>
+        <base_attribute>version_date</base_attribute>
+        <length>30</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DefaultRank</name>
+        <base_attribute>default_rank</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>DefDimension</name>
+        <base_attribute>default_dimension</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>DefTypeSize</name>
+        <base_attribute>default_type_size</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>DefMQName</name>
+        <base_attribute>default_mq_name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DefDataType</name>
+        <base_attribute>default_datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>ValidFlag</name>
+        <datatype>DT_ENUM</datatype>
+        <enumeration_type>valid_enum</enumeration_type>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>default_unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>Quantities</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-for-non_ref_chan_quantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>non_reference_channel_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>meq-for-ref_chan_quantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>reference_channel_quantity</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantities</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantities</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>Quantity</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ResultParameterSet</name>
+      <basetype>AoParameterSet</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>ResultParameter</name>
+        <ref_to>ResultParameter</ref_to>
+        <base_relation>parameters</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameterSet</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ResultParameter</name>
+      <basetype>AoParameter</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>DataType</name>
+        <base_attribute>parameter_datatype</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Value</name>
+        <base_attribute>pvalue</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Unit</name>
+        <ref_to>Unit</ref_to>
+        <base_relation>unit</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameter</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ResultParameterSet</name>
+        <ref_to>ResultParameterSet</ref_to>
+        <base_relation>parameter_set</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ResultParameter</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>LocalColumn</name>
+      <basetype>AoLocalColumn</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>IndependentFlag</name>
+        <base_attribute>independent</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>SequenceRepresentation</name>
+        <base_attribute>sequence_representation</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>GlobalFlag</name>
+        <base_attribute>global_flag</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Values</name>
+        <base_attribute>values</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Flags</name>
+        <base_attribute>flags</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>GenerationParameters</name>
+        <base_attribute>generation_parameters</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>RawDatatype</name>
+        <base_attribute>raw_datatype</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>axistype</name>
+        <datatype>DT_ENUM</datatype>
+        <enumeration_type>axistype</enumeration_type>
+      </application_attribute>
+      <relation_attribute>
+        <name>MeaQuantity</name>
+        <ref_to>MeaQuantity</ref_to>
+        <base_relation>measurement_quantity</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>LocalColumns</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SubMatrix</name>
+        <ref_to>SubMatrix</ref_to>
+        <base_relation>submatrix</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>LocalColumns</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>ExternalComponent</name>
+        <ref_to>ExternalComponent</ref_to>
+        <base_relation>external_component</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>LocalColumn</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>SubMatrix</name>
+      <basetype>AoSubmatrix</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>SubMatrixNoRows</name>
+        <base_attribute>number_of_rows</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>y-axis-for-z-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>z-axis-for-y-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>y-axis-for-x-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>x-axis-for-y-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>LocalColumns</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_columns</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>SubMatrix</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>z-axis-for-y-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>y-axis-for-z-axis</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResult</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>SubMatrices</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>x-axis-for-y-axis</name>
+        <ref_to>SubMatrix</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>y-axis-for-x-axis</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>ExternalComponent</name>
+      <basetype>AoExternalComponent</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>150</length>
+      </application_attribute>
+      <application_attribute>
+        <name>FilenameURL</name>
+        <base_attribute>filename_url</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>TypeSpecification</name>
+        <base_attribute>value_type</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Length</name>
+        <base_attribute>component_length</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>StartOffset</name>
+        <base_attribute>start_offset</base_attribute>
+        <datatype>DT_LONG</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Blocksize</name>
+        <base_attribute>block_size</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>ValuesPerBlock</name>
+        <base_attribute>valuesperblock</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>ValueOffset</name>
+        <base_attribute>value_offset</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>OrdinalNumber</name>
+        <base_attribute>ordinal_number</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>FlagsFilenameURL</name>
+        <base_attribute>flags_filename_url</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>FlagsStartOffset</name>
+        <base_attribute>flags_start_offset</base_attribute>
+        <datatype>DT_LONG</datatype>
+      </application_attribute>
+      <relation_attribute>
+        <name>LocalColumn</name>
+        <ref_to>LocalColumn</ref_to>
+        <base_relation>local_column</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>ExternalComponent</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>TestSequence</name>
+      <basetype>AoTestSequence</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>100</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Version</name>
+        <base_attribute>version</base_attribute>
+        <obligatory>true</obligatory>
+        <length>20</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>PBN_test_conduction</name>
+        <ref_to>PBN_test_conduction</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>track</name>
+        <ref_to>track</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>SVN_test_conduction</name>
+        <ref_to>SVN_test_conduction</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>testsite</name>
+        <ref_to>testsite</ref_to>
+        <base_relation>children</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>MeaResults</name>
+        <ref_to>MeaResult</ref_to>
+        <base_relation>measurement</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>TestSteps</name>
+        <ref_to>TestStep</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>TestSequence</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>PBN_test_conduction</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>v_test</name>
+        <datatype>DT_FLOAT</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>PMR</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>accelerated</name>
+        <datatype>DT_BOOLEAN</datatype>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>tested_vehicle_side</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>PBN_test_conduction</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>track</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>residual_voids_content</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>sound_absorption_coefficient</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>texture_depth</name>
+        <datatype>DT_FLOAT</datatype>
+      </application_attribute>
+      <application_attribute>
+        <name>surface_homogeneity</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <application_attribute>
+        <name>last_check_texture_depth</name>
+        <datatype>DT_DATE</datatype>
+        <length>30</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>track</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>SVN_test_conduction</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>SVN_test_conduction</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>testsite</name>
+      <basetype>AoTestSequencePart</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+        <obligatory>true</obligatory>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <obligatory>true</obligatory>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>track_id</name>
+        <datatype>DT_STRING</datatype>
+        <length>254</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>TestSequence</name>
+        <ref_to>TestSequence</ref_to>
+        <base_relation>parent_sequence</base_relation>
+        <min_occurs>1</min_occurs>
+        <max_occurs>1</max_occurs>
+        <inverse_name>testsite</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>User</name>
+      <basetype>AoUser</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <unique>true</unique>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Password</name>
+        <base_attribute>password</base_attribute>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <application_attribute>
+        <name>GivenName</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Surname</name>
+        <datatype>DT_STRING</datatype>
+        <obligatory>true</obligatory>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Department</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Telephone</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>E-Mail</name>
+        <datatype>DT_STRING</datatype>
+        <length>50</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>Tests</name>
+        <ref_to>Test</ref_to>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>ResponsiblePerson</inverse_name>
+      </relation_attribute>
+      <relation_attribute>
+        <name>users2groups</name>
+        <ref_to>Role</ref_to>
+        <base_relation>groups</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>groups2users</inverse_name>
+      </relation_attribute>
+    </application_element>
+    <application_element>
+      <name>Role</name>
+      <basetype>AoUserGroup</basetype>
+      <application_attribute>
+        <name>Id</name>
+        <base_attribute>id</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>Name</name>
+        <base_attribute>name</base_attribute>
+        <unique>true</unique>
+        <length>50</length>
+      </application_attribute>
+      <application_attribute>
+        <name>SuperuserFlag</name>
+        <base_attribute>superuser_flag</base_attribute>
+      </application_attribute>
+      <application_attribute>
+        <name>MimeType</name>
+        <base_attribute>mime_type</base_attribute>
+        <length>256</length>
+      </application_attribute>
+      <application_attribute>
+        <name>Description</name>
+        <base_attribute>description</base_attribute>
+        <length>500</length>
+      </application_attribute>
+      <relation_attribute>
+        <name>groups2users</name>
+        <ref_to>User</ref_to>
+        <base_relation>users</base_relation>
+        <min_occurs>0</min_occurs>
+        <max_occurs>Many</max_occurs>
+        <inverse_name>users2groups</inverse_name>
+      </relation_attribute>
+    </application_element>
+  </application_model>
+  <instance_data>
+    <Environment>
+      <Id>1</Id>
+      <Name>MDM</Name>
+      <MimeType>application/x-asam.aoenvironment</MimeType>
+      <Description>MDM Environment</Description>
+      <DateCreated>20120214120000</DateCreated>
+      <Max_test_level>4</Max_test_level>
+      <Base_model_version>asam30</Base_model_version>
+      <AppModelType>ASAM_SECURITY,ASAM_NVH,ASAM_WORKFLOW,MDM</AppModelType>
+      <AppModelVersion>4.4.1</AppModelVersion>
+      <Timezone>GMT</Timezone>
+      <MeaningOfAliases>
+        <s>,language=en</s>
+        <s>,language=de</s>
+      </MeaningOfAliases>
+    </Environment>
+    <Project>
+      <Id>1</Id>
+      <Name>PMV Model P</Name>
+      <MimeType>application/x-asam.aotest</MimeType>
+      <StructureLevel>1</StructureLevel>
+    </Project>
+    <StructureLevel>
+      <Id>1</Id>
+      <Name>PBN Measurements</Name>
+      <MimeType>application/x-asam.aosubtest.structurelevel</MimeType>
+      <Tests>1</Tests>
+      <Project>1</Project>
+    </StructureLevel>
+    <Test>
+      <Id>1</Id>
+      <Name>PBN_UNECE_R51_20140314170907</Name>
+      <MimeType>application/x-asam.aosubtest.test</MimeType>
+      <DateCreated>20140314170907</DateCreated>
+      <DateClosed>20140314170908</DateClosed>
+      <StructureLevel>1</StructureLevel>
+      <TestSteps>1</TestSteps>
+      <ResponsiblePerson>1</ResponsiblePerson>
+    </Test>
+    <TestStep>
+      <Id>1</Id>
+      <Name>PBN_UNECE_R51_Right_Acc_70</Name>
+      <MimeType>application/x-asam.aosubtest.teststep</MimeType>
+      <DateCreated>20140314170908</DateCreated>
+      <Optional>true</Optional>
+      <Sortindex>40</Sortindex>
+      <Test>1</Test>
+      <MeaResults>1</MeaResults>
+      <UnitUnderTest>1</UnitUnderTest>
+      <TestSequence>1</TestSequence>
+      <TestEquipment>1</TestEquipment>
+    </TestStep>
+    <MeaResult>
+      <Id>1</Id>
+      <Name>Channel</Name>
+      <MimeType>application/x-asam.aomeasurement</MimeType>
+      <DateCreated>20140317154822</DateCreated>
+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10 11</MeaQuantities>
+      <TestStep>1</TestStep>
+      <SubMatrices>1</SubMatrices>
+      <UnitUnderTest>1</UnitUnderTest>
+      <TestSequence>1</TestSequence>
+      <TestEquipment>1</TestEquipment>
+    </MeaResult>
+    <UnitUnderTest>
+      <Id>1</Id>
+      <Name>PBN_vehicle</Name>
+      <Version>57</Version>
+      <MimeType>application/x-asam.aounitundertest.unitundertest</MimeType>
+      <engine>1</engine>
+      <gearbox>1</gearbox>
+      <tyre>1 2 3 4</tyre>
+      <noise_reduction_system>1</noise_reduction_system>
+      <vehicle>1</vehicle>
+      <exhaust_piping>1</exhaust_piping>
+      <expansion_chamber>1</expansion_chamber>
+      <air_filter>1</air_filter>
+      <MeaResults>1</MeaResults>
+      <silencer>1 2</silencer>
+    </UnitUnderTest>
+    <engine>
+      <Id>1</Id>
+      <Name>engine</Name>
+      <MimeType>application/x-asam.aounitundertestpart.engine.engine</MimeType>
+      <power>167</power>
+      <manufacturer>Peak Motors Ltd.</manufacturer>
+      <type>Compression-ignition</type>
+      <model>Peak Turbo V16</model>
+      <UnitUnderTest>1</UnitUnderTest>
+    </engine>
+    <gearbox>
+      <Id>1</Id>
+      <Name>gearbox</Name>
+      <MimeType>application/x-asam.aounitundertestpart.gearbox.gearbox</MimeType>
+      <no_forward_gears>6</no_forward_gears>
+      <transmission>Automatic</transmission>
+      <UnitUnderTest>1</UnitUnderTest>
+    </gearbox>
+    <noise_reduction_system>
+      <Id>1</Id>
+      <Name>noise_reduction_system</Name>
+      <MimeType>application/x-asam.aounitundertestpart.noise_reduction_system.noise_reduction_system</MimeType>
+      <design_family>Whisper</design_family>
+      <UnitUnderTest>1</UnitUnderTest>
+    </noise_reduction_system>
+    <tyre>
+      <Id>1</Id>
+      <Name>FL_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.fl_tyre</MimeType>
+      <axle>1</axle>
+      <side>Left</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+      <tread_depth>2.2</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <tyre>
+      <Id>2</Id>
+      <Name>FR_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.fr_tyre</MimeType>
+      <axle>1</axle>
+      <side>Right</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+      <tread_depth>2.3</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <tyre>
+      <Id>3</Id>
+      <Name>RL_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.rl_tyre</MimeType>
+      <axle>2</axle>
+      <side>Left</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+	  <tread_depth>2.1</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <tyre>
+      <Id>4</Id>
+      <Name>RR_tyre</Name>
+      <MimeType>application/x-asam.aounitundertestpart.tyre.rr_tyre</MimeType>
+      <axle>2</axle>
+      <side>Right</side>
+      <size>75R15</size>
+      <manufacturer>Tunnelsand</manufacturer>
+      <tread_depth>2.2</tread_depth>
+      <UnitUnderTest>1</UnitUnderTest>
+    </tyre>
+    <air_filter>
+      <Id>1</Id>
+      <Name>air_filter</Name>
+      <MimeType>application/x-asam.aounitundertestpart.air_filter.air_filter</MimeType>
+      <min_bulk_material_density>0.83</min_bulk_material_density>
+      <UnitUnderTest>1</UnitUnderTest>
+    </air_filter>
+    <expansion_chamber>
+      <Id>1</Id>
+      <Name>expansion_chamber</Name>
+      <MimeType>application/x-asam.aounitundertestpart.expansion_chamber.expansion_chamber</MimeType>
+      <volume>0.53</volume>
+      <UnitUnderTest>1</UnitUnderTest>
+    </expansion_chamber>
+    <exhaust_piping>
+      <Id>1</Id>
+      <Name>exhaust_piping</Name>
+      <MimeType>application/x-asam.aounitundertestpart.exhaust_piping.exhaust_piping</MimeType>
+      <material>Stainless steel</material>
+      <length>3.79</length>
+      <UnitUnderTest>1</UnitUnderTest>
+    </exhaust_piping>
+    <vehicle>
+      <Id>1</Id>
+      <Name>vehicle</Name>
+      <MimeType>application/x-asam.aounitundertestpart.vehicle.vehicle</MimeType>
+      <maximum_authorized_mass>1950.0</maximum_authorized_mass>
+      <vehicle_type>Cabrio</vehicle_type>
+      <vehicle_category>Passenger transport</vehicle_category>
+      <manufacturer>Peak Motor Vehicles</manufacturer>
+      <model>Model P</model>
+      <length>3.96</length>
+      <reference_point>Rear end</reference_point>
+      <mass_in_running_order>1463.0</mass_in_running_order>
+      <UnitUnderTest>1</UnitUnderTest>
+    </vehicle>
+    <silencer>
+      <Id>1</Id>
+      <Name>exhaust_silencer</Name>
+      <MimeType>application/x-asam.aounitundertestpart.silencer.exhaust_silencer</MimeType>
+      <location>exhaust</location>
+      <manufacturer>Peak Silencers Ltd.</manufacturer>
+      <model>Lion's Roar 2013</model>
+      <type>Quadruple pipe</type>
+      <fibre_type>Biosil wool</fibre_type>
+      <UnitUnderTest>1</UnitUnderTest>
+    </silencer>
+    <silencer>
+      <Id>2</Id>
+      <Name>intake_silencer</Name>
+      <MimeType>application/x-asam.aounitundertestpart.silencer.intake_silencer</MimeType>
+      <location>intake</location>
+      <manufacturer>Peak Silencers Ltd.</manufacturer>
+      <model>Snake's Hiss 2013</model>
+      <fibre_type>Etype wool</fibre_type>
+      <UnitUnderTest>1</UnitUnderTest>
+    </silencer>
+    <TestEquipment>
+      <Id>1</Id>
+      <Name>PBN_setup</Name>
+      <Version>56</Version>
+      <MimeType>application/x-asam.aotestequipment.testequipment</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+      <meteorological_measurement>1</meteorological_measurement>
+      <sound_measurement>1</sound_measurement>
+      <MeaResults>1</MeaResults>
+    </TestEquipment>
+    <vehicle_measurement>
+      <Id>1</Id>
+      <Name>vehicle_measurement</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.vehicle_measurement.vehicle_measurement</MimeType>
+      <speed>1</speed>
+      <TestEquipment>1</TestEquipment>
+      <rotational_speed>1</rotational_speed>
+      <acceleration>1</acceleration>
+    </vehicle_measurement>
+    <speed>
+      <Id>1</Id>
+      <Name>vehicle_speed</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.speed</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+    </speed>
+    <rotational_speed>
+      <Id>1</Id>
+      <Name>rotational_speed</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.rotational_speed</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+    </rotational_speed>
+    <acceleration>
+      <Id>1</Id>
+      <Name>vehicle_acceleration</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.acceleration</MimeType>
+      <vehicle_measurement>1</vehicle_measurement>
+    </acceleration>
+    <meteorological_measurement>
+      <Id>1</Id>
+      <Name>meteorological_measurement</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.meteorological_measurement.meteorological_measurement</MimeType>
+      <temperature>1 2</temperature>
+      <barometric_pressure>1</barometric_pressure>
+      <TestEquipment>1</TestEquipment>
+      <relative_humidity>1</relative_humidity>
+      <wind_speed>1</wind_speed>
+    </meteorological_measurement>
+    <barometric_pressure>
+      <Id>1</Id>
+      <Name>atmospheric_pressure</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.barometric_pressure</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </barometric_pressure>
+    <temperature>
+      <Id>1</Id>
+      <Name>ambient_air_temperature</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </temperature>
+    <temperature>
+      <Id>2</Id>
+      <Name>track_surface_temperature</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </temperature>
+    <relative_humidity>
+      <Id>1</Id>
+      <Name>humidity</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.relative_humidity</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </relative_humidity>
+    <wind_speed>
+      <Id>1</Id>
+      <Name>wind_speed</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.wind_speed</MimeType>
+      <meteorological_measurement>1</meteorological_measurement>
+    </wind_speed>
+    <sound_measurement>
+      <Id>1</Id>
+      <Name>sound_measurement</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.sound_measurement.sound_measurement</MimeType>
+      <microphone>1 2</microphone>
+      <TestEquipment>1</TestEquipment>
+    </sound_measurement>
+    <microphone>
+      <Id>1</Id>
+      <Name>background_noise</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>
+      <sound_measurement>1</sound_measurement>
+    </microphone>
+    <microphone>
+      <Id>2</Id>
+      <Name>vehicle_noise</Name>
+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>
+      <sound_measurement>1</sound_measurement>
+    </microphone>
+    <MeaQuantity>
+      <Id>1</Id>
+      <Name>CHANNEL05</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8136</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>2</Id>
+      <Name>CHANNEL08</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8137</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>3</Id>
+      <Name>CHANNEL03</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8138</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>4</Id>
+      <Name>CHANNEL01</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8139</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>5</Id>
+      <Name>CHANNEL06</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8140</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>6</Id>
+      <Name>CHANNEL04</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8141</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>7</Id>
+      <Name>CHANNEL07</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8142</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>8</Id>
+      <Name>CHANNEL02</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8143</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>9</Id>
+      <Name>CHANNEL09</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8144</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>10</Id>
+      <Name>CHANNEL10</Name>
+      <DataType>DT_DOUBLE</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>1</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8145</LocalColumns>
+      <Quantity>1</Quantity>
+    </MeaQuantity>
+    <MeaQuantity>
+      <Id>11</Id>
+      <Name>X-Axis</Name>
+      <DataType>DT_LONG</DataType>
+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+      <Interpolation>no_interpolation</Interpolation>
+      <Rank>1</Rank>
+      <TypeSize>1</TypeSize>
+      <Unit>2</Unit>
+      <MeaResult>1</MeaResult>
+      <LocalColumns>8146</LocalColumns>
+      <Quantity>2</Quantity>
+    </MeaQuantity>
+    <Unit>
+      <Id>1</Id>
+      <Name>Pa</Name>
+      <Factor>1.0</Factor>
+      <Offset>0.0</Offset>
+      <MimeType>application/x-asam.aounit</MimeType>
+      <dB>false</dB>
+      <Quantities>1</Quantities>
+      <PhysDimension>1</PhysDimension>
+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>
+    </Unit>
+    <Unit>
+      <Id>2</Id>
+      <Name>s</Name>
+      <Factor>1.0</Factor>
+      <Offset>0.0</Offset>
+      <MimeType>application/x-asam.aounit</MimeType>
+      <dB>false</dB>
+      <Quantities>2</Quantities>
+      <PhysDimension>2</PhysDimension>
+      <MeaQuantities>11</MeaQuantities>
+    </Unit>
+    <PhysDimension>
+      <Id>1</Id>
+      <Name>pressure</Name>
+      <Length>-1</Length>
+      <Mass>1</Mass>
+      <Time>-2</Time>
+      <Current>0</Current>
+      <Temperature>0</Temperature>
+      <MolarAmount>0</MolarAmount>
+      <LuminousIntensity>0</LuminousIntensity>
+      <MimeType>application/x-asam.aophysicaldimension</MimeType>
+      <Description>unit: pascal</Description>
+      <angle>0</angle>
+      <Units>1</Units>
+    </PhysDimension>
+    <PhysDimension>
+      <Id>2</Id>
+      <Name>time</Name>
+      <Length>0</Length>
+      <Mass>0</Mass>
+      <Time>1</Time>
+      <Current>0</Current>
+      <Temperature>0</Temperature>
+      <MolarAmount>0</MolarAmount>
+      <LuminousIntensity>0</LuminousIntensity>
+      <MimeType>application/x-asam.aophysicaldimension</MimeType>
+      <angle>0</angle>
+      <Units>2</Units>
+    </PhysDimension>
+    <Quantity>
+      <Id>1</Id>
+      <Name>Noise</Name>
+      <Version>1</Version>
+      <MimeType>application/x-asam.aoquantity</MimeType>
+      <DateCreated>20140211133954</DateCreated>
+      <DefaultRank>1</DefaultRank>
+      <DefDimension>0</DefDimension>
+      <DefTypeSize>1</DefTypeSize>
+      <DefMQName>Noise</DefMQName>
+      <DefDataType>DT_FLOAT</DefDataType>
+      <ValidFlag>valid</ValidFlag>
+      <Unit>1</Unit>
+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>
+    </Quantity>
+    <Quantity>
+      <Id>2</Id>
+      <Name>Time</Name>
+      <Version>1</Version>
+      <MimeType>application/x-asam.aoquantity</MimeType>
+      <DateCreated>20140303190409</DateCreated>
+      <DefaultRank>1</DefaultRank>
+      <DefDimension>0</DefDimension>
+      <DefTypeSize>1</DefTypeSize>
+      <DefMQName>Time</DefMQName>
+      <DefDataType>DT_FLOAT</DefDataType>
+      <ValidFlag>valid</ValidFlag>
+      <Unit>2</Unit>
+      <MeaQuantities>11</MeaQuantities>
+    </Quantity>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8136</Id>
+      <Name>CHANNEL05</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>1</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>1</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8137</Id>
+      <Name>CHANNEL08</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>2</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>2</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8138</Id>
+      <Name>CHANNEL03</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>3</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>3</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8139</Id>
+      <Name>CHANNEL01</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>4</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>4</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8140</Id>
+      <Name>CHANNEL06</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>5</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>5</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8141</Id>
+      <Name>CHANNEL04</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>6</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>6</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8142</Id>
+      <Name>CHANNEL07</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>7</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>7</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8143</Id>
+      <Name>CHANNEL02</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>8</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>8</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8144</Id>
+      <Name>CHANNEL09</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>9</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>9</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8145</Id>
+      <Name>CHANNEL10</Name>
+      <IndependentFlag>0</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Yaxis</axistype>
+      <MeaQuantity>10</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>10</ExternalComponent>
+    </LocalColumn>
+    <LocalColumn>
+      <SequenceRepresentation>external_component</SequenceRepresentation>
+      <Id>8146</Id>
+      <Name>X-Axis</Name>
+      <IndependentFlag>1</IndependentFlag>
+      <MimeType>application/x-asam.aolocalcolumn</MimeType>
+      <GlobalFlag>15</GlobalFlag>
+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+      <axistype>Xaxis</axistype>
+      <MeaQuantity>11</MeaQuantity>
+      <SubMatrix>1</SubMatrix>
+      <ExternalComponent>11</ExternalComponent>
+    </LocalColumn>
+    <SubMatrix>
+      <Id>1</Id>
+      <Name>Channel</Name>
+      <SubMatrixNoRows>3001</SubMatrixNoRows>
+      <MimeType>application/x-asam.aosubmatrix</MimeType>
+      <LocalColumns>8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146</LocalColumns>
+      <MeaResult>1</MeaResult>
+    </SubMatrix>
+    <ExternalComponent>
+      <Id>1</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>0</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8136</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>2</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>24008</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8137</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>3</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>48016</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8138</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>4</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>72024</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8139</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>5</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>96032</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8140</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>6</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>120040</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8141</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>7</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>144048</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8142</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>8</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>168056</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8143</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>9</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>192064</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8144</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>10</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>ieeefloat8</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>216072</StartOffset>
+      <Blocksize>8</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8145</LocalColumn>
+    </ExternalComponent>
+    <ExternalComponent>
+      <Id>11</Id>
+      <Name>ExtComp</Name>
+      <FilenameURL>example_1.bin</FilenameURL>
+      <TypeSpecification>dt_long</TypeSpecification>
+      <Length>3001</Length>
+      <StartOffset>240080</StartOffset>
+      <Blocksize>4</Blocksize>
+      <ValuesPerBlock>1</ValuesPerBlock>
+      <ValueOffset>0</ValueOffset>
+      <LocalColumn>8146</LocalColumn>
+    </ExternalComponent>
+    <TestSequence>
+      <Id>1</Id>
+      <Name>PBN_emission_testing</Name>
+      <Version>41</Version>
+      <MimeType>application/x-asam.aotestsequence.testsequence</MimeType>
+      <PBN_test_conduction>1</PBN_test_conduction>
+      <track>1</track>
+      <testsite>1</testsite>
+      <MeaResults>1</MeaResults>
+    </TestSequence>
+    <PBN_test_conduction>
+      <Id>1</Id>
+      <Name>test_conduction</Name>
+      <MimeType>application/x-asam.aotestsequencepart.pbn_test_conduction.test_conduction</MimeType>
+      <v_test>70.0</v_test>
+      <PMR>114</PMR>
+      <accelerated>true</accelerated>
+      <tested_vehicle_side>Right</tested_vehicle_side>
+      <TestSequence>1</TestSequence>
+    </PBN_test_conduction>
+    <track>
+      <Id>1</Id>
+      <Name>track</Name>
+      <MimeType>application/x-asam.aotestsequencepart.track.track</MimeType>
+      <residual_voids_content>7.8</residual_voids_content>
+      <sound_absorption_coefficient>0.093</sound_absorption_coefficient>
+      <texture_depth>0.3</texture_depth>
+      <surface_homogeneity>homogenous</surface_homogeneity>
+      <last_check_texture_depth>20140220000000</last_check_texture_depth>
+      <TestSequence>1</TestSequence>
+    </track>
+    <testsite>
+      <Id>1</Id>
+      <Name>testsite</Name>
+      <MimeType>application/x-asam.aotestsequencepart.testsite.testsite</MimeType>
+      <track_id>PBN Area 51</track_id>
+      <TestSequence>1</TestSequence>
+    </testsite>
+    <User>
+      <Id>1</Id>
+      <Name>to</Name>
+      <MimeType>application/x-asam.aouser</MimeType>
+      <GivenName>dummy</GivenName>
+      <Surname>dummy</Surname>
+      <users2groups>1</users2groups>
+      <Tests>1</Tests>
+    </User>
+    <Role>
+      <Id>1</Id>
+      <Name>TestOperator</Name>
+      <SuperuserFlag>0</SuperuserFlag>
+      <MimeType>application/x-asam.aorole</MimeType>
+      <groups2users>1</groups2users>
+    </Role>
+  </instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/example_1.bin b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/example_1.bin
new file mode 100644
index 0000000..1cece2d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/example_1.bin
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/importtasktest.atfx b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/importtasktest.atfx
new file mode 100644
index 0000000..e94f8ab
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/test/resources/importtasktest.atfx
@@ -0,0 +1,6563 @@
+<atfx_file xmlns="http://www.asam.net/ODS/5.2.0/Schema" version="atfx_file: V1.2.0">

+  <documentation>

+    <exported_by>openATFX</exported_by>

+    <exporter>openATFX</exporter>

+    <export_date_time>20191122144629</export_date_time>

+    <exporter_version>0.7.4</exporter_version>

+  </documentation>

+  <base_model_version>asam30</base_model_version>

+  <application_model>

+    <application_enumeration>

+      <name>valid_enum</name>

+      <item>

+        <name>editing</name>

+        <value>0</value>

+      </item>

+      <item>

+        <name>valid</name>

+        <value>1</value>

+      </item>

+      <item>

+        <name>archive</name>

+        <value>2</value>

+      </item>

+    </application_enumeration>

+    <application_enumeration>

+      <name>axistype</name>

+      <item>

+        <name>Xaxis</name>

+        <value>0</value>

+      </item>

+      <item>

+        <name>Yaxis</name>

+        <value>1</value>

+      </item>

+      <item>

+        <name>Both</name>

+        <value>2</value>

+      </item>

+    </application_enumeration>

+    <application_element>

+      <name>Environment</name>

+      <basetype>AoEnvironment</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Max_test_level</name>

+        <base_attribute>max_test_level</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Base_model_version</name>

+        <base_attribute>base_model_version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>AppModelType</name>

+        <base_attribute>application_model_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>AppModelVersion</name>

+        <base_attribute>application_model_version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Timezone</name>

+        <base_attribute>timezone</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MeaningOfAliases</name>

+        <base_attribute>meaning_of_aliases</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+    </application_element>

+    <application_element>

+      <name>CatSensor</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatSensorAttr</name>

+        <ref_to>CatSensorAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatTestEquipmentComp</name>

+        <ref_to>CatTestEquipmentComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>CatSensor</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>CatSensorAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueListRef</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueCopyable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestClassname</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestParameter</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatSensor</name>

+        <ref_to>CatSensor</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>CatSensorAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensorAttr</name>

+        <ref_to>TplSensorAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatSensorAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>CatTestEquipmentComp</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatSensor</name>

+        <ref_to>CatSensor</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatTestEquipmentAttr</name>

+        <ref_to>CatTestEquipmentAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentComp</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatTestEquipmentComp</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>CatTestEquipmentAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueListRef</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueCopyable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestClassname</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestParameter</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentAttr</name>

+        <ref_to>TplTestEquipmentAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatTestEquipmentAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatTestEquipmentComp</name>

+        <ref_to>CatTestEquipmentComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>CatTestEquipmentAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>CatTestSequenceComp</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatTestSequenceAttr</name>

+        <ref_to>CatTestSequenceAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatTestSequenceComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceComp</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatTestSequenceComp</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>CatTestSequenceAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueListRef</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueCopyable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestClassname</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestParameter</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatTestSequenceComp</name>

+        <ref_to>CatTestSequenceComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>CatTestSequenceAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceAttr</name>

+        <ref_to>TplTestSequenceAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatTestSequenceAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>CatUnitUnderTestComp</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatUnitUnderTestAttr</name>

+        <ref_to>CatUnitUnderTestAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>CatUnitUnderTestAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>1500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueListRef</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueCopyable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestClassname</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ActionRequestParameter</name>

+        <datatype>DT_STRING</datatype>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatUnitUnderTestComp</name>

+        <ref_to>CatUnitUnderTestComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>CatUnitUnderTestAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestAttr</name>

+        <ref_to>TplUnitUnderTestAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>CatUnitUnderTestAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplGroup</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentRoot</name>

+        <ref_to>TplTestEquipmentRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplGroup</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTest</name>

+        <ref_to>TplTest</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplGroup</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceRoot</name>

+        <ref_to>TplTestSequenceRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplGroup</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestStep</name>

+        <ref_to>TplTestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplGroup</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroupParent</name>

+        <ref_to>TplGroup</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplGroupChild</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroupChild</name>

+        <ref_to>TplGroup</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplGroupParent</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestRoot</name>

+        <ref_to>TplUnitUnderTestRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplGroup</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplMeaResult</name>

+        <ref_to>TplMeaResult</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplGroup</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplMeaResult</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultMimeType</name>

+        <datatype>DT_STRING</datatype>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultName</name>

+        <datatype>DT_STRING</datatype>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplSubMatrix</name>

+        <ref_to>TplSubMatrix</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplMeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestStep</name>

+        <ref_to>TplTestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplMeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroup</name>

+        <ref_to>TplGroup</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplMeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaResult</name>

+        <ref_to>MeaResult</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplMeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplParameterSet</name>

+        <ref_to>TplParameterSet</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplMeaResult</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplSensor</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Optional</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultActive</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>MeaQuantityValuesEditable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>MeaQuantityIndependent</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>MeaQuantityAxisType</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>axistype</enumeration_type>

+      </application_attribute>

+      <application_attribute>

+        <name>MeaQuantityEditorPlugin</name>

+        <datatype>DT_STRING</datatype>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatSensor</name>

+        <ref_to>CatSensor</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensorAttr</name>

+        <ref_to>TplSensorAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Quantity</name>

+        <ref_to>Quantity</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>barometric_pressure</name>

+        <ref_to>barometric_pressure</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplParameterSet</name>

+        <ref_to>TplParameterSet</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>speed</name>

+        <ref_to>speed</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>rotational_speed</name>

+        <ref_to>rotational_speed</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>acceleration</name>

+        <ref_to>acceleration</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>temperature</name>

+        <ref_to>temperature</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>wind_speed</name>

+        <ref_to>wind_speed</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentComp</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>microphone</name>

+        <ref_to>microphone</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>relative_humidity</name>

+        <ref_to>relative_humidity</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSensor</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplSensorAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultValue</name>

+        <datatype>DT_STRING</datatype>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueReadonly</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Obligatory</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplSensorAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatSensorAttr</name>

+        <ref_to>CatSensorAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplSensorAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplSubMatrix</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MinNoRows</name>

+        <datatype>DT_LONG</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>MaxNoRows</name>

+        <datatype>DT_LONG</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplMeaResult</name>

+        <ref_to>TplMeaResult</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplSubMatrix</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>SubMatrix</name>

+        <ref_to>SubMatrix</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplSubMatrix</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTest</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>NameHelperClassname</name>

+        <datatype>DT_STRING</datatype>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DataSourcePluginClassnames</name>

+        <datatype>DS_STRING</datatype>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>TestOrderActionClassnames</name>

+        <datatype>DS_STRING</datatype>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestStepUsage</name>

+        <ref_to>TplTestStepUsage</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroup</name>

+        <ref_to>TplGroup</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Tests</name>

+        <ref_to>Test</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTest</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestEquipmentAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultValue</name>

+        <datatype>DT_STRING</datatype>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueReadonly</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Obligatory</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentComp</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestEquipmentAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatTestEquipmentAttr</name>

+        <ref_to>CatTestEquipmentAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestEquipmentAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestEquipmentRoot</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestStep</name>

+        <ref_to>TplTestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroup</name>

+        <ref_to>TplGroup</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestEquipmentRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentComp</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestEquipment</name>

+        <ref_to>TestEquipment</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentRoot</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestEquipmentComp</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Optional</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultActive</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>TestStepSeriesVariable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentRoot</name>

+        <ref_to>TplTestEquipmentRoot</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>vehicle_measurement</name>

+        <ref_to>vehicle_measurement</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>sound_measurement</name>

+        <ref_to>sound_measurement</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplCompParent</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplCompChildren</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>meteorological_measurement</name>

+        <ref_to>meteorological_measurement</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentAttr</name>

+        <ref_to>TplTestEquipmentAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestEquipmentComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplCompChildren</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplCompParent</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatTestEquipmentComp</name>

+        <ref_to>CatTestEquipmentComp</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestEquipmentComp</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestSequenceAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultValue</name>

+        <datatype>DT_STRING</datatype>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueReadonly</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Obligatory</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>CatTestSequenceAttr</name>

+        <ref_to>CatTestSequenceAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestSequenceAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceComp</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestSequenceAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestSequenceRoot</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestStep</name>

+        <ref_to>TplTestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceComp</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroup</name>

+        <ref_to>TplGroup</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestSequenceRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSequence</name>

+        <ref_to>TestSequence</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceRoot</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestSequenceComp</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Optional</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultActive</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>TestStepSeriesVariable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>SVN_test_conduction</name>

+        <ref_to>SVN_test_conduction</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceRoot</name>

+        <ref_to>TplTestSequenceRoot</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestSequenceComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatTestSequenceComp</name>

+        <ref_to>CatTestSequenceComp</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestSequenceComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplCompParent</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplCompChildren</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>PBN_test_conduction</name>

+        <ref_to>PBN_test_conduction</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>testsite</name>

+        <ref_to>testsite</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>track</name>

+        <ref_to>track</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplCompChildren</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplCompParent</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceAttr</name>

+        <ref_to>TplTestSequenceAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestSequenceComp</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestStepUsage</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultActive</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Optional</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTest</name>

+        <ref_to>TplTest</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestStepUsage</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestStep</name>

+        <ref_to>TplTestStep</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestStepUsage</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplUnitUnderTestAttr</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultValue</name>

+        <datatype>DT_STRING</datatype>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueReadonly</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Obligatory</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplUnitUnderTestAttr</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatUnitUnderTestAttr</name>

+        <ref_to>CatUnitUnderTestAttr</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplUnitUnderTestAttr</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplUnitUnderTestRoot</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestStep</name>

+        <ref_to>TplTestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroup</name>

+        <ref_to>TplGroup</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplUnitUnderTestRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestRoot</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestRoot</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplTestStep</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentRoot</name>

+        <ref_to>TplTestEquipmentRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestStep</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceRoot</name>

+        <ref_to>TplTestSequenceRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestStep</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSteps</name>

+        <ref_to>TestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestStep</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestStepUsage</name>

+        <ref_to>TplTestStepUsage</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestStep</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestRoot</name>

+        <ref_to>TplUnitUnderTestRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestStep</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplGroup</name>

+        <ref_to>TplGroup</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplTestStep</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplMeaResult</name>

+        <ref_to>TplMeaResult</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplTestStep</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplUnitUnderTestComp</name>

+      <basetype>AoAny</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Optional</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultActive</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>TestStepSeriesVariable</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>exhaust_piping</name>

+        <ref_to>exhaust_piping</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>noise_reduction_system</name>

+        <ref_to>noise_reduction_system</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplCompParent</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplCompChildren</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>air_filter</name>

+        <ref_to>air_filter</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplCompChildren</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplCompParent</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>tyre</name>

+        <ref_to>tyre</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>vehicle</name>

+        <ref_to>vehicle</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>expansion_chamber</name>

+        <ref_to>expansion_chamber</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>CatUnitUnderTestComp</name>

+        <ref_to>CatUnitUnderTestComp</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>silencer</name>

+        <ref_to>silencer</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>engine</name>

+        <ref_to>engine</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestRoot</name>

+        <ref_to>TplUnitUnderTestRoot</ref_to>

+        <base_relation>parent</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>gearbox</name>

+        <ref_to>gearbox</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestAttr</name>

+        <ref_to>TplUnitUnderTestAttr</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplUnitUnderTestComp</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>PhysDimension</name>

+      <basetype>AoPhysicalDimension</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Length</name>

+        <base_attribute>length_exp</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Mass</name>

+        <base_attribute>mass_exp</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Time</name>

+        <base_attribute>time_exp</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Current</name>

+        <base_attribute>current_exp</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Temperature</name>

+        <base_attribute>temperature_exp</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>MolarAmount</name>

+        <base_attribute>molar_amount_exp</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>LuminousIntensity</name>

+        <base_attribute>luminous_intensity_exp</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>angle</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>Units</name>

+        <ref_to>Unit</ref_to>

+        <base_relation>units</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>PhysDimension</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>Project</name>

+      <basetype>AoTest</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>StructureLevel</name>

+        <ref_to>StructureLevel</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Project</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>ResultParameterSet</name>

+      <basetype>AoParameterSet</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>ResultParameterSet</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>ResultParameter</name>

+        <ref_to>ResultParameter</ref_to>

+        <base_relation>parameters</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>ResultParameterSet</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaResult</name>

+        <ref_to>MeaResult</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>ResultParameterSet</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>Role</name>

+      <basetype>AoUserGroup</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>SuperuserFlag</name>

+        <base_attribute>superuser_flag</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>groups2users</name>

+        <ref_to>User</ref_to>

+        <base_relation>users</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>users2groups</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TestEquipment</name>

+      <basetype>AoTestEquipment</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentRoot</name>

+        <ref_to>TplTestEquipmentRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TestEquipment</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>vehicle_measurement</name>

+        <ref_to>vehicle_measurement</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestEquipment</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaResults</name>

+        <ref_to>MeaResult</ref_to>

+        <base_relation>measurement</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestEquipment</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>sound_measurement</name>

+        <ref_to>sound_measurement</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestEquipment</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSteps</name>

+        <ref_to>TestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestEquipment</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>meteorological_measurement</name>

+        <ref_to>meteorological_measurement</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestEquipment</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TestSequence</name>

+      <basetype>AoTestSequence</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaResults</name>

+        <ref_to>MeaResult</ref_to>

+        <base_relation>measurement</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestSequence</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>SVN_test_conduction</name>

+        <ref_to>SVN_test_conduction</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestSequence</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceRoot</name>

+        <ref_to>TplTestSequenceRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TestSequence</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSteps</name>

+        <ref_to>TestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestSequence</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>PBN_test_conduction</name>

+        <ref_to>PBN_test_conduction</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestSequence</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>testsite</name>

+        <ref_to>testsite</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestSequence</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>track</name>

+        <ref_to>track</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestSequence</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplParameterSet</name>

+      <basetype>AoParameterSet</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplParameterSet</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplMeaResult</name>

+        <ref_to>TplMeaResult</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplParameterSet</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplParameter</name>

+        <ref_to>TplParameter</ref_to>

+        <base_relation>parameters</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TplParameterSet</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>Unit</name>

+      <basetype>AoUnit</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Factor</name>

+        <base_attribute>factor</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Offset</name>

+        <base_attribute>offset</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>dB</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>dB_reference_factor</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>ResultParameter</name>

+        <ref_to>ResultParameter</ref_to>

+        <base_relation>parameters</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Unit</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>PhysDimension</name>

+        <ref_to>PhysDimension</ref_to>

+        <base_relation>phys_dimension</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>Units</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaQuantities</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Unit</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Quantities</name>

+        <ref_to>Quantity</ref_to>

+        <base_relation>quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Unit</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplParameter</name>

+        <ref_to>TplParameter</ref_to>

+        <base_relation>parameters</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Unit</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>Quantity</name>

+      <basetype>AoQuantity</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultRank</name>

+        <base_attribute>default_rank</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>DefDimension</name>

+        <base_attribute>default_dimension</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>DefTypeSize</name>

+        <base_attribute>default_type_size</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>DefMQName</name>

+        <base_attribute>default_mq_name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefDataType</name>

+        <base_attribute>default_datatype</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>ValidFlag</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>valid_enum</enumeration_type>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Quantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaQuantities</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Quantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Unit</name>

+        <ref_to>Unit</ref_to>

+        <base_relation>default_unit</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>Quantities</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>UnitUnderTest</name>

+      <basetype>AoUnitUnderTest</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Version</name>

+        <base_attribute>version</base_attribute>

+        <obligatory>true</obligatory>

+        <length>20</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>exhaust_piping</name>

+        <ref_to>exhaust_piping</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>expansion_chamber</name>

+        <ref_to>expansion_chamber</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaResults</name>

+        <ref_to>MeaResult</ref_to>

+        <base_relation>measurement</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>noise_reduction_system</name>

+        <ref_to>noise_reduction_system</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>silencer</name>

+        <ref_to>silencer</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSteps</name>

+        <ref_to>TestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>engine</name>

+        <ref_to>engine</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestRoot</name>

+        <ref_to>TplUnitUnderTestRoot</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>air_filter</name>

+        <ref_to>air_filter</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>gearbox</name>

+        <ref_to>gearbox</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>tyre</name>

+        <ref_to>tyre</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>vehicle</name>

+        <ref_to>vehicle</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>UnitUnderTest</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>User</name>

+      <basetype>AoUser</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Password</name>

+        <base_attribute>password</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>GivenName</name>

+        <datatype>DT_STRING</datatype>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Surname</name>

+        <datatype>DT_STRING</datatype>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Department</name>

+        <datatype>DT_STRING</datatype>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Telephone</name>

+        <datatype>DT_STRING</datatype>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>E-Mail</name>

+        <datatype>DT_STRING</datatype>

+        <length>50</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>users2groups</name>

+        <ref_to>Role</ref_to>

+        <base_relation>groups</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>groups2users</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Tests</name>

+        <ref_to>Test</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>ResponsiblePerson</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>ResultParameter</name>

+      <basetype>AoParameter</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DataType</name>

+        <base_attribute>parameter_datatype</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Value</name>

+        <base_attribute>pvalue</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>ResultParameterSet</name>

+        <ref_to>ResultParameterSet</ref_to>

+        <base_relation>parameter_set</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>ResultParameter</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Unit</name>

+        <ref_to>Unit</ref_to>

+        <base_relation>unit</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>ResultParameter</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>SubMatrix</name>

+        <ref_to>SubMatrix</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>ResultParameter</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>StructureLevel</name>

+      <basetype>AoSubTest</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>Project</name>

+        <ref_to>Project</ref_to>

+        <base_relation>parent_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>StructureLevel</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Tests</name>

+        <ref_to>Test</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>StructureLevel</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TplParameter</name>

+      <basetype>AoParameter</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultDataType</name>

+        <base_attribute>parameter_datatype</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>DefaultValue</name>

+        <base_attribute>pvalue</base_attribute>

+        <obligatory>true</obligatory>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>Unit</name>

+        <ref_to>Unit</ref_to>

+        <base_relation>unit</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplParameter</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplParameterSet</name>

+        <ref_to>TplParameterSet</ref_to>

+        <base_relation>parameter_set</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TplParameter</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>Test</name>

+      <basetype>AoSubTest</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MDMLinks</name>

+        <base_attribute>external_references</base_attribute>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateClosed</name>

+        <datatype>DT_DATE</datatype>

+        <length>30</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTest</name>

+        <ref_to>TplTest</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>Tests</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSteps</name>

+        <ref_to>TestStep</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>Test</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>ResponsiblePerson</name>

+        <ref_to>User</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>Tests</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>StructureLevel</name>

+        <ref_to>StructureLevel</ref_to>

+        <base_relation>parent_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>Tests</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>TestStep</name>

+      <basetype>AoSubTest</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MDMLinks</name>

+        <base_attribute>external_references</base_attribute>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Optional</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>Sortindex</name>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaResults</name>

+        <ref_to>MeaResult</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>TestStep</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestStep</name>

+        <ref_to>TplTestStep</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TestSteps</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Test</name>

+        <ref_to>Test</ref_to>

+        <base_relation>parent_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TestSteps</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSequence</name>

+        <ref_to>TestSequence</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TestSteps</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestEquipment</name>

+        <ref_to>TestEquipment</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TestSteps</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>TestSteps</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>MeaResult</name>

+      <basetype>AoMeasurement</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>100</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DateCreated</name>

+        <base_attribute>version_date</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MeasurementBegin</name>

+        <base_attribute>measurement_begin</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MeasurementEnd</name>

+        <base_attribute>measurement_end</base_attribute>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MDMLinks</name>

+        <base_attribute>external_references</base_attribute>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TestStep</name>

+        <ref_to>TestStep</ref_to>

+        <base_relation>test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaResults</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>ResultParameterSet</name>

+        <ref_to>ResultParameterSet</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>MeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>SubMatrices</name>

+        <ref_to>SubMatrix</ref_to>

+        <base_relation>submatrices</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>MeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaQuantities</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>MeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplMeaResult</name>

+        <ref_to>TplMeaResult</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaResult</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSequence</name>

+        <ref_to>TestSequence</ref_to>

+        <base_relation>sequences</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaResults</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestEquipment</name>

+        <ref_to>TestEquipment</ref_to>

+        <base_relation>equipments</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaResults</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>units_under_test</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaResults</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>MeaQuantity</name>

+      <basetype>AoMeasurementQuantity</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>DataType</name>

+        <base_attribute>datatype</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Description</name>

+        <base_attribute>description</base_attribute>

+        <length>500</length>

+      </application_attribute>

+      <application_attribute>

+        <name>Interpolation</name>

+        <base_attribute>interpolation</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Rank</name>

+        <base_attribute>rank</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Dimension</name>

+        <base_attribute>dimension</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>TypeSize</name>

+        <base_attribute>type_size</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Minimum</name>

+        <base_attribute>minimum</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Maximum</name>

+        <base_attribute>maximum</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Average</name>

+        <base_attribute>average</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Deviation</name>

+        <base_attribute>standard_deviation</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>non_reference_channel_name</name>

+        <datatype>DT_STRING</datatype>

+        <length>128</length>

+      </application_attribute>

+      <application_attribute>

+        <name>reference_channel_name</name>

+        <datatype>DT_STRING</datatype>

+        <length>128</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>ResultParameterSet</name>

+        <ref_to>ResultParameterSet</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Quantity</name>

+        <ref_to>Quantity</ref_to>

+        <base_relation>quantity</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantities</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>barometric_pressure</name>

+        <ref_to>barometric_pressure</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>Unit</name>

+        <ref_to>Unit</ref_to>

+        <base_relation>unit</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantities</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>speed</name>

+        <ref_to>speed</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>rotational_speed</name>

+        <ref_to>rotational_speed</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>acceleration</name>

+        <ref_to>acceleration</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>temperature</name>

+        <ref_to>temperature</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>wind_speed</name>

+        <ref_to>wind_speed</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>LocalColumns</name>

+        <ref_to>LocalColumn</ref_to>

+        <base_relation>local_columns</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>microphone</name>

+        <ref_to>microphone</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>relative_humidity</name>

+        <ref_to>relative_humidity</ref_to>

+        <base_relation>channel</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaResult</name>

+        <ref_to>MeaResult</ref_to>

+        <base_relation>measurement</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>MeaQuantities</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>SubMatrix</name>

+      <basetype>AoSubmatrix</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>SubMatrixNoRows</name>

+        <base_attribute>number_of_rows</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>y-axis-for-x-axis</name>

+        <ref_to>SubMatrix</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>x-axis-for-y-axis</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSubMatrix</name>

+        <ref_to>TplSubMatrix</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>SubMatrix</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>ResultParameter</name>

+        <ref_to>ResultParameter</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>SubMatrix</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>y-axis-for-z-axis</name>

+        <ref_to>SubMatrix</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>z-axis-for-y-axis</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>x-axis-for-y-axis</name>

+        <ref_to>SubMatrix</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>y-axis-for-x-axis</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>LocalColumns</name>

+        <ref_to>LocalColumn</ref_to>

+        <base_relation>local_columns</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>SubMatrix</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>z-axis-for-y-axis</name>

+        <ref_to>SubMatrix</ref_to>

+        <min_occurs>0</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>y-axis-for-z-axis</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaResult</name>

+        <ref_to>MeaResult</ref_to>

+        <base_relation>measurement</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>SubMatrices</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>LocalColumn</name>

+      <basetype>AoLocalColumn</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>IndependentFlag</name>

+        <base_attribute>independent</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>SequenceRepresentation</name>

+        <base_attribute>sequence_representation</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>GlobalFlag</name>

+        <base_attribute>global_flag</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Values</name>

+        <base_attribute>values</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>Flags</name>

+        <base_attribute>flags</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>GenerationParameters</name>

+        <base_attribute>generation_parameters</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>RawDatatype</name>

+        <base_attribute>raw_datatype</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>axistype</name>

+        <datatype>DT_ENUM</datatype>

+        <enumeration_type>axistype</enumeration_type>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantity</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>LocalColumns</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>ExternalComponent</name>

+        <ref_to>ExternalComponent</ref_to>

+        <base_relation>external_component</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>LocalColumn</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>SubMatrix</name>

+        <ref_to>SubMatrix</ref_to>

+        <base_relation>submatrix</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>LocalColumns</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>ExternalComponent</name>

+      <basetype>AoExternalComponent</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>150</length>

+      </application_attribute>

+      <application_attribute>

+        <name>FilenameURL</name>

+        <base_attribute>filename_url</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>TypeSpecification</name>

+        <base_attribute>value_type</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Length</name>

+        <base_attribute>component_length</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>StartOffset</name>

+        <base_attribute>start_offset</base_attribute>

+        <datatype>DT_LONG</datatype>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Blocksize</name>

+        <base_attribute>block_size</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>ValuesPerBlock</name>

+        <base_attribute>valuesperblock</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>ValueOffset</name>

+        <base_attribute>value_offset</base_attribute>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>OrdinalNumber</name>

+        <base_attribute>ordinal_number</base_attribute>

+      </application_attribute>

+      <application_attribute>

+        <name>FlagsFilenameURL</name>

+        <base_attribute>flags_filename_url</base_attribute>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>FlagsStartOffset</name>

+        <base_attribute>flags_start_offset</base_attribute>

+        <datatype>DT_LONG</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>LocalColumn</name>

+        <ref_to>LocalColumn</ref_to>

+        <base_relation>local_column</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>ExternalComponent</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>air_filter</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>min_bulk_material_density</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>air_filter</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>air_filter</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>engine</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>manufacturer</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>model</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>type</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>power</name>

+        <datatype>DT_SHORT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>engine</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>engine</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>exhaust_piping</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>material</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>length</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>exhaust_piping</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>exhaust_piping</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>expansion_chamber</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>volume</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>expansion_chamber</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>expansion_chamber</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>gearbox</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>transmission</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>no_forward_gears</name>

+        <datatype>DT_SHORT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>gearbox</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>gearbox</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>noise_reduction_system</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>design_family</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>noise_reduction_system</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>noise_reduction_system</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>silencer</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>location</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>manufacturer</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>model</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>type</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>fibre_type</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>silencer</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>silencer</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>tyre</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>manufacturer</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>axle</name>

+        <datatype>DT_SHORT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>side</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>size</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>tread_depth</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>tyre</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>tyre</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>vehicle</name>

+      <basetype>AoUnitUnderTestPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>manufacturer</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>model</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>vehicle_type</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>vehicle_category</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>maximum_authorized_mass</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>length</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>reference_point</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>mass_in_running_order</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplUnitUnderTestComp</name>

+        <ref_to>TplUnitUnderTestComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>vehicle</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>UnitUnderTest</name>

+        <ref_to>UnitUnderTest</ref_to>

+        <base_relation>parent_unit_under_test</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>vehicle</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>PBN_test_conduction</name>

+      <basetype>AoTestSequencePart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>tested_vehicle_side</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>v_test</name>

+        <datatype>DT_LONG</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>PMR</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>accelerated</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceComp</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>PBN_test_conduction</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSequence</name>

+        <ref_to>TestSequence</ref_to>

+        <base_relation>parent_sequence</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>PBN_test_conduction</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>SVN_test_conduction</name>

+      <basetype>AoTestSequencePart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceComp</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>SVN_test_conduction</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSequence</name>

+        <ref_to>TestSequence</ref_to>

+        <base_relation>parent_sequence</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>SVN_test_conduction</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>testsite</name>

+      <basetype>AoTestSequencePart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>track_id</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceComp</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>testsite</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSequence</name>

+        <ref_to>TestSequence</ref_to>

+        <base_relation>parent_sequence</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>testsite</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>track</name>

+      <basetype>AoTestSequencePart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>residual_voids_content</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>sound_absorption_coefficient</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>texture_depth</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>surface_homogeneity</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>last_check_texture_depth</name>

+        <datatype>DT_DATE</datatype>

+        <length>30</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestSequenceComp</name>

+        <ref_to>TplTestSequenceComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>track</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestSequence</name>

+        <ref_to>TestSequence</ref_to>

+        <base_relation>parent_sequence</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>track</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>meteorological_measurement</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>temperature</name>

+        <ref_to>temperature</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>meteorological_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>barometric_pressure</name>

+        <ref_to>barometric_pressure</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>meteorological_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>wind_speed</name>

+        <ref_to>wind_speed</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>meteorological_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentComp</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>meteorological_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>relative_humidity</name>

+        <ref_to>relative_humidity</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>meteorological_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestEquipment</name>

+        <ref_to>TestEquipment</ref_to>

+        <base_relation>parent_equipment</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>meteorological_measurement</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>sound_measurement</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentComp</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>sound_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>microphone</name>

+        <ref_to>microphone</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>sound_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestEquipment</name>

+        <ref_to>TestEquipment</ref_to>

+        <base_relation>parent_equipment</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>sound_measurement</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>vehicle_measurement</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>rotational_speed</name>

+        <ref_to>rotational_speed</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>vehicle_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>acceleration</name>

+        <ref_to>acceleration</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>vehicle_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplTestEquipmentComp</name>

+        <ref_to>TplTestEquipmentComp</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>vehicle_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TestEquipment</name>

+        <ref_to>TestEquipment</ref_to>

+        <base_relation>parent_equipment</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>vehicle_measurement</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>speed</name>

+        <ref_to>speed</ref_to>

+        <base_relation>children</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>vehicle_measurement</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>acceleration</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>direction</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>last_calibration</name>

+        <datatype>DT_DATE</datatype>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>location</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>manufacturer</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>type_code</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>vehicle_measurement</name>

+        <ref_to>vehicle_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>acceleration</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>acceleration</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>acceleration</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>rotational_speed</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>vehicle_measurement</name>

+        <ref_to>vehicle_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>rotational_speed</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>rotational_speed</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>rotational_speed</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>speed</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>direction</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>vehicle_measurement</name>

+        <ref_to>vehicle_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>speed</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>speed</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>speed</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>microphone</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>distance_from_target</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>heigth_above_ground</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>last_calibration</name>

+        <datatype>DT_DATE</datatype>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>manufacturer</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>type_code</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>windscreen_applied</name>

+        <datatype>DT_BOOLEAN</datatype>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>microphone</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>sound_measurement</name>

+        <ref_to>sound_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>microphone</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>microphone</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>barometric_pressure</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>height_above_ground</name>

+        <datatype>DT_FLOAT</datatype>

+      </application_attribute>

+      <application_attribute>

+        <name>last_calibration</name>

+        <datatype>DT_DATE</datatype>

+        <length>30</length>

+      </application_attribute>

+      <application_attribute>

+        <name>manufacturer</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <application_attribute>

+        <name>type_code</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>barometric_pressure</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>barometric_pressure</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>meteorological_measurement</name>

+        <ref_to>meteorological_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>barometric_pressure</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>relative_humidity</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>relative_humidity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>relative_humidity</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>meteorological_measurement</name>

+        <ref_to>meteorological_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>relative_humidity</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>temperature</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>temperature</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>temperature</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>meteorological_measurement</name>

+        <ref_to>meteorological_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>temperature</inverse_name>

+      </relation_attribute>

+    </application_element>

+    <application_element>

+      <name>wind_speed</name>

+      <basetype>AoTestEquipmentPart</basetype>

+      <application_attribute>

+        <name>Id</name>

+        <base_attribute>id</base_attribute>

+        <autogenerate>true</autogenerate>

+        <obligatory>true</obligatory>

+      </application_attribute>

+      <application_attribute>

+        <name>Name</name>

+        <base_attribute>name</base_attribute>

+        <obligatory>true</obligatory>

+        <length>50</length>

+      </application_attribute>

+      <application_attribute>

+        <name>MimeType</name>

+        <base_attribute>mime_type</base_attribute>

+        <obligatory>true</obligatory>

+        <length>256</length>

+      </application_attribute>

+      <application_attribute>

+        <name>wind_direction</name>

+        <datatype>DT_STRING</datatype>

+        <length>254</length>

+      </application_attribute>

+      <relation_attribute>

+        <name>MeaQuantity</name>

+        <ref_to>MeaQuantity</ref_to>

+        <base_relation>measurement_quantities</base_relation>

+        <min_occurs>0</min_occurs>

+        <max_occurs>Many</max_occurs>

+        <inverse_name>wind_speed</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>TplSensor</name>

+        <ref_to>TplSensor</ref_to>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>wind_speed</inverse_name>

+      </relation_attribute>

+      <relation_attribute>

+        <name>meteorological_measurement</name>

+        <ref_to>meteorological_measurement</ref_to>

+        <base_relation>parent_equipment_part</base_relation>

+        <min_occurs>1</min_occurs>

+        <max_occurs>1</max_occurs>

+        <inverse_name>wind_speed</inverse_name>

+      </relation_attribute>

+    </application_element>

+  </application_model>

+  <instance_data>

+    <Environment>

+      <Id>1</Id>

+      <Name>MDM</Name>

+      <MimeType>application/x-asam.aoenvironment</MimeType>

+      <Description>MDM Environment</Description>

+      <DateCreated>20120214120000</DateCreated>

+      <Max_test_level>4</Max_test_level>

+      <Base_model_version>asam30</Base_model_version>

+      <AppModelType>ASAM_SECURITY,ASAM_NVH,ASAM_WORKFLOW,MDM</AppModelType>

+      <AppModelVersion>4.4.1</AppModelVersion>

+      <Timezone>GMT</Timezone>

+      <MeaningOfAliases>

+        <s>,language=en</s>

+        <s>,language=de</s>

+      </MeaningOfAliases>

+    </Environment>

+    <CatSensor>

+      <Id>1</Id>

+      <Name>barometric_pressure</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatSensorAttr>1 2 3 4</CatSensorAttr>

+      <CatTestEquipmentComp>1</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensor>

+      <Id>2</Id>

+      <Name>relative_humidity</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatTestEquipmentComp>1</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensor>

+      <Id>3</Id>

+      <Name>temperature</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatTestEquipmentComp>1</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensor>

+      <Id>4</Id>

+      <Name>wind_speed</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatSensorAttr>5</CatSensorAttr>

+      <CatTestEquipmentComp>1</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensor>

+      <Id>5</Id>

+      <Name>microphone</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatSensorAttr>6 7 8 9 10 11</CatSensorAttr>

+      <CatTestEquipmentComp>2</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensor>

+      <Id>6</Id>

+      <Name>acceleration</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatSensorAttr>12 13 14 15 16</CatSensorAttr>

+      <CatTestEquipmentComp>3</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensor>

+      <Id>7</Id>

+      <Name>rotational_speed</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatTestEquipmentComp>3</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensor>

+      <Id>8</Id>

+      <Name>speed</Name>

+      <MimeType>application/x-asam.aoany.catsensor</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <CatSensorAttr>17</CatSensorAttr>

+      <CatTestEquipmentComp>3</CatTestEquipmentComp>

+    </CatSensor>

+    <CatSensorAttr>

+      <Id>1</Id>

+      <Name>height_above_ground</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatSensor>1</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>2</Id>

+      <Name>last_calibration</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatSensor>1</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>3</Id>

+      <Name>manufacturer</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatSensor>1</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>4</Id>

+      <Name>type_code</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatSensor>1</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>5</Id>

+      <Name>wind_direction</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatSensor>4</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>6</Id>

+      <Name>distance_from_target</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatSensor>5</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>7</Id>

+      <Name>heigth_above_ground</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatSensor>5</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>8</Id>

+      <Name>last_calibration</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatSensor>5</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>9</Id>

+      <Name>manufacturer</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatSensor>5</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>10</Id>

+      <Name>type_code</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>5</Sortindex>

+      <CatSensor>5</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>11</Id>

+      <Name>windscreen_applied</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>6</Sortindex>

+      <CatSensor>5</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>12</Id>

+      <Name>direction</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatSensor>6</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>13</Id>

+      <Name>last_calibration</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatSensor>6</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>14</Id>

+      <Name>location</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatSensor>6</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>15</Id>

+      <Name>manufacturer</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatSensor>6</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>16</Id>

+      <Name>type_code</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>5</Sortindex>

+      <CatSensor>6</CatSensor>

+    </CatSensorAttr>

+    <CatSensorAttr>

+      <Id>17</Id>

+      <Name>direction</Name>

+      <MimeType>application/x-asam.aoany.catsensorattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatSensor>8</CatSensor>

+    </CatSensorAttr>

+    <CatTestEquipmentComp>

+      <Id>1</Id>

+      <Name>meteorological_measurement</Name>

+      <MimeType>application/x-asam.aoany.cattestequipmentcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatSensor>1 2 3 4</CatSensor>

+    </CatTestEquipmentComp>

+    <CatTestEquipmentComp>

+      <Id>2</Id>

+      <Name>sound_measurement</Name>

+      <MimeType>application/x-asam.aoany.cattestequipmentcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatSensor>5</CatSensor>

+    </CatTestEquipmentComp>

+    <CatTestEquipmentComp>

+      <Id>3</Id>

+      <Name>vehicle_measurement</Name>

+      <MimeType>application/x-asam.aoany.cattestequipmentcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatSensor>6 7 8</CatSensor>

+    </CatTestEquipmentComp>

+    <CatTestSequenceComp>

+      <Id>1</Id>

+      <Name>PBN_test_conduction</Name>

+      <MimeType>application/x-asam.aoany.cattestsequencecomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatTestSequenceAttr>1 2 3 4</CatTestSequenceAttr>

+    </CatTestSequenceComp>

+    <CatTestSequenceComp>

+      <Id>2</Id>

+      <Name>SVN_test_conduction</Name>

+      <MimeType>application/x-asam.aoany.cattestsequencecomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+    </CatTestSequenceComp>

+    <CatTestSequenceComp>

+      <Id>3</Id>

+      <Name>testsite</Name>

+      <MimeType>application/x-asam.aoany.cattestsequencecomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatTestSequenceAttr>5</CatTestSequenceAttr>

+    </CatTestSequenceComp>

+    <CatTestSequenceComp>

+      <Id>4</Id>

+      <Name>track</Name>

+      <MimeType>application/x-asam.aoany.cattestsequencecomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatTestSequenceAttr>6 7 8 9 10</CatTestSequenceAttr>

+    </CatTestSequenceComp>

+    <CatTestSequenceAttr>

+      <Id>1</Id>

+      <Name>tested_vehicle_side</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatTestSequenceComp>1</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>2</Id>

+      <Name>v_test</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatTestSequenceComp>1</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>3</Id>

+      <Name>PMR</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatTestSequenceComp>1</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>4</Id>

+      <Name>accelerated</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatTestSequenceComp>1</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>5</Id>

+      <Name>track_id</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatTestSequenceComp>3</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>6</Id>

+      <Name>residual_voids_content</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatTestSequenceComp>4</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>7</Id>

+      <Name>sound_absorption_coefficient</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatTestSequenceComp>4</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>8</Id>

+      <Name>texture_depth</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatTestSequenceComp>4</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>9</Id>

+      <Name>surface_homogeneity</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatTestSequenceComp>4</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatTestSequenceAttr>

+      <Id>10</Id>

+      <Name>last_check_texture_depth</Name>

+      <MimeType>application/x-asam.aoany.cattestsequenceattr</MimeType>

+      <Sortindex>5</Sortindex>

+      <CatTestSequenceComp>4</CatTestSequenceComp>

+    </CatTestSequenceAttr>

+    <CatUnitUnderTestComp>

+      <Id>1</Id>

+      <Name>air_filter</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>1</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>2</Id>

+      <Name>engine</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>2 3 4 5</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>3</Id>

+      <Name>exhaust_piping</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>6 7</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>4</Id>

+      <Name>expansion_chamber</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>8</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>5</Id>

+      <Name>gearbox</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>9 10</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>6</Id>

+      <Name>noise_reduction_system</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>11</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>7</Id>

+      <Name>silencer</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>12 13 14 15 16</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>8</Id>

+      <Name>tyre</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>17 18 19 20 21</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestComp>

+      <Id>9</Id>

+      <Name>vehicle</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestcomp</MimeType>

+      <DateCreated>20191122144614</DateCreated>

+      <ValidFlag>valid</ValidFlag>

+      <CatUnitUnderTestAttr>22 23 24 25 26 27 28 29</CatUnitUnderTestAttr>

+    </CatUnitUnderTestComp>

+    <CatUnitUnderTestAttr>

+      <Id>1</Id>

+      <Name>min_bulk_material_density</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>1</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>2</Id>

+      <Name>manufacturer</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>2</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>3</Id>

+      <Name>model</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatUnitUnderTestComp>2</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>4</Id>

+      <Name>type</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatUnitUnderTestComp>2</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>5</Id>

+      <Name>power</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatUnitUnderTestComp>2</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>6</Id>

+      <Name>material</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>3</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>7</Id>

+      <Name>length</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatUnitUnderTestComp>3</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>8</Id>

+      <Name>volume</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>4</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>9</Id>

+      <Name>transmission</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>5</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>10</Id>

+      <Name>no_forward_gears</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatUnitUnderTestComp>5</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>11</Id>

+      <Name>design_family</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>6</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>12</Id>

+      <Name>location</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>7</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>13</Id>

+      <Name>manufacturer</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatUnitUnderTestComp>7</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>14</Id>

+      <Name>model</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatUnitUnderTestComp>7</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>15</Id>

+      <Name>type</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatUnitUnderTestComp>7</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>16</Id>

+      <Name>fibre_type</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>5</Sortindex>

+      <CatUnitUnderTestComp>7</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>17</Id>

+      <Name>manufacturer</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>8</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>18</Id>

+      <Name>axle</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatUnitUnderTestComp>8</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>19</Id>

+      <Name>side</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatUnitUnderTestComp>8</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>20</Id>

+      <Name>size</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatUnitUnderTestComp>8</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>21</Id>

+      <Name>tread_depth</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>5</Sortindex>

+      <CatUnitUnderTestComp>8</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>22</Id>

+      <Name>manufacturer</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>1</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>23</Id>

+      <Name>model</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>2</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>24</Id>

+      <Name>vehicle_type</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>3</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>25</Id>

+      <Name>vehicle_category</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>4</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>26</Id>

+      <Name>maximum_authorized_mass</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>5</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>27</Id>

+      <Name>length</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>6</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>28</Id>

+      <Name>reference_point</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>7</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <CatUnitUnderTestAttr>

+      <Id>29</Id>

+      <Name>mass_in_running_order</Name>

+      <MimeType>application/x-asam.aoany.catunitundertestattr</MimeType>

+      <Sortindex>8</Sortindex>

+      <CatUnitUnderTestComp>9</CatUnitUnderTestComp>

+    </CatUnitUnderTestAttr>

+    <PhysDimension>

+      <Id>1</Id>

+      <Name>pressure</Name>

+      <Length>-1</Length>

+      <Mass>1</Mass>

+      <Time>-2</Time>

+      <Current>0</Current>

+      <Temperature>0</Temperature>

+      <MolarAmount>0</MolarAmount>

+      <LuminousIntensity>0</LuminousIntensity>

+      <MimeType>application/x-asam.aophysicaldimension</MimeType>

+      <Description>unit: pascal</Description>

+      <angle>0</angle>

+      <Units>1</Units>

+    </PhysDimension>

+    <PhysDimension>

+      <Id>2</Id>

+      <Name>time</Name>

+      <Length>0</Length>

+      <Mass>0</Mass>

+      <Time>1</Time>

+      <Current>0</Current>

+      <Temperature>0</Temperature>

+      <MolarAmount>0</MolarAmount>

+      <LuminousIntensity>0</LuminousIntensity>

+      <MimeType>application/x-asam.aophysicaldimension</MimeType>

+      <angle>0</angle>

+      <Units>2</Units>

+    </PhysDimension>

+    <Project>

+      <Id>1</Id>

+      <Name>PMV Model P</Name>

+      <MimeType>application/x-asam.aotest</MimeType>

+      <StructureLevel>1</StructureLevel>

+    </Project>

+    <TestEquipment>

+      <Id>1</Id>

+      <Name>PBN_setup</Name>

+      <Version>1</Version>

+      <MimeType>application/x-asam.aotestequipment.testequipment</MimeType>

+      <TplTestEquipmentRoot>0</TplTestEquipmentRoot>

+      <vehicle_measurement>1</vehicle_measurement>

+      <sound_measurement>1</sound_measurement>

+      <TestSteps>1</TestSteps>

+      <meteorological_measurement>1</meteorological_measurement>

+    </TestEquipment>

+    <TestEquipment>

+      <Id>2</Id>

+      <Name>PBN_setup</Name>

+      <Version>2</Version>

+      <MimeType>application/x-asam.aotestequipment.testequipment</MimeType>

+      <TplTestEquipmentRoot>0</TplTestEquipmentRoot>

+      <vehicle_measurement>2</vehicle_measurement>

+      <MeaResults>1</MeaResults>

+      <sound_measurement>2</sound_measurement>

+      <meteorological_measurement>2</meteorological_measurement>

+    </TestEquipment>

+    <TestSequence>

+      <Id>1</Id>

+      <Name>PBN_emission_testing</Name>

+      <Version>1</Version>

+      <MimeType>application/x-asam.aotestsequence.testsequence</MimeType>

+      <TplTestSequenceRoot>0</TplTestSequenceRoot>

+      <TestSteps>1</TestSteps>

+      <PBN_test_conduction>1</PBN_test_conduction>

+      <testsite>1</testsite>

+      <track>1</track>

+    </TestSequence>

+    <TestSequence>

+      <Id>2</Id>

+      <Name>PBN_emission_testing</Name>

+      <Version>2</Version>

+      <MimeType>application/x-asam.aotestsequence.testsequence</MimeType>

+      <MeaResults>1</MeaResults>

+      <TplTestSequenceRoot>0</TplTestSequenceRoot>

+      <PBN_test_conduction>2</PBN_test_conduction>

+      <testsite>2</testsite>

+      <track>2</track>

+    </TestSequence>

+    <Unit>

+      <Id>1</Id>

+      <Name>Pa</Name>

+      <Factor>1.0</Factor>

+      <Offset>0.0</Offset>

+      <MimeType>application/x-asam.aounit</MimeType>

+      <dB>false</dB>

+      <PhysDimension>1</PhysDimension>

+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>

+      <Quantities>1</Quantities>

+    </Unit>

+    <Unit>

+      <Id>2</Id>

+      <Name>s</Name>

+      <Factor>1.0</Factor>

+      <Offset>0.0</Offset>

+      <MimeType>application/x-asam.aounit</MimeType>

+      <dB>false</dB>

+      <PhysDimension>2</PhysDimension>

+      <MeaQuantities>11</MeaQuantities>

+      <Quantities>2</Quantities>

+    </Unit>

+    <Quantity>

+      <Id>1</Id>

+      <Name>Noise</Name>

+      <Version>1</Version>

+      <MimeType>application/x-asam.aoquantity</MimeType>

+      <DateCreated>20190703154539</DateCreated>

+      <DefaultRank>1</DefaultRank>

+      <DefDimension>0</DefDimension>

+      <DefTypeSize>1</DefTypeSize>

+      <DefMQName>Noise</DefMQName>

+      <DefDataType>DT_FLOAT</DefDataType>

+      <ValidFlag>valid</ValidFlag>

+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>

+      <Unit>1</Unit>

+    </Quantity>

+    <Quantity>

+      <Id>2</Id>

+      <Name>Time</Name>

+      <Version>1</Version>

+      <MimeType>application/x-asam.aoquantity</MimeType>

+      <DateCreated>20190703154557</DateCreated>

+      <DefaultRank>1</DefaultRank>

+      <DefDimension>0</DefDimension>

+      <DefTypeSize>1</DefTypeSize>

+      <DefMQName>Time</DefMQName>

+      <DefDataType>DT_FLOAT</DefDataType>

+      <ValidFlag>valid</ValidFlag>

+      <MeaQuantities>11</MeaQuantities>

+      <Unit>2</Unit>

+    </Quantity>

+    <UnitUnderTest>

+      <Id>1</Id>

+      <Name>PBN_vehicle</Name>

+      <Version>1</Version>

+      <MimeType>application/x-asam.aounitundertest.unitundertest</MimeType>

+      <exhaust_piping>1</exhaust_piping>

+      <expansion_chamber>1</expansion_chamber>

+      <noise_reduction_system>1</noise_reduction_system>

+      <silencer>1 2</silencer>

+      <TestSteps>1</TestSteps>

+      <engine>1</engine>

+      <TplUnitUnderTestRoot>0</TplUnitUnderTestRoot>

+      <air_filter>1</air_filter>

+      <gearbox>1</gearbox>

+      <tyre>1 2 3 4</tyre>

+      <vehicle>1</vehicle>

+    </UnitUnderTest>

+    <UnitUnderTest>

+      <Id>2</Id>

+      <Name>PBN_vehicle</Name>

+      <Version>2</Version>

+      <MimeType>application/x-asam.aounitundertest.unitundertest</MimeType>

+      <exhaust_piping>2</exhaust_piping>

+      <expansion_chamber>2</expansion_chamber>

+      <MeaResults>1</MeaResults>

+      <noise_reduction_system>2</noise_reduction_system>

+      <silencer>3 4</silencer>

+      <engine>2</engine>

+      <TplUnitUnderTestRoot>0</TplUnitUnderTestRoot>

+      <air_filter>2</air_filter>

+      <gearbox>2</gearbox>

+      <tyre>5 6 7 8</tyre>

+      <vehicle>2</vehicle>

+    </UnitUnderTest>

+    <StructureLevel>

+      <Id>1</Id>

+      <Name>PBN Measurements</Name>

+      <MimeType>application/x-asam.aosubtest.structurelevel</MimeType>

+      <Project>1</Project>

+      <Tests>1</Tests>

+    </StructureLevel>

+    <Test>

+      <Id>1</Id>

+      <Name>PBN_UNECE_R51_20190703160224</Name>

+      <MimeType>application/x-asam.aosubtest.test</MimeType>

+      <DateCreated>20190703160224</DateCreated>

+      <DateClosed>20190703160224</DateClosed>

+      <TplTest>0</TplTest>

+      <TestSteps>1</TestSteps>

+      <ResponsiblePerson>0</ResponsiblePerson>

+      <StructureLevel>1</StructureLevel>

+    </Test>

+    <TestStep>

+      <Id>1</Id>

+      <Name>ImportTaskTest</Name>

+      <MimeType>application/x-asam.aosubtest.teststep</MimeType>

+      <DateCreated>20190703160224</DateCreated>

+      <Optional>true</Optional>

+      <Sortindex>40</Sortindex>

+      <MeaResults>1</MeaResults>

+      <TplTestStep>0</TplTestStep>

+      <Test>1</Test>

+      <TestSequence>1</TestSequence>

+      <TestEquipment>1</TestEquipment>

+      <UnitUnderTest>1</UnitUnderTest>

+    </TestStep>

+    <MeaResult>

+      <Id>1</Id>

+      <Name>Channel</Name>

+      <MimeType>application/x-asam.aomeasurement</MimeType>

+      <DateCreated>20190703160230</DateCreated>

+      <TestStep>1</TestStep>

+      <SubMatrices>1</SubMatrices>

+      <MeaQuantities>1 2 3 4 5 6 7 8 9 10 11</MeaQuantities>

+      <TplMeaResult>0</TplMeaResult>

+      <TestSequence>2</TestSequence>

+      <TestEquipment>2</TestEquipment>

+      <UnitUnderTest>2</UnitUnderTest>

+    </MeaResult>

+    <MeaQuantity>

+      <Id>1</Id>

+      <Name>CHANNEL01</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>5</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>2</Id>

+      <Name>CHANNEL02</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>9</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>3</Id>

+      <Name>CHANNEL03</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>4</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>4</Id>

+      <Name>CHANNEL04</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>7</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>5</Id>

+      <Name>CHANNEL05</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>2</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>6</Id>

+      <Name>CHANNEL06</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>6</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>7</Id>

+      <Name>CHANNEL07</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>8</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>8</Id>

+      <Name>CHANNEL08</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>3</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>9</Id>

+      <Name>CHANNEL09</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>10</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>10</Id>

+      <Name>CHANNEL10</Name>

+      <DataType>DT_DOUBLE</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>1</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>1</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>11</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <MeaQuantity>

+      <Id>11</Id>

+      <Name>X-Axis</Name>

+      <DataType>DT_LONG</DataType>

+      <MimeType>application/x-asam.aomeasurementquantity</MimeType>

+      <Interpolation>no_interpolation</Interpolation>

+      <Rank>1</Rank>

+      <TypeSize>1</TypeSize>

+      <Quantity>2</Quantity>

+      <barometric_pressure>0</barometric_pressure>

+      <Unit>2</Unit>

+      <speed>0</speed>

+      <rotational_speed>0</rotational_speed>

+      <acceleration>0</acceleration>

+      <temperature>0</temperature>

+      <wind_speed>0</wind_speed>

+      <LocalColumns>1</LocalColumns>

+      <microphone>0</microphone>

+      <relative_humidity>0</relative_humidity>

+      <MeaResult>1</MeaResult>

+    </MeaQuantity>

+    <SubMatrix>

+      <Id>1</Id>

+      <Name>Channel</Name>

+      <SubMatrixNoRows>3001</SubMatrixNoRows>

+      <MimeType>application/x-asam.aosubmatrix</MimeType>

+      <TplSubMatrix>0</TplSubMatrix>

+      <x-axis-for-y-axis>0</x-axis-for-y-axis>

+      <LocalColumns>1 2 3 4 5 6 7 8 9 10 11</LocalColumns>

+      <z-axis-for-y-axis>0</z-axis-for-y-axis>

+      <MeaResult>1</MeaResult>

+    </SubMatrix>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_INT32>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001</A_INT32>

+      </Values>

+      <Id>1</Id>

+      <Name>X-Axis</Name>

+      <IndependentFlag>1</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_LONG</RawDatatype>

+      <axistype>Xaxis</axistype>

+      <MeaQuantity>11</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 1.86265E-6 -6.52153 1.86265E-6 -6.52153 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 -6.52153 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 1.86265E-6 -6.52153 -6.52153 -6.52153 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -13.0431 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 1.86265E-6 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 1.86265E-6 -6.52153 -6.52153 -6.52153 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 -6.52153 -6.52153 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 -6.52153 -6.52153 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 -6.52153 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 1.86265E-6 -6.52153 1.86265E-6 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -6.52153 -13.0431 -13.0431 -13.0431 -6.52153 -13.0431 -13.0431 -13.0431 -13.0431 -13.0431 -13.0431 -13.0431 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -19.5646 -26.0861 -19.5646 -26.0861 -19.5646 -26.0861 -19.5646 -26.0861 -26.0861 -19.5646 -19.5646 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -32.6076 -32.6076 -32.6076 -32.6076 -32.6076 -32.6076 -39.1292 -39.1292 -39.1292 -45.6507 -45.6507 -45.6507 -52.1722 -52.1722 -45.6507 -52.1722 -52.1722 -52.1722 -52.1722 -58.6938 -58.6938 -52.1722 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -52.1722 -58.6938 -58.6938 -58.6938 -52.1722 -52.1722 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -52.1722 -52.1722 -52.1722 -52.1722 -52.1722 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -52.1722 -52.1722 -52.1722 -45.6507 -52.1722 -52.1722 -52.1722 -52.1722 -58.6938 -58.6938 -65.2153 -65.2153 -65.2153 -71.7368 -71.7368 -71.7368 -78.2584 -78.2584 -84.7799 -91.3014 -97.8229 -97.8229 -104.344 -110.866 -110.866 -117.388 -117.388 -123.909 -123.909 -123.909 -130.431 -130.431 -136.952 -143.474 -143.474 -143.474 -143.474 -149.995 -149.995 -149.995 -156.517 -149.995 -156.517 -156.517 -156.517 -156.517 -156.517 -163.038 -163.038 -169.56 -169.56 -169.56 -169.56 -169.56 -176.081 -169.56 -169.56 -169.56 -169.56 -176.081 -176.081 -169.56 -163.038 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -149.995 -149.995 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -149.995 -149.995 -156.517 -156.517 -156.517 -149.995 -149.995 -149.995 -149.995 -156.517 -156.517 -156.517 -149.995 -149.995 -149.995 -149.995 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -163.038 -169.56 -176.081 -182.603 -182.603 -189.124 -189.124 -195.646 -195.646 -202.167 -202.167 -208.689 -215.21 -215.21 -221.732 -221.732 -221.732 -228.254 -234.775 -234.775 -241.297 -241.297 -254.34 -260.861 -260.861 -267.383 -267.383 -273.904 -273.904 -280.426 -286.947 -293.469 -299.99 -306.512 -313.033 -319.555 -319.555 -332.598 -339.12 -352.163 -358.684 -365.206 -371.727 -378.249 -378.249 -384.77 -384.77 -384.77 -384.77 -384.77 -378.249 -384.77 -391.292 -397.813 -404.335 -410.856 -410.856 -410.856 -410.856 -404.335 -404.335 -397.813 -391.292 -384.77 -371.727 -365.206 -358.684 -358.684 -371.727 -397.813 -436.942 -469.55 -495.636 -508.679 -547.808 -593.459 -613.024 -652.153 -749.976 -815.191 -789.105 -743.454 -717.368 -684.761 -671.718 -684.761 -691.282 -652.153 -619.545 -613.024 -599.981 -567.373 -541.287 -521.722 -489.115 -482.593 -502.158 -456.507 -365.206 -332.598 -299.99 -234.775 -182.603 -130.431 -52.1722 -6.52153 -26.0861 -32.6076 26.0861 97.8229 163.038 215.21 254.34 299.99 339.12 339.12 293.469 247.818 228.254 215.21 202.167 202.167 215.21 228.254 228.254 234.775 241.297 241.297 208.689 123.909 104.344 247.818 378.249 358.684 313.033 306.512 286.947 319.555 410.856 463.029 469.55 521.722 593.459 613.024 541.287 378.249 319.555 430.421 554.33 554.33 586.938 678.239 652.153 567.373 613.024 710.847 723.89 736.933 756.497 723.89 710.847 736.933 789.105 834.756 847.799 828.234 795.627 789.105 815.191 815.191 749.976 710.847 749.976 782.584 763.019 763.019 828.234 893.45 926.057 945.622 971.708 1030.4 1056.49 1082.57 1245.61 1499.95 1682.55 1754.29 1793.42 1910.81 2217.32 2634.7 3006.43 3325.98 3593.36 3873.79 4258.56 4688.98 5054.18 5275.92 5347.65 5445.48 5647.64 5888.94 6156.32 6586.74 7278.03 7721.49 7988.87 8510.6 8875.8 9123.62 9749.69 10356.2 10597.5 10780.1 10936.6 10851.8 10643.1 10467.1 10369.2 10356.2 10336.6 10251.8 10212.7 10258.4 10362.7 10545.3 10767.0 10904.0 10930.1 10891.0 10851.8 10819.2 10773.6 10714.9 10656.2 10577.9 10473.6 10362.7 10245.3 10141.0 10056.2 9919.25 9756.21 9593.17 9430.13 9260.57 9110.58 9012.75 8908.41 8771.46 8647.55 8510.6 8327.99 8119.3 7910.61 7695.4 7473.67 7238.9 7036.73 6860.65 6691.09 6501.96 6325.88 6156.32 5980.24 5765.03 5556.34 5406.35 5236.79 5028.1 4838.97 4695.5 4578.11 4493.33 4415.08 4265.08 4030.3 3723.79 3352.07 2947.73 2778.17 2895.56 2999.9 2999.9 2999.9 2986.86 2947.73 2954.25 2947.73 2882.52 2810.78 2784.69 2810.78 2856.43 2882.52 2908.6 2960.77 2999.9 2993.38 2980.34 2980.34 2993.38 2999.9 3012.95 3032.51 3071.64 3084.68 3065.12 3039.03 3006.43 2960.77 2882.52 2804.26 2745.56 2706.43 2680.35 2673.83 2673.83 2667.31 2641.22 2602.09 2562.96 2523.83 2484.7 2445.57 2406.44 2367.32 2321.66 2269.49 2204.28 2139.06 2073.85 2008.63 1956.46 1910.81 1858.64 1819.51 1786.9 1760.81 1741.25 1721.68 1708.64 1695.6 1676.03 1649.95 1630.38 1617.34 1597.77 1584.73 1571.69 1558.65 1539.08 1526.04 1519.52 1512.99 1493.43 1473.87 1454.3 1434.74 1421.69 1408.65 1402.13 1395.61 1389.09 1376.04 1376.04 1376.04 1376.04 1376.04 1369.52 1356.48 1349.96 1336.91 1323.87 1304.31 1297.78 1291.26 1271.7 1252.13 1239.09 1226.05 1213.0 1193.44 1173.88 1141.27 1108.66 1076.05 1043.44 1017.36 991.273 958.665 932.579 899.971 873.885 834.756 795.627 756.497 710.847 678.239 645.631 613.024 580.416 554.33 521.722 495.636 476.072 456.507 436.942 417.378 404.335 391.292 371.727 358.684 345.641 332.598 319.555 306.512 293.469 273.904 260.861 247.818 228.254 215.21 195.646 182.603 169.56 156.517 143.474 123.909 104.344 84.7799 71.7368 52.1722 32.6076 13.0431 -13.0431 -39.1292 -58.6938 -84.7799 -117.388 -136.952 -163.038 -182.603 -202.167 -215.21 -234.775 -260.861 -280.426 -299.99 -326.076 -345.641 -358.684 -371.727 -391.292 -404.335 -410.856 -423.899 -436.942 -443.464 -449.986 -456.507 -469.55 -476.072 -482.593 -482.593 -489.115 -495.636 -502.158 -495.636 -482.593 -482.593 -476.072 -463.029 -443.464 -436.942 -430.421 -423.899 -423.899 -423.899 -423.899 -423.899 -430.421 -430.421 -436.942 -436.942 -436.942 -430.421 -423.899 -423.899 -417.378 -423.899 -423.899 -423.899 -423.899 -423.899 -423.899 -430.421 -436.942 -449.986 -469.55 -476.072 -476.072 -476.072 -476.072 -476.072 -482.593 -482.593 -482.593 -482.593 -482.593 -476.072 -476.072 -476.072 -476.072 -476.072 -469.55 -469.55 -463.029 -456.507 -456.507 -456.507 -449.986 -443.464 -443.464 -436.942 -430.421 -436.942 -430.421 -430.421 -423.899 -417.378 -417.378 -423.899 -423.899 -423.899 -423.899 -423.899 -423.899 -423.899 -423.899 -430.421 -430.421 -436.942 -436.942 -449.986 -449.986 -456.507 -463.029 -469.55 -476.072 -482.593 -495.636 -502.158 -508.679 -515.201 -528.244 -534.765 -541.287 -547.808 -554.33 -560.852 -567.373 -580.416 -580.416 -586.938 -593.459 -599.981 -606.502 -606.502 -613.024 -613.024 -613.024 -613.024 -613.024 -619.545 -619.545 -619.545 -619.545 -619.545 -619.545 -613.024 -613.024 -613.024 -613.024 -613.024 -619.545 -619.545 -619.545 -619.545 -619.545 -619.545 -613.024 -613.024 -606.502 -606.502 -606.502 -599.981 -599.981 -599.981 -593.459 -593.459 -593.459 -593.459 -593.459 -593.459 -593.459 -586.938 -586.938 -586.938 -580.416 -573.895 -567.373 -560.852 -554.33 -554.33 -547.808 -541.287 -534.765 -528.244 -521.722 -521.722 -515.201 -515.201 -502.158 -502.158 -489.115 -489.115 -482.593 -476.072 -469.55 -463.029 -456.507 -449.986 -449.986 -443.464 -436.942 -436.942 -430.421 -423.899 -423.899 -417.378 -417.378 -410.856 -410.856 -410.856 -410.856 -404.335 -404.335 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -404.335 -404.335 -404.335 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -404.335 -404.335 -404.335 -397.813 -404.335 -397.813 -397.813 -391.292 -391.292 -391.292 -391.292 -384.77 -391.292 -384.77 -384.77 -384.77 -378.249 -378.249 -378.249 -371.727 -371.727 -371.727 -371.727 -371.727 -371.727 -365.206 -365.206 -371.727 -371.727 -371.727 -371.727 -378.249 -378.249 -384.77 -384.77 -384.77 -384.77 -384.77 -384.77 -391.292 -391.292 -391.292 -391.292 -391.292 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -397.813 -404.335 -397.813 -397.813 -391.292 -391.292 -384.77 -384.77 -384.77 -378.249 -378.249 -371.727 -365.206 -365.206 -358.684 -358.684 -352.163 -352.163 -352.163 -345.641 -345.641 -345.641 -339.12 -339.12 -339.12 -339.12 -332.598 -332.598 -339.12 -339.12 -339.12 -332.598 -332.598 -332.598 -332.598 -332.598 -339.12 -339.12 -339.12 -339.12 -332.598 -339.12 -339.12 -339.12 -332.598 -332.598 -332.598 -326.076 -326.076 -319.555 -319.555 -313.033 -306.512 -306.512 -299.99 -293.469 -286.947 -280.426 -273.904 -267.383 -267.383 -260.861 -254.34 -254.34 -247.818 -241.297 -241.297 -234.775 -234.775 -228.254 -228.254 -228.254 -221.732 -221.732 -215.21 -215.21 -215.21 -208.689 -208.689 -208.689 -202.167 -202.167 -195.646 -195.646 -189.124 -195.646 -195.646 -195.646 -189.124 -189.124 -189.124 -189.124 -182.603 -176.081 -176.081 -176.081 -176.081 -169.56 -163.038 -163.038 -169.56 -169.56 -169.56 -169.56 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -156.517 -156.517 -156.517 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -143.474 -143.474 -136.952 -136.952 -143.474 -143.474 -136.952 -136.952 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -104.344 -104.344 -104.344 -104.344 -104.344 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -91.3014 -84.7799 -84.7799 -91.3014 -91.3014 -97.8229 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -71.7368 -78.2584 -78.2584 -78.2584 -78.2584 -71.7368 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -65.2153 -65.2153 -71.7368 -71.7368 -71.7368 -71.7368 -65.2153 -65.2153 -71.7368 -71.7368 -71.7368 -65.2153 -71.7368 -65.2153 -65.2153 -71.7368 -65.2153 -71.7368 -71.7368 -71.7368 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -58.6938 -58.6938 -58.6938 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -71.7368 -71.7368 -65.2153 -65.2153 -65.2153 -71.7368 -65.2153 -65.2153 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -91.3014 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -104.344 -104.344 -104.344 -97.8229 -97.8229 -97.8229 -104.344 -104.344 -104.344 -104.344 -104.344 -104.344 -104.344 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -117.388 -117.388 -117.388 -110.866 -110.866 -110.866 -110.866 -110.866 -117.388 -110.866 -110.866 -104.344 -110.866 -110.866 -110.866 -110.866 -117.388 -110.866 -110.866 -110.866 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -123.909 -130.431 -130.431 -123.909 -123.909 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -130.431 -130.431 -130.431 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -136.952 -130.431 -136.952 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -143.474 -143.474 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -143.474 -143.474 -143.474 -136.952 -136.952 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -149.995 -149.995 -149.995 -149.995 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -136.952 -136.952 -136.952 -136.952 -143.474 -143.474 -143.474 -136.952 -136.952 -136.952 -143.474 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -143.474 -149.995 -149.995 -156.517 -149.995 -149.995 -149.995 -149.995 -149.995 -156.517 -149.995 -156.517 -156.517 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -156.517 -156.517 -156.517 -149.995 -156.517 -156.517 -163.038 -156.517 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -156.517 -156.517 -156.517 -156.517 -163.038 -163.038 -163.038 -163.038 -156.517 -163.038 -163.038 -156.517 -156.517 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -163.038 -156.517 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -163.038 -163.038 -163.038 -163.038 -169.56 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -156.517 -156.517 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -156.517 -163.038 -163.038 -163.038 -163.038 -163.038 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -163.038 -163.038 -156.517 -156.517 -156.517 -156.517 -163.038 -156.517 -156.517 -149.995 -156.517 -156.517 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -149.995 -156.517 -156.517 -156.517 -156.517 -156.517 -149.995 -156.517 -156.517 -156.517 -156.517 -149.995 -149.995 -149.995 -149.995 -149.995 -156.517 -156.517 -149.995 -149.995 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -156.517 -149.995 -149.995 -149.995 -149.995 -149.995 -143.474 -143.474 -143.474 -143.474 -143.474 -149.995 -149.995 -149.995 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -143.474 -136.952 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -136.952 -136.952 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -130.431 -130.431 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -136.952 -130.431 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -130.431 -136.952 -130.431 -130.431 -130.431 -130.431 -130.431 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -136.952 -130.431 -136.952 -136.952 -130.431 -130.431 -130.431 -130.431 -136.952 -130.431 -130.431 -136.952 -136.952 -136.952 -130.431 -130.431 -123.909 -123.909 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -130.431 -123.909 -130.431 -130.431 -123.909 -123.909 -123.909 -123.909 -130.431 -130.431 -130.431 -130.431 -123.909 -130.431 -130.431 -123.909 -123.909 -123.909 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -117.388 -110.866 -110.866 -110.866 -110.866 -117.388 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -110.866 -104.344 -110.866 -110.866 -110.866 -104.344 -104.344 -104.344 -104.344 -104.344 -104.344 -110.866 -110.866 -104.344 -104.344 -97.8229 -104.344 -104.344 -110.866 -104.344 -104.344 -104.344 -104.344 -104.344 -104.344 -104.344 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -97.8229 -104.344 -97.8229 -91.3014 -97.8229 -97.8229 -97.8229 -97.8229 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -97.8229 -91.3014 -91.3014 -91.3014 -97.8229 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -78.2584 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -71.7368 -78.2584 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -78.2584 -71.7368 -78.2584 -78.2584 -71.7368 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -84.7799 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -97.8229 -97.8229 -97.8229 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -91.3014 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -84.7799 -84.7799 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -91.3014 -84.7799 -91.3014 -84.7799 -84.7799 -91.3014 -84.7799 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -91.3014 -91.3014 -84.7799 -84.7799 -91.3014 -91.3014 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -84.7799 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -78.2584 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -71.7368 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -71.7368 -65.2153 -71.7368 -71.7368 -71.7368 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -71.7368 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -58.6938 -58.6938 -58.6938 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -65.2153 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -65.2153 -65.2153 -58.6938 -58.6938 -65.2153 -65.2153 -65.2153 -58.6938 -58.6938 -65.2153 -58.6938 -58.6938 -65.2153 -65.2153 -65.2153 -65.2153 -58.6938 -65.2153 -65.2153 -65.2153 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -58.6938 -52.1722 -52.1722 -52.1722 -52.1722 -52.1722 -52.1722 -52.1722 -52.1722 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -45.6507 -39.1292 -39.1292 -39.1292 -39.1292 -39.1292 -32.6076 -32.6076 -39.1292 -32.6076 -32.6076 -32.6076 -32.6076 -39.1292 -32.6076 -32.6076 -32.6076 -32.6076 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -19.5646 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -32.6076 -32.6076 -32.6076 -32.6076 -32.6076 -32.6076 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861 -26.0861</A_FLOAT64>

+      </Values>

+      <Id>2</Id>

+      <Name>CHANNEL05</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>5</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.577823 0.770431 0.577823 0.577823 0.770431 0.770431 0.770431 0.770431 0.770431 0.577823 0.577823 0.577823 0.770431 0.577823 0.577823 0.577823 0.577823 0.770431 0.770431 0.770431 0.577823 0.770431 0.577823 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.577823 0.770431 0.577823 0.770431 0.577823 0.770431 0.770431 0.770431 0.577823 0.577823 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.577823 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.577823 0.770431 0.770431 0.770431 0.770431 0.770431 0.577823 0.770431 0.577823 0.770431 0.770431 0.770431 0.770431 0.577823 0.577823 0.577823 0.577823 0.577823 0.770431 0.770431 0.770431 0.770431 0.770431 0.577823 0.577823 0.770431 0.770431 0.577823 0.770431 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.385215 0.577823 0.385215 0.577823 0.577823 0.577823 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.192607 0.385215 0.385215 0.385215 0.192607 0.192607 0.192607 0.385215 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 -2.38419E-7 0.192607 -2.38419E-7 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 -2.38419E-7 0.192607 0.192607 0.192607 0.192607 0.192607 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -0.192608 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -0.192608 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -0.192608 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -0.192608 -0.192608 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -0.192608 -0.192608 -2.38419E-7 -2.38419E-7 -0.192608 -0.192608 -2.38419E-7 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -2.38419E-7 -0.192608 -2.38419E-7 -0.192608 -2.38419E-7 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -2.38419E-7 -2.38419E-7 -2.38419E-7 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -2.38419E-7 -2.38419E-7 -0.192608 -0.192608 -0.192608 -0.192608 -2.38419E-7 -0.192608 -2.38419E-7 -0.192608 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 -2.38419E-7 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.385215 0.192607 0.192607 0.192607 0.192607 0.192607 0.192607 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.385215 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.577823 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.770431 0.963039 0.963039 0.963039 0.963039 0.963039 0.963039 1.15565 1.15565 1.15565 1.15565 1.15565 1.15565 1.15565 1.34825 1.34825 1.34825 1.34825 1.34825 1.34825 1.54086 1.54086 1.54086 1.54086 1.54086 1.54086 1.54086 1.73347 1.73347 1.73347 1.73347 1.73347 1.92608 1.92608 1.92608 1.92608 1.92608 2.11869 2.11869 2.11869 2.11869 2.11869 2.11869 2.11869 2.31129 2.31129 2.31129 2.31129 2.31129 2.5039 2.5039 2.5039 2.5039 2.5039 2.5039 2.69651 2.69651 2.69651 2.69651 2.69651 2.88912 2.88912 2.88912 2.88912 2.88912 2.88912 2.88912 2.88912 2.88912 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.46694 3.46694 3.46694 3.46694 3.46694 3.27433 3.27433 3.27433 3.27433 3.46694 3.46694 3.65955 3.65955 3.85216 4.04476 4.23737 4.42998 4.62259 4.81519 5.39302 5.58563 6.16345 6.93388 7.89692 8.85996 9.05257 9.05257 8.66735 8.08953 7.5117 6.93388 6.74127 6.54867 6.35606 6.35606 6.35606 7.12649 8.47474 9.823 10.0156 9.24517 8.08953 7.5117 8.08953 9.43778 11.1713 12.9047 14.4456 15.7938 17.7199 19.646 21.5721 23.3055 24.6538 25.6168 26.1947 26.5799 26.9651 27.3503 27.3503 27.3503 26.9651 26.9651 26.9651 26.9651 26.5799 25.8094 24.8464 24.076 23.4981 23.1129 22.5351 21.9573 21.7647 21.5721 21.5721 21.5721 21.5721 21.7647 21.9573 22.3425 22.5351 22.9203 23.3055 23.4981 23.4981 23.3055 22.9203 22.5351 21.9573 21.5721 21.3795 20.9942 20.4164 20.0312 19.4534 19.0682 18.683 18.4903 18.4903 18.2977 18.1051 17.9125 17.7199 17.5273 17.3347 17.3347 17.1421 16.9495 16.7569 16.3717 15.9864 15.4086 14.6382 13.8678 13.0973 12.5195 12.1343 11.7491 11.5565 11.3639 11.1713 11.1713 11.1713 11.1713 11.1713 10.786 10.0156 9.24517 8.66735 8.66735 8.85996 9.05257 9.24517 8.85996 7.89692 6.35606 3.85216 -2.38419E-7 -4.42998 -9.05257 -12.9047 -15.7938 -17.5273 -17.9125 -17.5273 -16.3717 -14.8308 -13.4825 -12.5195 -11.9417 -11.7491 -11.9417 -12.1343 -12.1343 -12.1343 -11.7491 -11.3639 -10.5934 -10.2082 -9.823 -9.63039 -9.43778 -9.24517 -9.24517 -9.24517 -9.43778 -9.63039 -10.0156 -10.2082 -10.4008 -10.4008 -10.5934 -10.786 -10.786 -10.5934 -10.4008 -9.823 -9.05257 -8.08953 -7.12649 -5.97084 -4.8152 -4.04476 -3.08173 -2.31129 -1.73347 -0.963039 -0.192608 0.385215 0.770431 0.963039 0.963039 1.15565 1.15565 1.34825 1.54086 1.73347 1.92608 2.31129 2.5039 2.69651 2.88912 2.69651 2.5039 1.92608 0.963039 -0.385216 -2.11869 -4.42998 -6.74127 -9.823 -13.4825 -17.9125 -22.1499 -26.3873 -30.432 -34.4768 -38.3289 -41.9885 -45.4554 -49.115 -52.5819 -56.4341 -60.0936 -63.7532 -67.4127 -70.8797 -74.3466 -77.6209 -80.7027 -83.7844 -86.6735 -89.5626 -92.6443 -95.5335 -98.4226 -101.697 -104.971 -108.438 -111.713 -115.179 -118.839 -122.306 -125.773 -129.432 -132.899 -136.752 -140.411 -144.263 -148.115 -151.968 -155.434 -158.324 -160.828 -163.717 -166.606 -169.495 -172.769 -176.044 -179.896 -183.94 -187.6 -191.26 -194.726 -198.001 -200.89 -203.586 -206.09 -208.787 -211.483 -214.372 -217.262 -220.343 -223.232 -225.736 -228.048 -230.359 -232.478 -234.404 -236.33 -238.256 -239.989 -241.915 -244.034 -245.96 -247.501 -249.042 -250.583 -251.931 -253.279 -254.05 -254.435 -254.628 -254.628 -254.435 -253.857 -252.894 -251.931 -250.775 -249.62 -248.464 -247.116 -245.768 -244.419 -242.878 -241.338 -239.989 -238.834 -237.678 -236.715 -235.752 -234.018 -232.092 -229.396 -226.122 -223.232 -220.729 -218.225 -215.336 -212.254 -208.979 -206.283 -203.779 -201.275 -198.771 -196.46 -194.534 -192.8 -190.682 -188.563 -186.059 -183.748 -181.051 -178.355 -175.273 -172.384 -169.687 -167.376 -165.45 -163.909 -162.176 -160.442 -158.901 -156.975 -155.049 -152.931 -150.812 -148.693 -146.767 -145.034 -143.108 -141.567 -140.026 -138.485 -136.944 -135.596 -134.055 -132.129 -130.203 -128.277 -126.351 -124.232 -122.499 -120.765 -119.224 -117.683 -116.528 -115.565 -114.602 -113.639 -112.676 -112.098 -111.135 -110.172 -109.209 -108.631 -108.246 -107.86 -107.475 -106.897 -106.512 -105.934 -105.742 -105.934 -106.127 -106.319 -107.09 -107.86 -108.246 -108.246 -108.053 -107.86 -107.475 -106.705 -105.742 -104.779 -104.008 -103.238 -102.275 -101.312 -100.349 -99.193 -97.6521 -95.7261 -93.8 -91.6813 -89.5626 -87.4439 -85.5179 -83.5918 -81.8583 -80.1248 -78.584 -77.2357 -75.8875 -74.7318 -73.3836 -72.2279 -70.6871 -69.3388 -67.7979 -66.2571 -64.9088 -63.9458 -63.368 -63.1754 -62.9827 -63.1754 -63.368 -63.5606 -63.5606 -63.5606 -63.5606 -63.5606 -63.7532 -64.1384 -64.5236 -64.9088 -65.294 -65.8719 -66.6423 -67.2201 -67.6053 -68.1832 -68.761 -69.5314 -70.6871 -72.0353 -73.3836 -74.7318 -75.6949 -76.8505 -77.8135 -78.3914 -78.7766 -78.9692 -78.9692 -78.7766 -78.584 -78.3914 -78.3914 -78.584 -78.9692 -79.3544 -79.9322 -80.7027 -81.4731 -82.0509 -82.4361 -82.2435 -81.6657 -80.8953 -79.9322 -78.9692 -78.0062 -77.0431 -76.0801 -74.7318 -73.3836 -71.6501 -69.5314 -67.4127 -64.9088 -62.2123 -59.5158 -56.6267 -53.7376 -50.6558 -47.1889 -43.5294 -39.4846 -35.4398 -31.0099 -26.5799 -22.1499 -17.9125 -14.0604 -10.786 -7.3191 -4.04476 -1.15565 1.15565 3.27433 5.20041 7.12649 9.24517 11.5565 14.0604 16.7569 19.4534 21.9573 23.8834 25.4242 26.3873 26.9651 27.9281 28.8912 30.2394 31.5877 33.1285 34.4768 35.4398 36.5955 37.9437 39.6772 42.1811 45.8407 49.6928 53.7376 59.1306 66.0645 74.5392 83.2066 91.1035 98.0374 104.393 110.172 114.409 116.913 118.454 120.38 122.306 124.039 125.388 126.543 127.892 129.432 130.588 131.551 132.707 134.055 135.596 137.329 138.87 140.604 141.952 143.3 144.071 144.456 144.263 143.685 143.108 142.337 141.567 141.182 140.796 140.604 140.604 140.411 139.833 139.255 138.485 137.715 136.944 136.174 135.403 134.633 133.862 132.899 131.936 130.588 129.047 127.121 125.388 123.462 121.728 119.995 118.069 116.528 114.987 113.639 112.098 110.749 109.401 107.86 106.127 104.393 102.66 100.926 99.5782 98.6152 97.8448 97.2669 96.4965 95.7261 94.9556 94.3778 93.6074 93.0296 92.2591 91.8739 91.4887 91.2961 91.2961 91.2961 91.4887 91.6813 91.6813 92.0665 92.4517 93.0296 93.4148 93.9926 94.3778 94.9556 95.3409 95.5335 95.9187 96.6891 97.2669 98.0374 99.193 100.349 101.89 104.008 106.32 108.438 110.172 111.52 112.483 113.446 114.409 114.987 115.372 115.757 115.757 116.335 117.876 120.187 121.921 122.884 124.039 125.002 126.158 126.736 126.543 126.543 126.736 126.929 126.929 127.121 127.699 128.277 128.855 129.047 129.432 130.01 130.395 130.588 130.588 130.588 130.395 130.203 129.625 128.855 128.084 127.506 126.929 126.351 125.965 125.965 126.158 126.351 126.929 127.506 128.277 129.047 130.01 131.166 132.129 133.477 134.825 136.366 138.1 139.833 141.759 143.493 145.226 146.767 148.115 149.464 150.427 151.582 152.738 154.086 155.242 156.59 158.131 159.479 160.827 161.983 162.754 163.524 163.909 163.909 163.909 163.717 163.139 162.946 162.946 163.331 164.294 165.643 167.376 169.302 171.421 173.154 174.503 175.466 176.236 176.621 177.007 177.199 177.199 177.392 177.584 177.777 177.97 177.97 177.777 177.584 177.199 176.814 176.236 175.851 175.466 175.08 174.888 174.31 173.925 173.347 172.769 172.384 172.191 171.806 171.614 171.228 170.458 169.495 168.147 166.413 164.294 162.176 160.057 158.131 156.783 155.82 155.434 155.242 155.434 155.627 155.82 156.012 156.205 156.398 156.59 156.783 156.975 156.975 156.975 156.975 156.783 156.59 156.012 155.627 155.242 154.857 154.857 154.857 154.664 154.471 154.279 153.701 153.123 152.16 151.005 149.656 148.501 147.538 146.575 145.804 144.841 144.071 143.3 142.53 141.759 140.796 140.026 139.063 138.292 137.522 136.944 136.366 135.788 135.018 134.248 133.477 132.514 131.551 130.588 129.818 129.047 128.277 127.506 126.736 125.965 125.195 124.232 123.269 122.306 121.15 119.995 119.032 117.876 116.528 115.179 113.831 112.676 111.713 110.557 109.209 107.86 106.512 105.164 104.008 102.66 101.504 100.349 99.193 98.4226 97.4595 96.4965 95.7261 94.9556 93.9926 93.2222 92.2591 91.2961 90.5257 89.7552 88.7922 88.0218 87.2513 86.4809 85.7105 84.7474 83.977 83.014 82.0509 81.0879 80.3175 79.3544 78.584 77.8135 77.0431 76.2727 75.5023 74.7318 74.154 73.191 72.6131 71.8427 71.0723 70.4945 69.724 69.1462 68.5684 68.1832 67.6053 67.2201 66.6423 66.2571 65.8719 65.4866 64.9088 64.5236 63.9458 63.5606 62.9827 62.5975 62.0197 61.6345 61.0567 60.4788 60.0936 59.7084 59.3232 58.7454 58.3602 57.7823 57.3971 56.8193 56.2415 55.6637 55.471 55.0858 54.508 54.1228 53.545 53.1598 52.5819 52.1967 51.6189 51.2337 50.8485 50.4632 50.078 49.5002 49.115 48.5372 48.152 47.7667 47.3815 46.9963 46.4185 46.0333 45.648 45.2628 44.8776 44.4924 44.2998 43.722 43.1441 42.5663 42.3737 42.1811 41.7959 41.4107 41.2181 41.0255 40.6402 40.0624 39.6772 39.292 39.0994 38.7142 38.329 38.1363 38.1363 37.9437 37.5585 37.3659 36.9807 36.7881 36.5955 36.4029 36.2103 35.8251 35.6324 35.4398 35.2472 35.0546 34.862 34.6694 34.6694 34.4768 34.2842 33.899 33.7064 33.5138 33.3211 33.1285 33.1285 32.9359 32.7433 32.5507 32.3581 32.1655 32.1655 31.9729 31.7803 31.5877 31.5877 31.3951 31.3951 31.2025 31.2025 31.2025 31.2025 31.0099 31.0099 31.0099 31.0099 30.8172 30.8172 30.8172 30.8172 30.8172 30.8172 31.0099 31.0099 31.0099 31.0099 31.2025 31.2025 31.3951 31.3951 31.5877 31.7803 31.7803 31.7803 31.9729 31.9729 31.9729 32.1655 32.1655 32.3581 32.3581 32.3581 32.1655 32.1655 32.5507 32.5507 32.5507 32.5507 32.7433 32.5507 32.3581 32.1655 31.9729 31.9729 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 32.1655 31.9729 31.9729 31.9729 31.7803 31.7803 31.5877 31.5877 31.3951 31.3951 31.3951 31.3951 31.2025 31.2025 31.2025 31.2025 31.0099 31.0099 30.8172 30.8172 30.8172 30.6246 30.8172 30.8172 30.6246 30.432 30.2394 30.0468 30.0468 30.0468 30.0468 30.0468 29.8542 29.8542 29.6616 29.6616 29.469 29.469 29.469 29.2764 29.2764 29.0838 28.8912 28.8912 28.6986 28.6986 28.506 28.506 28.3133 28.3133 28.3133 28.1207 27.9281 27.9281 27.7355 27.7355 27.7355 27.5429 27.3503 27.3503 27.1577 27.1577 26.9651 26.9651 26.7725 26.5799 26.3873 26.3873 26.1947 26.0021 25.8094 25.6168 25.6168 25.4242 25.2316 25.039 24.8464 24.6538 24.4612 24.4612 24.076 23.8834 23.4981 23.3055 23.1129 22.9203 22.7277 22.3425 22.1499 21.9573 21.5721 21.1869 21.1869 20.9942 20.8016 20.609 20.4164 20.2238 20.0312 19.8386 19.646 19.4534 19.2608 19.0682 18.8756 18.683 18.4903 18.2977 18.1051 18.1051 17.9125 17.7199 17.5273 17.3347 17.1421 17.1421 16.9495 16.7569 16.7569 16.5643 16.3717 16.3717 16.1791 16.1791 15.9864 15.7938 15.7938 15.6012 15.4086 15.4086 15.216 15.0234 15.0234 15.0234 14.8308 14.6382 14.6382 14.4456 14.4456 14.253 14.253 14.0604 14.0604 13.8678 13.8678 13.6752 13.6752 13.4825 13.4825 13.4825 13.4825 13.2899 13.2899 13.2899 13.0973 13.0973 13.0973 12.9047 12.9047 12.9047 12.9047 12.9047 12.7121 12.7121 12.5195 12.5195 12.5195 12.5195 12.3269 12.3269 12.1343 12.1343 12.1343 11.9417 11.9417 11.9417 11.7491 11.5565 11.5565 11.3639 11.3639 11.1713 11.1713 10.9786 10.9786 10.9786 10.786 10.5934 10.5934 10.4008 10.4008 10.2082 10.2082 10.0156 10.0156 10.0156 10.0156 9.823 9.63039 9.24517 9.24517 9.24517 9.24517 9.05257 9.05257 9.05257 8.85996 8.85996 8.66735 8.66735 8.66735 8.47474 8.47474 8.28214 8.28214 8.08953 8.08953 7.89692 7.89692 7.89692 7.70431 7.70431 7.70431 7.70431 7.70431 7.5117 7.3191 7.3191 7.3191 7.3191 7.12649 7.12649 7.12649 7.12649 7.12649 7.12649 7.12649 6.93388 6.93388 6.93388 6.93388 6.93388 6.93388 6.74127 6.54867 6.74127 6.54867 6.54867 6.54867 6.74127 6.74127 6.74127 6.74127 6.74127 6.93388 7.12649 7.3191 7.89692 8.47474 9.24517 10.2082 10.9786 11.7491 12.3269 12.9047 13.4825 14.0604 14.4456 14.8308 15.0234 15.4086 15.4086 15.4086 15.4086 15.0234 14.8308 14.4456 14.253 13.8678 13.4825 13.0973 12.7121 12.3269 11.9417 11.5565 11.3639 11.1713 10.9786 10.786 10.786 10.5934 10.5934 10.5934 10.5934 10.5934 10.5934 10.5934 10.786 10.5934 10.5934 10.786 10.786 10.786 10.786 10.5934 10.5934 10.5934 10.5934 10.786 10.9786 11.1713 11.1713 10.9786 10.786 10.9786 10.9786 10.9786 10.9786 10.9786 10.9786 10.786 10.786 10.786 10.5934 10.5934 10.4008 10.4008 10.4008 10.4008 10.2082 10.2082 10.2082 10.2082 10.0156 10.0156 10.0156 9.823 9.823 9.63039 9.63039 9.43778 9.24517 9.24517 9.24517 9.05257 9.05257 9.05257 9.05257 8.85996 8.85996 8.85996 8.85996 8.85996 8.66735 8.66735 8.66735 8.66735 8.47474 8.47474 8.28214 8.28214 8.08953 8.08953 7.89692 7.70431 7.70431 7.70431 7.5117 7.5117 7.3191 7.12649 7.12649 6.93388 6.74127 6.74127 6.54867 6.54867 6.35606 6.35606 6.16345 5.97084 5.97084 5.97084 5.77823 5.77823 5.77823 5.77823 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.39302 5.39302 5.39302 5.20041 5.20041 5.0078 5.0078 5.0078 4.81519 5.0078 4.81519 4.62259 4.42998 4.23737 4.23737 4.42998 4.23737 4.23737 4.04476 4.04476 3.85216 3.85216 3.85216 3.85216 3.85216 3.65955 3.46694 3.46694 3.27433 3.27433 3.27433 3.27433 3.27433 3.08172 3.08172 3.08172 3.08172 3.08172 2.88912 2.88912 2.88912 2.88912 2.69651 2.69651 2.69651 2.69651 2.69651 2.69651 2.69651 2.69651 2.5039 2.5039 2.5039 2.31129 2.31129 2.31129 2.5039 2.31129 2.31129 2.5039 2.5039 2.31129 2.31129 2.31129 2.31129 2.31129 2.31129 2.31129 2.11869 2.11869 2.11869 2.31129 2.11869 2.11869 2.11869 2.11869 2.11869 2.11869 2.31129 2.31129 2.11869 2.31129 2.31129 2.31129 2.31129 2.31129 2.31129 2.5039 2.5039 2.5039 2.5039 2.31129 2.5039 2.31129 2.31129 2.5039 2.5039 2.5039 2.5039 2.5039 2.5039 2.5039 2.5039 2.69651 2.69651 2.69651 2.69651 2.69651 2.69651 2.69651 2.88912 2.88912 2.88912 2.88912 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.08172 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.27433 3.46694 3.46694 3.46694 3.46694 3.46694 3.27433 3.27433 3.27433 3.27433 3.46694 3.65955 3.65955 3.65955 3.65955 3.65955 3.65955 3.65955 3.65955 3.85216 3.85216 3.85216 3.65955 3.85216 3.85216 3.85216 3.85216 3.85216 3.85216 4.04476 4.04476 4.04476 4.04476 4.04476 4.23737 4.23737 4.23737 4.42998 4.42998 4.42998 4.42998 4.62259 4.62259 4.62259 4.81519 4.81519 4.81519 5.0078 5.0078 4.81519 5.0078 5.0078 5.0078 5.20041 5.20041 5.20041 5.39302 5.39302 5.39302 5.39302 5.58563 5.58563 5.58563 5.58563 5.58563 5.58563 5.77823 5.77823 5.97084 5.97084 5.97084 5.97084 5.97084 6.16345 6.16345 6.35606 6.35606 6.35606 6.35606 6.54867 6.74127 6.74127 6.54867 6.74127 6.74127 6.74127 6.74127 6.93388 6.93388 6.93388 6.93388 7.12649 7.12649 7.12649 7.3191 7.5117 7.5117 7.5117 7.70431 7.70431 7.70431 7.70431 7.70431 7.89692 8.08953 8.28214 8.47474 8.28214 8.47474 8.47474 8.47474 8.66735 8.85996 8.85996 9.05257 9.05257 9.05257 9.05257 9.24517 9.24517 9.43778 9.43778 9.63039 9.63039 9.63039 9.823 9.823 9.823 10.0156 10.0156 10.0156 10.2082 10.2082 10.2082 10.4008 10.4008 10.4008 10.4008 10.5934 10.5934 10.5934 10.786 10.9786 10.9786 10.9786 11.1713 11.1713 11.1713 11.3639 11.5565 11.5565 11.5565 11.5565 11.7491 11.9417 12.1343 12.1343 12.3269 12.3269 12.5195 12.5195 12.5195 12.7121 12.7121 12.9047 12.9047 13.0973 13.0973 13.2899 13.4825 13.8678 13.8678 13.8678 13.8678 14.0604 14.4456 14.4456 14.4456 14.4456 14.4456 14.4456 14.6382 15.0234 15.216 15.216 15.0234 15.0234 15.0234 15.216 15.6012 15.6012 15.6012 15.4086 15.4086 15.7938 16.1791 15.9864 15.9864 15.9864 16.1791 15.9864 16.1791 16.3717 16.3717 16.3717 16.3717 16.3717 16.3717 16.5643 16.5643 16.5643 16.7569 16.7569 16.7569 16.5643 16.5643 16.9495 17.1421 16.9495 16.9495 17.1421 17.1421 17.1421 17.1421 17.1421 17.1421 17.3347 17.3347 17.3347 17.5273 17.5273 17.5273 17.3347 17.3347 17.1421 17.3347 17.5273 17.5273 17.5273 17.7199 17.9125 17.9125 17.9125 17.7199 17.7199 17.9125 17.9125 17.9125 17.7199 17.9125 18.1051 18.1051 18.1051 18.2977 18.2977 18.1051 18.1051 18.2977 18.2977 18.2977 18.2977 18.2977 18.2977 18.1051 18.2977 18.2977 18.2977 18.2977 18.2977 18.2977 18.4903 18.4903 18.4903 18.2977 18.2977 18.2977 18.2977 18.1051 18.1051 18.1051 17.9125 17.9125 18.1051 18.1051 18.2977 18.2977 18.2977 18.2977 18.1051 17.9125 17.9125 18.1051 17.9125 17.7199 17.9125 17.9125 18.1051 17.9125 18.1051 18.2977 18.1051 17.9125 17.9125 17.7199 17.7199 17.7199 17.7199 17.7199 17.9125 18.1051 18.1051 17.9125 17.9125 17.9125 17.9125 17.9125 17.9125 17.9125 17.7199 17.9125 17.9125 17.9125 17.9125 17.9125 17.7199 17.7199 17.7199 17.7199 17.7199 17.7199 17.7199 17.7199 17.7199 17.7199 17.5273 17.5273 17.5273 17.5273 17.5273 17.5273 17.5273 17.5273 17.5273 17.3347 17.3347 17.3347 17.1421 17.1421 17.1421 17.1421 17.1421 16.9495 16.9495 16.9495 16.9495 16.9495 16.9495 16.7569 16.7569 16.7569 16.7569 16.5643 16.5643 16.5643 16.5643 16.5643 16.5643 16.3717 16.3717 16.3717 16.3717 16.3717 16.3717 16.1791 16.1791 16.1791 16.1791 16.1791 16.1791 15.9864 15.9864 15.9864 15.9864 15.7938 15.7938 15.7938 15.7938 15.7938 15.7938 15.6012 15.6012 15.6012 15.6012 15.6012 15.4086 15.4086 15.4086 15.4086 15.4086 15.4086 15.4086 15.216 15.216 15.216 15.216 15.216 15.216 15.0234 15.0234 15.0234 15.216 15.0234 15.0234 15.0234 15.0234 15.0234 14.8308 14.8308 15.0234 14.8308 14.8308 14.8308 14.8308 14.8308 14.8308 14.6382 14.8308 14.8308 14.8308 14.8308 14.6382 14.6382 14.6382 14.6382 14.6382 14.6382 14.6382 14.6382 14.6382 14.6382 14.6382 14.4456 14.4456 14.4456 14.4456 14.4456 14.4456 14.4456 14.253 14.253 14.253 14.253 14.253 14.0604 14.0604 14.0604 14.0604 14.0604 14.0604 14.0604 14.0604 14.0604 14.0604 14.0604 13.8678 13.8678 13.8678 13.8678 13.8678 13.8678 13.8678 13.8678 13.8678 13.8678 13.8678 13.6752 13.6752 13.6752 13.6752 13.6752 13.4825 13.6752 13.8678 13.8678 13.6752 13.4825 13.6752 13.6752 13.6752 13.4825 13.4825 13.4825 13.2899 13.2899 13.2899 13.4825 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.2899 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 12.9047 13.0973 13.0973 13.2899 13.2899 13.0973 13.0973 13.0973 13.0973 13.0973 12.9047 12.9047 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.0973 13.2899 13.2899 13.2899 13.2899 13.4825 13.4825 13.2899 13.2899 13.4825 13.4825 13.2899 13.2899 13.4825 13.8678 13.8678 13.6752 13.6752 13.6752 13.8678 13.8678 13.8678 13.8678 14.0604 14.0604 14.0604 13.8678 14.0604 14.253 14.253 14.253 14.253 14.4456 14.4456 14.4456 14.6382 14.8308 14.6382 14.6382 14.6382 14.4456 14.4456 14.6382 14.8308 14.8308 14.8308 14.8308 14.8308 15.0234 15.0234 15.0234 15.0234 15.0234 15.216 15.216 15.216 15.4086 15.4086 15.4086 15.216 15.4086 15.4086 15.4086 15.4086 15.216 15.4086 15.6012 15.6012 15.6012 15.6012 15.7938 15.7938 15.7938 15.7938 15.7938 15.7938 15.9864 15.9864 15.9864 15.9864 15.9864 15.9864 15.9864 16.1791 15.9864 16.1791 16.1791 16.1791 16.1791 16.1791 16.1791 16.1791 16.3717 16.3717 16.3717 16.1791 16.1791 16.1791 16.1791 15.9864 15.7938 15.9864 15.9864 15.9864 15.9864 15.9864 15.9864 15.9864 15.9864 15.7938 15.7938 15.7938 15.7938 15.7938 15.7938 15.6012 15.6012 15.6012 15.6012 15.6012 15.6012 15.7938 15.7938 15.6012 15.4086 15.4086 15.4086 15.4086 15.216 15.0234 15.216 15.216 15.216 15.216 15.216 15.0234 15.216 15.216 15.4086 15.216 15.0234 15.0234 15.0234 15.0234 15.0234 14.8308 14.8308 14.8308 14.6382 14.8308 14.8308 15.0234 15.0234 14.8308 14.6382 14.6382 14.6382 14.6382 14.6382 14.4456 14.4456 14.6382 14.6382 14.4456 14.4456 14.253 14.253 14.253 14.253 14.253 14.0604 14.0604 14.0604 14.0604 13.8678 13.6752 13.6752 13.8678</A_FLOAT64>

+      </Values>

+      <Id>3</Id>

+      <Name>CHANNEL08</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>8</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>-4.44111 -2.03551 -4.44111 -4.44111 -4.44111 -2.03551 -4.44111 -2.03551 -4.44111 -2.03551 -4.44111 -2.03551 -2.03551 -2.03551 -4.44111 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -4.44111 -2.03551 -4.44111 -2.03551 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -4.44111 -4.44111 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -2.03551 -4.44111 -4.44111 -4.44111 -2.03551 -2.03551 -2.03551 -4.44111 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -4.44111 -4.44111 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -2.03551 -2.03551 -4.44111 -2.03551 -4.44111 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -2.03551 -2.03551 -2.03551 -2.03551 -4.44111 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -4.44111 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -4.44111 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -4.44111 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 0.370093 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 0.370093 -2.03551 0.370093 -2.03551 0.370093 -2.03551 0.370093 0.370093 -2.03551 -2.03551 0.370093 -2.03551 0.370093 -2.03551 -2.03551 0.370093 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 0.370093 -2.03551 0.370093 -2.03551 0.370093 -2.03551 -2.03551 -2.03551 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 0.370093 0.370093 -2.03551 0.370093 0.370093 -2.03551 0.370093 0.370093 0.370093 0.370093 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 0.370093 0.370093 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 2.7757 2.7757 2.7757 0.370093 2.7757 2.7757 2.7757 0.370093 0.370093 0.370093 2.7757 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 2.7757 0.370093 0.370093 2.7757 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -9.25232 -9.25232 -9.25232 -11.6579 -11.6579 -11.6579 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -11.6579 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -11.6579 -11.6579 -14.0635 -16.4691 -18.8747 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -18.8747 -16.4691 -16.4691 -14.0635 -14.0635 -14.0635 -11.6579 -11.6579 -11.6579 -11.6579 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -11.6579 -11.6579 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -11.6579 -11.6579 -11.6579 -9.25232 -9.25232 -11.6579 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -6.84672 -6.84672 -6.84672 -6.84672 -4.44111 -4.44111 -6.84672 -6.84672 -4.44111 -4.44111 -2.03551 -2.03551 -2.03551 -2.03551 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 -2.03551 -2.03551 0.370093 0.370093 0.370093 2.7757 2.7757 5.1813 5.1813 7.58691 9.99247 9.99247 7.58691 5.1813 5.1813 2.7757 2.7757 0.370093 0.370093 2.7757 2.7757 2.7757 2.7757 5.1813 5.1813 7.58691 7.58691 7.58691 7.58691 9.99247 9.99247 7.58691 7.58691 7.58691 7.58691 7.58691 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 5.1813 2.7757 2.7757 2.7757 2.7757 2.7757 0.370093 0.370093 0.370093 0.370093 0.370093 2.7757 2.7757 2.7757 0.370093 0.370093 -2.03551 -6.84672 -6.84672 -9.25232 -9.25232 -11.6579 -11.6579 -11.6579 -11.6579 -9.25232 -9.25232 -9.25232 -9.25232 -11.6579 -11.6579 -11.6579 -14.0635 -16.4691 -16.4691 -18.8747 -18.8747 -21.2803 -21.2803 -21.2803 -23.686 -26.0916 -26.0916 -23.686 -21.2803 -21.2803 -21.2803 -21.2803 -18.8747 -18.8747 -18.8747 -18.8747 -16.4691 -18.8747 -18.8747 -16.4691 -16.4691 -18.8747 -16.4691 -14.0635 -9.25232 -9.25232 -11.6579 -11.6579 -11.6579 -14.0635 -16.4691 -18.8747 -21.2803 -21.2803 -18.8747 -16.4691 -18.8747 -23.686 -26.0916 -23.686 -16.4691 -11.6579 -2.03551 7.58691 17.2093 19.6149 19.6149 19.6149 17.2093 9.99247 5.1813 12.3981 22.0205 26.8317 26.8317 31.6429 41.2654 48.4822 50.8878 48.4822 48.4822 48.4822 50.8878 53.2934 55.699 58.1046 62.9158 62.9158 60.5102 58.1046 58.1046 55.699 53.2934 53.2934 58.1046 65.3214 70.1326 72.5382 77.3494 77.3494 77.3494 77.3494 79.755 79.755 84.5662 89.3774 96.5943 103.811 106.217 106.217 103.811 103.811 98.9996 94.1887 89.3774 79.755 74.9438 89.3774 103.811 111.028 125.461 151.924 173.573 180.79 178.385 161.545 139.896 120.65 86.9718 46.0766 22.0205 22.0205 31.6429 43.671 60.5102 65.3214 58.1046 53.2934 60.5102 65.3214 65.3214 70.1326 86.9718 96.5943 98.9996 98.9996 103.811 101.405 96.5943 91.783 91.783 89.3774 82.1606 74.9438 74.9438 77.3494 74.9438 74.9438 79.755 86.9718 89.3774 89.3774 91.783 94.1887 94.1887 91.783 91.783 91.783 91.783 91.783 94.1887 91.783 91.783 91.783 89.3774 89.3774 86.9718 84.5662 84.5662 84.5662 82.1606 82.1606 82.1606 82.1606 82.1606 84.5662 86.9718 91.783 94.1887 96.5943 98.9996 101.405 98.9996 96.5943 96.5943 98.9996 103.811 111.028 115.839 120.65 123.056 127.867 123.056 118.245 115.839 113.433 106.217 101.405 98.9996 98.9996 94.1887 91.783 84.5662 79.755 72.5382 67.727 65.3214 70.1326 72.5382 74.9438 77.3494 79.755 82.1606 82.1606 79.755 77.3494 77.3494 77.3494 79.755 79.755 82.1606 84.5662 86.9718 86.9718 86.9718 89.3774 89.3774 89.3774 89.3774 86.9718 89.3774 89.3774 89.3774 86.9718 84.5662 82.1606 82.1606 82.1606 79.755 79.755 79.755 82.1606 82.1606 84.5662 84.5662 86.9718 84.5662 84.5662 82.1606 82.1606 79.755 79.755 79.755 79.755 79.755 79.755 79.755 82.1606 82.1606 82.1606 82.1606 79.755 79.755 79.755 79.755 77.3494 79.755 79.755 79.755 79.755 82.1606 82.1606 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 86.9718 89.3774 91.783 91.783 94.1887 96.5943 98.9996 98.9996 98.9996 101.405 103.811 101.405 101.405 98.9996 98.9996 98.9996 96.5943 94.1887 91.783 91.783 91.783 89.3774 86.9718 86.9718 86.9718 86.9718 84.5662 84.5662 84.5662 84.5662 86.9718 86.9718 86.9718 89.3774 94.1887 94.1887 96.5943 98.9996 98.9996 98.9996 101.405 101.405 101.405 101.405 101.405 101.405 101.405 103.811 103.811 106.217 106.217 106.217 108.622 111.028 111.028 111.028 111.028 113.433 115.839 118.245 120.65 120.65 118.245 118.245 118.245 120.65 120.65 120.65 123.056 123.056 120.65 120.65 120.65 120.65 118.245 118.245 118.245 120.65 120.65 120.65 123.056 123.056 123.056 123.056 125.461 125.461 125.461 125.461 127.867 125.461 125.461 125.461 125.461 125.461 125.461 125.461 127.867 127.867 127.867 127.867 127.867 127.867 125.461 125.461 123.056 120.65 118.245 115.839 115.839 111.028 111.028 108.622 108.622 106.217 106.217 106.217 106.217 103.811 103.811 103.811 103.811 103.811 103.811 101.405 98.9996 98.9996 98.9996 96.5943 96.5943 94.1887 94.1887 94.1887 94.1887 91.783 91.783 89.3774 89.3774 89.3774 86.9718 86.9718 86.9718 89.3774 86.9718 86.9718 89.3774 89.3774 86.9718 86.9718 84.5662 86.9718 86.9718 86.9718 86.9718 86.9718 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 86.9718 86.9718 89.3774 89.3774 89.3774 86.9718 86.9718 86.9718 89.3774 89.3774 89.3774 91.783 89.3774 84.5662 84.5662 84.5662 86.9718 84.5662 82.1606 82.1606 84.5662 82.1606 84.5662 84.5662 84.5662 84.5662 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 84.5662 82.1606 82.1606 82.1606 82.1606 82.1606 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 77.3494 77.3494 77.3494 74.9438 77.3494 77.3494 74.9438 77.3494 77.3494 77.3494 74.9438 79.755 84.5662 86.9718 84.5662 84.5662 89.3774 94.1887 94.1887 91.783 94.1887 96.5943 96.5943 96.5943 96.5943 96.5943 96.5943 96.5943 96.5943 96.5943 96.5943 96.5943 94.1887 94.1887 91.783 91.783 89.3774 89.3774 86.9718 86.9718 84.5662 84.5662 84.5662 82.1606 82.1606 82.1606 79.755 79.755 79.755 77.3494 77.3494 77.3494 77.3494 77.3494 77.3494 77.3494 74.9438 74.9438 74.9438 74.9438 77.3494 74.9438 74.9438 77.3494 77.3494 77.3494 77.3494 74.9438 77.3494 77.3494 74.9438 77.3494 74.9438 77.3494 77.3494 77.3494 77.3494 77.3494 77.3494 77.3494 77.3494 77.3494 74.9438 74.9438 72.5382 72.5382 72.5382 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 67.727 70.1326 70.1326 72.5382 72.5382 72.5382 74.9438 74.9438 77.3494 77.3494 79.755 79.755 82.1606 82.1606 82.1606 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 79.755 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 84.5662 84.5662 84.5662 84.5662 84.5662 86.9718 86.9718 89.3774 86.9718 89.3774 89.3774 86.9718 89.3774 89.3774 89.3774 86.9718 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 91.783 91.783 91.783 91.783 91.783 91.783 91.783 91.783 91.783 94.1887 94.1887 94.1887 94.1887 94.1887 94.1887 94.1887 94.1887 94.1887 96.5943 96.5943 94.1887 96.5943 96.5943 96.5943 96.5943 94.1887 96.5943 94.1887 94.1887 96.5943 94.1887 94.1887 94.1887 94.1887 94.1887 91.783 91.783 91.783 91.783 91.783 91.783 91.783 89.3774 91.783 89.3774 89.3774 89.3774 89.3774 89.3774 89.3774 86.9718 86.9718 86.9718 86.9718 86.9718 86.9718 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 84.5662 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 82.1606 82.1606 79.755 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 84.5662 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 82.1606 79.755 79.755 79.755 79.755 79.755 79.755 79.755 79.755 77.3494 77.3494 77.3494 77.3494 77.3494 74.9438 74.9438 74.9438 74.9438 74.9438 74.9438 74.9438 72.5382 72.5382 72.5382 72.5382 72.5382 72.5382 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 70.1326 67.727 67.727 67.727 67.727 67.727 65.3214 65.3214 65.3214 65.3214 65.3214 65.3214 62.9158 62.9158 62.9158 62.9158 62.9158 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 60.5102 58.1046 58.1046 58.1046 58.1046 58.1046 58.1046 58.1046 58.1046 55.699 55.699 55.699 55.699 55.699 55.699 55.699 55.699 53.2934 53.2934 53.2934 53.2934 53.2934 53.2934 53.2934 50.8878 50.8878 50.8878 50.8878 50.8878 48.4822 48.4822 48.4822 48.4822 48.4822 48.4822 48.4822 46.0766 46.0766 46.0766 46.0766 46.0766 46.0766 43.671 43.671 43.671 43.671 43.671 43.671 41.2654 43.671 41.2654 41.2654 41.2654 41.2654 41.2654 38.8598 38.8598 38.8598 38.8598 38.8598 38.8598 36.4542 36.4542 36.4542 36.4542 36.4542 36.4542 36.4542 36.4542 36.4542 34.0485 34.0485 34.0485 34.0485 34.0485 34.0485 34.0485 31.6429 31.6429 31.6429 31.6429 31.6429 31.6429 29.2373 31.6429 29.2373 29.2373 29.2373 29.2373 29.2373 29.2373 29.2373 29.2373 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 26.8317 24.4261 26.8317 26.8317 26.8317 26.8317 24.4261 24.4261 24.4261 24.4261 24.4261 24.4261 22.0205 22.0205 22.0205 22.0205 22.0205 22.0205 22.0205 19.6149 19.6149 19.6149 19.6149 19.6149 19.6149 19.6149 17.2093 17.2093 17.2093 17.2093 17.2093 17.2093 17.2093 17.2093 17.2093 17.2093 14.8037 14.8037 14.8037 14.8037 14.8037 14.8037 14.8037 14.8037 14.8037 12.3981 12.3981 12.3981 12.3981 12.3981 12.3981 12.3981 9.99247 9.99247 9.99247 9.99247 9.99247 9.99247 9.99247 9.99247 9.99247 9.99247 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 7.58691 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 5.1813 2.7757 2.7757 2.7757 2.7757 2.7757 2.7757 2.7757 2.7757 0.370093 2.7757 2.7757 2.7757 2.7757 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 0.370093 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -2.03551 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -4.44111 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -9.25232 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -6.84672 -9.25232 -6.84672 -6.84672 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -6.84672 -6.84672 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -9.25232 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -11.6579 -14.0635 -11.6579 -11.6579 -11.6579 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -16.4691 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -21.2803 -18.8747 -18.8747 -21.2803 -21.2803 -18.8747 -18.8747 -18.8747 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -23.686 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -23.686 -21.2803 -21.2803 -23.686 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -18.8747 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -18.8747 -21.2803 -21.2803 -18.8747 -21.2803 -18.8747 -18.8747 -18.8747 -21.2803 -18.8747 -21.2803 -18.8747 -18.8747 -21.2803 -21.2803 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -21.2803 -18.8747 -18.8747 -18.8747 -18.8747 -21.2803 -18.8747 -21.2803 -18.8747 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -23.686 -21.2803 -23.686 -21.2803 -21.2803 -21.2803 -23.686 -23.686 -23.686 -23.686 -23.686 -21.2803 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -28.4972 -26.0916 -26.0916 -28.4972 -26.0916 -26.0916 -28.4972 -26.0916 -26.0916 -28.4972 -26.0916 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -30.9028 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -30.9028 -28.4972 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -33.3084 -30.9028 -33.3084 -30.9028 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -35.714 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -35.714 -35.714 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -35.714 -35.714 -35.714 -35.714 -33.3084 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -33.3084 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -35.714 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -40.5252 -40.5252 -40.5252 -38.1196 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -40.5252 -38.1196 -40.5252 -38.1196 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -42.9308 -40.5252 -42.9308 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -40.5252 -38.1196 -38.1196 -40.5252 -40.5252 -38.1196 -38.1196 -40.5252 -40.5252 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -38.1196 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -35.714 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -33.3084 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -30.9028 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -28.4972 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -28.4972 -28.4972 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -28.4972 -26.0916 -26.0916 -26.0916 -28.4972 -26.0916 -28.4972 -28.4972 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -26.0916 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -23.686 -21.2803 -23.686 -23.686 -23.686 -21.2803 -23.686 -23.686 -23.686 -21.2803 -21.2803 -23.686 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -21.2803 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -18.8747 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -16.4691 -14.0635 -16.4691 -14.0635 -14.0635 -16.4691 -16.4691 -14.0635 -16.4691 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -14.0635 -11.6579 -11.6579 -14.0635 -11.6579 -11.6579 -11.6579 -11.6579</A_FLOAT64>

+      </Values>

+      <Id>4</Id>

+      <Name>CHANNEL03</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>3</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>4.38541E-6 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 4.38541E-6 2.40175 2.40175 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 4.38541E-6 2.40175 2.40175 4.38541E-6 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 4.38541E-6 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 4.38541E-6 2.40175 2.40175 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 2.40175 2.40175 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 12.0087 9.60698 12.0087 12.0087 12.0087 12.0087 12.0087 12.0087 14.4105 14.4105 14.4105 14.4105 14.4105 14.4105 16.8122 16.8122 16.8122 16.8122 16.8122 16.8122 16.8122 16.8122 16.8122 16.8122 19.214 19.214 19.214 19.214 19.214 19.214 19.214 19.214 21.6157 19.214 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 21.6157 24.0174 21.6157 21.6157 21.6157 21.6157 24.0174 24.0174 24.0174 24.0174 24.0174 24.0174 24.0174 24.0174 24.0174 24.0174 26.4192 26.4192 28.8209 28.8209 28.8209 31.2227 28.8209 28.8209 31.2227 31.2227 33.6245 33.6245 33.6245 33.6245 33.6245 31.2227 31.2227 31.2227 28.8209 31.2227 31.2227 31.2227 31.2227 31.2227 28.8209 28.8209 28.8209 31.2227 31.2227 31.2227 33.6245 36.0261 38.4279 38.4279 38.4279 36.0261 36.0261 36.0261 38.4279 36.0261 38.4279 36.0261 38.4279 40.8296 40.8296 43.2314 43.2314 45.6332 48.0349 50.4366 50.4366 52.8384 50.4366 50.4366 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 48.0349 50.4366 50.4366 50.4366 52.8384 52.8384 55.2401 55.2401 55.2401 55.2401 55.2401 57.6419 57.6419 60.0436 60.0436 62.4454 62.4454 62.4454 64.8471 64.8471 64.8471 67.2488 67.2488 67.2488 67.2488 67.2488 69.6506 69.6506 72.0523 72.0523 74.4541 74.4541 74.4541 74.4541 74.4541 74.4541 74.4541 74.4541 74.4541 74.4541 74.4541 74.4541 76.8559 79.2575 79.2575 79.2575 81.6593 81.6593 81.6593 84.0611 84.0611 84.0611 84.0611 84.0611 86.4628 88.8646 91.2663 91.2663 93.668 93.668 93.668 93.668 93.668 91.2663 88.8646 86.4628 86.4628 86.4628 86.4628 84.0611 86.4628 86.4628 86.4628 86.4628 88.8646 88.8646 91.2663 88.8646 91.2663 91.2663 93.668 93.668 93.668 93.668 93.668 93.668 91.2663 91.2663 88.8646 88.8646 88.8646 88.8646 88.8646 88.8646 91.2663 91.2663 93.668 96.0698 96.0698 98.4718 100.873 103.275 103.275 103.275 100.873 98.4718 96.0698 91.2663 88.8646 86.4628 86.4628 86.4628 86.4628 88.8646 96.0698 103.275 110.48 112.882 112.882 112.882 110.48 108.079 108.079 105.677 103.275 103.275 103.275 105.677 108.079 112.882 115.284 120.087 127.293 132.096 136.9 141.703 146.506 148.908 153.712 156.113 156.113 158.515 165.72 175.327 187.336 196.943 201.747 199.345 189.738 172.926 160.917 153.712 151.309 153.712 156.113 158.515 163.319 165.72 172.926 177.729 187.336 192.14 189.738 187.336 184.934 184.934 180.131 170.524 160.917 158.515 160.917 168.122 175.327 184.934 192.14 201.747 208.952 206.55 194.541 177.729 168.122 172.926 184.934 192.14 196.943 194.541 192.14 201.747 211.354 208.952 192.14 172.926 160.917 158.515 156.113 148.908 141.703 136.9 134.498 134.498 139.301 148.908 158.515 170.524 184.934 204.148 223.362 237.773 244.978 244.978 242.576 240.174 232.969 225.764 216.157 211.354 208.952 211.354 223.362 232.969 237.773 237.773 240.174 252.183 276.201 302.62 326.638 345.852 362.663 374.672 386.681 396.288 398.689 386.681 365.065 338.646 312.227 295.414 326.638 410.699 504.366 571.615 607.641 650.873 742.139 821.396 811.789 730.13 650.873 612.445 595.633 562.008 499.562 441.921 415.502 417.903 425.109 417.903 413.1 422.707 453.929 494.76 533.187 557.205 562.008 562.008 562.008 559.607 545.196 528.384 513.973 509.169 501.965 482.751 461.135 444.322 432.314 417.903 405.895 401.092 401.092 405.895 415.502 420.306 420.306 415.502 408.296 398.689 384.279 369.868 360.261 348.253 338.646 331.441 326.638 324.235 319.432 317.031 314.628 314.628 312.227 309.825 305.021 302.62 297.816 293.013 290.611 290.611 290.611 293.013 295.414 293.013 283.406 271.398 252.183 235.371 230.567 235.371 240.174 247.38 254.585 259.388 256.987 252.183 244.978 242.576 244.978 252.183 268.995 288.209 307.423 321.834 326.638 319.432 307.423 297.816 293.013 293.013 297.816 307.423 314.628 321.834 321.834 317.031 314.628 312.227 312.227 314.628 319.432 324.235 331.441 333.842 336.245 336.245 333.842 329.039 324.235 319.432 314.628 317.031 319.432 319.432 317.031 309.825 302.62 297.816 295.414 297.816 297.816 297.816 297.816 297.816 297.816 297.816 297.816 297.816 295.414 295.414 295.414 295.414 295.414 297.816 297.816 300.218 302.62 305.021 302.62 302.62 300.218 297.816 295.414 295.414 293.013 290.611 290.611 290.611 290.611 290.611 293.013 293.013 293.013 295.414 295.414 293.013 293.013 293.013 293.013 293.013 295.414 295.414 297.816 297.816 295.414 293.013 290.611 288.209 285.807 285.807 285.807 288.209 290.611 293.013 297.816 305.021 309.825 317.031 324.235 331.441 336.245 343.449 345.852 350.655 355.458 357.86 362.663 367.467 372.271 377.074 384.279 391.485 396.288 398.689 403.493 403.493 403.493 401.092 401.092 396.288 391.485 386.681 381.878 379.475 377.074 377.074 377.074 377.074 379.475 379.475 379.475 379.475 377.074 374.672 372.271 367.467 362.663 353.056 345.852 338.646 331.441 326.638 324.235 321.834 319.432 319.432 317.031 317.031 317.031 314.628 312.227 309.825 305.021 300.218 295.414 290.611 283.406 278.602 268.995 264.192 256.987 252.183 247.38 244.978 240.174 232.969 230.567 228.166 225.764 223.362 220.96 218.559 213.755 211.354 208.952 204.148 199.345 194.541 189.738 187.336 184.934 184.934 184.934 184.934 184.934 187.336 187.336 187.336 187.336 189.738 189.738 192.14 194.541 196.943 199.345 199.345 201.747 199.345 199.345 196.943 194.541 192.14 189.738 189.738 187.336 184.934 180.131 175.327 172.926 170.524 170.524 170.524 172.926 175.327 175.327 172.926 172.926 170.524 170.524 170.524 170.524 172.926 175.327 175.327 172.926 172.926 175.327 172.926 172.926 170.524 170.524 170.524 170.524 172.926 172.926 175.327 177.729 177.729 180.131 180.131 180.131 180.131 180.131 177.729 177.729 175.327 175.327 175.327 172.926 170.524 170.524 168.122 168.122 165.72 165.72 163.319 163.319 160.917 158.515 158.515 158.515 158.515 156.113 156.113 156.113 156.113 153.712 153.712 151.309 151.309 151.309 151.309 151.309 153.712 153.712 153.712 153.712 153.712 153.712 151.309 151.309 151.309 148.908 148.908 148.908 148.908 148.908 148.908 148.908 146.506 146.506 144.105 144.105 141.703 141.703 141.703 139.301 141.703 141.703 141.703 141.703 144.105 146.506 148.908 153.712 156.113 156.113 156.113 153.712 153.712 151.309 148.908 144.105 141.703 139.301 134.498 132.096 127.293 124.891 122.489 120.087 120.087 120.087 117.686 117.686 120.087 120.087 120.087 120.087 120.087 120.087 120.087 120.087 117.686 115.284 112.882 112.882 110.48 110.48 108.079 105.677 105.677 103.275 100.873 100.873 100.873 98.4718 98.4718 98.4718 98.4718 98.4718 98.4718 96.0698 96.0698 93.668 93.668 91.2663 91.2663 91.2663 88.8646 86.4628 84.0611 84.0611 81.6593 79.2575 79.2575 76.8559 74.4541 74.4541 72.0523 72.0523 72.0523 69.6506 69.6506 69.6506 69.6506 67.2488 67.2488 67.2488 64.8471 64.8471 64.8471 64.8471 62.4454 62.4454 60.0436 60.0436 57.6419 57.6419 57.6419 55.2401 55.2401 55.2401 55.2401 55.2401 55.2401 55.2401 55.2401 55.2401 55.2401 55.2401 55.2401 52.8384 52.8384 50.4366 50.4366 48.0349 45.6332 43.2314 43.2314 40.8296 40.8296 38.4279 36.0261 36.0261 36.0261 33.6245 33.6245 33.6245 31.2227 31.2227 28.8209 28.8209 28.8209 26.4192 26.4192 24.0174 21.6157 21.6157 19.214 19.214 16.8122 16.8122 14.4105 14.4105 14.4105 14.4105 14.4105 12.0087 12.0087 12.0087 9.60698 9.60698 7.20524 7.20524 4.8035 4.8035 2.40175 2.40175 4.38541E-6 -2.40174 -2.40174 -4.80349 -4.80349 -7.20523 -9.60697 -9.60697 -12.0087 -12.0087 -12.0087 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -16.8122 -16.8122 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -24.0174 -24.0174 -24.0174 -24.0174 -24.0174 -24.0174 -24.0174 -24.0174 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -31.2227 -31.2227 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -38.4279 -36.0261 -36.0261 -36.0261 -38.4279 -38.4279 -38.4279 -38.4279 -38.4279 -38.4279 -38.4279 -38.4279 -36.0261 -38.4279 -36.0261 -36.0261 -38.4279 -38.4279 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -38.4279 -38.4279 -38.4279 -38.4279 -40.8296 -38.4279 -40.8296 -38.4279 -38.4279 -38.4279 -38.4279 -36.0261 -38.4279 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -36.0261 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -33.6245 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -31.2227 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -28.8209 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -24.0174 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -26.4192 -24.0174 -24.0174 -24.0174 -24.0174 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -21.6156 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -19.214 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -16.8122 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -9.60697 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -7.20523 -9.60697 -9.60697 -9.60697 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -4.80349 -4.80349 -7.20523 -4.80349 -7.20523 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -2.40174 -4.80349 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 4.38541E-6 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 4.8035 4.8035 2.40175 2.40175 4.38541E-6 4.38541E-6 2.40175 4.8035 4.8035 7.20524 7.20524 9.60698 9.60698 9.60698 7.20524 7.20524 7.20524 7.20524 9.60698 9.60698 9.60698 9.60698 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 9.60698 9.60698 7.20524 7.20524 7.20524 7.20524 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 9.60698 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 9.60698 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 7.20524 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 2.40175 4.8035 2.40175 4.8035 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.8035 2.40175 4.8035 4.8035 2.40175 2.40175 2.40175 2.40175 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 2.40175 2.40175 2.40175 2.40175 2.40175 4.8035 4.8035 4.8035 4.8035 4.8035 4.8035 2.40175 4.8035 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.8035 4.8035 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 -2.40174 -2.40174 -2.40174 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 -2.40174 4.38541E-6 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -4.80349 -4.80349 -4.80349 -4.80349 -2.40174 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -9.60697 -9.60697 -7.20523 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -12.0087 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -12.0087 -9.60697 -9.60697 -9.60697 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -14.4105 -14.4105 -12.0087 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -16.8122 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -16.8122 -16.8122 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -16.8122 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -14.4105 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -14.4105 -14.4105 -14.4105 -12.0087 -14.4105 -12.0087 -14.4105 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -12.0087 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -12.0087 -12.0087 -12.0087 -12.0087 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -7.20523 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -7.20523 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -9.60697 -7.20523 -7.20523 -9.60697 -9.60697 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -9.60697 -9.60697 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -7.20523 -4.80349 -7.20523 -4.80349 -7.20523 -7.20523 -7.20523 -4.80349 -7.20523 -4.80349 -4.80349 -4.80349 -7.20523 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -4.80349 -2.40174 -4.80349 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -4.80349 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 -2.40174 4.38541E-6 -2.40174 4.38541E-6 -2.40174 4.38541E-6 -2.40174 -2.40174 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 4.38541E-6 4.38541E-6 4.38541E-6 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 2.40175 4.8035 4.8035 4.8035 2.40175 4.8035 2.40175 4.8035 4.8035 4.8035</A_FLOAT64>

+      </Values>

+      <Id>5</Id>

+      <Name>CHANNEL01</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>1</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>-1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -5.43436 -1.74623E-7 -5.43436 -5.43436 -5.43436 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -5.43436 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 -1.74623E-7 -1.74623E-7 5.43436 -1.74623E-7 -1.74623E-7 5.43436 -1.74623E-7 -1.74623E-7 5.43436 5.43436 -1.74623E-7 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 -1.74623E-7 -1.74623E-7 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 5.43436 -1.74623E-7 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 -1.74623E-7 5.43436 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 -1.74623E-7 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 -1.74623E-7 -1.74623E-7 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 5.43436 -1.74623E-7 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 -1.74623E-7 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 5.43436 10.8687 5.43436 5.43436 10.8687 10.8687 10.8687 10.8687 10.8687 10.8687 16.3031 16.3031 10.8687 16.3031 16.3031 16.3031 16.3031 16.3031 16.3031 16.3031 16.3031 21.7374 21.7374 21.7374 21.7374 21.7374 21.7374 21.7374 21.7374 21.7374 21.7374 27.1718 27.1718 27.1718 32.6061 27.1718 27.1718 27.1718 27.1718 32.6061 32.6061 32.6061 32.6061 32.6061 32.6061 32.6061 32.6061 38.0405 38.0405 38.0405 38.0405 38.0405 38.0405 38.0405 43.4748 43.4748 43.4748 43.4748 43.4748 43.4748 48.9092 48.9092 48.9092 48.9092 48.9092 54.3436 65.2123 76.081 76.081 65.2123 59.7779 59.7779 70.6466 76.081 81.5153 81.5153 81.5153 86.9497 92.3841 97.8184 103.253 108.687 108.687 114.121 114.121 119.556 130.425 135.859 124.99 103.253 97.8184 124.99 152.162 163.031 163.031 163.031 168.465 173.899 173.899 195.637 244.546 336.93 478.223 548.87 505.395 402.142 331.496 347.799 385.839 423.88 451.052 445.617 407.577 353.233 315.193 315.193 326.061 347.799 369.536 374.971 374.971 380.405 402.142 429.314 440.183 423.88 418.445 418.445 429.314 423.88 402.142 385.839 380.405 396.708 402.142 402.142 402.142 413.011 434.748 451.052 461.92 472.789 478.223 489.092 494.526 494.526 494.526 489.092 489.092 489.092 489.092 489.092 483.658 478.223 478.223 483.658 494.526 494.526 494.526 494.526 494.526 499.961 499.961 510.829 516.264 521.698 516.264 499.961 499.961 527.133 548.87 559.739 570.607 581.476 592.345 614.082 635.82 652.123 662.991 668.426 668.426 668.426 679.294 684.729 690.163 679.294 652.123 630.385 641.254 690.163 728.204 728.204 695.598 673.86 701.032 755.375 798.85 809.719 793.416 782.547 809.719 864.063 923.841 961.881 972.75 989.053 1021.66 1070.57 1097.74 1097.74 1076.0 1043.4 1005.36 983.618 961.881 940.144 923.841 929.275 951.012 994.487 1037.96 1081.44 1114.04 1135.78 1152.08 1162.95 1173.82 1179.26 1173.82 1168.39 1168.39 1173.82 1179.26 1179.26 1184.69 1195.56 1211.86 1233.6 1255.34 1271.64 1282.51 1293.38 1304.25 1309.68 1309.68 1304.25 1304.25 1304.25 1304.25 1309.68 1315.11 1331.42 1347.72 1369.46 1385.76 1407.5 1429.24 1450.97 1472.71 1489.01 1510.75 1527.05 1548.79 1565.09 1581.4 1597.7 1619.44 1646.61 1679.22 1717.26 1749.86 1787.9 1825.94 1869.42 1923.76 1983.54 2054.19 2130.27 2200.91 2260.69 2304.17 2347.64 2412.85 2472.63 2499.8 2526.98 2570.45 2624.79 2668.27 2700.88 2749.78 2804.13 2853.04 2891.08 2929.12 2967.16 3016.07 3070.41 3097.58 3119.32 3141.06 3179.1 3211.7 3244.31 3271.48 3304.09 3342.13 3369.3 3391.04 3418.21 3456.25 3505.16 3526.9 3526.9 3537.77 3559.5 3575.81 3575.81 3575.81 3602.98 3641.02 3673.62 3673.62 3673.62 3689.93 3706.23 3706.23 3706.23 3700.8 3695.36 3679.06 3646.45 3602.98 3564.94 3532.33 3499.73 3461.68 3412.78 3358.43 3325.83 3293.22 3244.31 3173.66 3113.89 3059.54 3010.63 2967.16 2929.12 2885.64 2820.43 2760.65 2717.18 2695.44 2679.14 2635.66 2575.88 2499.8 2423.72 2358.51 2304.17 2255.26 2200.91 2141.14 2081.36 2016.15 1956.37 1896.59 1836.81 1782.47 1744.43 1722.69 1695.52 1662.91 1619.44 1586.83 1554.23 1521.62 1494.45 1467.28 1440.1 1402.06 1364.02 1325.98 1271.64 1200.99 1141.21 1119.48 1119.48 1097.74 1048.83 989.053 918.406 864.063 826.022 771.679 695.598 619.517 559.739 516.264 472.789 423.88 391.274 369.536 347.799 326.061 298.89 271.718 255.415 239.112 233.677 228.243 222.809 201.071 168.465 146.728 157.596 168.465 157.596 130.425 103.253 86.9497 81.5153 86.9497 81.5153 65.2123 43.4748 27.1718 21.7374 16.3031 16.3031 16.3031 10.8687 5.43436 5.43436 21.7374 48.9092 81.5153 119.556 146.728 163.031 168.465 184.768 190.202 201.071 201.071 195.637 168.465 152.162 168.465 195.637 201.071 179.334 146.728 124.99 119.556 108.687 92.3841 70.6466 65.2123 65.2123 48.9092 32.6061 32.6061 43.4748 48.9092 38.0405 32.6061 27.1718 32.6061 38.0405 32.6061 27.1718 32.6061 38.0405 43.4748 43.4748 43.4748 54.3436 70.6466 81.5153 86.9497 97.8184 114.121 135.859 141.293 141.293 146.728 168.465 201.071 222.809 222.809 201.071 179.334 184.768 195.637 206.506 206.506 206.506 228.243 282.587 288.021 244.546 228.243 244.546 255.415 260.849 260.849 249.98 244.546 249.98 266.283 293.455 304.324 293.455 277.152 271.718 282.587 293.455 304.324 304.324 298.89 288.021 271.718 260.849 249.98 255.415 277.152 304.324 342.364 353.233 342.364 336.93 347.799 364.102 380.405 391.274 396.708 402.142 396.708 402.142 402.142 391.274 380.405 364.102 347.799 336.93 331.496 320.627 320.627 331.496 331.496 331.496 320.627 315.193 309.758 304.324 293.455 282.587 277.152 271.718 255.415 239.112 222.809 217.374 206.506 168.465 135.859 124.99 108.687 103.253 119.556 146.728 173.899 190.202 206.506 228.243 266.283 288.021 288.021 282.587 282.587 277.152 271.718 271.718 288.021 298.89 298.89 293.455 282.587 271.718 249.98 217.374 152.162 76.081 32.6061 5.43436 -43.4748 -146.728 -255.415 -353.233 -413.011 -429.314 -445.617 -494.526 -554.304 -559.739 -532.567 -510.83 -521.698 -538.001 -538.001 -538.001 -554.304 -586.91 -614.082 -635.82 -657.557 -673.86 -695.598 -711.901 -722.769 -733.638 -733.638 -728.204 -722.769 -711.901 -701.032 -695.598 -690.163 -690.163 -684.729 -679.295 -684.729 -701.032 -717.335 -733.638 -755.376 -777.113 -804.285 -820.588 -836.891 -847.76 -853.194 -869.497 -885.8 -902.103 -912.972 -918.406 -923.841 -934.709 -940.144 -951.012 -967.315 -994.487 -1016.22 -1032.53 -1043.4 -1054.27 -1065.13 -1070.57 -1081.44 -1092.31 -1108.61 -1135.78 -1162.95 -1179.26 -1200.99 -1222.73 -1249.9 -1277.07 -1298.81 -1315.11 -1331.42 -1336.85 -1342.29 -1353.15 -1369.46 -1391.2 -1412.93 -1434.67 -1461.84 -1489.01 -1521.62 -1548.79 -1570.53 -1586.83 -1603.14 -1619.44 -1641.18 -1657.48 -1673.78 -1690.08 -1695.52 -1695.52 -1690.08 -1690.08 -1695.52 -1690.08 -1673.78 -1657.48 -1646.61 -1646.61 -1641.18 -1619.44 -1597.7 -1570.53 -1559.66 -1559.66 -1570.53 -1570.53 -1554.23 -1543.36 -1554.23 -1565.09 -1581.4 -1597.7 -1597.7 -1570.53 -1543.36 -1548.79 -1586.83 -1597.7 -1559.66 -1543.36 -1548.79 -1543.36 -1521.62 -1521.62 -1543.36 -1581.4 -1581.4 -1570.53 -1575.96 -1597.7 -1619.44 -1624.87 -1614.0 -1592.27 -1586.83 -1581.4 -1570.53 -1554.23 -1548.79 -1554.23 -1559.66 -1559.66 -1559.66 -1565.09 -1565.09 -1548.79 -1532.49 -1516.19 -1505.32 -1494.45 -1489.01 -1483.58 -1483.58 -1489.01 -1483.58 -1483.58 -1483.58 -1483.58 -1478.14 -1483.58 -1478.14 -1478.14 -1472.71 -1467.28 -1472.71 -1472.71 -1467.28 -1467.28 -1467.28 -1467.28 -1461.84 -1456.41 -1445.54 -1434.67 -1429.24 -1423.8 -1423.8 -1423.8 -1423.8 -1418.37 -1407.5 -1385.76 -1364.02 -1347.72 -1342.29 -1336.85 -1331.42 -1336.85 -1342.29 -1358.59 -1369.46 -1374.89 -1374.89 -1380.33 -1380.33 -1374.89 -1364.02 -1353.15 -1342.29 -1336.85 -1320.55 -1315.11 -1304.25 -1298.81 -1287.94 -1277.07 -1271.64 -1266.21 -1260.77 -1266.21 -1266.21 -1255.34 -1244.47 -1233.6 -1233.6 -1233.6 -1239.03 -1239.03 -1244.47 -1239.03 -1239.03 -1233.6 -1217.3 -1200.99 -1179.26 -1157.52 -1146.65 -1135.78 -1130.35 -1124.91 -1124.91 -1119.48 -1108.61 -1097.74 -1086.87 -1092.31 -1092.31 -1092.31 -1092.31 -1092.31 -1092.31 -1086.87 -1081.44 -1076.0 -1065.13 -1059.7 -1054.27 -1048.83 -1043.4 -1043.4 -1043.4 -1037.96 -1032.53 -1021.66 -1021.66 -1027.09 -1027.09 -1016.22 -1005.36 -999.922 -994.487 -983.618 -978.184 -972.75 -967.315 -967.315 -967.315 -967.315 -961.881 -961.881 -956.447 -945.578 -934.709 -929.275 -923.841 -918.406 -912.972 -912.972 -907.538 -902.103 -896.669 -891.234 -891.234 -885.8 -885.8 -880.366 -874.931 -869.497 -869.497 -864.063 -858.628 -853.194 -847.76 -847.76 -836.891 -826.022 -820.588 -820.588 -809.719 -798.85 -782.547 -777.113 -766.244 -760.81 -749.941 -749.941 -749.941 -744.507 -744.507 -733.638 -733.638 -728.204 -717.335 -711.901 -706.466 -701.032 -695.598 -690.163 -684.729 -679.295 -673.86 -673.86 -673.86 -668.426 -662.992 -662.992 -657.557 -652.123 -652.123 -652.123 -646.688 -641.254 -635.82 -630.385 -624.951 -614.082 -608.648 -603.214 -597.779 -592.345 -581.476 -576.042 -570.607 -559.739 -554.304 -543.436 -538.001 -532.567 -532.567 -527.133 -521.698 -521.698 -516.264 -510.83 -505.395 -505.395 -499.961 -499.961 -494.526 -489.092 -483.658 -483.658 -478.223 -478.223 -478.223 -472.789 -472.789 -467.355 -467.355 -461.92 -461.92 -461.92 -461.92 -461.92 -461.92 -461.92 -461.92 -456.486 -456.486 -451.052 -451.052 -445.617 -445.617 -440.183 -440.183 -434.749 -429.314 -429.314 -429.314 -429.314 -423.88 -423.88 -423.88 -423.88 -418.445 -418.445 -418.445 -418.445 -418.445 -413.011 -413.011 -407.577 -407.577 -413.011 -413.011 -413.011 -407.577 -413.011 -413.011 -413.011 -413.011 -407.577 -418.445 -467.355 -483.658 -445.617 -407.577 -396.708 -396.708 -396.708 -396.708 -391.274 -391.274 -391.274 -396.708 -396.708 -396.708 -391.274 -396.708 -396.708 -396.708 -391.274 -396.708 -402.142 -402.142 -402.142 -396.708 -396.708 -396.708 -402.142 -402.142 -396.708 -402.142 -396.708 -396.708 -396.708 -396.708 -396.708 -396.708 -391.274 -391.274 -391.274 -385.839 -385.839 -385.839 -380.405 -380.405 -380.405 -380.405 -380.405 -385.839 -385.839 -385.839 -385.839 -385.839 -380.405 -380.405 -380.405 -385.839 -380.405 -385.839 -385.839 -385.839 -385.839 -385.839 -391.274 -391.274 -391.274 -391.274 -391.274 -391.274 -396.708 -396.708 -396.708 -396.708 -396.708 -396.708 -396.708 -396.708 -396.708 -402.142 -396.708 -396.708 -391.274 -391.274 -391.274 -391.274 -391.274 -391.274 -391.274 -391.274 -391.274 -391.274 -385.839 -380.405 -380.405 -374.971 -374.971 -374.971 -374.971 -374.971 -374.971 -374.971 -369.536 -369.536 -364.102 -364.102 -358.668 -364.102 -358.668 -358.668 -358.668 -358.668 -358.668 -358.668 -353.233 -353.233 -353.233 -353.233 -353.233 -347.799 -347.799 -347.799 -347.799 -347.799 -347.799 -342.364 -342.364 -342.364 -342.364 -342.364 -336.93 -336.93 -331.496 -336.93 -331.496 -336.93 -331.496 -331.496 -326.061 -326.061 -326.061 -320.627 -320.627 -320.627 -320.627 -320.627 -320.627 -320.627 -320.627 -320.627 -320.627 -315.193 -315.193 -315.193 -315.193 -315.193 -309.758 -309.758 -309.758 -309.758 -309.758 -304.324 -304.324 -304.324 -304.324 -304.324 -304.324 -304.324 -298.89 -298.89 -298.89 -298.89 -298.89 -293.455 -293.455 -293.455 -288.021 -288.021 -282.587 -282.587 -282.587 -282.587 -282.587 -277.152 -277.152 -277.152 -271.718 -266.283 -266.283 -266.283 -266.283 -266.283 -260.849 -260.849 -255.415 -255.415 -255.415 -249.98 -249.98 -249.98 -249.98 -244.546 -244.546 -244.546 -244.546 -239.112 -233.677 -233.677 -239.112 -239.112 -233.677 -233.677 -239.112 -239.112 -239.112 -239.112 -233.677 -228.243 -233.677 -233.677 -233.677 -233.677 -233.677 -228.243 -228.243 -233.677 -228.243 -233.677 -228.243 -228.243 -228.243 -222.809 -222.809 -222.809 -222.809 -222.809 -217.374 -217.374 -217.374 -217.374 -217.374 -217.374 -217.374 -211.94 -211.94 -211.94 -211.94 -217.374 -217.374 -211.94 -211.94 -211.94 -217.374 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -206.506 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -206.506 -206.506 -211.94 -206.506 -211.94 -211.94 -211.94 -211.94 -211.94 -211.94 -206.506 -206.506 -206.506 -206.506 -206.506 -206.506 -206.506 -201.071 -201.071 -201.071 -201.071 -201.071 -201.071 -201.071 -201.071 -201.071 -201.071 -195.637 -201.071 -201.071 -201.071 -195.637 -195.637 -195.637 -195.637 -195.637 -195.637 -190.202 -195.637 -195.637 -190.202 -190.202 -190.202 -190.202 -190.202 -184.768 -184.768 -184.768 -184.768 -179.334 -184.768 -184.768 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -173.899 -179.334 -179.334 -179.334 -179.334 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -168.465 -168.465 -168.465 -163.031 -157.596 -152.162 -146.728 -135.859 -124.99 -119.556 -119.556 -124.99 -135.859 -146.728 -157.596 -168.465 -173.899 -173.899 -168.465 -163.031 -163.031 -152.162 -146.728 -146.728 -146.728 -141.293 -141.293 -141.293 -141.293 -141.293 -146.728 -152.162 -152.162 -157.596 -157.596 -157.596 -157.596 -163.031 -163.031 -163.031 -163.031 -173.899 -179.334 -179.334 -179.334 -173.899 -173.899 -168.465 -168.465 -163.031 -163.031 -157.596 -152.162 -152.162 -146.728 -152.162 -152.162 -152.162 -146.728 -141.293 -141.293 -141.293 -146.728 -146.728 -141.293 -141.293 -141.293 -141.293 -141.293 -141.293 -135.859 -135.859 -135.859 -141.293 -141.293 -141.293 -141.293 -141.293 -141.293 -141.293 -146.728 -146.728 -146.728 -146.728 -152.162 -152.162 -152.162 -152.162 -152.162 -152.162 -152.162 -152.162 -152.162 -146.728 -146.728 -141.293 -141.293 -141.293 -141.293 -141.293 -135.859 -135.859 -135.859 -135.859 -130.425 -130.425 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -130.425 -130.425 -135.859 -141.293 -141.293 -141.293 -135.859 -135.859 -141.293 -146.728 -146.728 -141.293 -141.293 -141.293 -141.293 -146.728 -146.728 -146.728 -141.293 -141.293 -141.293 -141.293 -141.293 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -130.425 -130.425 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -130.425 -130.425 -130.425 -130.425 -130.425 -124.99 -124.99 -124.99 -124.99 -124.99 -124.99 -124.99 -124.99 -119.556 -119.556 -119.556 -119.556 -119.556 -119.556 -119.556 -119.556 -119.556 -119.556 -124.99 -124.99 -124.99 -119.556 -119.556 -124.99 -119.556 -119.556 -119.556 -124.99 -119.556 -119.556 -119.556 -119.556 -119.556 -119.556 -114.121 -119.556 -114.121 -119.556 -119.556 -119.556 -119.556 -119.556 -119.556 -114.121 -119.556 -119.556 -119.556 -119.556 -119.556 -114.121 -114.121 -108.687 -108.687 -108.687 -108.687 -103.253 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -114.121 -108.687 -108.687 -108.687 -108.687 -103.253 -103.253 -108.687 -108.687 -108.687 -108.687 -103.253 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -114.121 -114.121 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -108.687 -114.121 -114.121 -108.687 -114.121 -114.121 -114.121 -114.121 -119.556 -124.99 -130.425 -130.425 -124.99 -114.121 -108.687 -103.253 -108.687 -119.556 -124.99 -124.99 -124.99 -114.121 -108.687 -108.687 -108.687 -103.253 -86.9497 -81.5153 -81.5153 -92.3841 -103.253 -103.253 -97.8184 -97.8184 -103.253 -108.687 -108.687 -108.687 -108.687 -103.253 -92.3841 -86.9497 -86.9497 -92.3841 -97.8184 -103.253 -103.253 -108.687 -114.121 -114.121 -108.687 -108.687 -108.687 -114.121 -108.687 -108.687 -103.253 -108.687 -108.687 -114.121 -114.121 -108.687 -108.687 -114.121 -119.556 -124.99 -124.99 -124.99 -124.99 -124.99 -119.556 -114.121 -108.687 -114.121 -114.121 -114.121 -108.687 -103.253 -97.8184 -103.253 -114.121 -130.425 -130.425 -119.556 -114.121 -114.121 -119.556 -119.556 -124.99 -124.99 -124.99 -124.99 -119.556 -114.121 -114.121 -119.556 -119.556 -119.556 -114.121 -86.9497 -70.6466 -103.253 -141.293 -152.162 -141.293 -124.99 -119.556 -130.425 -141.293 -146.728 -135.859 -124.99 -135.859 -152.162 -157.596 -141.293 -130.425 -135.859 -146.728 -157.596 -157.596 -146.728 -135.859 -135.859 -141.293 -141.293 -146.728 -141.293 -135.859 -146.728 -152.162 -152.162 -146.728 -135.859 -135.859 -135.859 -130.425 -130.425 -130.425 -135.859 -141.293 -141.293 -141.293 -141.293 -141.293 -146.728 -146.728 -146.728 -141.293 -135.859 -135.859 -135.859 -135.859 -135.859 -135.859 -130.425 -130.425 -124.99 -114.121 -114.121 -124.99 -135.859 -146.728 -152.162 -157.596 -152.162 -146.728 -141.293 -141.293 -135.859 -130.425 -130.425 -130.425 -130.425 -130.425 -135.859 -141.293 -146.728 -146.728 -146.728 -152.162 -152.162 -146.728 -141.293 -135.859 -135.859 -130.425 -135.859 -141.293 -146.728 -152.162 -146.728 -146.728 -152.162 -152.162 -152.162 -152.162 -146.728 -146.728 -152.162 -157.596 -163.031 -163.031 -163.031 -163.031 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -163.031 -157.596 -157.596 -157.596 -157.596 -157.596 -163.031 -168.465 -163.031 -163.031 -157.596 -157.596 -157.596 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -168.465 -168.465 -168.465 -168.465 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -163.031 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -173.899 -173.899 -179.334 -184.768 -184.768 -179.334 -179.334 -173.899 -173.899 -173.899 -173.899 -179.334 -173.899 -179.334 -179.334 -179.334 -179.334 -173.899 -173.899 -173.899 -173.899 -179.334 -179.334 -173.899 -173.899 -179.334 -179.334 -179.334 -173.899 -173.899 -173.899 -173.899 -168.465 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -179.334 -173.899 -173.899 -173.899 -173.899 -168.465 -163.031 -173.899 -184.768 -190.202 -190.202 -184.768 -184.768 -179.334 -173.899 -173.899 -173.899 -179.334 -179.334 -179.334 -179.334 -173.899 -168.465 -168.465 -168.465 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -168.465 -168.465 -168.465 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -179.334 -179.334 -179.334 -173.899 -173.899 -173.899 -173.899 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -184.768 -184.768 -184.768 -184.768 -184.768 -184.768 -184.768 -184.768 -184.768 -184.768 -184.768 -179.334 -184.768 -184.768 -184.768 -184.768 -184.768 -179.334 -179.334 -179.334 -179.334 -179.334 -173.899 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -179.334 -173.899 -173.899 -179.334 -179.334 -179.334 -179.334 -179.334 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -173.899 -179.334 -179.334 -179.334 -173.899 -173.899 -168.465 -168.465 -163.031 -168.465 -168.465 -173.899 -179.334 -179.334 -173.899 -173.899 -168.465 -168.465 -168.465 -168.465 -173.899 -168.465 -173.899 -168.465 -168.465 -168.465 -163.031 -163.031 -163.031 -163.031 -168.465 -168.465 -168.465 -168.465 -163.031 -163.031 -163.031 -168.465 -168.465 -168.465 -168.465 -173.899 -168.465 -168.465 -163.031 -163.031 -163.031 -163.031 -168.465 -168.465 -173.899 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -163.031 -163.031 -163.031 -163.031 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -157.596 -157.596 -163.031 -168.465 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -168.465 -168.465 -163.031 -157.596 -157.596 -157.596 -163.031 -163.031 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -152.162 -152.162 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -152.162 -152.162 -152.162 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -152.162 -152.162 -152.162 -157.596 -152.162 -157.596 -152.162 -152.162 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -152.162 -152.162 -152.162 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -168.465 -168.465 -168.465 -173.899 -173.899 -168.465 -163.031 -168.465 -168.465 -168.465 -168.465 -168.465 -168.465 -163.031 -163.031 -168.465 -168.465 -168.465 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -163.031 -157.596 -163.031 -163.031 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -163.031 -163.031 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596 -157.596</A_FLOAT64>

+      </Values>

+      <Id>6</Id>

+      <Name>CHANNEL06</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>6</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>-4.51025 -4.51025 -4.51025 2.00455 2.00455 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -11.025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -4.51025 -11.025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -11.025 -4.51025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 -4.51025 -4.51025 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 -4.51025 -4.51025 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 -4.51025 -4.51025 2.00455 2.00455 -4.51025 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 -4.51025 2.00455 2.00455 -4.51025 -4.51025 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 2.00455 -4.51025 2.00455 -4.51025 2.00455 2.00455 2.00455 -4.51025 -4.51025 2.00455 -4.51025 2.00455 -4.51025 -4.51025 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 -4.51025 -4.51025 2.00455 2.00455 -4.51025 -4.51025 2.00455 2.00455 -4.51025 -4.51025 -4.51025 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 2.00455 2.00455 -4.51025 -4.51025 -4.51025 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -11.025 -11.025 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -30.5694 -30.5694 -30.5694 -30.5694 -30.5694 -30.5694 -30.5694 -37.0842 -37.0842 -30.5694 -30.5694 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -43.599 -43.599 -43.599 -43.599 -43.599 -43.599 -43.599 -43.599 -43.599 -43.599 -43.599 -43.599 -37.0842 -43.599 -43.599 -37.0842 -37.0842 -37.0842 -30.5694 -37.0842 -37.0842 -37.0842 -37.0842 -37.0842 -30.5694 -30.5694 -30.5694 -24.0546 -24.0546 -24.0546 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -11.025 -11.025 -11.025 -17.5398 -30.5694 -30.5694 -24.0546 -11.025 -4.51025 8.51934 15.0341 8.51934 2.00455 2.00455 2.00455 2.00455 15.0341 47.6081 60.6377 34.5785 28.0637 28.0637 8.51934 -4.51025 2.00455 -4.51025 -11.025 -4.51025 -11.025 -30.5694 -43.599 -50.1138 -50.1138 -37.0842 -4.51025 2.00455 -4.51025 -11.025 -17.5398 -30.5694 -43.599 -43.599 -56.6286 -76.173 -95.7174 -108.747 -115.262 -115.262 -121.777 -121.777 -121.777 -115.262 -115.262 -102.232 -102.232 -102.232 -102.232 -102.232 -102.232 -108.747 -121.777 -128.291 -134.806 -141.321 -147.836 -154.351 -154.351 -154.351 -160.865 -167.38 -173.895 -180.41 -186.925 -193.439 -193.439 -193.439 -199.954 -199.954 -199.954 -206.469 -206.469 -199.954 -199.954 -199.954 -206.469 -199.954 -199.954 -199.954 -199.954 -199.954 -199.954 -193.439 -186.925 -186.925 -186.925 -180.41 -173.895 -167.38 -167.38 -167.38 -167.38 -173.895 -186.925 -193.439 -186.925 -167.38 -147.836 -134.806 -121.777 -121.777 -115.262 -121.777 -121.777 -128.291 -134.806 -134.806 -128.291 -128.291 -108.747 -76.173 -43.599 -11.025 8.51934 15.0341 8.51934 -4.51025 -11.025 -17.5398 -11.025 -11.025 2.00455 28.0637 67.1525 99.7265 132.3 158.36 177.904 184.419 184.419 171.389 158.36 138.815 125.786 106.241 93.2117 86.6969 93.2117 106.241 112.756 125.786 132.3 138.815 138.815 138.815 138.815 132.3 125.786 119.271 106.241 99.7265 93.2117 86.6969 80.1821 80.1821 73.6673 73.6673 73.6673 67.1525 67.1525 67.1525 60.6377 54.1229 47.6081 41.0933 41.0933 34.5785 34.5785 41.0933 41.0933 41.0933 34.5785 34.5785 28.0637 21.5489 15.0341 8.51934 2.00455 2.00455 2.00455 8.51934 8.51934 8.51934 8.51934 8.51934 2.00455 -11.025 -17.5398 -43.599 -63.1434 -69.6582 -82.6878 -95.7174 -95.7174 -89.2026 -82.6878 -76.173 -63.1434 -56.6286 -56.6286 -56.6286 -50.1138 -50.1138 -43.599 -50.1138 -43.599 -30.5694 2.00455 34.5785 60.6377 80.1821 86.6969 93.2117 99.7265 106.241 119.271 132.3 132.3 132.3 132.3 138.815 138.815 145.33 151.845 151.845 151.845 158.36 164.874 164.874 171.389 164.874 164.874 151.845 145.33 138.815 119.271 99.7265 86.6969 73.6673 60.6377 54.1229 47.6081 34.5785 21.5489 15.0341 8.51934 8.51934 -4.51025 -17.5398 -30.5694 -37.0842 -43.599 -50.1138 -56.6286 -63.1434 -69.6582 -69.6582 -76.173 -82.6878 -89.2026 -95.7174 -102.232 -102.232 -115.262 -128.291 -134.806 -134.806 -108.747 -30.5694 125.786 308.2 477.585 614.395 712.117 783.78 829.383 842.413 855.443 861.957 861.957 848.928 829.383 783.78 712.117 633.94 549.247 497.129 497.129 510.158 529.703 581.821 646.969 686.058 712.117 718.632 731.661 744.691 679.543 614.395 666.514 686.058 614.395 581.821 575.306 549.247 536.218 536.218 523.188 516.673 529.703 536.218 523.188 510.158 503.644 497.129 490.614 458.04 412.437 379.863 353.803 301.685 243.052 190.934 151.845 112.756 73.6673 28.0637 -4.51025 -17.5398 -17.5398 -24.0546 -30.5694 -50.1138 -82.6878 -82.6878 -50.1138 -43.599 -56.6286 -37.0842 -17.5398 -17.5398 -30.5694 -37.0842 -43.599 -43.599 -24.0546 -24.0546 -17.5398 21.5489 41.0933 47.6081 54.1229 67.1525 73.6673 15.0341 -24.0546 2.00455 21.5489 28.0637 47.6081 86.6969 119.271 138.815 171.389 190.934 230.022 262.596 301.685 347.289 392.892 431.981 458.04 477.585 490.614 503.644 497.129 477.585 445.011 418.951 412.437 405.922 373.348 340.774 321.229 314.715 295.17 282.141 249.567 190.934 151.845 145.33 132.3 106.241 93.2117 99.7265 106.241 119.271 125.786 132.3 145.33 151.845 151.845 164.874 177.904 203.963 243.052 288.656 340.774 392.892 405.922 405.922 425.466 464.555 516.673 568.792 601.366 633.94 673.028 699.088 718.632 738.176 738.176 751.206 790.295 835.898 881.502 927.105 914.076 829.383 790.295 809.839 822.869 829.383 855.443 861.957 855.443 861.957 888.017 894.531 907.561 914.076 933.62 959.679 985.739 1011.8 1044.37 1070.43 1103.0 1135.58 1168.15 1194.21 1213.76 1233.3 1259.36 1291.93 1317.99 1344.05 1370.11 1402.69 1435.26 1448.29 1454.8 1474.35 1493.89 1500.41 1506.92 1493.89 1493.89 1500.41 1506.92 1513.44 1526.47 1539.5 1559.04 1552.53 1532.98 1519.95 1526.47 1519.95 1493.89 1480.86 1480.86 1474.35 1467.83 1474.35 1500.41 1526.47 1572.07 1624.19 1689.34 1767.51 1858.72 1943.41 2034.62 2138.86 2236.58 2340.82 2438.54 2549.29 2666.56 2783.82 2894.57 3018.35 3155.17 3311.52 3467.88 3591.66 3682.86 3741.5 3787.1 3813.16 3858.76 3910.88 3969.51 4028.15 4093.3 4158.44 4217.08 4275.71 4334.34 4379.95 4425.55 4477.67 4516.76 4549.33 4575.39 4601.45 4627.51 4640.54 4660.08 4679.63 4692.66 4699.17 4705.69 4712.2 4718.72 4738.26 4777.35 4809.92 4849.01 4894.62 4946.73 4992.34 5031.43 5057.49 5070.51 5077.03 5083.54 5083.54 5077.03 5064.0 5057.49 5050.97 5064.0 5077.03 5077.03 5057.49 5037.94 5018.4 4998.85 4985.82 4985.82 4985.82 4985.82 4992.34 4985.82 4972.79 4972.79 4979.31 4979.31 4959.76 4946.73 4946.73 4933.7 4927.19 4940.22 4959.76 4959.76 4953.25 4972.79 4992.34 4998.85 5024.91 5064.0 5103.09 5148.69 5194.3 5246.41 5292.02 5337.62 5376.71 5396.25 5402.77 5409.28 5409.28 5409.28 5422.31 5448.37 5461.4 5461.4 5448.37 5441.86 5435.34 5415.8 5383.22 5350.65 5324.59 5305.05 5298.53 5305.05 5311.56 5318.08 5331.11 5357.17 5389.74 5428.83 5448.37 5435.34 5422.31 5422.31 5448.37 5467.92 5467.92 5461.4 5467.92 5487.46 5500.49 5513.52 5526.55 5552.61 5585.18 5611.24 5624.27 5643.82 5676.39 5702.45 5715.48 5721.99 5728.51 5728.51 5721.99 5715.48 5708.96 5708.96 5715.48 5715.48 5715.48 5715.48 5728.51 5735.02 5735.02 5728.51 5721.99 5708.96 5695.94 5682.91 5676.39 5676.39 5682.91 5682.91 5689.42 5695.94 5702.45 5702.45 5708.96 5708.96 5702.45 5695.94 5689.42 5689.42 5689.42 5689.42 5689.42 5689.42 5689.42 5689.42 5682.91 5676.39 5663.36 5656.85 5643.82 5637.3 5617.76 5611.24 5598.21 5585.18 5572.15 5552.61 5539.58 5513.52 5493.98 5480.95 5461.4 5441.86 5435.34 5441.86 5441.86 5454.89 5461.4 5467.92 5461.4 5448.37 5428.83 5409.28 5376.71 5331.11 5292.02 5246.41 5194.3 5142.18 5083.54 5031.43 4985.82 4933.7 4888.1 4855.53 4829.47 4809.92 4796.89 4777.35 4757.8 4738.26 4718.72 4692.66 4673.11 4660.08 4640.54 4620.99 4607.96 4588.42 4575.39 4555.85 4529.79 4497.21 4471.15 4438.58 4406.01 4379.95 4347.37 4321.31 4288.74 4269.2 4256.17 4243.14 4230.11 4217.08 4191.02 4158.44 4132.38 4099.81 4067.24 4041.18 4015.12 3989.06 3956.49 3923.91 3897.85 3858.76 3819.67 3793.62 3754.53 3721.95 3689.38 3656.8 3624.23 3585.14 3552.57 3526.51 3493.93 3461.36 3435.3 3409.24 3383.18 3357.12 3331.06 3305.01 3278.95 3259.4 3226.83 3194.25 3161.68 3129.11 3090.02 3057.44 3031.38 2998.81 2972.75 2946.69 2927.15 2901.09 2881.54 2855.48 2835.94 2809.88 2790.34 2770.79 2744.73 2725.19 2699.13 2679.59 2653.53 2627.47 2594.89 2568.83 2536.26 2510.2 2477.63 2451.57 2425.51 2399.45 2379.9 2360.36 2340.82 2314.76 2295.21 2269.15 2243.09 2223.55 2197.49 2171.43 2138.86 2112.8 2086.74 2060.68 2034.62 2015.08 1995.53 1969.47 1949.93 1923.87 1897.81 1871.75 1852.21 1826.15 1800.09 1780.54 1761.0 1734.94 1708.88 1689.34 1656.76 1637.22 1611.16 1585.1 1559.04 1532.98 1500.41 1474.35 1441.77 1415.71 1389.66 1363.6 1344.05 1317.99 1298.45 1278.9 1252.85 1233.3 1220.27 1200.73 1181.18 1161.64 1148.61 1129.06 1109.52 1096.49 1076.95 1063.92 1050.89 1031.34 1018.31 1005.28 992.253 985.739 966.194 953.165 946.65 933.62 927.105 914.076 907.561 894.531 888.017 874.987 861.957 848.928 835.898 822.869 809.839 796.809 783.78 770.75 757.721 744.691 731.661 718.632 712.117 699.088 686.058 679.543 666.514 659.999 646.969 633.94 627.425 614.395 601.366 594.851 581.821 575.306 568.792 562.277 555.762 542.732 542.732 536.218 523.188 516.673 510.158 503.644 490.614 484.099 471.07 464.555 458.04 451.525 445.011 438.496 431.981 425.466 418.951 405.922 399.407 392.892 392.892 386.377 379.863 373.348 366.833 360.318 360.318 360.318 353.803 347.289 340.774 334.259 334.259 327.744 327.744 321.229 321.229 314.715 314.715 314.715 314.715 308.2 308.2 308.2 301.685 301.685 295.17 295.17 295.17 288.656 288.656 282.141 282.141 282.141 282.141 275.626 275.626 269.111 269.111 262.596 256.082 256.082 256.082 256.082 256.082 249.567 249.567 249.567 243.052 243.052 243.052 243.052 243.052 236.537 236.537 236.537 236.537 236.537 230.022 223.508 223.508 216.993 216.993 210.478 210.478 203.963 203.963 197.448 197.448 190.934 190.934 190.934 184.419 190.934 184.419 184.419 177.904 177.904 177.904 177.904 177.904 171.389 164.874 164.874 164.874 158.36 158.36 158.36 151.845 151.845 145.33 145.33 138.815 138.815 138.815 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 125.786 119.271 119.271 119.271 112.756 112.756 106.241 106.241 99.7265 99.7265 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 73.6673 73.6673 73.6673 73.6673 67.1525 67.1525 67.1525 60.6377 60.6377 60.6377 54.1229 54.1229 47.6081 47.6081 41.0933 41.0933 41.0933 34.5785 28.0637 28.0637 28.0637 21.5489 21.5489 15.0341 15.0341 8.51934 8.51934 2.00455 2.00455 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -17.5398 -17.5398 -17.5398 -17.5398 -24.0546 -24.0546 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -17.5398 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -11.025 -4.51025 -4.51025 2.00455 2.00455 2.00455 2.00455 8.51934 8.51934 8.51934 8.51934 8.51934 15.0341 15.0341 15.0341 15.0341 15.0341 21.5489 21.5489 15.0341 15.0341 15.0341 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 15.0341 21.5489 21.5489 21.5489 15.0341 15.0341 15.0341 15.0341 15.0341 15.0341 21.5489 15.0341 21.5489 15.0341 21.5489 15.0341 21.5489 21.5489 28.0637 21.5489 28.0637 28.0637 28.0637 28.0637 21.5489 21.5489 21.5489 28.0637 28.0637 28.0637 28.0637 28.0637 34.5785 34.5785 34.5785 34.5785 34.5785 34.5785 41.0933 41.0933 41.0933 41.0933 41.0933 41.0933 41.0933 41.0933 34.5785 34.5785 34.5785 41.0933 41.0933 41.0933 41.0933 47.6081 47.6081 47.6081 47.6081 41.0933 41.0933 41.0933 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 60.6377 60.6377 60.6377 60.6377 60.6377 67.1525 67.1525 67.1525 67.1525 67.1525 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 86.6969 86.6969 86.6969 93.2117 86.6969 93.2117 93.2117 93.2117 93.2117 99.7265 106.241 112.756 119.271 119.271 125.786 125.786 125.786 125.786 119.271 119.271 112.756 112.756 112.756 99.7265 93.2117 80.1821 73.6673 60.6377 54.1229 54.1229 54.1229 60.6377 73.6673 86.6969 99.7265 106.241 119.271 125.786 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 125.786 125.786 125.786 125.786 125.786 125.786 119.271 119.271 119.271 125.786 125.786 125.786 125.786 125.786 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 132.3 125.786 125.786 125.786 125.786 125.786 125.786 125.786 119.271 119.271 112.756 112.756 106.241 106.241 99.7265 99.7265 93.2117 86.6969 86.6969 86.6969 80.1821 80.1821 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 67.1525 67.1525 67.1525 67.1525 67.1525 67.1525 67.1525 67.1525 67.1525 73.6673 73.6673 73.6673 73.6673 80.1821 80.1821 80.1821 80.1821 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 67.1525 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 73.6673 73.6673 73.6673 73.6673 73.6673 73.6673 67.1525 67.1525 67.1525 67.1525 67.1525 67.1525 67.1525 60.6377 60.6377 60.6377 60.6377 60.6377 60.6377 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 47.6081 47.6081 47.6081 47.6081 47.6081 41.0933 41.0933 41.0933 41.0933 41.0933 41.0933 41.0933 41.0933 34.5785 34.5785 34.5785 34.5785 34.5785 34.5785 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 28.0637 21.5489 21.5489 21.5489 21.5489 15.0341 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 21.5489 15.0341 15.0341 15.0341 15.0341 15.0341 8.51934 8.51934 8.51934 8.51934 8.51934 8.51934 8.51934 8.51934 8.51934 2.00455 8.51934 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 2.00455 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -11.025 -4.51025 -4.51025 -11.025 -4.51025 -11.025 -11.025 -11.025 -11.025 -17.5398 -17.5398 -17.5398 -24.0546 -17.5398 -17.5398 -24.0546 -24.0546 -17.5398 -24.0546 -24.0546 -24.0546 -24.0546 -17.5398 -17.5398 -17.5398 -17.5398 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -17.5398 -24.0546 -24.0546 -24.0546 -17.5398 -24.0546 -17.5398 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -17.5398 -17.5398 -17.5398 -17.5398 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -24.0546 -17.5398 -17.5398 -24.0546 -24.0546 -24.0546 -24.0546 -17.5398 -17.5398 -17.5398 -17.5398 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -11.025 -11.025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 -4.51025 2.00455 2.00455 2.00455 2.00455 8.51934 8.51934 8.51934 8.51934 8.51934 8.51934 15.0341 15.0341 21.5489 21.5489 21.5489 21.5489 28.0637 28.0637 28.0637 28.0637 34.5785 28.0637 28.0637 34.5785 34.5785 34.5785 34.5785 41.0933 41.0933 41.0933 41.0933 41.0933 41.0933 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 47.6081 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 54.1229 60.6377 60.6377 67.1525 67.1525 67.1525 73.6673 73.6673 80.1821 73.6673 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 80.1821 86.6969 86.6969 86.6969 86.6969 86.6969 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 99.7265 93.2117 93.2117 99.7265 99.7265 99.7265 99.7265 106.241 106.241 106.241 106.241 106.241 106.241 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 119.271 119.271 112.756 112.756 112.756 112.756 112.756 112.756 119.271 119.271 119.271 119.271 119.271 119.271 119.271 112.756 112.756 119.271 119.271 119.271 119.271 119.271 119.271 119.271 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 119.271 119.271 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 106.241 112.756 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 99.7265 99.7265 99.7265 99.7265 106.241 106.241 106.241 106.241 99.7265 106.241 106.241 106.241 106.241 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 93.2117 99.7265 99.7265 99.7265 93.2117 93.2117 99.7265 99.7265 99.7265 93.2117 93.2117 93.2117 99.7265 99.7265 93.2117 93.2117 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 106.241 106.241 106.241 106.241 106.241 106.241 99.7265 99.7265 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 99.7265 99.7265 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 99.7265 93.2117 99.7265 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 99.7265 99.7265 99.7265 99.7265 106.241 106.241 99.7265 99.7265 99.7265 99.7265 93.2117 99.7265 99.7265 93.2117 99.7265 99.7265 99.7265 93.2117 93.2117 93.2117 93.2117 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 106.241 106.241 99.7265 99.7265 99.7265 99.7265 106.241 106.241 99.7265 106.241 99.7265 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 106.241 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 106.241 112.756 106.241 106.241 106.241 106.241 112.756 106.241 112.756 112.756 106.241 106.241 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 119.271 119.271 119.271 119.271 119.271 119.271 125.786 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 125.786 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 119.271 112.756 119.271 119.271 112.756 112.756 112.756 112.756 112.756 112.756 112.756 112.756 106.241 106.241 106.241 106.241 106.241 106.241 106.241 99.7265 99.7265 99.7265 99.7265 99.7265 99.7265 93.2117 93.2117 93.2117 99.7265 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 93.2117 86.6969 86.6969 86.6969 93.2117 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969 86.6969</A_FLOAT64>

+      </Values>

+      <Id>7</Id>

+      <Name>CHANNEL04</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>4</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>-0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.385186 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -2.32831E-9 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -2.32831E-9 -0.192593 -2.32831E-9 -0.192593 -0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -0.192593 -2.32831E-9 -2.32831E-9 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -2.32831E-9 -2.32831E-9 -0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 -2.32831E-9 -2.32831E-9 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.192593 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.192593 0.192593 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -0.192593 -0.385186 -0.57778 -0.57778 -0.57778 -0.57778 -0.385186 -0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -0.385186 -0.385186 -0.192593 -0.192593 -0.192593 -0.385186 -0.770373 -1.15556 -1.34815 -1.54075 -1.73334 -1.92593 -1.92593 -2.11852 -2.6963 -3.65927 -4.62224 -5.97039 -7.12595 -7.89632 -8.08891 -7.89632 -7.70373 -7.70373 -7.51113 -7.12595 -6.74076 -6.54817 -6.35557 -6.16298 -5.97039 -5.77779 -5.77779 -5.77779 -5.97039 -6.16298 -6.16298 -6.16298 -6.16298 -5.77779 -5.5852 -5.20002 -4.81483 -4.62224 -4.42964 -4.23705 -4.23705 -4.23705 -4.42964 -4.62224 -5.00742 -5.00742 -5.00742 -5.00742 -4.81483 -4.62224 -4.23705 -3.85186 -3.46668 -3.27408 -3.08149 -2.8889 -2.6963 -2.50371 -2.50371 -2.11852 -2.11852 -2.11852 -1.92593 -1.92593 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.54075 -1.34815 -0.770373 -2.32831E-9 0.770372 1.54075 1.92593 2.11852 2.11852 2.31112 2.50371 3.46668 5.39261 7.89632 10.4 12.1334 13.0963 13.6741 14.0593 14.4445 15.0223 15.6 15.9852 16.3704 17.1408 18.1038 19.4519 20.9927 21.9556 22.3408 22.5334 22.726 22.9186 23.1112 22.9186 22.5334 21.9556 21.763 21.763 22.3408 23.3038 24.0741 24.8445 25.4223 25.8075 26.0001 26.0001 25.8075 25.4223 25.0371 25.0371 25.0371 25.0371 25.0371 25.0371 25.0371 25.0371 25.0371 25.4223 25.8075 26.1927 26.5779 26.963 27.1556 27.3482 27.5408 27.7334 28.1186 28.5038 28.6964 29.0816 29.6593 30.0445 30.6223 31.2001 31.7779 32.3556 33.126 33.7038 34.4742 35.2445 36.2075 37.1705 38.1334 39.289 40.4446 41.6001 42.7557 43.9112 45.0668 46.4149 47.9557 49.3038 50.8446 52.3853 54.1187 55.852 57.5854 59.1261 60.4742 62.015 63.5557 65.2891 66.8298 68.3706 70.1039 71.6446 73.1854 74.7261 76.0743 77.2299 78.3854 79.3484 80.3113 81.2743 82.0447 83.0076 83.778 84.5484 84.9336 85.1262 85.1262 85.1262 84.9336 84.5484 84.3558 83.9706 83.778 83.5854 83.3928 83.2002 83.0076 82.815 82.6225 82.4299 82.2373 82.2373 82.4299 82.4299 82.6225 82.6225 82.815 83.0076 82.815 82.2373 81.6595 80.8891 79.9262 79.1558 78.578 78.3854 78.1928 78.1928 77.8076 77.615 77.2299 76.4595 75.3039 73.7632 72.415 70.8743 69.3335 67.7928 66.252 64.5187 62.7854 61.2446 59.8965 58.5483 57.0076 55.4668 53.9261 52.3853 51.0372 49.689 48.5335 47.5705 46.6075 45.8372 44.8742 43.5261 41.9853 40.4446 39.0964 37.7483 36.4001 35.4371 34.2816 33.3186 32.3556 31.5853 30.6223 29.6593 28.6964 27.7334 26.7704 25.8075 25.0371 24.4593 24.2667 23.689 23.1112 22.1482 20.8001 19.0667 17.3334 15.7926 14.4445 13.2889 12.326 11.5556 10.9778 10.4 9.82225 9.43706 9.05188 9.05188 9.05188 9.05188 9.05188 9.05188 8.66669 8.2815 7.70373 7.12595 6.54817 6.16298 5.97039 5.97039 5.5852 5.20001 5.00742 4.81483 4.62223 4.42964 4.42964 4.62223 4.62223 4.81483 5.00742 5.39261 5.5852 5.77779 5.5852 5.39261 5.00742 4.62223 4.42964 4.23705 4.23705 4.04446 3.85186 3.65927 3.46668 3.27408 3.08149 2.6963 2.11852 1.73334 1.15556 0.962966 0.770372 0.577779 0.577779 0.577779 0.770372 0.962966 1.34815 1.73334 2.11852 2.50371 2.50371 2.6963 3.27408 4.04446 5.00742 5.97039 6.93335 7.70373 8.2815 8.4741 8.66669 8.85928 8.85928 8.66669 8.2815 8.08891 8.08891 8.2815 8.2815 8.08891 7.89632 7.31854 6.35557 5.5852 4.62223 3.85186 2.8889 1.92593 1.34815 0.770372 0.385186 0.192593 -2.32831E-9 -2.32831E-9 0.192593 0.577779 0.770372 0.962966 1.15556 1.34815 1.73334 2.11852 2.50371 3.27408 4.04446 4.81483 5.77779 6.74076 7.70373 8.4741 9.43706 10.0148 10.5926 10.7852 10.5926 10.4 10.4 10.5926 10.7852 10.9778 10.9778 10.9778 10.9778 10.9778 11.1704 11.1704 10.9778 10.5926 10.2074 9.82225 9.62966 9.24447 8.66669 8.08891 7.31854 6.54817 5.77779 5.00742 4.42964 3.65927 3.08149 2.8889 2.6963 2.50371 2.50371 2.50371 2.50371 2.50371 2.8889 3.08149 3.46668 3.46668 3.46668 3.27408 2.8889 2.50371 2.31112 1.92593 1.54075 1.34815 1.34815 1.54075 1.92593 2.50371 2.8889 3.08149 3.27408 3.46668 3.65927 3.85186 4.04446 4.04446 4.04446 3.85186 3.85186 3.65927 3.46668 3.08149 2.8889 2.6963 3.08149 3.27408 3.08149 2.50371 1.73334 0.962966 0.192593 -0.57778 -1.15556 -1.73334 -2.31112 -2.8889 -3.27408 -3.46668 -3.46668 -3.08149 -2.6963 -2.31112 -2.11852 -2.31112 -2.6963 -2.6963 -2.6963 -2.8889 -2.8889 -2.8889 -2.31112 -1.54075 -0.192593 1.54075 3.27408 4.23705 4.04446 3.08149 1.92593 0.577779 -0.57778 -1.73334 -3.08149 -4.81483 -6.74076 -8.2815 -9.62966 -10.4 -11.1704 -11.7482 -12.7111 -13.6741 -14.8297 -16.1778 -17.9112 -19.8371 -21.5704 -23.3038 -24.8445 -26.1927 -27.1556 -27.926 -28.5038 -28.889 -29.0816 -29.0816 -28.889 -28.5038 -28.1186 -27.926 -27.5408 -27.5408 -27.3482 -27.3482 -27.3482 -27.3482 -27.3482 -27.3482 -27.5408 -27.926 -28.1186 -28.3112 -28.5038 -28.5038 -28.5038 -28.6964 -28.6964 -28.6964 -28.889 -29.0816 -29.4667 -29.8519 -30.2371 -30.6223 -31.0075 -31.3927 -31.5853 -31.5853 -31.5853 -31.5853 -31.3927 -31.2001 -30.8149 -30.8149 -30.8149 -31.0075 -31.2001 -31.5853 -32.1631 -32.5482 -32.9334 -33.126 -33.5112 -33.5112 -33.7038 -34.089 -34.4742 -34.8594 -35.4371 -36.0149 -36.7853 -37.3631 -37.7483 -38.1334 -38.326 -38.5186 -38.5186 -38.1334 -37.9408 -37.7483 -37.3631 -37.3631 -37.3631 -37.3631 -37.3631 -37.3631 -37.3631 -37.5557 -37.5557 -37.7483 -37.7483 -37.5557 -37.5557 -37.3631 -37.5557 -37.3631 -37.3631 -37.1705 -36.9779 -36.5927 -36.2075 -36.2075 -36.2075 -36.0149 -35.6297 -35.2445 -34.8594 -34.4742 -33.7038 -32.9334 -31.9705 -31.2001 -30.6223 -30.2371 -29.8519 -29.8519 -29.6593 -29.4667 -29.0816 -28.889 -28.889 -28.5038 -27.926 -27.5408 -26.963 -26.3853 -25.8075 -25.2297 -24.6519 -24.0741 -23.4964 -22.726 -22.1482 -21.3778 -20.8001 -20.2223 -19.4519 -18.8741 -18.4889 -17.9112 -17.526 -17.1408 -16.563 -16.1778 -15.6 -15.2149 -14.6371 -14.0593 -13.4815 -12.9037 -12.1334 -11.5556 -10.7852 -10.0148 -9.24447 -8.66669 -7.89632 -7.31854 -6.93335 -6.54817 -6.16298 -5.77779 -5.5852 -5.39261 -5.39261 -5.39261 -5.39261 -5.5852 -5.77779 -5.77779 -5.97039 -6.16298 -6.16298 -6.16298 -6.35557 -6.54817 -6.74076 -7.12595 -7.89632 -8.4741 -9.43706 -10.2074 -11.363 -12.326 -13.2889 -13.8667 -14.4445 -15.0223 -15.4075 -15.9852 -16.563 -17.1408 -17.7186 -18.2964 -18.8741 -19.6445 -20.2223 -20.8001 -21.5704 -22.1482 -22.9186 -23.4964 -24.2667 -24.8445 -25.6149 -26.0001 -26.5779 -27.1556 -27.5408 -27.926 -28.3112 -28.5038 -28.6964 -28.889 -29.0816 -29.2742 -29.2742 -29.0816 -29.0816 -29.0816 -29.2742 -29.4667 -29.6593 -29.8519 -30.2371 -30.6223 -30.8149 -31.2001 -31.3927 -31.5853 -31.7779 -31.9705 -32.1631 -32.5482 -32.7408 -32.9334 -33.126 -33.5112 -33.7038 -33.8964 -34.089 -34.4742 -34.8594 -35.2445 -35.6297 -36.0149 -36.2075 -36.5927 -36.7853 -36.7853 -36.7853 -36.7853 -36.7853 -36.5927 -36.5927 -36.5927 -36.5927 -36.7853 -36.9779 -36.9779 -36.9779 -36.9779 -36.7853 -36.7853 -36.7853 -36.5927 -36.5927 -36.4001 -36.2075 -36.0149 -35.8223 -35.6297 -35.4371 -35.2445 -34.8594 -34.6668 -34.2816 -34.089 -33.8964 -33.5112 -33.126 -32.7408 -32.1631 -31.7779 -31.2001 -30.6223 -30.0445 -29.4667 -28.6964 -27.926 -27.1556 -26.5779 -25.8075 -25.0371 -24.2667 -23.4964 -22.726 -22.1482 -21.3778 -20.6075 -19.8371 -19.0667 -18.4889 -17.7186 -16.9482 -16.3704 -15.7926 -15.0223 -14.4445 -13.6741 -13.0963 -12.5186 -11.7482 -11.1704 -10.5926 -10.0148 -9.43706 -8.85928 -8.4741 -7.89632 -7.51113 -6.93335 -6.54817 -5.97039 -5.77779 -5.39261 -5.00742 -4.81483 -4.42964 -4.04446 -3.85186 -3.65927 -3.46668 -3.46668 -3.08149 -3.08149 -2.6963 -2.6963 -2.31112 -2.11852 -2.11852 -1.92593 -1.73334 -1.54075 -1.34815 -1.15556 -0.962966 -0.770373 -0.770373 -0.57778 -0.57778 -0.385186 -0.192593 -0.192593 -2.32831E-9 -2.32831E-9 0.192593 0.385186 0.385186 0.577779 0.577779 0.577779 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.577779 0.385186 0.577779 0.385186 0.385186 0.385186 0.385186 0.385186 0.385186 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.770372 0.770372 0.770372 0.770372 0.962966 0.962966 0.962966 1.15556 1.15556 1.15556 1.15556 1.15556 1.34815 1.34815 1.15556 1.34815 1.34815 1.54075 1.92593 2.31112 2.50371 2.50371 2.50371 2.50371 2.50371 2.50371 2.50371 2.50371 2.50371 2.50371 2.50371 2.6963 2.6963 2.6963 2.6963 2.6963 2.6963 2.6963 2.8889 2.8889 2.8889 2.6963 2.8889 2.8889 2.8889 2.8889 2.8889 2.8889 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 3.08149 2.8889 2.8889 2.8889 2.6963 2.6963 2.6963 2.50371 2.31112 2.31112 2.11852 2.11852 1.92593 1.73334 1.73334 1.54075 1.34815 1.15556 1.15556 0.962966 0.770372 0.577779 0.577779 0.385186 0.192593 0.192593 -2.32831E-9 -2.32831E-9 -0.192593 -0.192593 -0.385186 -0.385186 -0.385186 -0.57778 -0.57778 -0.57778 -0.770373 -0.770373 -0.770373 -0.770373 -0.770373 -0.770373 -0.770373 -0.770373 -0.770373 -0.770373 -0.57778 -0.57778 -0.57778 -0.57778 -0.385186 -0.385186 -0.192593 -0.192593 -0.192593 -2.32831E-9 -2.32831E-9 0.192593 0.192593 0.385186 0.385186 0.385186 0.577779 0.577779 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.962966 0.962966 1.15556 1.15556 1.34815 1.54075 1.54075 1.54075 1.73334 1.92593 2.11852 2.11852 2.11852 2.31112 2.31112 2.50371 2.50371 2.50371 2.50371 2.6963 2.6963 2.6963 2.6963 2.8889 2.8889 2.8889 2.8889 2.8889 3.08149 3.08149 3.08149 3.08149 3.27408 3.27408 3.27408 3.46668 3.46668 3.46668 3.65927 3.65927 3.65927 3.65927 3.65927 3.65927 3.46668 3.46668 3.65927 3.85186 3.85186 3.85186 3.85186 3.85186 3.85186 4.04446 4.04446 4.04446 4.04446 4.04446 3.85186 3.85186 4.04446 3.85186 3.85186 3.85186 3.85186 3.85186 3.85186 3.85186 3.85186 3.65927 3.65927 3.65927 3.65927 3.65927 3.46668 3.46668 3.46668 3.46668 3.27408 3.27408 3.27408 3.08149 3.08149 3.08149 2.8889 2.8889 2.8889 2.6963 2.6963 2.6963 2.50371 2.50371 2.50371 2.50371 2.50371 2.31112 2.31112 2.31112 2.11852 2.11852 1.92593 1.92593 1.92593 1.92593 1.73334 1.73334 1.73334 1.54075 1.54075 1.54075 1.54075 1.34815 1.34815 1.34815 1.15556 1.15556 1.15556 1.15556 1.15556 1.15556 0.962966 0.962966 0.962966 0.962966 0.962966 0.962966 0.770372 0.770372 0.770372 0.770372 0.770372 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.577779 0.770372 0.577779 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.962966 0.962966 0.962966 1.15556 1.15556 1.15556 1.34815 1.34815 1.34815 1.34815 1.34815 1.54075 1.54075 1.54075 1.54075 1.54075 1.54075 1.54075 1.54075 1.54075 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.73334 1.54075 1.54075 1.54075 1.54075 1.34815 1.34815 1.34815 1.34815 1.34815 1.34815 1.15556 1.15556 1.15556 1.15556 0.962966 0.962966 0.962966 0.770372 0.770372 0.770372 0.770372 0.770372 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.577779 0.385186 0.385186 0.385186 0.385186 0.192593 0.192593 0.192593 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -0.192593 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.57778 -0.770373 -0.962966 -1.15556 -1.15556 -1.34815 -1.54075 -1.73334 -1.73334 -1.92593 -2.11852 -2.11852 -2.31112 -2.31112 -2.31112 -2.50371 -2.50371 -2.50371 -2.6963 -2.6963 -2.6963 -2.8889 -2.8889 -3.08149 -3.08149 -3.08149 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.46668 -3.46668 -3.46668 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.85186 -3.85186 -3.85186 -3.85186 -3.65927 -3.65927 -3.65927 -3.85186 -3.65927 -3.65927 -3.65927 -3.65927 -3.46668 -3.46668 -3.27408 -3.27408 -3.27408 -3.27408 -3.08149 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.08149 -3.08149 -3.08149 -3.08149 -2.8889 -2.8889 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.50371 -2.50371 -2.50371 -2.50371 -2.50371 -2.31112 -2.31112 -2.11852 -2.11852 -1.92593 -1.92593 -1.73334 -1.73334 -1.54075 -1.54075 -1.34815 -1.34815 -1.15556 -1.15556 -0.962966 -0.770373 -0.770373 -0.57778 -0.385186 -0.385186 -0.192593 -2.32831E-9 0.192593 0.385186 0.577779 0.577779 0.770372 0.962966 0.962966 1.15556 1.34815 1.34815 1.54075 1.54075 1.73334 1.73334 1.73334 1.92593 1.92593 1.92593 1.92593 1.92593 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 2.11852 1.92593 2.11852 1.92593 1.92593 1.92593 1.92593 1.92593 1.73334 1.73334 1.73334 1.73334 1.73334 1.54075 1.54075 1.34815 1.34815 1.34815 1.15556 1.15556 1.15556 0.962966 0.962966 0.962966 0.770372 0.770372 0.577779 0.577779 0.577779 0.385186 0.385186 0.385186 0.192593 0.192593 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.385186 -0.192593 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.385186 -0.192593 -0.385186 -0.385186 -0.385186 -0.192593 -0.385186 -0.385186 -0.385186 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 0.192593 0.192593 0.192593 0.385186 0.385186 0.385186 0.385186 0.577779 0.577779 0.577779 0.577779 0.770372 0.770372 0.962966 0.962966 0.962966 0.962966 0.962966 0.962966 0.962966 0.962966 0.962966 0.962966 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.770372 0.577779 0.577779 0.577779 0.385186 0.385186 0.385186 0.192593 0.385186 0.192593 0.192593 0.192593 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -2.32831E-9 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.192593 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.385186 -0.57778 -0.770373 -0.770373 -0.962966 -1.15556 -1.15556 -1.15556 -0.962966 -0.962966 -0.962966 -0.962966 -1.15556 -1.34815 -1.34815 -1.54075 -1.54075 -1.54075 -1.73334 -1.73334 -1.73334 -1.73334 -1.92593 -1.92593 -1.92593 -2.11852 -2.11852 -2.31112 -2.31112 -2.31112 -2.31112 -2.50371 -2.6963 -2.6963 -2.6963 -2.6963 -2.8889 -2.8889 -2.8889 -3.08149 -3.08149 -3.27408 -3.27408 -3.46668 -3.46668 -3.46668 -3.46668 -3.65927 -3.65927 -3.65927 -3.85186 -3.85186 -3.85186 -3.85186 -3.85186 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.23705 -4.23705 -4.23705 -4.23705 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.62224 -4.62224 -4.62224 -4.62224 -4.81483 -4.81483 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.20002 -5.00742 -5.00742 -5.00742 -5.00742 -5.20002 -5.20002 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -4.81483 -4.81483 -4.81483 -4.81483 -4.62224 -4.62224 -4.62224 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.23705 -4.23705 -4.23705 -4.04446 -4.04446 -4.04446 -4.04446 -3.85186 -3.85186 -3.85186 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.08149 -3.08149 -3.08149 -3.08149 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.6963 -2.6963 -2.50371 -2.50371 -2.50371 -2.50371 -2.50371 -2.50371 -2.50371 -2.31112 -2.31112 -2.31112 -2.11852 -2.11852 -2.11852 -2.31112 -2.11852 -2.11852 -2.11852 -2.11852 -1.92593 -1.92593 -1.92593 -1.92593 -1.92593 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.54075 -1.54075 -1.54075 -1.54075 -1.73334 -1.73334 -1.73334 -1.54075 -1.54075 -1.54075 -1.73334 -1.54075 -1.54075 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.73334 -1.92593 -1.92593 -1.92593 -1.92593 -1.92593 -2.11852 -2.11852 -2.11852 -2.11852 -2.11852 -2.11852 -2.31112 -2.31112 -2.31112 -2.31112 -2.50371 -2.50371 -2.50371 -2.50371 -2.50371 -2.6963 -2.6963 -2.6963 -2.8889 -2.8889 -2.8889 -2.8889 -3.08149 -3.08149 -3.08149 -3.27408 -3.27408 -3.27408 -3.46668 -3.46668 -3.46668 -3.65927 -3.65927 -3.65927 -3.65927 -3.85186 -3.85186 -3.85186 -4.04446 -4.04446 -4.04446 -4.04446 -4.23705 -4.23705 -4.23705 -4.42964 -4.42964 -4.42964 -4.42964 -4.62224 -4.62224 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -5.00742 -5.00742 -5.00742 -5.00742 -5.20002 -5.20002 -5.20002 -5.20002 -5.20002 -5.20002 -5.20002 -5.39261 -5.39261 -5.39261 -5.39261 -5.39261 -5.39261 -5.39261 -5.39261 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.5852 -5.77779 -5.5852 -5.5852 -5.5852 -5.5852 -5.39261 -5.5852 -5.5852 -5.5852 -5.39261 -5.39261 -5.39261 -5.39261 -5.39261 -5.39261 -5.39261 -5.20002 -5.20002 -5.20002 -5.20002 -5.20002 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -5.00742 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.04446 -4.04446 -4.04446 -4.04446 -3.85186 -3.85186 -3.85186 -3.85186 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.08149 -3.08149 -3.08149 -3.08149 -3.08149 -3.08149 -3.08149 -3.08149 -3.08149 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.6963 -2.8889 -2.8889 -2.6963 -2.8889 -2.6963 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -2.8889 -3.08149 -3.08149 -3.08149 -3.08149 -3.08149 -3.08149 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.27408 -3.46668 -3.46668 -3.46668 -3.46668 -3.65927 -3.65927 -3.65927 -3.65927 -3.85186 -3.65927 -3.85186 -3.85186 -3.85186 -3.85186 -3.85186 -3.85186 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.81483 -4.62224 -4.62224 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.81483 -4.62224 -4.81483 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.62224 -4.42964 -4.42964 -4.42964 -4.62224 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.42964 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.23705 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -4.04446 -3.85186 -3.85186 -3.85186 -3.85186 -3.85186 -3.85186 -3.85186 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.46668 -3.46668 -3.46668 -3.65927 -3.65927 -3.65927 -3.46668 -3.46668 -3.46668 -3.65927 -3.65927 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.46668 -3.65927 -3.65927 -3.65927 -3.46668 -3.65927 -3.46668 -3.46668 -3.46668 -3.46668 -3.65927 -3.46668 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.85186 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927 -3.65927</A_FLOAT64>

+      </Values>

+      <Id>8</Id>

+      <Name>CHANNEL07</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>7</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>2.02778 2.02778 2.02778 2.02778 -0.368683 -0.368683 2.02778 -0.368683 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 -0.368683 -0.368683 2.02778 2.02778 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 -0.368683 -0.368683 2.02778 -0.368683 2.02778 2.02778 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 2.02778 2.02778 -0.368683 -0.368683 2.02778 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 2.02778 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 -0.368683 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 2.02778 2.02778 2.02778 -0.368683 2.02778 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 2.02778 2.02778 2.02778 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 2.02778 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 4.42423 6.82069 2.02778 2.02778 -0.368683 2.02778 -0.368683 2.02778 -0.368683 2.02778 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 2.02778 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -2.76514 -0.368683 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 2.02778 2.02778 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 -0.368683 -0.368683 -2.76514 -2.76514 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -2.76514 -0.368683 -2.76514 -2.76514 -2.76514 -0.368683 -2.76514 -2.76514 -2.76514 -2.76514 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -0.368683 -2.76514 -2.76514 -2.76514 -2.76514 -5.1616 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -2.76514 -2.76514 -2.76514 -2.76514 -5.1616 -5.1616 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -5.1616 -5.1616 -7.55806 -5.1616 -5.1616 -5.1616 -5.1616 -2.76514 -0.368683 2.02778 2.02778 4.42423 4.42423 4.42423 6.82069 6.82069 6.82069 6.82069 9.21714 11.6136 11.6136 14.0101 16.4065 18.803 18.803 18.803 18.803 18.803 16.4065 16.4065 14.0101 14.0101 14.0101 16.4065 16.4065 16.4065 18.803 18.803 18.803 18.803 16.4065 16.4065 14.0101 14.0101 14.0101 11.6136 11.6136 14.0101 14.0101 16.4065 16.4065 16.4065 18.803 18.803 16.4065 16.4065 16.4065 16.4065 14.0101 14.0101 14.0101 11.6136 11.6136 11.6136 14.0101 14.0101 14.0101 16.4065 16.4065 18.803 21.1994 23.5959 23.5959 25.9924 25.9924 28.3888 28.3888 28.3888 25.9924 21.1994 18.803 14.0101 9.21714 4.42423 2.02778 2.02778 2.02778 2.02778 4.42423 4.42423 4.42423 6.82069 9.21714 11.6136 14.0101 16.4065 18.803 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 23.5959 25.9924 25.9924 25.9924 21.1994 14.0101 6.82069 -0.368683 -5.1616 -2.76514 -0.368683 2.02778 4.42423 4.42423 4.42423 2.02778 -2.76514 -9.9545 -19.5403 -26.7297 -36.3155 -41.1084 -41.1084 -38.712 -38.712 -36.3155 -31.5227 -26.7297 -21.9368 -17.1439 -14.7475 -14.7475 -17.1439 -19.5403 -24.3332 -33.9191 -41.1084 -43.5049 -41.1084 -31.5227 -21.9368 -17.1439 -17.1439 -17.1439 -19.5403 -19.5403 -19.5403 -24.3332 -29.1262 -29.1262 -24.3332 -17.1439 -9.9545 -5.1616 -5.1616 -7.55806 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 2.02778 6.82069 14.0101 21.1994 30.7853 35.5782 42.7676 45.164 49.9569 49.9569 49.9569 47.5604 45.164 45.164 42.7676 37.9746 30.7853 21.1994 9.21714 -2.76514 -12.351 -17.1439 -21.9368 -26.7297 -29.1262 -33.9191 -36.3155 -43.5049 -53.0907 -62.6766 -74.6589 -86.6411 -96.227 -105.813 -110.606 -105.813 -98.6239 -108.209 -134.571 -156.139 -182.499 -211.257 -237.618 -287.943 -319.098 -304.719 -278.358 -259.186 -237.618 -206.464 -177.706 -153.742 -139.363 -132.174 -136.967 -139.363 -129.777 -108.209 -91.4341 -84.2447 -81.8483 -79.4518 -77.0553 -77.0553 -81.8483 -81.8483 -72.2624 -60.2801 -50.6943 -45.9014 -41.1084 -36.3155 -31.5227 -29.1262 -26.7297 -21.9368 -14.7475 -7.55806 -2.76514 2.02778 6.82069 9.21714 16.4065 23.5959 35.5782 47.5604 59.5428 71.525 83.5073 95.4897 105.076 114.661 124.248 131.436 138.626 145.815 155.401 164.987 174.573 184.158 193.745 198.538 203.33 205.726 210.52 217.709 222.502 224.898 227.295 229.691 232.088 234.485 241.673 248.863 256.052 263.242 265.638 265.638 263.242 256.052 248.863 239.277 236.88 234.485 234.485 229.691 227.295 220.105 212.916 200.933 186.555 172.176 167.383 164.987 164.987 164.987 164.987 162.59 157.798 153.005 148.211 148.211 148.211 153.005 160.194 167.383 174.573 179.366 186.555 188.951 188.951 186.555 188.951 191.348 191.348 188.951 188.951 188.951 188.951 188.951 191.348 191.348 193.745 191.348 188.951 188.951 188.951 191.348 193.745 193.745 196.141 196.141 196.141 196.141 193.745 191.348 188.951 188.951 188.951 191.348 193.745 193.745 196.141 198.538 200.933 203.33 203.33 203.33 205.726 205.726 205.726 208.123 208.123 210.52 210.52 212.916 212.916 212.916 215.313 215.313 215.313 215.313 215.313 215.313 215.313 215.313 215.313 215.313 220.105 222.502 224.898 224.898 222.502 220.105 215.313 212.916 210.52 208.123 208.123 208.123 210.52 212.916 217.709 222.502 224.898 229.691 234.485 236.88 241.673 244.07 246.466 251.26 256.052 260.845 263.242 268.035 270.431 272.828 275.223 277.62 277.62 280.017 280.017 277.62 275.223 272.828 272.828 270.431 268.035 268.035 270.431 270.431 268.035 268.035 268.035 268.035 270.431 270.431 268.035 265.638 263.242 260.845 258.448 251.26 248.863 244.07 239.277 234.485 232.088 229.691 227.295 224.898 220.105 217.709 217.709 212.916 210.52 205.726 200.933 196.141 193.745 188.951 184.158 181.762 176.969 174.573 169.78 167.383 164.987 160.194 157.798 155.401 153.005 150.608 150.608 150.608 150.608 150.608 150.608 150.608 150.608 150.608 150.608 148.211 145.815 143.418 141.023 138.626 133.833 131.436 129.04 126.643 126.643 126.643 126.643 126.643 126.643 126.643 129.04 129.04 126.643 126.643 126.643 124.248 124.248 121.851 119.454 117.058 117.058 114.661 114.661 112.265 112.265 109.868 107.471 105.076 105.076 102.679 100.283 97.886 97.886 95.4897 95.4897 95.4897 95.4897 93.0932 93.0932 90.6967 90.6967 90.6967 88.3002 85.9038 83.5073 81.1108 81.1108 78.7145 78.7145 76.318 73.9215 73.9215 71.525 71.525 71.525 71.525 71.525 71.525 69.1286 69.1286 69.1286 66.7321 66.7321 64.3356 64.3356 64.3356 61.9392 61.9392 59.5428 59.5428 59.5428 59.5428 59.5428 59.5428 59.5428 59.5428 59.5428 57.1463 57.1463 57.1463 57.1463 54.7498 57.1463 57.1463 57.1463 57.1463 57.1463 57.1463 57.1463 57.1463 57.1463 59.5428 59.5428 59.5428 59.5428 61.9392 61.9392 61.9392 64.3356 64.3356 66.7321 66.7321 66.7321 66.7321 69.1286 69.1286 69.1286 69.1286 69.1286 69.1286 69.1286 69.1286 71.525 71.525 73.9215 73.9215 73.9215 73.9215 73.9215 73.9215 76.318 76.318 78.7145 81.1108 81.1108 83.5073 83.5073 85.9038 85.9038 83.5073 83.5073 83.5073 83.5073 81.1108 78.7145 78.7145 78.7145 76.318 76.318 76.318 76.318 76.318 76.318 78.7145 78.7145 78.7145 78.7145 78.7145 78.7145 78.7145 81.1108 81.1108 81.1108 81.1108 81.1108 78.7145 81.1108 78.7145 78.7145 78.7145 78.7145 78.7145 78.7145 78.7145 78.7145 78.7145 81.1108 81.1108 81.1108 81.1108 83.5073 83.5073 83.5073 83.5073 83.5073 83.5073 83.5073 85.9038 85.9038 85.9038 85.9038 85.9038 85.9038 85.9038 85.9038 85.9038 83.5073 83.5073 83.5073 83.5073 81.1108 81.1108 78.7145 78.7145 76.318 76.318 76.318 76.318 76.318 73.9215 73.9215 73.9215 71.525 71.525 71.525 69.1286 69.1286 66.7321 66.7321 66.7321 66.7321 64.3356 64.3356 64.3356 61.9392 61.9392 61.9392 59.5428 59.5428 59.5428 59.5428 57.1463 57.1463 54.7498 54.7498 54.7498 54.7498 52.3534 49.9569 49.9569 49.9569 47.5604 45.164 45.164 45.164 42.7676 42.7676 42.7676 40.3711 40.3711 40.3711 40.3711 40.3711 40.3711 37.9746 37.9746 37.9746 37.9746 35.5782 35.5782 33.1817 33.1817 30.7853 30.7853 28.3888 25.9924 23.5959 23.5959 21.1994 18.803 16.4065 16.4065 14.0101 11.6136 11.6136 9.21714 6.82069 4.42423 4.42423 -0.368683 -0.368683 -2.76514 -2.76514 -5.1616 -7.55806 -9.9545 -9.9545 -12.351 -12.351 -14.7475 -14.7475 -14.7475 -17.1439 -17.1439 -17.1439 -17.1439 -19.5403 -19.5403 -21.9368 -21.9368 -21.9368 -21.9368 -21.9368 -24.3332 -21.9368 -24.3332 -24.3332 -24.3332 -26.7297 -26.7297 -29.1262 -29.1262 -29.1262 -29.1262 -31.5227 -31.5227 -31.5227 -31.5227 -33.9191 -33.9191 -33.9191 -33.9191 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -38.712 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -36.3155 -33.9191 -36.3155 -33.9191 -33.9191 -33.9191 -33.9191 -33.9191 -33.9191 -33.9191 -33.9191 -33.9191 -33.9191 -31.5227 -33.9191 -31.5227 -31.5227 -31.5227 -31.5227 -31.5227 -31.5227 -31.5227 -29.1262 -29.1262 -29.1262 -29.1262 -29.1262 -29.1262 -29.1262 -29.1262 -29.1262 -26.7297 -26.7297 -26.7297 -26.7297 -26.7297 -26.7297 -24.3332 -24.3332 -24.3332 -24.3332 -24.3332 -24.3332 -24.3332 -21.9368 -21.9368 -21.9368 -21.9368 -21.9368 -21.9368 -21.9368 -21.9368 -19.5403 -19.5403 -21.9368 -19.5403 -19.5403 -19.5403 -19.5403 -19.5403 -19.5403 -19.5403 -17.1439 -17.1439 -17.1439 -17.1439 -17.1439 -14.7475 -14.7475 -14.7475 -14.7475 -14.7475 -14.7475 -12.351 -12.351 -12.351 -12.351 -12.351 -9.9545 -9.9545 -9.9545 -9.9545 -9.9545 -7.55806 -7.55806 -7.55806 -7.55806 -7.55806 -7.55806 -5.1616 -5.1616 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -0.368683 -0.368683 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 6.82069 6.82069 6.82069 6.82069 9.21714 9.21714 9.21714 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 16.4065 14.0101 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 23.5959 21.1994 23.5959 23.5959 23.5959 21.1994 23.5959 23.5959 23.5959 23.5959 21.1994 23.5959 21.1994 23.5959 23.5959 23.5959 21.1994 23.5959 21.1994 21.1994 21.1994 21.1994 21.1994 21.1994 18.803 18.803 18.803 18.803 21.1994 21.1994 21.1994 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 18.803 16.4065 18.803 18.803 18.803 16.4065 18.803 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 16.4065 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 6.82069 9.21714 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 9.21714 9.21714 6.82069 9.21714 6.82069 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 4.42423 4.42423 4.42423 6.82069 6.82069 6.82069 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 4.42423 4.42423 4.42423 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 4.42423 4.42423 4.42423 4.42423 6.82069 4.42423 6.82069 6.82069 6.82069 6.82069 6.82069 4.42423 6.82069 6.82069 6.82069 6.82069 6.82069 4.42423 4.42423 6.82069 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 4.42423 4.42423 4.42423 2.02778 2.02778 4.42423 2.02778 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 2.02778 4.42423 2.02778 4.42423 2.02778 4.42423 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -2.76514 -0.368683 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -0.368683 -2.76514 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 4.42423 2.02778 4.42423 4.42423 4.42423 4.42423 2.02778 4.42423 4.42423 4.42423 2.02778 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 9.21714 6.82069 6.82069 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 11.6136 9.21714 9.21714 11.6136 11.6136 11.6136 9.21714 9.21714 9.21714 11.6136 9.21714 9.21714 11.6136 11.6136 9.21714 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 16.4065 14.0101 14.0101 14.0101 16.4065 14.0101 14.0101 14.0101 14.0101 14.0101 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 16.4065 14.0101 16.4065 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 14.0101 11.6136 14.0101 11.6136 14.0101 11.6136 14.0101 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 14.0101 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 11.6136 9.21714 11.6136 11.6136 9.21714 9.21714 9.21714 11.6136 11.6136 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 11.6136 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 9.21714 6.82069 9.21714 6.82069 6.82069 6.82069 9.21714 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 9.21714 6.82069 6.82069 9.21714 9.21714 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 6.82069 4.42423 6.82069 6.82069 6.82069 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 4.42423 2.02778 2.02778 2.02778 4.42423 2.02778 2.02778 4.42423 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 -0.368683 -0.368683 2.02778 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -5.1616 -2.76514 -2.76514 -5.1616 -2.76514 -5.1616 -2.76514 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -5.1616 -2.76514 -2.76514 -5.1616 -5.1616 -5.1616 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -2.76514 -0.368683 -2.76514 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 -0.368683 2.02778 -0.368683 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 4.42423 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 4.42423 2.02778 2.02778 2.02778 2.02778 2.02778 4.42423 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778 2.02778</A_FLOAT64>

+      </Values>

+      <Id>9</Id>

+      <Name>CHANNEL02</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>2</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>-0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.772695 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.386347 -0.386347 -0.386347 -0.579521 -0.579521 -0.579521 -0.386347 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.579521 -0.579521 -0.579521 -0.386347 -0.579521 -0.579521 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.193173 -0.386347 -0.193173 -0.193173 -0.193173 -0.386347 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 8.9407E-8 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 8.9407E-8 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.193173 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.772695 -0.772695 -0.772695 -0.579521 -0.579521 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.965869 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.965869 -0.965869 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.772695 -0.579521 -0.579521 -0.579521 -0.579521 -0.579521 -0.386347 -0.386347 -0.386347 -0.386347 -0.579521 -0.579521 -0.386347 -0.386347 -0.386347 -0.193173 -0.193173 -0.386347 -0.965869 -1.54539 -1.93174 -2.12491 -2.12491 -2.12491 -2.31809 -2.89761 -3.09078 -3.09078 -3.28395 -3.47713 -3.47713 -3.47713 -3.47713 -3.28395 -3.47713 -3.86348 -4.443 -5.21569 -6.18156 -7.14743 -7.92013 -8.69282 -9.46552 -9.65869 -9.85186 -9.85186 -10.045 -10.045 -9.85186 -9.07917 -8.49965 -7.92013 -7.53378 -7.14743 -6.95426 -6.76108 -6.76108 -6.95426 -7.3406 -7.92013 -8.49965 -9.07917 -9.65869 -10.2382 -10.8177 -11.2041 -11.3973 -11.5904 -11.7836 -11.9768 -12.1699 -12.3631 -12.5563 -12.5563 -12.5563 -12.5563 -12.5563 -12.5563 -12.5563 -12.5563 -12.7495 -12.7495 -12.7495 -12.7495 -12.9426 -12.9426 -12.9426 -13.1358 -13.329 -13.329 -13.5222 -13.7153 -13.9085 -14.1017 -14.2949 -14.2949 -14.6812 -14.8744 -15.2607 -15.4539 -15.4539 -15.0676 -14.488 -14.1017 -13.7153 -13.5222 -13.7153 -14.1017 -15.0676 -15.4539 -14.8744 -13.5222 -11.7836 -10.2382 -9.27234 -8.49965 -7.53378 -6.56791 -5.60204 -5.02252 -4.82934 -4.63617 -4.443 -3.6703 -2.70443 -1.73856 -0.579521 0.386348 0.965869 1.54539 1.93174 1.93174 1.73856 1.35222 0.772695 0.386348 8.9407E-8 -0.193173 8.9407E-8 0.193174 0.772695 1.54539 2.12491 2.70443 3.09078 3.28395 3.47713 3.47713 3.86348 4.05665 4.443 4.443 4.63617 4.63617 4.82935 4.82935 5.02252 5.40887 5.79521 6.18156 6.56791 6.95426 7.3406 7.53378 7.72695 7.92013 8.1133 8.30647 8.49965 8.69282 8.88599 9.07917 9.65869 10.045 10.6246 11.0109 11.3973 11.9768 12.3631 12.9426 13.5222 13.9085 14.488 15.0676 15.6471 16.2266 16.8061 17.5788 18.1583 19.1242 19.8969 20.4764 21.2491 22.0218 22.9877 23.9536 24.9194 25.6921 26.4648 27.0443 28.0102 28.5897 29.1692 29.9419 30.9078 32.26 33.2259 34.1918 34.9645 35.9303 36.5098 36.8962 37.0894 37.4757 37.6689 38.0552 38.0552 38.2484 38.4416 38.4416 38.2484 38.0552 37.6689 37.4757 37.2825 37.2825 37.4757 37.6689 37.6689 38.0552 38.4416 38.8279 39.0211 39.2143 39.4075 39.6006 39.6006 39.7938 39.987 40.3733 40.9528 41.3392 41.3392 41.5324 41.3392 40.9528 40.1801 39.6006 39.2143 38.6348 37.8621 37.2825 36.703 36.5098 36.1235 35.7372 35.1576 34.5781 33.9986 33.6122 33.2259 32.6464 32.0668 31.101 30.3283 29.5556 28.7829 28.0102 27.0443 26.0785 25.3058 24.5331 23.9536 23.5672 22.9877 22.6013 22.215 21.6355 21.2491 20.6696 20.2832 19.7037 19.3174 18.5447 17.9652 17.3856 16.9993 16.4198 15.8403 15.6471 15.0676 14.2949 13.329 11.9768 10.8177 9.46552 8.30647 7.53378 6.95426 6.37473 6.18156 6.18156 5.98839 5.79521 5.79521 5.98839 6.76108 7.53378 8.30647 8.88599 9.27234 9.27234 9.27234 9.07917 8.88599 8.69282 8.1133 7.53378 6.76108 5.79521 4.24982 3.09078 1.73856 0.193174 -1.15904 -2.70443 -3.86348 -4.82934 -5.60204 -6.56791 -7.72695 -9.27234 -10.8177 -9.46552 -6.76108 -5.79521 -5.60204 -5.21569 -4.82934 -4.63617 -4.63617 -4.63617 -4.82934 -5.02252 -5.21569 -5.40887 -5.60204 -5.79521 -5.79521 -5.60204 -5.02252 -5.02252 -5.02252 -3.86348 -4.443 -11.3973 -15.2607 -6.76108 1.93174 4.24982 4.24982 4.24982 4.443 4.82935 5.60204 6.37473 7.14743 7.92013 8.69282 9.46552 10.045 10.8177 11.7836 12.9426 13.7153 14.488 15.4539 16.6129 17.3856 17.772 17.9652 17.5788 16.6129 15.2607 13.5222 11.5904 9.46552 7.14743 4.63617 2.31809 8.9407E-8 -2.31809 -4.24982 -5.98839 -7.53378 -9.07917 -10.4314 -11.9768 -13.1358 -14.2949 -14.8744 -15.2607 -15.0676 -14.8744 -14.2949 -13.5222 -12.5563 -11.5904 -10.6246 -9.46552 -8.30647 -7.3406 -6.18156 -5.21569 -4.24982 -3.28395 -2.51126 -1.54539 -0.386347 0.579521 1.54539 2.51126 3.28395 4.05665 4.82935 5.79521 6.56791 6.95426 7.3406 7.72695 7.92013 8.30647 8.69282 8.88599 9.27234 9.46552 9.46552 9.65869 9.46552 9.65869 9.85186 10.2382 10.6246 11.0109 11.2041 11.2041 11.3973 11.5904 11.7836 11.9768 11.9768 11.9768 11.7836 11.5904 11.0109 10.6246 9.85186 9.27234 8.49965 7.72695 6.95426 6.76108 6.37473 6.37473 6.37473 6.37473 6.18156 5.79521 5.40887 5.21569 5.21569 5.21569 5.21569 5.21569 5.21569 5.02252 5.02252 4.82935 4.82935 4.82935 5.21569 5.40887 5.79521 6.37473 7.14743 8.1133 9.07917 9.85186 10.4314 11.3973 12.5563 13.9085 15.4539 16.6129 17.772 18.931 19.3174 19.7037 20.0901 20.8628 21.6355 22.6013 23.7604 25.1126 26.4648 28.0102 29.5556 31.101 32.8395 34.3849 35.9303 37.4757 38.6348 39.7938 40.5665 40.9528 40.9528 41.5324 42.6914 44.2368 45.9754 48.1003 49.8388 51.3842 52.9296 55.0545 56.9863 57.759 57.5658 57.1794 56.4067 55.634 54.6682 53.8955 53.5091 53.316 53.316 53.7023 54.2818 55.0545 55.8272 56.9863 58.3385 60.077 61.8156 63.9405 65.8723 68.1903 70.5084 73.0197 75.5309 78.0422 80.7466 83.4511 86.1555 88.6668 91.178 93.4961 95.621 97.9391 99.8708 101.803 103.541 105.087 106.439 107.405 108.37 109.143 109.723 110.302 110.882 111.461 112.234 112.813 113.393 114.166 114.938 115.711 116.484 117.45 118.416 119.188 119.768 120.347 120.734 121.12 121.506 121.893 122.279 122.665 122.859 122.859 122.472 121.893 121.12 120.154 119.381 118.802 118.222 117.836 117.45 117.257 117.063 116.87 116.677 116.87 117.257 117.643 118.222 118.802 119.575 120.154 120.734 121.313 121.699 122.086 122.086 122.279 122.086 122.279 122.279 122.279 122.665 123.052 123.438 124.211 124.983 126.142 127.108 128.074 129.04 130.006 130.972 131.938 133.097 134.063 135.222 136.188 136.767 137.153 137.733 138.312 138.506 138.312 138.506 138.506 138.312 138.119 137.926 137.926 137.926 137.54 137.153 136.96 136.96 136.767 136.574 136.574 136.767 136.96 137.153 137.347 137.54 137.926 138.119 138.119 138.312 138.312 138.506 138.699 138.892 138.892 139.085 139.278 139.471 139.665 139.858 140.051 140.051 140.051 139.858 139.858 139.665 139.858 139.665 139.665 139.665 139.665 139.665 139.665 139.471 139.278 139.085 138.892 138.506 138.312 137.733 137.347 136.767 135.994 135.415 134.642 133.676 132.71 131.358 130.199 128.847 127.495 125.949 124.79 123.824 122.859 122.086 121.313 120.54 119.768 118.802 117.643 116.484 115.325 114.359 113.2 112.041 111.075 109.916 108.95 107.984 106.825 105.859 104.893 103.927 102.962 101.996 101.223 100.45 99.4845 98.7118 97.9391 97.1664 96.3937 95.4279 94.6552 93.8825 92.9166 91.9507 90.9849 90.019 88.8599 87.8941 86.735 85.7692 84.6101 83.4511 82.292 81.3262 80.1671 79.0081 78.0422 76.8832 75.9173 74.9514 74.1787 73.406 72.6333 71.8606 71.088 70.3153 69.5426 68.5767 67.804 67.0313 66.0654 65.0996 64.1337 63.1678 62.202 61.2361 60.4634 59.4975 58.5317 57.5658 56.7931 55.8272 55.0545 54.2818 53.7023 52.9296 52.3501 51.7706 51.1911 50.6115 50.2252 49.6457 49.0661 48.6798 48.1003 47.7139 47.3276 46.7481 46.3617 45.7822 45.3958 45.0095 44.6231 44.0436 43.6573 43.2709 42.8846 42.4982 42.1119 41.9187 41.5324 41.146 40.7597 40.3733 40.1801 39.7938 39.6006 39.2143 39.0211 38.8279 38.6348 38.4416 38.2484 38.0552 37.8621 37.6689 37.6689 37.4757 37.2825 37.0894 37.0894 36.8962 36.703 36.5098 36.5098 36.5098 36.5098 36.5098 36.703 36.703 36.8962 36.8962 37.0894 37.0894 37.2825 37.4757 37.6689 37.6689 37.6689 37.6689 37.6689 37.6689 37.8621 37.8621 37.6689 37.6689 37.6689 37.4757 37.4757 37.4757 37.4757 37.2825 37.2825 37.2825 37.2825 37.0894 37.0894 36.8962 36.8962 36.703 36.5098 36.5098 36.3167 36.3167 36.1235 36.1235 36.1235 35.9303 35.9303 35.9303 35.9303 35.7372 35.7372 35.7372 35.544 35.544 35.3508 35.1576 35.1576 34.9645 34.9645 34.7713 34.5781 34.5781 34.3849 34.1918 33.9986 33.9986 33.8054 33.6122 33.4191 33.2259 33.0327 32.8395 32.6464 32.4532 32.0668 31.8737 31.6805 31.6805 31.2942 31.101 30.9078 30.5215 30.3283 30.1351 29.9419 29.7488 29.3624 29.1692 28.9761 28.5897 28.3965 28.2034 28.0102 27.6239 27.2375 26.8512 26.658 26.4648 26.2716 25.8853 25.6921 25.4989 25.1126 24.7262 24.5331 24.5331 24.1467 23.5672 22.9877 22.6013 22.215 22.0218 21.6355 21.4423 21.0559 20.6696 20.4764 20.0901 19.7037 19.5106 19.1242 18.931 18.5447 18.1583 17.772 17.5788 17.1925 16.9993 16.8061 16.4198 16.0334 15.6471 15.4539 15.0676 14.6812 14.488 14.2949 13.9085 13.7153 13.5222 13.1358 12.9426 12.7495 12.5563 12.3631 12.1699 11.9768 11.7836 11.7836 11.5904 11.3973 11.3973 11.2041 11.0109 11.0109 10.8177 10.8177 10.6246 10.4314 10.4314 10.2382 10.2382 10.045 10.045 9.85186 9.85186 9.65869 9.46552 9.27234 9.27234 9.07917 9.07917 8.88599 8.88599 8.69282 8.49965 8.30647 8.30647 8.1133 7.92013 7.92013 7.53378 7.53378 7.53378 7.53378 7.3406 7.14743 7.14743 7.14743 6.95426 6.76108 6.76108 6.56791 6.56791 6.56791 6.37473 6.37473 6.37473 6.18156 6.18156 5.98839 5.98839 5.98839 5.98839 5.98839 5.98839 5.98839 5.98839 5.98839 5.98839 5.79521 5.79521 5.79521 5.79521 5.60204 5.60204 5.79521 5.79521 5.79521 5.98839 5.98839 6.18156 6.18156 6.37473 6.37473 6.37473 6.56791 6.56791 6.56791 6.76108 6.76108 6.76108 6.76108 6.95426 6.95426 6.76108 6.76108 6.76108 6.56791 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.76108 6.56791 6.56791 6.56791 6.56791 6.37473 6.37473 6.37473 6.18156 6.18156 5.98839 5.98839 5.79521 5.79521 5.60204 5.60204 5.40887 5.40887 5.40887 5.40887 5.21569 5.21569 5.02252 5.02252 5.02252 5.02252 5.02252 4.82935 4.82935 4.63617 4.63617 4.63617 4.443 4.443 4.24982 4.24982 4.24982 4.05665 3.86348 3.86348 4.05665 3.86348 3.86348 3.6703 3.6703 3.6703 3.6703 3.6703 3.47713 3.47713 3.47713 3.47713 3.47713 3.47713 3.47713 3.47713 3.47713 3.28395 3.28395 3.47713 3.47713 3.28395 3.47713 3.28395 3.28395 3.28395 3.28395 3.28395 3.47713 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.28395 3.09078 3.28395 3.28395 3.28395 3.28395 3.47713 3.47713 3.47713 3.6703 3.6703 3.6703 3.86348 3.86348 3.86348 4.05665 4.05665 4.05665 4.05665 4.05665 4.24982 4.24982 4.24982 4.24982 4.24982 4.443 4.443 4.443 4.443 4.443 4.443 4.443 4.63617 4.63617 4.63617 4.63617 4.63617 4.82935 4.82935 5.02252 5.21569 5.21569 5.40887 5.60204 5.60204 5.79521 5.98839 6.18156 6.18156 6.37473 6.56791 6.56791 6.76108 6.95426 7.14743 7.3406 7.3406 7.53378 7.72695 7.92013 7.92013 8.1133 8.1133 8.1133 8.30647 8.49965 8.49965 8.69282 8.69282 8.88599 8.88599 9.07917 9.07917 9.27234 9.27234 9.27234 9.46552 9.46552 9.65869 9.65869 9.85186 9.85186 9.85186 9.85186 9.85186 10.045 10.045 10.2382 10.4314 10.2382 10.4314 10.4314 10.6246 10.6246 10.6246 10.8177 10.8177 11.0109 11.0109 11.2041 11.2041 11.3973 11.3973 11.3973 11.5904 11.5904 11.5904 11.7836 11.9768 11.9768 11.9768 11.9768 12.1699 12.1699 12.1699 12.1699 12.3631 12.3631 12.3631 12.3631 12.3631 12.5563 12.7495 12.9426 13.1358 13.329 13.5222 13.5222 13.5222 13.5222 13.329 13.329 13.329 13.329 13.329 13.329 13.329 13.329 13.329 13.329 13.329 13.5222 13.7153 13.9085 14.1017 14.2949 14.2949 14.2949 14.2949 14.2949 14.2949 14.2949 14.488 14.6812 14.8744 15.2607 15.4539 15.8403 16.0334 16.2266 16.2266 16.2266 16.0334 15.8403 15.8403 15.6471 15.4539 15.2607 15.0676 15.0676 15.0676 15.2607 15.6471 15.8403 16.2266 16.4198 16.6129 16.9993 17.1925 17.5788 17.772 17.772 17.9652 17.9652 17.9652 17.9652 17.9652 17.9652 17.9652 17.9652 17.9652 17.9652 18.1583 18.3515 18.5447 18.5447 18.7379 18.931 19.1242 19.1242 19.3174 19.3174 19.3174 19.3174 19.3174 19.5106 19.5106 19.5106 19.5106 19.7037 19.7037 19.7037 19.7037 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 20.0901 20.0901 20.0901 20.0901 20.2832 20.2832 20.2832 20.4764 20.4764 20.4764 20.6696 20.6696 20.8628 20.8628 20.8628 21.0559 21.0559 21.0559 21.0559 21.0559 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.0559 21.0559 21.0559 21.0559 21.0559 21.0559 20.8628 20.8628 20.8628 20.6696 20.6696 20.6696 20.4764 20.4764 20.2832 20.2832 20.2832 20.0901 20.0901 19.8969 19.8969 19.8969 19.7037 19.7037 19.7037 19.7037 19.7037 19.5106 19.5106 19.5106 19.5106 19.3174 19.3174 19.1242 19.1242 19.1242 19.1242 19.1242 19.1242 19.1242 19.1242 18.931 19.1242 19.1242 19.1242 19.3174 19.3174 19.3174 19.3174 19.3174 19.3174 19.3174 19.5106 19.5106 19.5106 19.5106 19.5106 19.5106 19.5106 19.7037 19.7037 19.7037 19.7037 19.7037 19.7037 19.7037 19.7037 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.7037 19.7037 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.7037 19.7037 19.7037 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.8969 19.7037 19.7037 19.8969 19.8969 19.7037 19.8969 19.8969 19.8969 19.8969 19.7037 19.7037 19.7037 19.7037 19.7037 19.7037 19.7037 19.7037 19.5106 19.5106 19.5106 19.5106 19.5106 19.3174 19.3174 19.3174 19.3174 19.3174 19.3174 19.3174 19.3174 19.3174 19.1242 19.1242 19.1242 19.1242 19.1242 19.1242 19.1242 19.1242 18.931 19.1242 19.1242 18.931 18.931 18.931 18.931 18.931 18.931 18.7379 18.7379 18.7379 18.5447 18.5447 18.5447 18.5447 18.5447 18.3515 18.3515 18.3515 18.3515 18.3515 18.1583 18.1583 17.9652 17.9652 17.772 17.772 17.5788 17.5788 17.5788 17.5788 17.5788 17.5788 17.3856 17.1925 16.9993 16.9993 16.8061 16.8061 16.8061 16.8061 16.8061 16.8061 16.8061 16.8061 16.6129 16.6129 16.4198 16.4198 16.4198 16.4198 16.4198 16.4198 16.2266 16.2266 16.2266 16.0334 16.0334 16.0334 16.0334 15.8403 15.8403 15.8403 15.8403 15.6471 15.6471 15.6471 15.4539 15.4539 15.4539 15.4539 15.4539 15.2607 15.2607 15.2607 15.2607 15.0676 15.0676 15.0676 15.0676 15.0676 15.0676 15.0676 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 14.8744 15.0676 15.0676 15.0676 15.2607 15.2607 15.0676 15.0676 15.0676 15.0676 15.2607 15.4539 15.6471 15.8403 15.8403 15.8403 15.8403 15.8403 15.8403 15.8403 15.8403 15.8403 15.8403 15.6471 15.6471 15.6471 15.6471 15.6471 15.6471 15.6471 15.6471 15.8403 15.8403 15.6471 15.8403 15.8403 16.0334 16.2266 16.2266 16.4198 16.4198 16.4198 16.4198 16.6129 16.6129 16.6129 16.8061 16.8061 16.9993 16.9993 17.1925 17.1925 17.3856 17.5788 17.5788 17.772 17.9652 17.9652 18.1583 18.1583 18.1583 18.1583 18.3515 18.3515 18.5447 18.5447 18.5447 18.5447 18.5447 18.5447 18.5447 18.5447 18.5447 18.5447 18.5447 18.7379 18.7379 18.7379 18.5447 18.5447 18.7379 18.7379 18.7379 18.7379 18.7379 18.7379 18.7379 18.7379 18.7379 18.931 18.931 18.931 18.931 18.931 19.1242 19.1242 19.1242 19.3174 19.1242 19.1242 19.3174 19.3174 19.5106 19.5106 19.5106 19.5106 19.5106 19.7037 19.8969 19.8969 19.8969 19.8969 19.8969 20.0901 20.2832 20.2832 20.2832 20.2832 20.4764 20.4764 20.4764 20.6696 20.6696 20.6696 20.6696 20.6696 20.8628 21.0559 20.8628 21.0559 21.0559 21.0559 21.0559 21.0559 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.2491 21.4423 21.4423 21.4423 21.4423 21.4423 21.4423 21.6355 21.6355 21.6355 21.6355 21.8286 21.8286 21.8286 22.0218 22.0218 22.0218 21.8286 21.8286 22.0218 22.0218 22.0218 22.0218 22.0218 22.0218 22.0218 22.0218 22.0218 21.8286 21.8286 21.8286 21.8286 21.8286 21.8286 21.8286 21.8286 21.8286 22.0218 22.0218 22.0218 22.0218 21.8286 22.0218 22.0218 22.0218 22.0218 22.0218 22.0218 22.0218 22.0218 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.0218 22.0218 22.215 22.215 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.215 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.215 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.6013 22.6013 22.6013 22.4082 22.4082 22.4082 22.4082 22.6013 22.4082 22.4082 22.6013 22.6013 22.6013 22.6013 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.4082 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.215 22.4082 22.4082 22.4082 22.6013 22.6013 22.6013 22.6013 22.6013 22.6013 22.6013 22.7945 22.6013 22.6013 22.7945 22.7945 22.7945 22.7945 22.7945 22.9877 22.7945 22.7945 22.9877 22.9877 22.9877 22.7945 22.7945 22.7945 22.9877 22.7945 22.7945 22.7945 22.9877 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.7945 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 23.1809 23.1809 23.1809 23.1809 23.1809 23.1809 22.9877 23.1809 23.1809 23.1809 23.1809 23.1809 23.374 23.374 23.374 23.1809 23.1809 23.1809 23.374 23.374 23.374 23.374 23.1809 23.1809 23.1809 23.1809 23.1809 23.1809 23.374 23.1809 23.1809 23.374 23.1809 23.1809 23.1809 23.1809 23.374 23.374 23.374 23.374 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.374 23.374 23.374 23.374 23.374 23.5672 23.5672 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.5672 23.5672 23.5672 23.5672 23.5672 23.5672 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.7604 23.5672 23.5672 23.5672 23.5672 23.5672 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.374 23.1809 23.1809 23.1809 23.1809 23.1809 22.9877 22.9877 23.1809 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.9877 22.7945 22.7945 22.7945 22.7945 22.6013 22.6013 22.7945 22.7945 22.7945 22.6013 22.6013 22.6013 22.4082 22.4082 22.4082 22.4082 22.215 22.215 22.215 22.0218 22.0218 22.0218 22.0218 21.8286 21.8286 21.8286 21.6355 21.6355 21.6355 21.6355 21.6355 21.4423 21.4423 21.2491 21.0559 21.0559 21.0559 21.0559 20.8628 20.8628 20.8628 20.6696 20.6696 20.6696 20.4764 20.4764 20.2832 20.2832 20.2832 20.2832 20.2832 20.0901 20.0901 19.8969 19.8969 19.8969 19.7037 19.7037 19.5106 19.5106 19.3174 19.3174 19.3174 19.1242 18.931 18.931 18.7379 18.7379 18.5447 18.5447 18.3515 18.3515 18.1583 18.1583 17.9652 17.772 17.772 17.5788 17.3856 17.3856 17.1925 17.1925 16.9993 16.9993 16.8061 16.8061 16.6129 16.6129 16.4198 16.2266 16.2266 16.0334 16.0334 15.8403 15.6471 15.6471 15.6471 15.4539 15.4539 15.2607 15.2607 15.0676 15.0676 14.8744 14.8744 14.6812 14.488 14.488 14.2949 14.2949 14.1017 14.1017 13.9085 13.9085 13.7153 13.7153 13.7153 13.5222 13.329 13.329 13.1358 13.1358 12.9426 12.7495 12.7495 12.7495 12.5563 12.5563 12.5563 12.3631 12.3631 12.3631 12.1699 12.1699 11.9768 11.9768 11.7836 11.7836 11.5904 11.5904 11.3973 11.3973 11.3973 11.3973 11.3973 11.2041 11.2041 11.0109 10.8177 10.8177 10.8177 10.6246 10.6246 10.4314 10.4314 10.4314 10.4314 10.2382 10.2382 10.2382 10.045 10.045 10.045 10.045 9.85186 9.85186 9.85186 9.65869 9.65869 9.46552 9.46552</A_FLOAT64>

+      </Values>

+      <Id>10</Id>

+      <Name>CHANNEL09</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>9</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <LocalColumn>

+      <SequenceRepresentation>explicit</SequenceRepresentation>

+      <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>

+      <Values>

+        <A_FLOAT64>0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.178524 0.371926 0.178524 0.371926 0.371926 0.178524 0.371926 0.178524 0.371926 0.178524 0.371926 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.371926 0.178524 0.178524 0.371926 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.371926 0.178524 0.178524 0.371926 0.178524 0.371926 0.178524 0.371926 0.178524 0.178524 0.371926 0.371926 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.371926 0.178524 0.371926 0.178524 0.371926 0.371926 0.178524 0.371926 0.178524 0.371926 0.178524 0.371926 0.371926 0.371926 0.371926 0.371926 0.178524 0.371926 0.178524 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.178524 0.371926 0.371926 0.371926 0.371926 0.178524 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.178524 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.178524 0.371926 0.371926 0.371926 0.178524 0.371926 0.178524 0.371926 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 -0.014877 0.178524 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.208278 -0.208278 -0.208278 -0.208278 -0.014877 -0.014877 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.401679 -0.208278 -0.401679 -0.208278 -0.208278 -0.208278 -0.401679 -0.401679 -0.401679 -0.401679 -0.208278 -0.401679 -0.401679 -0.208278 -0.208278 -0.208278 -0.401679 -0.401679 -0.208278 -0.208278 -0.401679 -0.401679 -0.401679 -0.401679 -0.401679 -0.208278 -0.401679 -0.401679 -0.208278 -0.208278 -0.208278 -0.401679 -0.208278 -0.208278 -0.401679 -0.401679 -0.401679 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.208278 -0.014877 -0.014877 -0.014877 -0.014877 -0.208278 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 0.178524 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 0.178524 0.178524 0.178524 -0.014877 0.178524 0.178524 -0.014877 0.178524 0.178524 -0.014877 0.178524 -0.014877 0.178524 0.178524 0.178524 -0.014877 0.178524 0.178524 -0.014877 0.178524 -0.014877 -0.014877 0.178524 -0.014877 0.178524 0.178524 -0.014877 0.178524 0.178524 0.178524 0.178524 -0.014877 -0.014877 0.178524 0.178524 0.178524 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 0.178524 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 -0.014877 0.178524 -0.014877 -0.014877 -0.014877 -0.014877 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.178524 0.371926 0.178524 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.371926 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.565327 0.758728 0.758728 0.758728 0.758728 0.758728 0.758728 0.758728 0.758728 0.952129 0.952129 0.758728 0.952129 0.952129 0.952129 0.952129 1.14553 0.952129 1.14553 1.14553 1.14553 1.14553 1.14553 1.14553 1.14553 1.33893 1.33893 1.33893 1.33893 1.53233 1.53233 1.53233 1.53233 1.72573 1.72573 1.72573 1.72573 1.91914 1.91914 1.91914 1.91914 1.91914 2.11254 2.11254 2.11254 2.11254 2.11254 2.30594 2.30594 2.30594 2.30594 2.49934 2.49934 2.49934 2.49934 2.69274 2.69274 2.69274 2.69274 2.69274 2.88614 2.69274 2.88614 2.88614 2.88614 2.88614 3.07954 3.07954 3.07954 3.07954 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.27294 3.46635 3.46635 3.65975 3.46635 3.46635 3.46635 3.65975 3.65975 3.65975 3.85315 3.85315 3.85315 4.04655 4.04655 4.23995 4.43335 4.62675 4.82015 4.82015 4.82015 5.01356 5.98056 7.52777 8.88158 10.2354 11.009 11.976 13.1364 14.1034 14.877 15.2638 15.2638 15.2638 16.0374 17.778 20.2923 23.1933 25.3207 26.2877 26.4811 26.6745 27.8349 29.3821 31.1227 32.4765 33.6369 34.7973 36.538 38.6654 40.5994 42.34 43.6938 44.6608 45.4344 45.6278 45.241 44.4674 43.1136 41.7598 40.406 39.2456 38.2786 37.3116 36.7314 36.1512 36.1512 36.538 37.3116 38.0852 38.8588 39.8258 40.9862 41.9532 42.9202 43.5004 44.0806 44.274 44.4674 44.4674 44.274 44.0806 43.6938 43.307 42.9202 42.5334 41.9532 41.373 40.9862 40.5994 40.5994 40.406 40.5994 40.5994 40.7928 40.9862 41.373 41.7598 42.34 42.7268 43.1136 43.5004 43.6938 43.8872 43.8872 44.0806 43.8872 43.8872 43.8872 43.8872 43.8872 43.5004 43.1136 42.5334 42.1466 41.7598 41.373 41.1796 40.7928 40.406 40.2126 40.2126 40.406 40.7928 41.1796 41.373 41.1796 40.9862 41.1796 41.5664 42.1466 42.5334 43.1136 44.0806 45.0476 45.8212 45.4344 43.6938 40.9862 37.3116 33.4435 29.9623 26.8679 24.5471 23.1933 22.8065 23.5801 25.3207 27.6415 30.3491 32.6699 34.6039 36.538 38.2786 39.439 40.2126 40.5994 40.406 40.0192 39.439 38.6654 37.6984 36.9248 36.1512 35.7644 35.5709 35.7644 36.3446 37.505 38.8588 40.2126 41.5664 42.9202 44.0806 45.0476 46.208 46.9816 47.7552 48.7222 49.4958 50.2694 51.043 51.8167 52.7837 53.7507 54.9111 56.2649 57.6187 58.9725 60.1329 61.2933 62.4537 63.4207 64.3877 65.3547 66.3217 67.2887 68.4492 69.6096 70.9634 72.5106 74.2512 75.9918 77.9258 79.8598 81.6004 83.1477 84.5015 85.6619 86.6289 87.0157 86.8223 86.0487 85.0817 84.1147 83.5345 83.3411 83.5345 83.9213 84.6949 86.0487 87.5959 89.1431 90.6903 92.0441 93.2045 94.3649 95.1385 95.5253 95.7187 95.7187 95.3319 95.1385 94.9451 94.5583 93.7847 93.0111 91.8507 90.8837 89.5299 88.3695 87.0157 85.6619 84.5015 83.5345 82.3741 81.407 80.44 79.473 78.506 77.3456 76.3786 75.7984 75.605 75.9918 76.572 77.1522 77.7324 78.3126 78.506 78.6994 78.3126 77.3456 76.1852 74.4446 72.704 70.77 68.6426 66.5151 64.0009 61.4867 58.9725 56.0715 53.3639 50.6562 48.142 45.8212 43.6938 41.7598 39.8258 38.2786 36.9248 35.7644 34.9907 34.0237 32.8633 31.5095 30.1557 28.6085 26.8679 24.9339 22.8065 20.6791 18.3582 16.0374 13.91 11.976 10.2354 8.68818 6.94757 5.59376 4.43335 3.85315 3.27294 3.27294 3.46635 3.85315 3.85315 3.46635 2.88614 2.69274 2.69274 2.69274 2.30594 1.91914 1.53233 1.14553 0.565327 -0.401679 -1.17528 -1.75549 -2.52909 -3.3027 -4.0763 -4.84991 -5.43011 -6.20372 -7.17072 -7.94433 -8.91133 -9.68494 -10.0717 -9.87834 -9.29814 -8.33113 -6.97732 -5.04331 -2.9159 -0.981883 0.758728 2.30594 3.46635 4.62675 5.78716 6.75417 7.72117 8.49478 8.88158 9.26838 9.46178 9.65519 9.65519 9.65519 9.46178 9.26838 9.07498 8.88158 8.88158 9.07498 9.26838 9.84859 10.6222 11.3958 12.3628 13.1364 13.91 14.4902 14.6836 14.4902 14.1034 13.3298 12.3628 11.2024 9.26838 7.14097 4.23995 1.14553 -2.52909 -6.20372 -9.87834 -13.3596 -16.6474 -19.9352 -23.223 -26.124 -29.0251 -31.7327 -34.4403 -36.9545 -39.0819 -41.2093 -42.7565 -43.917 -44.6906 -44.884 -44.4972 -43.5302 -42.1763 -40.8225 -39.0819 -37.3413 -35.6007 -33.4733 -31.7327 -29.7987 -27.8647 -25.9306 -24.19 -22.256 -20.5154 -18.7748 -17.2276 -15.6804 -14.52 -13.553 -12.7794 -12.1992 -12.0058 -11.8124 -11.8124 -11.4255 -11.0387 -10.4585 -9.87834 -9.68494 -9.87834 -10.0717 -10.4585 -10.8453 -11.4255 -11.619 -12.3926 -13.3596 -13.9398 -14.3266 -15.1002 -16.2606 -17.8078 -19.5484 -21.289 -23.0296 -24.5768 -25.9306 -27.4779 -29.0251 -30.1855 -31.1525 -31.9261 -32.3129 -32.6997 -33.0865 -33.2799 -33.2799 -33.0865 -32.8931 -32.8931 -33.0865 -33.0865 -33.2799 -33.2799 -33.2799 -33.0865 -33.0865 -33.2799 -33.6667 -34.0535 -34.2469 -34.8271 -35.2139 -35.6007 -35.7941 -35.7941 -35.6007 -35.4073 -35.2139 -35.0205 -34.8271 -34.6337 -34.4403 -34.2469 -33.8601 -33.4733 -33.2799 -33.0865 -32.8931 -32.8931 -33.0865 -33.2799 -33.2799 -33.0865 -32.8931 -32.3129 -31.5393 -30.5723 -29.4119 -28.2515 -27.2845 -25.5438 -22.4494 -18.5814 -14.3266 -9.87834 -5.81691 -2.33569 0.758728 3.27294 5.20696 7.33437 9.26838 11.009 11.976 12.5562 12.5562 11.7826 10.6222 9.07498 7.52777 5.98056 4.62675 3.65975 2.49934 1.33893 -0.014877 -1.94889 -4.2697 -6.01032 -6.78392 -7.17072 -7.55752 -7.94433 -7.94433 -6.97732 -4.46311 -1.56209 1.14553 3.07954 4.82015 6.56077 8.30138 9.46178 10.2354 11.009 11.7826 12.5562 13.1364 13.7166 14.1034 14.4902 14.877 15.0704 15.2638 15.4572 15.844 16.6176 17.1978 17.9714 18.5516 19.1318 19.5186 19.3252 18.9384 18.1648 17.0044 15.4572 13.91 12.1694 10.4288 8.49478 6.56077 4.43335 2.30594 0.178524 -2.33569 -4.84991 -7.55752 -10.2651 -13.1662 -16.0672 -19.1616 -22.0626 -25.157 -28.0581 -30.9591 -34.0535 -37.1479 -40.2423 -43.5302 -46.818 -50.2992 -53.7804 -57.455 -61.1297 -64.8043 -68.6723 -72.5403 -76.4084 -80.4698 -84.5312 -88.5927 -92.4607 -96.1353 -99.6165 -102.904 -105.999 -109.093 -112.188 -115.089 -118.183 -121.277 -124.178 -127.273 -130.174 -132.688 -134.816 -136.75 -138.49 -139.844 -141.198 -142.552 -143.905 -145.259 -146.42 -147.193 -147.58 -147.387 -146.613 -145.646 -144.486 -143.325 -142.358 -141.004 -139.651 -138.49 -137.33 -136.363 -135.202 -134.042 -132.882 -131.915 -131.334 -131.334 -131.334 -130.948 -129.787 -128.433 -127.466 -126.886 -126.693 -126.499 -126.112 -125.919 -126.112 -126.499 -126.499 -126.886 -127.273 -127.66 -127.466 -127.079 -127.079 -127.273 -127.273 -126.886 -126.886 -126.693 -126.693 -126.306 -125.726 -125.145 -124.372 -123.405 -122.244 -120.891 -119.73 -118.57 -117.216 -116.056 -115.089 -114.122 -113.155 -112.381 -111.414 -110.254 -109.093 -107.546 -106.192 -104.645 -103.098 -101.357 -100.003 -98.4561 -97.1023 -95.9419 -94.7815 -93.8145 -92.6541 -91.3003 -89.9465 -88.3992 -86.852 -85.3048 -83.7576 -82.2104 -80.6632 -78.9226 -77.3754 -75.6348 -73.7008 -71.9601 -70.0261 -68.4789 -66.7383 -65.1911 -63.8373 -62.4835 -61.1297 -60.1627 -59.5825 -59.1957 -58.8089 -58.6155 -58.0353 -57.455 -56.2946 -54.9408 -53.3936 -51.653 -49.9124 -48.1718 -46.6246 -45.2708 -44.1104 -42.95 -41.9829 -41.0159 -40.0489 -39.0819 -37.9215 -36.7611 -35.6007 -34.4403 -33.4733 -32.3129 -31.1525 -29.9921 -29.0251 -27.8647 -26.8976 -25.9306 -25.157 -24.5768 -23.9966 -23.6098 -23.0296 -22.256 -21.6758 -20.9022 -19.9352 -19.1616 -18.388 -17.8078 -17.6144 -17.421 -17.421 -17.421 -17.2276 -17.0342 -16.6474 -16.0672 -15.487 -14.9068 -14.3266 -13.7464 -13.1662 -12.586 -12.0058 -11.4255 -10.8453 -10.0717 -9.29814 -8.52453 -7.94433 -7.55752 -6.97732 -6.59052 -6.20372 -5.62351 -5.23671 -4.84991 -4.2697 -3.8829 -3.4961 -3.1093 -2.72249 -2.52909 -2.33569 -2.14229 -2.14229 -2.14229 -2.14229 -2.14229 -1.94889 -1.75549 -1.75549 -1.56209 -1.36869 -1.36869 -1.36869 -1.36869 -1.36869 -1.36869 -1.36869 -1.36869 -1.36869 -1.36869 -1.56209 -1.56209 -1.75549 -1.94889 -2.33569 -2.52909 -2.9159 -3.1093 -3.3027 -3.4961 -3.6895 -3.8829 -4.0763 -4.2697 -4.46311 -4.84991 -5.04331 -5.23671 -5.43011 -5.81691 -6.01032 -6.01032 -6.20372 -6.20372 -6.20372 -6.20372 -6.20372 -6.20372 -6.39712 -6.39712 -6.59052 -6.59052 -6.78392 -6.97732 -6.97732 -7.17072 -6.97732 -6.97732 -6.97732 -6.97732 -6.97732 -6.97732 -6.97732 -6.97732 -6.97732 -6.97732 -6.97732 -6.78392 -6.78392 -6.59052 -6.59052 -6.39712 -6.39712 -6.20372 -6.20372 -6.01032 -5.81691 -5.62351 -5.23671 -5.04331 -4.65651 -4.46311 -4.0763 -3.6895 -3.1093 -2.72249 -2.33569 -1.94889 -1.56209 -1.17528 -0.981883 -0.595081 -0.208278 -0.014877 0.371926 0.758728 0.952129 1.33893 1.53233 1.72573 1.91914 2.11254 2.30594 2.49934 2.69274 2.88614 2.88614 3.07954 3.27294 3.27294 3.46635 3.46635 3.65975 3.85315 3.85315 4.04655 4.23995 4.23995 4.43335 4.62675 4.82015 5.01356 5.01356 5.20696 5.40036 5.59376 5.59376 5.78716 5.78716 5.98056 5.98056 6.17396 6.17396 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.17396 6.17396 6.36736 6.36736 6.36736 6.17396 5.59376 5.20696 5.78716 6.36736 6.56077 6.75417 6.75417 6.94757 6.94757 6.75417 6.94757 6.94757 6.94757 6.94757 6.94757 6.94757 6.94757 6.94757 6.94757 6.94757 6.94757 6.75417 6.75417 6.75417 6.75417 6.75417 6.75417 6.56077 6.56077 6.56077 6.56077 6.56077 6.56077 6.36736 6.56077 6.56077 6.56077 6.36736 6.56077 6.36736 6.36736 6.36736 6.36736 6.36736 6.36736 6.17396 6.17396 6.17396 5.98056 5.98056 5.98056 5.98056 5.78716 5.78716 5.78716 5.78716 5.59376 5.78716 5.59376 5.59376 5.59376 5.59376 5.59376 5.59376 5.40036 5.40036 5.40036 5.40036 5.59376 5.59376 5.59376 5.59376 5.59376 5.59376 5.59376 5.59376 5.78716 5.59376 5.59376 5.78716 5.59376 5.59376 5.78716 5.78716 5.78716 5.78716 5.78716 5.78716 5.59376 5.78716 5.78716 5.78716 5.78716 5.59376 5.59376 5.59376 5.59376 5.59376 5.40036 5.40036 5.40036 5.40036 5.20696 5.20696 5.20696 5.01356 5.01356 5.01356 4.82015 4.82015 4.82015 4.62675 4.62675 4.62675 4.62675 4.62675 4.62675 4.62675 4.62675 4.43335 4.43335 4.43335 4.43335 4.43335 4.23995 4.23995 4.23995 4.23995 4.23995 4.04655 4.23995 4.04655 4.04655 4.04655 4.04655 3.85315 3.85315 3.85315 3.85315 3.85315 3.65975 3.65975 3.46635 3.46635 3.27294 3.27294 3.27294 3.27294 3.27294 3.07954 3.07954 3.07954 2.88614 2.88614 2.88614 2.69274 2.69274 2.69274 2.69274 2.69274 2.69274 2.69274 2.69274 2.69274 2.49934 2.49934 2.49934 2.49934 2.49934 2.49934 2.49934 2.49934 2.49934 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.30594 2.11254 2.11254 2.11254 2.11254 2.11254 2.11254 1.91914 1.91914 1.72573 1.72573 1.72573 1.72573 1.53233 1.53233 1.53233 1.33893 1.14553 0.952129 0.758728 0.758728 0.371926 0.178524 -0.014877 -0.208278 -0.401679 -0.595081 -0.788482 -0.981883 -1.17528 -1.36869 -1.75549 -1.75549 -1.94889 -2.14229 -2.33569 -2.52909 -2.72249 -2.72249 -2.9159 -3.1093 -3.1093 -3.1093 -3.3027 -3.3027 -3.3027 -3.4961 -3.4961 -3.4961 -3.4961 -3.6895 -3.6895 -3.6895 -3.8829 -3.8829 -3.8829 -3.8829 -4.0763 -4.0763 -4.0763 -4.2697 -4.46311 -4.46311 -4.46311 -4.46311 -4.46311 -4.46311 -4.46311 -4.65651 -4.65651 -4.65651 -4.65651 -4.65651 -4.65651 -4.65651 -4.65651 -4.65651 -4.84991 -4.84991 -4.84991 -4.84991 -4.84991 -4.84991 -4.84991 -4.84991 -4.84991 -5.04331 -5.04331 -5.04331 -5.04331 -5.04331 -5.23671 -5.23671 -5.23671 -5.23671 -5.43011 -5.43011 -5.43011 -5.62351 -5.62351 -5.62351 -5.81691 -5.81691 -6.01032 -6.01032 -6.01032 -6.20372 -6.20372 -6.20372 -6.20372 -6.20372 -6.39712 -6.39712 -6.39712 -6.39712 -6.59052 -6.59052 -6.59052 -6.59052 -6.78392 -6.78392 -6.78392 -6.78392 -6.97732 -6.97732 -6.97732 -7.17072 -7.17072 -7.36412 -7.36412 -7.55752 -7.55752 -7.75093 -7.75093 -7.94433 -7.94433 -7.94433 -8.13773 -8.13773 -8.13773 -8.13773 -8.33113 -8.33113 -8.33113 -8.33113 -8.52453 -8.71793 -8.71793 -8.71793 -8.91133 -8.91133 -9.10473 -9.10473 -9.29814 -9.29814 -9.49154 -9.49154 -9.68494 -9.68494 -9.87834 -9.87834 -10.0717 -10.0717 -10.2651 -10.2651 -10.2651 -10.4585 -10.6519 -10.6519 -10.8453 -10.8453 -11.0387 -11.2321 -11.4255 -11.619 -11.8124 -12.0058 -12.3926 -12.7794 -13.1662 -13.7464 -14.52 -14.9068 -15.2936 -15.2936 -14.9068 -14.52 -13.7464 -12.9728 -12.0058 -11.0387 -10.0717 -9.10473 -7.94433 -7.17072 -6.59052 -6.39712 -6.39712 -6.59052 -6.97732 -7.55752 -8.33113 -9.10473 -10.0717 -10.8453 -11.4255 -12.1992 -12.7794 -13.1662 -13.553 -13.9398 -14.1332 -14.3266 -14.3266 -14.52 -14.52 -14.52 -14.52 -14.52 -14.3266 -14.1332 -14.1332 -13.9398 -13.7464 -13.7464 -13.7464 -13.7464 -13.7464 -13.7464 -13.7464 -13.7464 -13.9398 -13.9398 -14.1332 -14.3266 -14.1332 -14.1332 -14.3266 -14.3266 -14.3266 -14.3266 -14.52 -14.3266 -14.3266 -14.3266 -14.3266 -14.1332 -14.1332 -14.1332 -14.1332 -14.1332 -13.9398 -14.1332 -13.9398 -13.9398 -14.1332 -14.1332 -14.1332 -14.1332 -14.1332 -13.9398 -13.9398 -13.7464 -13.7464 -13.553 -13.3596 -13.3596 -13.1662 -12.9728 -12.7794 -12.586 -12.1992 -12.0058 -12.0058 -11.619 -11.619 -11.4255 -11.2321 -11.2321 -11.0387 -11.0387 -11.0387 -11.0387 -11.0387 -11.0387 -11.2321 -11.2321 -11.4255 -11.4255 -11.619 -11.619 -11.8124 -12.0058 -12.1992 -12.1992 -12.3926 -12.586 -12.7794 -12.7794 -12.9728 -12.9728 -13.1662 -13.1662 -13.1662 -13.1662 -13.1662 -13.1662 -13.1662 -13.1662 -13.1662 -12.9728 -12.9728 -12.9728 -12.9728 -12.7794 -12.7794 -12.7794 -12.7794 -12.586 -12.586 -12.586 -12.586 -12.586 -12.3926 -12.3926 -12.3926 -12.3926 -12.1992 -12.3926 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.3926 -12.3926 -12.3926 -12.1992 -12.1992 -12.1992 -12.1992 -12.1992 -12.3926 -12.1992 -12.1992 -12.1992 -12.3926 -12.3926 -12.3926 -12.586 -12.586 -12.7794 -12.7794 -12.7794 -12.9728 -12.9728 -12.9728 -13.1662 -12.9728 -12.9728 -13.1662 -12.9728 -12.9728 -12.9728 -12.9728 -12.9728 -12.9728 -12.7794 -12.7794 -12.7794 -12.7794 -12.7794 -12.586 -12.586 -12.586 -12.586 -12.586 -12.3926 -12.3926 -12.3926 -12.3926 -12.3926 -12.1992 -12.1992 -12.1992 -12.1992 -12.0058 -12.0058 -12.0058 -12.1992 -12.1992 -12.0058 -12.0058 -12.0058 -12.0058 -12.0058 -12.0058 -12.0058 -11.8124 -11.8124 -11.8124 -11.619 -11.619 -11.619 -11.619 -11.4255 -11.4255 -11.4255 -11.2321 -11.2321 -11.2321 -11.0387 -11.0387 -11.0387 -11.0387 -11.0387 -11.0387 -10.8453 -10.8453 -10.8453 -10.8453 -10.6519 -10.6519 -10.6519 -10.6519 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.8453 -10.6519 -10.8453 -10.8453 -10.8453 -10.6519 -10.8453 -10.8453 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.8453 -10.8453 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.6519 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.2651 -10.2651 -10.2651 -10.2651 -10.0717 -9.87834 -9.87834 -9.87834 -9.87834 -9.68494 -9.68494 -9.68494 -9.68494 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.68494 -9.68494 -9.68494 -9.49154 -9.68494 -9.68494 -9.49154 -9.49154 -9.68494 -9.68494 -9.68494 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.68494 -9.68494 -9.68494 -9.68494 -9.68494 -9.49154 -9.49154 -9.68494 -9.68494 -9.68494 -9.68494 -9.49154 -9.49154 -9.29814 -9.29814 -9.29814 -9.29814 -9.29814 -9.29814 -9.29814 -9.29814 -9.29814 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.49154 -9.68494 -9.68494 -9.49154 -9.49154 -9.49154 -9.29814 -9.29814 -9.29814 -9.29814 -9.29814 -9.29814 -9.10473 -9.10473 -8.91133 -9.10473 -9.10473 -9.10473 -9.29814 -9.29814 -9.29814 -9.49154 -9.49154 -9.49154 -9.49154 -9.68494 -9.68494 -9.87834 -9.87834 -9.87834 -10.0717 -10.0717 -10.0717 -10.2651 -10.2651 -10.2651 -10.2651 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.4585 -10.2651 -10.2651 -10.2651 -10.2651 -10.2651 -10.2651 -10.2651 -10.2651 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.68494 -9.68494 -9.68494 -9.68494 -9.87834 -9.87834 -9.87834 -9.68494 -9.68494 -9.87834 -9.87834 -9.87834 -9.68494 -9.68494 -9.68494 -9.68494 -9.68494 -9.68494 -9.87834 -9.87834 -9.68494 -9.68494 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -10.0717 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.87834 -9.68494 -9.68494 -9.68494 -9.49154 -9.49154 -9.49154 -9.29814 -9.29814 -9.29814 -9.29814 -9.10473 -9.10473 -8.91133 -8.91133 -8.91133 -8.71793 -8.71793 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.52453 -8.33113 -8.33113 -8.52453 -8.52453 -8.52453 -8.52453 -8.33113 -8.33113 -8.33113 -8.33113 -8.52453 -8.33113 -8.33113 -8.33113 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -7.94433 -7.94433 -8.13773 -8.13773 -8.13773 -8.13773 -7.94433 -7.94433 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -8.13773 -7.94433 -7.94433 -7.94433 -7.94433 -7.94433 -7.94433 -7.94433 -7.75093 -7.75093 -7.75093 -7.75093 -7.55752 -7.55752 -7.55752 -7.55752 -7.55752 -7.55752 -7.36412 -7.36412 -7.36412 -7.36412 -7.17072 -7.17072 -7.17072 -7.36412 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.36412 -7.36412 -7.17072 -7.36412 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -7.17072 -6.97732 -6.97732 -6.97732 -6.97732 -6.78392 -6.78392 -6.78392 -6.78392 -6.78392 -6.78392 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.59052 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.39712 -6.20372 -6.20372 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -5.81691 -5.81691 -6.01032 -5.81691 -5.81691 -6.01032 -5.81691 -6.01032 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -6.01032 -5.81691 -5.81691 -5.81691 -5.81691 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.20372 -6.20372 -6.20372 -6.01032 -6.01032 -6.01032 -6.20372 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -6.01032 -5.81691 -6.01032 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.81691 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.43011 -5.43011 -5.43011 -5.43011 -5.62351 -5.62351 -5.43011 -5.43011 -5.43011 -5.62351 -5.62351 -5.62351 -5.62351 -5.81691 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.62351 -5.43011 -5.43011 -5.43011 -5.43011 -5.23671 -5.23671 -5.23671 -5.04331 -5.04331 -5.04331 -4.84991 -4.84991 -4.84991 -4.65651 -4.65651 -4.65651 -4.46311 -4.46311 -4.2697 -4.2697 -4.0763 -4.0763 -4.0763 -3.8829 -3.8829 -3.8829 -3.6895 -3.4961 -3.4961 -3.3027 -3.3027 -3.1093 -3.1093 -2.9159 -2.72249 -2.72249 -2.72249 -2.52909 -2.33569 -2.33569 -2.14229 -1.94889 -1.75549 -1.75549 -1.56209 -1.36869 -1.17528 -0.981883 -0.981883 -0.788482 -0.595081 -0.595081 -0.401679 -0.208278 -0.208278 -0.014877 -0.014877 0.371926 0.371926 0.565327 0.758728 0.758728 0.952129 1.14553 1.14553 1.33893 1.53233 1.72573 1.91914 1.91914 2.11254 2.30594 2.30594 2.49934 2.69274 2.69274 2.88614 3.07954 3.07954 3.27294 3.46635 3.65975 3.65975 3.85315 4.04655 4.23995 4.23995 4.43335 4.62675 4.82015 5.01356 5.01356 5.20696 5.20696 5.40036 5.40036 5.59376 5.59376 5.78716 5.78716 5.98056 5.98056 6.17396 6.17396 6.36736 6.36736 6.56077 6.56077 6.75417 6.75417 6.75417 6.94757 6.94757 6.94757 7.14097 7.14097 7.14097 7.14097 7.14097 7.33437 7.33437 7.33437 7.33437 7.33437 7.52777 7.52777 7.52777 7.52777 7.52777 7.52777 7.52777 7.52777 7.52777 7.52777 7.72117 7.72117 7.72117 7.72117 7.91457 7.91457 7.91457 7.91457 7.91457 7.91457 8.10798 8.10798 8.10798 8.10798 8.30138 8.30138 8.30138 8.30138 8.49478 8.49478 8.49478 8.49478 8.68818 8.68818 8.68818 8.68818 8.68818 8.88158 8.88158 8.88158 9.07498 9.07498 9.07498 9.07498 9.26838 9.26838 9.46178 9.46178 9.46178 9.65519 9.65519 9.65519 9.84859 9.84859 9.84859 9.84859 10.042 10.042 10.042 10.2354 10.2354 10.2354 10.2354 10.4288 10.4288 10.4288 10.4288 10.4288 10.4288 10.6222 10.6222 10.6222 10.6222 10.6222 10.6222 10.8156 10.8156 10.8156 10.8156 10.8156 10.8156 10.8156 11.009 11.009 11.009 11.009</A_FLOAT64>

+      </Values>

+      <Id>11</Id>

+      <Name>CHANNEL10</Name>

+      <IndependentFlag>0</IndependentFlag>

+      <MimeType>application/x-asam.aolocalcolumn</MimeType>

+      <RawDatatype>DT_DOUBLE</RawDatatype>

+      <axistype>Yaxis</axistype>

+      <MeaQuantity>10</MeaQuantity>

+      <SubMatrix>1</SubMatrix>

+    </LocalColumn>

+    <air_filter>

+      <Id>1</Id>

+      <Name>air_filter</Name>

+      <MimeType>application/x-asam.aounitundertestpart.air_filter.air_filter</MimeType>

+      <min_bulk_material_density>0.83</min_bulk_material_density>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </air_filter>

+    <air_filter>

+      <Id>2</Id>

+      <Name>air_filter</Name>

+      <MimeType>application/x-asam.aounitundertestpart.air_filter.air_filter</MimeType>

+      <min_bulk_material_density>0.83</min_bulk_material_density>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </air_filter>

+    <engine>

+      <Id>1</Id>

+      <Name>engine</Name>

+      <MimeType>application/x-asam.aounitundertestpart.engine.engine</MimeType>

+      <manufacturer>Peak Motors Ltd.</manufacturer>

+      <model>Peak Turbo V16</model>

+      <type>Compression-ignition</type>

+      <power>167</power>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </engine>

+    <engine>

+      <Id>2</Id>

+      <Name>engine</Name>

+      <MimeType>application/x-asam.aounitundertestpart.engine.engine</MimeType>

+      <manufacturer>Peak Motors Ltd.</manufacturer>

+      <model>Peak Turbo V16</model>

+      <type>Compression-ignition</type>

+      <power>167</power>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </engine>

+    <exhaust_piping>

+      <Id>1</Id>

+      <Name>exhaust_piping</Name>

+      <MimeType>application/x-asam.aounitundertestpart.exhaust_piping.exhaust_piping</MimeType>

+      <material>Stainless steel</material>

+      <length>3.79</length>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </exhaust_piping>

+    <exhaust_piping>

+      <Id>2</Id>

+      <Name>exhaust_piping</Name>

+      <MimeType>application/x-asam.aounitundertestpart.exhaust_piping.exhaust_piping</MimeType>

+      <material>Stainless steel</material>

+      <length>3.79</length>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </exhaust_piping>

+    <expansion_chamber>

+      <Id>1</Id>

+      <Name>expansion_chamber</Name>

+      <MimeType>application/x-asam.aounitundertestpart.expansion_chamber.expansion_chamber</MimeType>

+      <volume>0.53</volume>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </expansion_chamber>

+    <expansion_chamber>

+      <Id>2</Id>

+      <Name>expansion_chamber</Name>

+      <MimeType>application/x-asam.aounitundertestpart.expansion_chamber.expansion_chamber</MimeType>

+      <volume>0.53</volume>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </expansion_chamber>

+    <gearbox>

+      <Id>1</Id>

+      <Name>gearbox</Name>

+      <MimeType>application/x-asam.aounitundertestpart.gearbox.gearbox</MimeType>

+      <transmission>Automatic</transmission>

+      <no_forward_gears>6</no_forward_gears>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </gearbox>

+    <gearbox>

+      <Id>2</Id>

+      <Name>gearbox</Name>

+      <MimeType>application/x-asam.aounitundertestpart.gearbox.gearbox</MimeType>

+      <transmission>Automatic</transmission>

+      <no_forward_gears>6</no_forward_gears>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </gearbox>

+    <noise_reduction_system>

+      <Id>1</Id>

+      <Name>noise_reduction_system</Name>

+      <MimeType>application/x-asam.aounitundertestpart.noise_reduction_system.noise_reduction_system</MimeType>

+      <design_family>Whisper</design_family>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </noise_reduction_system>

+    <noise_reduction_system>

+      <Id>2</Id>

+      <Name>noise_reduction_system</Name>

+      <MimeType>application/x-asam.aounitundertestpart.noise_reduction_system.noise_reduction_system</MimeType>

+      <design_family>Whisper</design_family>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </noise_reduction_system>

+    <silencer>

+      <Id>1</Id>

+      <Name>exhaust_silencer</Name>

+      <MimeType>application/x-asam.aounitundertestpart.silencer.exhaust_silencer</MimeType>

+      <location>Exhaust</location>

+      <manufacturer>Peak Silencers Ltd.</manufacturer>

+      <model>Lion's Roar 2013</model>

+      <type>Quadruple pipe</type>

+      <fibre_type>Biosil wool</fibre_type>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </silencer>

+    <silencer>

+      <Id>2</Id>

+      <Name>intake_silencer</Name>

+      <MimeType>application/x-asam.aounitundertestpart.silencer.intake_silencer</MimeType>

+      <location>Intake</location>

+      <manufacturer>Peak Silencers Ltd.</manufacturer>

+      <model>Snake's Hiss 2013</model>

+      <fibre_type>Etype wool</fibre_type>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </silencer>

+    <silencer>

+      <Id>3</Id>

+      <Name>exhaust_silencer</Name>

+      <MimeType>application/x-asam.aounitundertestpart.silencer.exhaust_silencer</MimeType>

+      <location>Exhaust</location>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </silencer>

+    <silencer>

+      <Id>4</Id>

+      <Name>intake_silencer</Name>

+      <MimeType>application/x-asam.aounitundertestpart.silencer.intake_silencer</MimeType>

+      <location>Intake</location>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </silencer>

+    <tyre>

+      <Id>1</Id>

+      <Name>FL_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.fl_tyre</MimeType>

+      <manufacturer>Tunnelsand</manufacturer>

+      <axle>1</axle>

+      <side>Left</side>

+      <size>75R15</size>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </tyre>

+    <tyre>

+      <Id>2</Id>

+      <Name>FR_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.fr_tyre</MimeType>

+      <manufacturer>Tunnelsand</manufacturer>

+      <axle>1</axle>

+      <side>Right</side>

+      <size>75R15</size>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </tyre>

+    <tyre>

+      <Id>3</Id>

+      <Name>RL_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.rl_tyre</MimeType>

+      <manufacturer>Tunnelsand</manufacturer>

+      <axle>2</axle>

+      <side>Left</side>

+      <size>75R15</size>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </tyre>

+    <tyre>

+      <Id>4</Id>

+      <Name>RR_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.rr_tyre</MimeType>

+      <manufacturer>Tunnelsand</manufacturer>

+      <axle>2</axle>

+      <side>Right</side>

+      <size>75R15</size>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </tyre>

+    <tyre>

+      <Id>5</Id>

+      <Name>FL_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.fl_tyre</MimeType>

+      <axle>1</axle>

+      <side>Left</side>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </tyre>

+    <tyre>

+      <Id>6</Id>

+      <Name>FR_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.fr_tyre</MimeType>

+      <axle>1</axle>

+      <side>Right</side>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </tyre>

+    <tyre>

+      <Id>7</Id>

+      <Name>RL_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.rl_tyre</MimeType>

+      <axle>2</axle>

+      <side>Left</side>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </tyre>

+    <tyre>

+      <Id>8</Id>

+      <Name>RR_tyre</Name>

+      <MimeType>application/x-asam.aounitundertestpart.tyre.rr_tyre</MimeType>

+      <axle>2</axle>

+      <side>Right</side>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </tyre>

+    <vehicle>

+      <Id>1</Id>

+      <Name>vehicle</Name>

+      <MimeType>application/x-asam.aounitundertestpart.vehicle.vehicle</MimeType>

+      <manufacturer>Peak Motor Vehicles</manufacturer>

+      <model>Model P</model>

+      <vehicle_type>Cabrio</vehicle_type>

+      <vehicle_category>Passenger transport</vehicle_category>

+      <maximum_authorized_mass>1950.0</maximum_authorized_mass>

+      <length>3.96</length>

+      <reference_point>Rear end</reference_point>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>1</UnitUnderTest>

+    </vehicle>

+    <vehicle>

+      <Id>2</Id>

+      <Name>vehicle</Name>

+      <MimeType>application/x-asam.aounitundertestpart.vehicle.vehicle</MimeType>

+      <manufacturer>Peak Motor Vehicles</manufacturer>

+      <model>Model P</model>

+      <vehicle_type>Cabrio</vehicle_type>

+      <vehicle_category>Passenger transport</vehicle_category>

+      <maximum_authorized_mass>1950.0</maximum_authorized_mass>

+      <length>3.96</length>

+      <reference_point>Rear end</reference_point>

+      <mass_in_running_order>1463.0</mass_in_running_order>

+      <TplUnitUnderTestComp>0</TplUnitUnderTestComp>

+      <UnitUnderTest>2</UnitUnderTest>

+    </vehicle>

+    <PBN_test_conduction>

+      <Id>1</Id>

+      <Name>test_conduction</Name>

+      <MimeType>application/x-asam.aotestsequencepart.pbn_test_conduction.test_conduction</MimeType>

+      <tested_vehicle_side>Right</tested_vehicle_side>

+      <v_test>70</v_test>

+      <accelerated>true</accelerated>

+      <TplTestSequenceComp>0</TplTestSequenceComp>

+      <TestSequence>1</TestSequence>

+    </PBN_test_conduction>

+    <PBN_test_conduction>

+      <Id>2</Id>

+      <Name>test_conduction</Name>

+      <MimeType>application/x-asam.aotestsequencepart.pbn_test_conduction.test_conduction</MimeType>

+      <tested_vehicle_side>Right</tested_vehicle_side>

+      <v_test>70</v_test>

+      <PMR>114.0</PMR>

+      <accelerated>true</accelerated>

+      <TplTestSequenceComp>0</TplTestSequenceComp>

+      <TestSequence>2</TestSequence>

+    </PBN_test_conduction>

+    <testsite>

+      <Id>1</Id>

+      <Name>testsite</Name>

+      <MimeType>application/x-asam.aotestsequencepart.testsite.testsite</MimeType>

+      <track_id>PBN Area 51</track_id>

+      <TplTestSequenceComp>0</TplTestSequenceComp>

+      <TestSequence>1</TestSequence>

+    </testsite>

+    <testsite>

+      <Id>2</Id>

+      <Name>testsite</Name>

+      <MimeType>application/x-asam.aotestsequencepart.testsite.testsite</MimeType>

+      <track_id>PBN Area 51</track_id>

+      <TplTestSequenceComp>0</TplTestSequenceComp>

+      <TestSequence>2</TestSequence>

+    </testsite>

+    <track>

+      <Id>1</Id>

+      <Name>track</Name>

+      <MimeType>application/x-asam.aotestsequencepart.track.track</MimeType>

+      <residual_voids_content>7.8</residual_voids_content>

+      <sound_absorption_coefficient>0.093</sound_absorption_coefficient>

+      <texture_depth>0.3</texture_depth>

+      <surface_homogeneity>homogenous</surface_homogeneity>

+      <last_check_texture_depth>20190703160700</last_check_texture_depth>

+      <TplTestSequenceComp>0</TplTestSequenceComp>

+      <TestSequence>1</TestSequence>

+    </track>

+    <track>

+      <Id>2</Id>

+      <Name>track</Name>

+      <MimeType>application/x-asam.aotestsequencepart.track.track</MimeType>

+      <residual_voids_content>7.8</residual_voids_content>

+      <sound_absorption_coefficient>0.093</sound_absorption_coefficient>

+      <texture_depth>0.3</texture_depth>

+      <surface_homogeneity>homogenous</surface_homogeneity>

+      <last_check_texture_depth>20140220000000</last_check_texture_depth>

+      <TplTestSequenceComp>0</TplTestSequenceComp>

+      <TestSequence>2</TestSequence>

+    </track>

+    <meteorological_measurement>

+      <Id>1</Id>

+      <Name>meteorological_measurement</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.meteorological_measurement.meteorological_measurement</MimeType>

+      <temperature>1 2</temperature>

+      <barometric_pressure>1</barometric_pressure>

+      <wind_speed>1</wind_speed>

+      <TplTestEquipmentComp>0</TplTestEquipmentComp>

+      <relative_humidity>1</relative_humidity>

+      <TestEquipment>1</TestEquipment>

+    </meteorological_measurement>

+    <meteorological_measurement>

+      <Id>2</Id>

+      <Name>meteorological_measurement</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.meteorological_measurement.meteorological_measurement</MimeType>

+      <temperature>3 4</temperature>

+      <barometric_pressure>2</barometric_pressure>

+      <wind_speed>2</wind_speed>

+      <TplTestEquipmentComp>0</TplTestEquipmentComp>

+      <relative_humidity>2</relative_humidity>

+      <TestEquipment>2</TestEquipment>

+    </meteorological_measurement>

+    <sound_measurement>

+      <Id>1</Id>

+      <Name>sound_measurement</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.sound_measurement.sound_measurement</MimeType>

+      <TplTestEquipmentComp>0</TplTestEquipmentComp>

+      <microphone>1 2</microphone>

+      <TestEquipment>1</TestEquipment>

+    </sound_measurement>

+    <sound_measurement>

+      <Id>2</Id>

+      <Name>sound_measurement</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.sound_measurement.sound_measurement</MimeType>

+      <TplTestEquipmentComp>0</TplTestEquipmentComp>

+      <microphone>3 4</microphone>

+      <TestEquipment>2</TestEquipment>

+    </sound_measurement>

+    <vehicle_measurement>

+      <Id>1</Id>

+      <Name>vehicle_measurement</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.vehicle_measurement.vehicle_measurement</MimeType>

+      <rotational_speed>1</rotational_speed>

+      <acceleration>1</acceleration>

+      <TplTestEquipmentComp>0</TplTestEquipmentComp>

+      <TestEquipment>1</TestEquipment>

+      <speed>1</speed>

+    </vehicle_measurement>

+    <vehicle_measurement>

+      <Id>2</Id>

+      <Name>vehicle_measurement</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.vehicle_measurement.vehicle_measurement</MimeType>

+      <rotational_speed>2</rotational_speed>

+      <acceleration>2</acceleration>

+      <TplTestEquipmentComp>0</TplTestEquipmentComp>

+      <TestEquipment>2</TestEquipment>

+      <speed>2</speed>

+    </vehicle_measurement>

+    <acceleration>

+      <Id>1</Id>

+      <Name>vehicle_acceleration</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.acceleration</MimeType>

+      <vehicle_measurement>1</vehicle_measurement>

+      <TplSensor>0</TplSensor>

+    </acceleration>

+    <acceleration>

+      <Id>2</Id>

+      <Name>vehicle_acceleration</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.acceleration</MimeType>

+      <vehicle_measurement>2</vehicle_measurement>

+      <TplSensor>0</TplSensor>

+    </acceleration>

+    <rotational_speed>

+      <Id>1</Id>

+      <Name>rotational_speed</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.rotational_speed</MimeType>

+      <vehicle_measurement>1</vehicle_measurement>

+      <TplSensor>0</TplSensor>

+    </rotational_speed>

+    <rotational_speed>

+      <Id>2</Id>

+      <Name>rotational_speed</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.rotational_speed</MimeType>

+      <vehicle_measurement>2</vehicle_measurement>

+      <TplSensor>0</TplSensor>

+    </rotational_speed>

+    <speed>

+      <Id>1</Id>

+      <Name>vehicle_speed</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.speed</MimeType>

+      <vehicle_measurement>1</vehicle_measurement>

+      <TplSensor>0</TplSensor>

+    </speed>

+    <speed>

+      <Id>2</Id>

+      <Name>vehicle_speed</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.speed</MimeType>

+      <vehicle_measurement>2</vehicle_measurement>

+      <TplSensor>0</TplSensor>

+    </speed>

+    <microphone>

+      <Id>1</Id>

+      <Name>background_noise</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>

+      <sound_measurement>1</sound_measurement>

+      <TplSensor>0</TplSensor>

+    </microphone>

+    <microphone>

+      <Id>2</Id>

+      <Name>vehicle_noise</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>

+      <sound_measurement>1</sound_measurement>

+      <TplSensor>0</TplSensor>

+    </microphone>

+    <microphone>

+      <Id>3</Id>

+      <Name>background_noise</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>

+      <sound_measurement>2</sound_measurement>

+      <TplSensor>0</TplSensor>

+    </microphone>

+    <microphone>

+      <Id>4</Id>

+      <Name>vehicle_noise</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>

+      <sound_measurement>2</sound_measurement>

+      <TplSensor>0</TplSensor>

+    </microphone>

+    <barometric_pressure>

+      <Id>1</Id>

+      <Name>atmospheric_pressure</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.barometric_pressure</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>1</meteorological_measurement>

+    </barometric_pressure>

+    <barometric_pressure>

+      <Id>2</Id>

+      <Name>atmospheric_pressure</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.barometric_pressure</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>2</meteorological_measurement>

+    </barometric_pressure>

+    <relative_humidity>

+      <Id>1</Id>

+      <Name>humidity</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.relative_humidity</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>1</meteorological_measurement>

+    </relative_humidity>

+    <relative_humidity>

+      <Id>2</Id>

+      <Name>humidity</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.relative_humidity</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>2</meteorological_measurement>

+    </relative_humidity>

+    <temperature>

+      <Id>1</Id>

+      <Name>ambient_air_temperature</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>1</meteorological_measurement>

+    </temperature>

+    <temperature>

+      <Id>2</Id>

+      <Name>track_surface_temperature</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>1</meteorological_measurement>

+    </temperature>

+    <temperature>

+      <Id>3</Id>

+      <Name>ambient_air_temperature</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>2</meteorological_measurement>

+    </temperature>

+    <temperature>

+      <Id>4</Id>

+      <Name>track_surface_temperature</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>2</meteorological_measurement>

+    </temperature>

+    <wind_speed>

+      <Id>1</Id>

+      <Name>wind_speed</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.wind_speed</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>1</meteorological_measurement>

+    </wind_speed>

+    <wind_speed>

+      <Id>2</Id>

+      <Name>wind_speed</Name>

+      <MimeType>application/x-asam.aotestequipmentpart.wind_speed</MimeType>

+      <TplSensor>0</TplSensor>

+      <meteorological_measurement>2</meteorological_measurement>

+    </wind_speed>

+  </instance_data>

+</atfx_file>

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/build.gradle
new file mode 100644
index 0000000..f5b6044
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/build.gradle
@@ -0,0 +1,131 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+ 
+
+import org.apache.tools.ant.taskdefs.condition.Os
+import org.apache.tools.ant.filters.ConcatFilter
+
+plugins {
+	id "com.moowork.node" version "1.3.1"
+}
+
+description = 'MDM Web Application'
+
+System.setProperty('file.encoding', 'UTF-8')
+
+task map_tslint(type: Copy) {
+	File tsLintFile = file("${project.buildDir}/node/coverage/tslint_out.json")
+	File mappedTsLintFile = file("${project.buildDir}/node/coverage/tslint_out_mapped.json")
+
+	if (tsLintFile.exists()) {
+		String contents = tsLintFile.getText('UTF-8')
+		contents = contents.replaceAll( 'src/app', 'src/main/webapp/src/app' )
+		mappedTsLintFile.write(contents, 'UTF-8')
+	}
+}
+
+sonarqube {
+	properties {
+		property "sonar.sources", "src/main/webapp/src,src/main/java"
+		property "sonar.exclusions", "src/main/webapp/node_modules/**, src/main/webapp/coverage/**, src/main/webapp/dist/**,**/*.spec.ts, **/*.js"
+		property "sonar.tests", "src/main/webapp/src"
+		property "sonar.test.inclusions", "**/*.spec.ts"
+
+		property "sonar.ts.tslint.configPath", "src/main/webapp"
+		property "sonar.ts.tslint.projectPath", "src/main/webapp"
+		property "sonar.ts.tslint.outputPath", "${project.buildDir}/node/coverage/tslint_out_mapped.json"
+		property "sonar.ts.coverage.lcovReportpath", "${project.buildDir}/node/coverage/lcov.info"
+	}
+}
+
+dependencies {
+	runtime 'org.glassfish.jersey.containers:jersey-container-servlet:2.23.2'
+	compile 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.9.2'
+
+	compile project(':org.eclipse.mdm.businessobjects')
+	compile project(':org.eclipse.mdm.filerelease')
+	compile project(':org.eclipse.mdm.property')
+	compile project(':org.eclipse.mdm.freetextindexer')
+	compile project(':org.eclipse.mdm.preferences')
+}
+
+jar {
+	metaInf { from '../NOTICE.txt' }
+	metaInf { from '../LICENSE.txt' }
+}
+
+task copy_websources(type: Copy) {
+
+	from('./src/main/webapp') {
+		exclude 'dist'
+		exclude 'node_modules'
+		exclude 'NOTICE.html'
+	}
+
+	into "${project.buildDir}/node"
+}
+
+task copyNoticeFile() {
+  file("${project.buildDir}/node/src/app/").mkdirs()
+  def html = file("${project.buildDir}/node/src/app/NOTICE.html")
+  html.text = '<pre>' + file('../NOTICE.txt').text + '</pre>'
+}
+
+
+node {
+	version = '10.14.0'
+	npmVersion = '6.4.1'
+	distBaseUrl = 'https://nodejs.org/dist'
+	download = true
+	workDir = file("${project.buildDir}/node/nodejs")
+	npmWorkDir = file("${project.buildDir}/node")
+	nodeModulesDir = file("${project.buildDir}/node")
+	if (!nodeModulesDir.isDirectory()) {
+		nodeModulesDir.mkdirs()
+	}
+}
+
+npm_install { args = ["${project.buildDir}"] }
+
+task runBuild(type: NpmTask) {
+	args = ['run', 'ci_build']
+	inputs.dir 'src'
+	outputs.dir 'build'
+}
+
+task copy_loginsites(type: Copy) {
+	from 	"${project.buildDir}/node/src/login.jsp",
+			"${project.buildDir}/node/src/login.css",
+			"${project.buildDir}/node/src/error.jsp"
+
+	into	 "${project.buildDir}/node/dist"
+}
+
+task copyFilesForRunningWithoutNpm(type: Copy){
+	from	"${project.buildDir}/node/src/index.html"
+	into	"${project.buildDir}/node/dist"
+}
+
+if (hasProperty('skipNode')) {
+  compileJava.dependsOn(copy_loginsites)
+} else {
+	compileJava.dependsOn(copy_loginsites)
+	map_tslint.dependsOn(runBuild)
+	copy_loginsites.dependsOn(runBuild)
+	runBuild.dependsOn(npmInstall)
+	npmInstall.dependsOn(copy_websources)
+	npmInstall.dependsOn(copyNoticeFile)
+	copy_websources.dependsOn(npmSetup)
+	npmSetup.dependsOn(nodeSetup)
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/AccessControlResponseFilter.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/AccessControlResponseFilter.java
new file mode 100644
index 0000000..2489e18
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/AccessControlResponseFilter.java
@@ -0,0 +1,45 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.application;
+
+import javax.annotation.Priority;
+import javax.ws.rs.Priorities;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+@Priority(Priorities.HEADER_DECORATOR)
+public class AccessControlResponseFilter implements ContainerResponseFilter {
+
+	@Override
+	public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
+
+		final MultivaluedMap<String, Object> responseHeaders = responseContext.getHeaders();
+		final MultivaluedMap<String, String> requestHeaders = requestContext.getHeaders();
+
+		responseHeaders.add("Access-Control-Allow-Origin", "*");
+		responseHeaders.add("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type");
+		responseHeaders.add("Access-Control-Expose-Headers", "Location, Content-Disposition");
+		responseHeaders.add("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, HEAD, OPTIONS");
+
+		requestHeaders.add("Access-Control-Allow-Origin", "*");
+		requestHeaders.add("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type");
+		requestHeaders.add("Access-Control-Expose-Headers", "Location, Content-Disposition");
+		requestHeaders.add("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, HEAD, OPTIONS");
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/ApplicationConfig.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/ApplicationConfig.java
new file mode 100644
index 0000000..2e2a064
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/ApplicationConfig.java
@@ -0,0 +1,31 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.application;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+/**
+ * Application configuration
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@ApplicationPath("mdm")
+public class ApplicationConfig extends Application {
+
+	public ApplicationConfig() {
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/MDMRequestFilter.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/MDMRequestFilter.java
new file mode 100644
index 0000000..4d3c881
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/MDMRequestFilter.java
@@ -0,0 +1,109 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.application;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Splitter;
+import com.google.common.io.ByteStreams;
+
+/**
+ * MDMRequestFilter
+ * 
+ * For the angular web client all URLs that are routed by angular have to
+ * fallback to index.html. Thus this filter tests, if the the requested URL is
+ * in the configured passThroughPrefixes or if the URL matches a real file. If
+ * this is the case the filter passes the processing to the next filter,
+ * otherwise the contents of index.html is returned.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class MDMRequestFilter implements Filter {
+
+	private static final Logger LOG = LoggerFactory.getLogger(MDMRequestFilter.class);
+
+	private List<String> passThroughPrefixes = new ArrayList<>();
+
+	@Override
+	public void init(FilterConfig filterConfig) throws ServletException {
+		String passThrough = filterConfig.getInitParameter("passThroughPrefixes");
+		if (passThrough == null) {
+			passThroughPrefixes.add("mdm");
+		} else {
+			Splitter.on(',').trimResults().split(passThrough.toLowerCase()).forEach(passThroughPrefixes::add);
+		}
+
+		LOG.debug("Returning index.html for all requests except requests prefixed with: {}.", passThroughPrefixes);
+	}
+
+	@Override
+	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+			throws IOException, ServletException {
+		if (request instanceof HttpServletRequest) {
+			HttpServletRequest httpRequest = (HttpServletRequest) request;
+
+			String requestedPath = httpRequest.getServletPath().toLowerCase();
+			if (!matchesPassthrough(requestedPath)) {
+				InputStream in = request.getServletContext().getResourceAsStream(requestedPath);
+				if (in == null) {
+					response.setContentType("text/html");
+					in = request.getServletContext().getResourceAsStream("/index.html");
+					ByteStreams.copy(in, response.getOutputStream());
+					return;
+				}
+			}
+			chain.doFilter(request, response);
+		}
+	}
+
+	/**
+	 * Checks if the requestedURL has a prefix that is configured in
+	 * passThroughPrefix.
+	 * 
+	 * @param requestedURL the requested URL
+	 * @return true, if the requested URL is in the configured passThroughPrefix
+	 *         list.
+	 */
+	private boolean matchesPassthrough(String requestedURL) {
+		String trimmedURL = requestedURL.trim();
+		for (String e : passThroughPrefixes) {
+			if (trimmedURL.startsWith(e)) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	@Override
+	public void destroy() {
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/logout/MDMLogoutServlet.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/logout/MDMLogoutServlet.java
new file mode 100644
index 0000000..2d2131d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/java/org/eclipse/mdm/application/logout/MDMLogoutServlet.java
@@ -0,0 +1,57 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.application.logout;
+
+import java.io.IOException;
+
+import javax.inject.Inject;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.mdm.property.GlobalPropertyService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * MDMLogoutServlet
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@WebServlet(name = "MDMLogoutServlet", urlPatterns = { "/mdm/logout" })
+public class MDMLogoutServlet extends HttpServlet {
+
+	private static final long serialVersionUID = -2243639870075761399L;
+	private static final Logger LOG = LoggerFactory.getLogger(MDMLogoutServlet.class);
+
+	@Inject
+	private GlobalPropertyService propertyService;
+
+	@Override
+	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+		req.logout();
+		req.getSession().invalidate();
+
+		String r = propertyService.getGlobalPropertyMap(null).getOrDefault("application.logoutRedirect",
+				req.getContextPath());
+
+		LOG.info("Logged out, redirecting to {}", r);
+		resp.sendRedirect(r);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.editorconfig b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.editorconfig
new file mode 100644
index 0000000..6e87a00
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.editorconfig
@@ -0,0 +1,13 @@
+# Editor configuration, see http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.gitignore
new file mode 100644
index 0000000..0742f7a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.gitignore
@@ -0,0 +1,41 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/coverage
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage/*
+/libpeerconnection.log
+npm-debug.log
+testem.log
+/typings
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+#System Files
+.DS_Store
+Thumbs.db
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.vscode/launch.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.vscode/launch.json
new file mode 100644
index 0000000..1348ba4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/.vscode/launch.json
@@ -0,0 +1,15 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "type": "chrome",
+            "request": "launch",
+            "name": "Launch Chrome against localhost",
+            "url": "http://localhost:4200",
+            "webRoot": "${workspaceFolder}"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/README.md b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/README.md
new file mode 100644
index 0000000..6cea79e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/README.md
@@ -0,0 +1,43 @@
+# Webapp
+
+This project was generated with [angular-cli](https://github.com/angular/angular-cli) version 1.0.0-beta.28.3.
+
+## Development server
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class/module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
+Before running the tests make sure you are serving the app via `ng serve`.
+
+## Deploying to GitHub Pages
+
+Run `ng github-pages:deploy` to deploy to GitHub Pages.
+
+## Further help
+
+To get more help on the `angular-cli` use `ng help` or go check out the [Angular-CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
+
+## Copyright and License ##
+Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+
+ See the NOTICE file(s) distributed with this work for additional
+ information regarding copyright ownership.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v. 2.0 which is available at
+ http://www.eclipse.org/legal/epl-2.0.
+
+ SPDX-License-Identifier: EPL-2.0
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/README_I18N.md b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/README_I18N.md
new file mode 100644
index 0000000..22ce293
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/README_I18N.md
@@ -0,0 +1,149 @@
+# General

+

+The [ngx-translate library](https://github.com/ngx-translate/core) is used for internationalization. 

+This library basically provides functionality for replacing keys (as placeholders for the text to be translated)

+in HTML or TypeScript files with values (the actual translations) defined as key-value pairs in separate JSON files (one for each language to be supported). The JSON files (in UTF8 character encoding) should be placed in the _src/assets/i18n_ directory. It is suggested the 2-letter ISO language codes be used for the file names, the file name extension "json" is mandatory.

+

+Key/value replacement is performed at runtime of the web application, and it is possible to switch between languages at runtime (see below).

+

+For details, please refer to the ngx-translate documentation at the link above.

+

+

+## Recommendations

+

+The keys for the texts to be translated should follow the pattern 

+

+`<directory>.<filename>.<descriptive key>`

+

+where _directory_ is the directory within the _app_ folder containing the respective file, _filename_ the root file name (omitting the file name extension and  qualifiers such as "component" or "module"), and _descriptive key_ a name for the key preferably so chosen as to give some indication about its usage or meaning. Key names should be in English, with dashes (-) replacing spaces between words. For clarity, consider using prefixes such as "title" for dialog titles, "btn" for button texts, "lbl" for labels, "tooltip" for tooltip texts, "err" for error messages, etc.  

+

+Examples: 

+

+* `search.mdm-search.btn-apply-changes`

+* `details.sensor.err-cannot-load-descriptive-data`

+

+For the sake of uniformity, it is recommended to use the _translate_ pipe in HTML files:

+

+```html

+<h4 class="modal-title">{{ 'tableview.editview.title-view-editor' | translate }}</h4>

+```

+

+Using the _TranslateService.instant()_ method, a translation for a key can be obtained in the language currently selected at the time of the method call. A typical application scenario for this is a message etc. shown in response to an event triggered by user action (e.g., a button click):

+

+```typescript

+saveBasket(e: Event) {

+    if (e) {

+      e.stopPropagation();

+    }

+    if (this.baskets.find(f => f.name === this.basketName) != undefined) {

+      this.childSaveModal.hide();

+      this.overwriteDialogComponent.showOverwriteModal(

+        this.translateService.instant('basket.mdm-basket.item-save-shopping-basket')).subscribe(

+          needSave => this.saveBasket2(needSave),

+          error => {

+            this.saveBasket2(false);

+            this.notificationService.notifyError(this.translateService.instant('basket.mdm-basket.err-save-shopping-basket'), error);

+        });

+    } else {

+      this.saveBasket2(true);

+    }

+  }

+```

+

+A function _streamTranslate_ is defined in mdm-core.module.ts which accepts a translation key and returns an Observable:

+

+```typescript

+export function streamTranslate(translateService: TranslateService, keys: string | Array<string>, params?: any): Observable<any> {

+  return translateService.onLangChange.pipe( startWith({}),

+      switchMap(() => params ? translateService.get(keys, params) : translateService.get(keys)) );

+}

+```

+By subscribing to that observable, a change of language in the application can be detected and the current translation for the key passed can be obtained. This is especially useful for class variables containing text to be localized, which is then guaranteed to always be in the language currently selected. Example (see below for an explanation of the marker function _TRANSLATE_):

+

+```typescript

+import { TranslateService } from '@ngx-translate/core';

+import { streamTranslate, TRANSLATE } from '../core/mdm-core.module';

+

+export class MDMNavigatorComponent implements OnInit {

+

+  loadingNode = <TreeNode>{

+    label: 'Loading subordinate items...',

+    leaf: true,

+    icon: 'fa fa-spinner fa-pulse fa-fw'

+  };

+  

+  [...]

+

+  contextMenuItems: MenuItem[] = [

+    { label: 'Add to shopping basket', icon: 'fa fa-shopping-cart', command: (event) => this.addSelectionToBasket() }

+  ];

+

+  constructor(private translateService: TranslateService) {

+  }

+

+  ngOnInit() {

+    streamTranslate(this.translateService, TRANSLATE('navigator.mdm-navigator.loading-subordinate-items')).subscribe(

+            (msg: string) => this.loadingNode.label = msg);

+    streamTranslate(this.translateService, TRANSLATE('navigator.mdm-navigator.add-to-shopping-basket')).subscribe(

+            (msg: string) => this.contextMenuItems[0].label = msg);

+  }

+  

+  [...]

+}

+```

+  

+Please also note that a suitable default value should be provided for the text if there is the possibility of it being needed before the translation library has been fully initialized. These default texts should be in English.

+

+

+

+## Language selection in the web application

+

+The user can select the language for the UI from a list presented in the web application's main menu bar.

+The entries for this list are defined in the _languages_ array of the _AppComponent_ class. For each language, a _SelectItem_ must be added to this array (label: the name of the language _in that language itself_, value: the name of the JSON file with the translations, excluding the "json" extension):

+

+```typescript

+export class AppComponent implements OnInit {

+  [...]

+ 

+  languages = <SelectItem[]> [

+    { label: 'English', value: 'en' },

+    { label: 'Deutsch', value: 'de' },

+    { label: 'Français', value: 'fr' },

+  ];

+  

+  [...]

+}

+```

+

+

+# Extracting translation keys from source files

+

+Using the [ngx-translate-extract](https://github.com/biesbjerg/ngx-translate-extract) library, translation keys can be automatically extracted from the source files and collected in a JSON file for use with ngx-translate. Documentation for ngx-translate-extract is available at the link above. 

+

+A script (_extract-translations_) which extracts the keys to two files (_en.json_ and _de.json_ for English and German, respectively) has been defined in _package.json_ and can be invoked on the command line by _npm run extract-translations_. 

+

+```typescript

+"extract-translations": "ngx-translate-extract --input ./src --output ./src/assets/i18n/en.json ./src/assets/i18n/de.json --clean --sort --format namespaced-json --marker TRANSLATE"

+

+```

+

+In this script, a marker function (_TRANSLATE_, defined in mdm-core.module.ts) is specified for marking translation keys outside the methods provided by ngx-translate. Whenever a translation key is used in an ngx-translate method (such as _instant()_) or in conjunction with the _translate_ pipe or directive, ngx-translate-extract automatically extracts that key to the JSON file. Keys located elsewhere in a typescript file must, if they are to be included in the JSON file, be marked using a marker function, which should not do anything but return the string passed into it:

+

+```typescript

+export function TRANSLATE(str: string) {

+  return str;

+}

+```

+

+At each extraction run, new keys found in the sources are added to the JSON file(s), keys no longer used in the source files removed from the JSON file(s), and all other keys in the JSON file(s) left untouched, together with any already existing translations for these. 

+

+The script can, of course, be modified as needed. Please note that some of the ways to specify the target JSON files mentioned in the ngx-translate-extract documentation appear to be non-functional (e.g., the _{en,de}.json_ notation for creating two files, _en.json_ and _de.json_).

+

+

+

+

+

+

+

+

+

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/angular.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/angular.json
new file mode 100644
index 0000000..40981c4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/angular.json
@@ -0,0 +1,150 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "openMDM-Web": {
+      "root": "",
+      "sourceRoot": "src",
+      "projectType": "application",
+      "prefix": "mdm5",
+      "schematics": {},
+      "architect": {
+        "build": {
+          "builder": "@angular-devkit/build-angular:browser",
+          "options": {
+            "outputPath": "dist",
+            "index": "src/index.html",
+            "main": "src/main.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "src/tsconfig.app.json",
+            "assets": [
+              "src/assets",
+              "src/favicon.ico"
+            ],
+            "styles": [
+              "node_modules/primeicons/primeicons.css",
+              "node_modules/primeng/resources/themes/nova-light/theme.css",
+              "node_modules/primeng/resources/primeng.min.css",
+              "node_modules/primeflex/primeflex.css",
+              "node_modules/font-awesome/css/font-awesome.min.css",
+              "node_modules/bootstrap/dist/css/bootstrap.min.css",
+              "src/styles.css"
+            ],
+            "scripts": [
+              "node_modules/chart.js/dist/Chart.js"
+            ],
+            "es5BrowserSupport": true
+          },
+          "configurations": {
+            "production": {
+              "fileReplacements": [
+                {
+                  "replace": "src/environments/environment.ts",
+                  "with": "src/environments/environment.prod.ts"
+                }
+              ],
+              "optimization": true,
+              "outputHashing": "all",
+              "sourceMap": false,
+              "extractCss": true,
+              "namedChunks": false,
+              "aot": true,
+              "extractLicenses": true,
+              "vendorChunk": false,
+              "buildOptimizer": true,
+              "budgets": [
+                {
+                  "type": "initial",
+                  "maximumWarning": "2mb",
+                  "maximumError": "5mb"
+                }
+              ]
+            }
+          }
+        },
+        "serve": {
+          "builder": "@angular-devkit/build-angular:dev-server",
+          "options": {
+            "browserTarget": "openMDM-Web:build",
+            "proxyConfig": "proxies/development.config.json"
+          },
+          "configurations": {
+            "production": {
+              "browserTarget": "openMDM-Web:build:production"
+            }
+          }
+        },
+        "extract-i18n": {
+          "builder": "@angular-devkit/build-angular:extract-i18n",
+          "options": {
+            "browserTarget": "openMDM-Web:build"
+          }
+        },
+        "test": {
+          "builder": "@angular-devkit/build-angular:karma",
+          "options": {
+            "main": "src/test.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "src/tsconfig.spec.json",
+            "karmaConfig": "src/karma.conf.js",
+            "styles": [
+              "node_modules/primeicons/primeicons.css",
+              "node_modules/primeng/resources/themes/nova-light/theme.css",
+              "node_modules/primeng/resources/primeng.min.css",
+              "node_modules/font-awesome/css/font-awesome.min.css",
+              "node_modules/bootstrap/dist/css/bootstrap.min.css",
+              "src/styles.css"
+            ],
+            "scripts": [],
+            "assets": [
+              "src/assets",
+              "src/favicon.ico"
+            ]
+          }
+        },
+        "lint": {
+          "builder": "@angular-devkit/build-angular:tslint",
+          "options": {
+            "tsConfig": [
+              "src/tsconfig.app.json",
+              "src/tsconfig.spec.json"
+            ],
+            "exclude": [
+              "**/node_modules/**"
+            ]
+          }
+        }
+      }
+    },
+    "openMDM-Web-e2e": {
+      "root": "e2e/",
+      "projectType": "application",
+      "prefix": "",
+      "architect": {
+        "e2e": {
+          "builder": "@angular-devkit/build-angular:protractor",
+          "options": {
+            "protractorConfig": "e2e/protractor.conf.js",
+            "devServerTarget": "openMDM-Web:serve"
+          },
+          "configurations": {
+            "production": {
+              "devServerTarget": "openMDM-Web:serve:production"
+            }
+          }
+        },
+        "lint": {
+          "builder": "@angular-devkit/build-angular:tslint",
+          "options": {
+            "tsConfig": "e2e/tsconfig.e2e.json",
+            "exclude": [
+              "**/node_modules/**"
+            ]
+          }
+        }
+      }
+    }
+  },
+  "defaultProject": "openMDM-Web"
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/app.e2e-spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/app.e2e-spec.ts
new file mode 100644
index 0000000..48533e9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/app.e2e-spec.ts
@@ -0,0 +1,28 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { WebappPage } from './app.po';
+
+describe('webapp App', function() {
+  let page: WebappPage;
+
+  beforeEach(() => {
+    page = new WebappPage();
+  });
+
+  it('should display message saying app works', () => {
+    page.navigateTo();
+    expect(page.getParagraphText()).toEqual('app works!');
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/app.po.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/app.po.ts
new file mode 100644
index 0000000..0e327c8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/app.po.ts
@@ -0,0 +1,25 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { browser, element, by } from 'protractor';
+
+export class WebappPage {
+  navigateTo() {
+    return browser.get('/');
+  }
+
+  getParagraphText() {
+    return element(by.css('app-root h1')).getText();
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/protractor.conf.js b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/protractor.conf.js
new file mode 100644
index 0000000..001c7c0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/protractor.conf.js
@@ -0,0 +1,45 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+  allScriptsTimeout: 11000,
+  specs: [
+    './e2e/**/*.e2e-spec.ts'
+  ],
+  capabilities: {
+    'browserName': 'chrome'
+  },
+  directConnect: true,
+  baseUrl: 'http://localhost:4200/',
+  framework: 'jasmine',
+  jasmineNodeOpts: {
+    showColors: true,
+    defaultTimeoutInterval: 30000,
+    print: function() {}
+  },
+  beforeLaunch: function() {
+    require('ts-node').register({
+      project: 'e2e/tsconfig.e2e.json'
+    });
+  },
+  onPrepare() {
+    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+  }
+};
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/tsconfig.e2e.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/tsconfig.e2e.json
new file mode 100644
index 0000000..656bdb1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/e2e/tsconfig.e2e.json
@@ -0,0 +1,16 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "declaration": false,
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "module": "commonjs",
+    "moduleResolution": "node",
+    "outDir": "../dist/out-tsc-e2e",
+    "sourceMap": true,
+    "target": "es5",
+    "typeRoots": [
+      "../node_modules/@types"
+    ]
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/package-lock.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/package-lock.json
new file mode 100644
index 0000000..315531b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/package-lock.json
@@ -0,0 +1,11479 @@
+{
+  "name": "openMDM-Web",
+  "version": "5.1.0M8",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@angular-devkit/architect": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.1.tgz",
+      "integrity": "sha512-QDmIbqde75ZZSEFbw6Q6kQWq4cY6C7D67yujXw6XTyubDNAs1tyXJyxTIB8vjSlEKwRizTTDd/B0ZXVcke3Mvw==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.3.1",
+        "rxjs": "6.3.3"
+      }
+    },
+    "@angular-devkit/build-angular": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.13.1.tgz",
+      "integrity": "sha512-vkKwMVQ+NNCcVR3HFMffS+Mq4b2afXeUjI+02N38hBuFTppnC83uivUB6Uu2NUk5NTSQA4BnJlG5CbMs6N4QYg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.13.1",
+        "@angular-devkit/build-optimizer": "0.13.1",
+        "@angular-devkit/build-webpack": "0.13.1",
+        "@angular-devkit/core": "7.3.1",
+        "@ngtools/webpack": "7.3.1",
+        "ajv": "6.7.0",
+        "autoprefixer": "9.4.6",
+        "circular-dependency-plugin": "5.0.2",
+        "clean-css": "4.2.1",
+        "copy-webpack-plugin": "4.6.0",
+        "file-loader": "3.0.1",
+        "glob": "7.1.3",
+        "istanbul-instrumenter-loader": "3.0.1",
+        "karma-source-map-support": "1.3.0",
+        "less": "3.9.0",
+        "less-loader": "4.1.0",
+        "license-webpack-plugin": "2.1.0",
+        "loader-utils": "1.2.3",
+        "mini-css-extract-plugin": "0.5.0",
+        "minimatch": "3.0.4",
+        "node-sass": "4.11.0",
+        "opn": "5.4.0",
+        "parse5": "4.0.0",
+        "postcss": "7.0.14",
+        "postcss-import": "12.0.1",
+        "postcss-loader": "3.0.0",
+        "raw-loader": "1.0.0",
+        "rxjs": "6.3.3",
+        "sass-loader": "7.1.0",
+        "semver": "5.6.0",
+        "source-map-loader": "0.2.4",
+        "source-map-support": "0.5.10",
+        "speed-measure-webpack-plugin": "1.3.0",
+        "stats-webpack-plugin": "0.7.0",
+        "style-loader": "0.23.1",
+        "stylus": "0.54.5",
+        "stylus-loader": "3.0.2",
+        "terser-webpack-plugin": "1.2.2",
+        "tree-kill": "1.2.1",
+        "webpack": "4.29.0",
+        "webpack-dev-middleware": "3.5.1",
+        "webpack-dev-server": "3.1.14",
+        "webpack-merge": "4.2.1",
+        "webpack-sources": "1.3.0",
+        "webpack-subresource-integrity": "1.1.0-rc.6"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "parse5": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+          "integrity": "sha1-bXhlbj2o14tOwLkG98CO8d/j9gg=",
+          "dev": true
+        },
+        "semver": {
+          "version": "5.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+          "dev": true
+        }
+      }
+    },
+    "@angular-devkit/build-optimizer": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.13.1.tgz",
+      "integrity": "sha512-LmvHiI3H451aVWY5Ac6Fqz0i1eX/mUfWN+uJvo8NaL6Jc0HKYX2o3l4ODr8UUECWWctUC9AMD522ZMwAvnvsKQ==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.2.3",
+        "source-map": "0.5.6",
+        "typescript": "3.2.4",
+        "webpack-sources": "1.3.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
+          "dev": true
+        },
+        "typescript": {
+          "version": "3.2.4",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz",
+          "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==",
+          "dev": true
+        }
+      }
+    },
+    "@angular-devkit/build-webpack": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.13.1.tgz",
+      "integrity": "sha512-OGwC7bAl3u+w7Glw+OqIrN7OD1BkDXgrWbeQSpKAmsx6VdNPCnI4NPS+JldWNp70LVlE2nQlJUhtEqMVfBMnlg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.13.1",
+        "@angular-devkit/core": "7.3.1",
+        "rxjs": "6.3.3"
+      }
+    },
+    "@angular-devkit/core": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.1.tgz",
+      "integrity": "sha512-56XDWWfIzOAkEk69lBLgmCYybPUA4yjunhmMlCk7vVdb7gbQUyzNjFD04Uj0GjlejatAQ5F76tRwygD9C+3RXQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "6.7.0",
+        "chokidar": "2.0.4",
+        "fast-json-stable-stringify": "2.0.0",
+        "rxjs": "6.3.3",
+        "source-map": "0.7.3"
+      }
+    },
+    "@angular-devkit/schematics": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.1.tgz",
+      "integrity": "sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.3.1",
+        "rxjs": "6.3.3"
+      }
+    },
+    "@angular/animations": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.4.tgz",
+      "integrity": "sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/cdk": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.1.1.tgz",
+      "integrity": "sha1-aRayMDr14KVqm2T/TVRkLPGRxU8=",
+      "requires": {
+        "parse5": "^5.0.0",
+        "tslib": "^1.7.1"
+      }
+    },
+    "@angular/cli": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.3.1.tgz",
+      "integrity": "sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.13.1",
+        "@angular-devkit/core": "7.3.1",
+        "@angular-devkit/schematics": "7.3.1",
+        "@schematics/angular": "7.3.1",
+        "@schematics/update": "0.13.1",
+        "@yarnpkg/lockfile": "1.1.0",
+        "ini": "1.3.5",
+        "inquirer": "6.2.1",
+        "npm-package-arg": "6.1.0",
+        "opn": "5.4.0",
+        "pacote": "9.4.0",
+        "semver": "5.6.0",
+        "symbol-observable": "1.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+          "dev": true
+        }
+      }
+    },
+    "@angular/common": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.4.tgz",
+      "integrity": "sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/compiler": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.4.tgz",
+      "integrity": "sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/compiler-cli": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz",
+      "integrity": "sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg==",
+      "dev": true,
+      "requires": {
+        "canonical-path": "1.0.0",
+        "chokidar": "^1.4.2",
+        "convert-source-map": "^1.5.1",
+        "dependency-graph": "^0.7.2",
+        "magic-string": "^0.25.0",
+        "minimist": "^1.2.0",
+        "reflect-metadata": "^0.1.2",
+        "shelljs": "^0.8.1",
+        "source-map": "^0.6.1",
+        "tslib": "^1.9.0",
+        "yargs": "9.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "anymatch": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+          "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
+          "dev": true,
+          "requires": {
+            "micromatch": "^2.1.5",
+            "normalize-path": "^2.0.0"
+          }
+        },
+        "arr-diff": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.0.1"
+          }
+        },
+        "array-unique": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+          "dev": true
+        },
+        "braces": {
+          "version": "1.8.5",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+          "dev": true,
+          "requires": {
+            "expand-range": "^1.8.1",
+            "preserve": "^0.2.0",
+            "repeat-element": "^1.1.2"
+          }
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "chokidar": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+          "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+          "dev": true,
+          "requires": {
+            "anymatch": "^1.3.0",
+            "async-each": "^1.0.0",
+            "fsevents": "^1.0.0",
+            "glob-parent": "^2.0.0",
+            "inherits": "^2.0.1",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^2.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+          "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "expand-brackets": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+          "dev": true,
+          "requires": {
+            "is-posix-bracket": "^0.1.0"
+          }
+        },
+        "extglob": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^1.0.0"
+          }
+        },
+        "glob-parent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^2.0.0"
+          }
+        },
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^1.0.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "mem": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+          "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^1.0.0"
+          }
+        },
+        "micromatch": {
+          "version": "2.3.11",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^2.0.0",
+            "array-unique": "^0.2.1",
+            "braces": "^1.8.2",
+            "expand-brackets": "^0.1.4",
+            "extglob": "^0.3.1",
+            "filename-regex": "^2.0.0",
+            "is-extglob": "^1.0.0",
+            "is-glob": "^2.0.1",
+            "kind-of": "^3.0.2",
+            "normalize-path": "^2.0.1",
+            "object.omit": "^2.0.0",
+            "parse-glob": "^3.0.4",
+            "regex-cache": "^0.4.2"
+          }
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+          "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=",
+          "dev": true,
+          "requires": {
+            "execa": "^0.7.0",
+            "lcid": "^1.0.0",
+            "mem": "^1.1.0"
+          }
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^2.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.0.0",
+            "read-pkg": "^2.0.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz",
+          "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^2.0.0",
+            "read-pkg-up": "^2.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^7.0.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0"
+          }
+        }
+      }
+    },
+    "@angular/core": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.4.tgz",
+      "integrity": "sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/forms": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.4.tgz",
+      "integrity": "sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/http": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.4.tgz",
+      "integrity": "sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/language-service": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.2.4.tgz",
+      "integrity": "sha512-A9Rud/27hHMSUUjpgn57nVeLsoYgdvFwJhtlZA/oCuSpmlD+LqqBsEpPhivwn++u44+DSrFXsic29jlFnsBotw==",
+      "dev": true
+    },
+    "@angular/platform-browser": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.4.tgz",
+      "integrity": "sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/platform-browser-dynamic": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz",
+      "integrity": "sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/router": {
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.4.tgz",
+      "integrity": "sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@biesbjerg/ngx-translate-extract": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/@biesbjerg/ngx-translate-extract/-/ngx-translate-extract-2.3.4.tgz",
+      "integrity": "sha512-FzOdm5Jr2TMgdzTW+c6CGIgMQMCAXCyN6JYzz+hfnYjcvPrYbyR05AhM08W70nXD3a2RnbqjImNjEEcXY9pZ/g==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.0.1",
+        "cheerio": "1.0.0-rc.2",
+        "flat": "2.0.1",
+        "fs": "0.0.1-security",
+        "gettext-parser": "1.2.2",
+        "glob": "7.1.2",
+        "mkdirp": "0.5.1",
+        "path": "0.12.7",
+        "typescript": "2.4.1",
+        "yargs": "8.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz",
+          "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.1.0",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^4.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+          "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+          "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "mem": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+          "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^1.0.0"
+          }
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+          "dev": true,
+          "requires": {
+            "execa": "^0.7.0",
+            "lcid": "^1.0.0",
+            "mem": "^1.1.0"
+          }
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^2.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.0.0",
+            "read-pkg": "^2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^2.0.0"
+          }
+        },
+        "typescript": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.1.tgz",
+          "integrity": "sha1-w8yxbdqgsjFN4DHn5v7onlujRrw=",
+          "dev": true
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "8.0.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+          "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^2.0.0",
+            "read-pkg-up": "^2.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^7.0.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0"
+          }
+        }
+      }
+    },
+    "@ngtools/webpack": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.3.1.tgz",
+      "integrity": "sha512-EGQRjgDf5XP+Fm1MdZNRFiPd9e1vhl11BhjkwqkAsewic4eoz6fqXfj/Osz1hQy8xU+2dPPf/byQ/+nY3E02Zg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.3.1",
+        "enhanced-resolve": "4.1.0",
+        "rxjs": "6.3.3",
+        "tree-kill": "1.2.1",
+        "webpack-sources": "1.3.0"
+      }
+    },
+    "@ngx-translate/core": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-11.0.1.tgz",
+      "integrity": "sha1-zs761B8GNo9YWdrEj+yPzESFYV8=",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@ngx-translate/http-loader": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-4.0.0.tgz",
+      "integrity": "sha1-ilVSSK1LfVE0YPzsnaJbBEeWLx0=",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@schematics/angular": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.3.1.tgz",
+      "integrity": "sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.3.1",
+        "@angular-devkit/schematics": "7.3.1",
+        "typescript": "3.2.4"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "3.2.4",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz",
+          "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==",
+          "dev": true
+        }
+      }
+    },
+    "@schematics/update": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.13.1.tgz",
+      "integrity": "sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.3.1",
+        "@angular-devkit/schematics": "7.3.1",
+        "@yarnpkg/lockfile": "1.1.0",
+        "ini": "1.3.5",
+        "pacote": "9.4.0",
+        "rxjs": "6.3.3",
+        "semver": "5.6.0",
+        "semver-intersect": "1.4.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+          "dev": true
+        }
+      }
+    },
+    "@types/jasmine": {
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.8.tgz",
+      "integrity": "sha512-OJSUxLaxXsjjhob2DBzqzgrkLmukM3+JMpRp0r0E4HTdT1nwDCWhaswjYxazPij6uOdzHCJfNbDjmQ1/rnNbCg==",
+      "dev": true
+    },
+    "@types/jasminewd2": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz",
+      "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==",
+      "dev": true,
+      "requires": {
+        "@types/jasmine": "*"
+      }
+    },
+    "@types/node": {
+      "version": "8.9.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.4.tgz",
+      "integrity": "sha512-dSvD36qnQs78G1BPsrZFdPpvLgMW/dnvr5+nTW2csMs5TiP9MOXrjUbnMZOEwnIuBklXtn7b6TPA2Cuq07bDHA==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "0.0.32",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz",
+      "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
+      "dev": true
+    },
+    "@types/selenium-webdriver": {
+      "version": "3.0.14",
+      "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.14.tgz",
+      "integrity": "sha1-CyCiNw5rG4MiycPfyqQJ5sfAwKk=",
+      "dev": true
+    },
+    "@types/source-list-map": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
+      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
+      "dev": true
+    },
+    "@types/webpack-sources": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz",
+      "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/source-list-map": "*",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz",
+      "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/wast-parser": "1.7.11"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz",
+      "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz",
+      "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz",
+      "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz",
+      "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.7.11"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz",
+      "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz",
+      "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz",
+      "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz",
+      "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz",
+      "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz",
+      "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz",
+      "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz",
+      "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/helper-wasm-section": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11",
+        "@webassemblyjs/wasm-opt": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11",
+        "@webassemblyjs/wast-printer": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz",
+      "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/ieee754": "1.7.11",
+        "@webassemblyjs/leb128": "1.7.11",
+        "@webassemblyjs/utf8": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz",
+      "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz",
+      "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-api-error": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/ieee754": "1.7.11",
+        "@webassemblyjs/leb128": "1.7.11",
+        "@webassemblyjs/utf8": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz",
+      "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/floating-point-hex-parser": "1.7.11",
+        "@webassemblyjs/helper-api-error": "1.7.11",
+        "@webassemblyjs/helper-code-frame": "1.7.11",
+        "@webassemblyjs/helper-fsm": "1.7.11",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz",
+      "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/wast-parser": "1.7.11",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=",
+      "dev": true
+    },
+    "@xtuc/long": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
+      "integrity": "sha1-XIXWYvdvodNFdXZsXc1mFavNMNg=",
+      "dev": true
+    },
+    "@yarnpkg/lockfile": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+      "integrity": "sha1-53qX+9NFt22DJF7c0X05OxtB+zE=",
+      "dev": true
+    },
+    "JSONStream": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+      "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=",
+      "dev": true,
+      "requires": {
+        "jsonparse": "^1.2.0",
+        "through": ">=2.2.7 <3"
+      }
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=",
+      "dev": true,
+      "optional": true
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.18",
+        "negotiator": "0.6.1"
+      }
+    },
+    "acorn": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.0.tgz",
+      "integrity": "sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
+      "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==",
+      "dev": true
+    },
+    "adm-zip": {
+      "version": "0.4.13",
+      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz",
+      "integrity": "sha1-WX4vjMNnIVHhMH0+lc3bx1ZyMUo=",
+      "dev": true
+    },
+    "after": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+      "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
+      "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=",
+      "dev": true,
+      "requires": {
+        "es6-promisify": "^5.0.0"
+      }
+    },
+    "agentkeepalive": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
+      "integrity": "sha1-oROSTdP6JKC8O3gQjEUMKr7gD2c=",
+      "dev": true,
+      "requires": {
+        "humanize-ms": "^1.2.1"
+      }
+    },
+    "ajv": {
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz",
+      "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^2.0.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=",
+      "dev": true
+    },
+    "ajv-keywords": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz",
+      "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==",
+      "dev": true
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "ansi-colors": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+      "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+      "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+      "dev": true
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+      "dev": true,
+      "requires": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      }
+    },
+    "app-root-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
+      "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=",
+      "dev": true
+    },
+    "append-transform": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
+      "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
+      "dev": true,
+      "requires": {
+        "default-require-extensions": "^1.0.0"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=",
+      "dev": true,
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true,
+      "optional": true
+    },
+    "array-flatten": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+      "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=",
+      "dev": true
+    },
+    "array-slice": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+      "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
+    },
+    "arraybuffer.slice": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+      "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU=",
+      "dev": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "dev": true,
+      "optional": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "assert": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "dev": true,
+      "requires": {
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "async": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+      "integrity": "sha1-skWiPKcZMAROxT+kaqAKPofGphA=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.10"
+      }
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
+    },
+    "async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+      "dev": true,
+      "optional": true
+    },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "9.4.6",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.6.tgz",
+      "integrity": "sha512-Yp51mevbOEdxDUy5WjiKtpQaecqYq9OqZSL04rSoCiry7Tc5I9FEyo3bfxiTJc1DfHeKwSFCUYbBAiOQ2VGfiw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.4.1",
+        "caniuse-lite": "^1.0.30000929",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.13",
+        "postcss-value-parser": "^3.3.1"
+      }
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+      "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=",
+      "dev": true
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=",
+      "dev": true,
+      "requires": {
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "detect-indent": "^4.0.0",
+        "jsesc": "^1.3.0",
+        "lodash": "^4.17.4",
+        "source-map": "^0.5.7",
+        "trim-right": "^1.0.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "dev": true,
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.26.0",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "debug": "^2.6.8",
+        "globals": "^9.18.0",
+        "invariant": "^2.2.2",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "esutils": "^2.0.2",
+        "lodash": "^4.17.4",
+        "to-fast-properties": "^1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=",
+      "dev": true
+    },
+    "backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "dev": true,
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "base64-arraybuffer": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+      "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+      "dev": true
+    },
+    "base64-js": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+      "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=",
+      "dev": true
+    },
+    "base64id": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "better-assert": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+      "dev": true,
+      "requires": {
+        "callsite": "1.0.0"
+      }
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz",
+      "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==",
+      "dev": true
+    },
+    "blob": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
+      "integrity": "sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM=",
+      "dev": true
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "inherits": "~2.0.0"
+      }
+    },
+    "blocking-proxy": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz",
+      "integrity": "sha1-gdb9H+E6TA1pV99/kbdemNrEDLI=",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.0"
+      }
+    },
+    "bluebird": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
+      "integrity": "sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c=",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+      "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.18.3",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "~1.6.3",
+        "iconv-lite": "0.4.23",
+        "on-finished": "~2.3.0",
+        "qs": "6.5.2",
+        "raw-body": "2.3.3",
+        "type-is": "~1.6.16"
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "bootstrap": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.3.tgz",
+      "integrity": "sha512-rDFIzgXcof0jDyjNosjv4Sno77X4KuPeFxG2XZZv1/Kc8DRVGVADdoQyyOVDwPqL36DDmtCQbrpMCqvpPLJQ0w=="
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.1",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.2",
+        "elliptic": "^6.0.0",
+        "inherits": "^2.0.1",
+        "parse-asn1": "^5.0.0"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
+      "dev": true,
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz",
+      "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30000929",
+        "electron-to-chromium": "^1.3.103",
+        "node-releases": "^1.1.3"
+      }
+    },
+    "browserstack": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz",
+      "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==",
+      "dev": true,
+      "requires": {
+        "https-proxy-agent": "^2.2.1"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "buffer-alloc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+      "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=",
+      "dev": true,
+      "requires": {
+        "buffer-alloc-unsafe": "^1.1.0",
+        "buffer-fill": "^1.0.0"
+      }
+    },
+    "buffer-alloc-unsafe": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+      "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=",
+      "dev": true
+    },
+    "buffer-fill": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+      "dev": true
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=",
+      "dev": true
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "builtins": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "cacache": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+      "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.1",
+        "chownr": "^1.0.1",
+        "glob": "^7.1.2",
+        "graceful-fs": "^4.1.11",
+        "lru-cache": "^4.1.1",
+        "mississippi": "^2.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.2",
+        "ssri": "^5.2.4",
+        "unique-filename": "^1.1.0",
+        "y18n": "^4.0.0"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "dev": true,
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "callsite": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+      "dev": true
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true,
+      "optional": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000936",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000936.tgz",
+      "integrity": "sha512-orX4IdpbFhdNO7bTBhSbahp1EBpqzBc+qrvTRVUFfZgA4zta7TdM6PN5ZxkEUgDnz36m+PfWGcdX7AVfFWItJw==",
+      "dev": true
+    },
+    "canonical-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz",
+      "integrity": "sha1-/LRwwjlY3vhQgYVr56hukE8YDR0=",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "chalk": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+      "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=",
+      "dev": true
+    },
+    "chart.js": {
+      "version": "2.9.3",
+      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz",
+      "integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==",
+      "requires": {
+        "chartjs-color": "^2.1.0",
+        "moment": "^2.10.2"
+      }
+    },
+    "chartjs-color": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz",
+      "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==",
+      "requires": {
+        "chartjs-color-string": "^0.6.0",
+        "color-convert": "^1.9.3"
+      }
+    },
+    "chartjs-color-string": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz",
+      "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==",
+      "requires": {
+        "color-name": "^1.0.0"
+      }
+    },
+    "cheerio": {
+      "version": "1.0.0-rc.2",
+      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
+      "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
+      "dev": true,
+      "requires": {
+        "css-select": "~1.2.0",
+        "dom-serializer": "~0.1.0",
+        "entities": "~1.1.1",
+        "htmlparser2": "^3.9.1",
+        "lodash": "^4.15.0",
+        "parse5": "^3.0.1"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
+          "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+          "dev": true,
+          "requires": {
+            "@types/node": "*"
+          }
+        }
+      }
+    },
+    "chokidar": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+      "integrity": "sha1-NW/04rDo5D4yLRijckYLvPOszSY=",
+      "dev": true,
+      "requires": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.0",
+        "braces": "^2.3.0",
+        "fsevents": "^1.2.2",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.1",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "lodash.debounce": "^4.0.8",
+        "normalize-path": "^2.1.1",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.0.0",
+        "upath": "^1.0.5"
+      }
+    },
+    "chownr": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
+      "integrity": "sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ=",
+      "dev": true
+    },
+    "chrome-trace-event": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
+      "integrity": "sha1-Rakb0sIMlBHwljtarrmhuV4JzEg=",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "circular-dependency-plugin": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz",
+      "integrity": "sha1-2haMCzfntDVj+5+RLBwAfCEzie8=",
+      "dev": true
+    },
+    "circular-json": {
+      "version": "0.5.9",
+      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz",
+      "integrity": "sha1-kydjroj0996teg0JyKUaR0OlOx0=",
+      "dev": true
+    },
+    "class-transformer": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.1.6.tgz",
+      "integrity": "sha1-ETnBSTEcDITe08AOKoeeNHn2D6A="
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "clean-css": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+      "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^2.0.0"
+      }
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "dev": true
+    },
+    "cliui": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
+      }
+    },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
+      "integrity": "sha1-ANs6Hhc2VnMNEYjD1qztbX6pdxM=",
+      "dev": true,
+      "requires": {
+        "for-own": "^1.0.0",
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.0",
+        "shallow-clone": "^1.0.0"
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "codelyzer": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz",
+      "integrity": "sha1-pl3e7soolGUyU6ib+iKRGP+fWbE=",
+      "dev": true,
+      "requires": {
+        "app-root-path": "^2.1.0",
+        "css-selector-tokenizer": "^0.7.0",
+        "cssauron": "^1.4.0",
+        "semver-dsl": "^1.0.1",
+        "source-map": "^0.5.7",
+        "sprintf-js": "^1.1.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "sprintf-js": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+          "integrity": "sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM=",
+          "dev": true
+        }
+      }
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "dev": true
+    },
+    "combine-lists": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
+      "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.5.0"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+      "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.17.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+      "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "component-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+      "dev": true
+    },
+    "component-inherit": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.15",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
+      "integrity": "sha1-hXqasKfloH2Ng37UP+Le//ZP4hI=",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.36.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
+      "integrity": "sha1-J+DhdqryYPfywoE8PkQK258Zk9s=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.14",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.1",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "connect": {
+      "version": "3.6.6",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
+      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.0",
+        "parseurl": "~1.3.2",
+        "utils-merge": "1.0.1"
+      },
+      "dependencies": {
+        "finalhandler": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+          "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "encodeurl": "~1.0.1",
+            "escape-html": "~1.0.3",
+            "on-finished": "~2.3.0",
+            "parseurl": "~1.3.2",
+            "statuses": "~1.3.1",
+            "unpipe": "~1.0.0"
+          }
+        },
+        "statuses": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+          "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+          "dev": true
+        }
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "dev": true,
+      "requires": {
+        "date-now": "^0.1.4"
+      }
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+      "dev": true
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "dev": true
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+      "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "cookie": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "copy-webpack-plugin": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz",
+      "integrity": "sha1-5/QN2KaEd9QF3Rt6hUquMksVi64=",
+      "dev": true,
+      "requires": {
+        "cacache": "^10.0.4",
+        "find-cache-dir": "^1.0.0",
+        "globby": "^7.1.1",
+        "is-glob": "^4.0.0",
+        "loader-utils": "^1.1.0",
+        "minimatch": "^3.0.4",
+        "p-limit": "^1.0.0",
+        "serialize-javascript": "^1.4.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "core-js": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz",
+      "integrity": "sha1-HjB5Pp7leCswfjf/oi2g6s3dhNQ="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "cosmiconfig": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
+      "integrity": "sha1-dgORVJWAu9LfHlYrwXexPCkJctw=",
+      "dev": true,
+      "requires": {
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.9.0",
+        "parse-json": "^4.0.0",
+        "require-from-string": "^2.0.1"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+      "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "cross-spawn": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "lru-cache": "^4.0.1",
+        "which": "^1.2.9"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "css-parse": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
+      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
+      "dev": true
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0",
+        "css-what": "2.1",
+        "domutils": "1.5.1",
+        "nth-check": "~1.0.1"
+      }
+    },
+    "css-selector-tokenizer": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
+      "integrity": "sha1-oXcnGovKUBkXL0+JH8bu2cv2jV0=",
+      "dev": true,
+      "requires": {
+        "cssesc": "^0.1.0",
+        "fastparse": "^1.1.1",
+        "regexpu-core": "^1.0.0"
+      }
+    },
+    "css-what": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+      "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+      "dev": true
+    },
+    "cssauron": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
+      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
+      "dev": true,
+      "requires": {
+        "through": "X.X.X"
+      }
+    },
+    "cssesc": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+      "dev": true
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "custom-event": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+      "dev": true
+    },
+    "cyclist": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+      "dev": true
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "date-format": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
+      "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=",
+      "dev": true
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+      "dev": true
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
+      "dev": true
+    },
+    "default-gateway": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
+      "integrity": "sha1-t+8znl4CSwRUZ69APVA0jbRkLQ8=",
+      "dev": true,
+      "requires": {
+        "execa": "^0.10.0",
+        "ip-regex": "^2.1.0"
+      }
+    },
+    "default-require-extensions": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
+      "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
+      "dev": true,
+      "requires": {
+        "strip-bom": "^2.0.0"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "del": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "dev": true,
+      "requires": {
+        "globby": "^6.1.0",
+        "is-path-cwd": "^1.0.0",
+        "is-path-in-cwd": "^1.0.0",
+        "p-map": "^1.1.1",
+        "pify": "^3.0.0",
+        "rimraf": "^2.2.8"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "dependency-graph": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz",
+      "integrity": "sha1-kdud5utyaZIJ2IrqTB/VIhysHEk=",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "dev": true,
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "detect-node": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+      "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=",
+      "dev": true
+    },
+    "di": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+      "dev": true
+    },
+    "diff": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+      "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "dir-glob": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
+      "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+      "dev": true,
+      "requires": {
+        "path-type": "^3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=",
+      "dev": true,
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "dom-serialize": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
+      "dev": true,
+      "requires": {
+        "custom-event": "~1.0.0",
+        "ent": "~2.2.0",
+        "extend": "^3.0.0",
+        "void-elements": "^2.0.0"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+      "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.0",
+        "entities": "^1.1.1"
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.113",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz",
+      "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==",
+      "dev": true
+    },
+    "elliptic": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
+      "integrity": "sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
+      }
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "encoding": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "~0.4.13"
+      }
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+      "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "engine.io": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
+      "integrity": "sha1-tgKBw1SEpw7gNR6g6/+D7IyVIqI=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "base64id": "1.0.0",
+        "cookie": "0.3.1",
+        "debug": "~3.1.0",
+        "engine.io-parser": "~2.1.0",
+        "ws": "~3.3.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "engine.io-client": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
+      "integrity": "sha1-b1TAR13khxWKGnx30QF4cItq3TY=",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.2.1",
+        "component-inherit": "0.0.3",
+        "debug": "~3.1.0",
+        "engine.io-parser": "~2.1.1",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "parseqs": "0.0.5",
+        "parseuri": "0.0.5",
+        "ws": "~3.3.1",
+        "xmlhttprequest-ssl": "~1.5.4",
+        "yeast": "0.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "engine.io-parser": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz",
+      "integrity": "sha1-dXq5cPvy37Mse3SwMyFtVznveaY=",
+      "dev": true,
+      "requires": {
+        "after": "0.8.2",
+        "arraybuffer.slice": "~0.0.7",
+        "base64-arraybuffer": "0.1.5",
+        "blob": "0.0.5",
+        "has-binary2": "~1.0.2"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
+      "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.4.0",
+        "tapable": "^1.0.0"
+      }
+    },
+    "ent": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+      "dev": true
+    },
+    "entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=",
+      "dev": true
+    },
+    "err-code": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
+      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
+      "dev": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es6-promise": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
+      "integrity": "sha1-2m0NVpLvtGHggsFIF/4kJ9j10FQ=",
+      "dev": true
+    },
+    "es6-promisify": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+      "dev": true,
+      "requires": {
+        "es6-promise": "^4.0.3"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "eslint-scope": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+      "integrity": "sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI=",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "eventemitter3": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+      "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=",
+      "dev": true
+    },
+    "events": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
+      "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
+      "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=",
+      "dev": true,
+      "requires": {
+        "original": "^1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+      "dev": true,
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "execa": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
+      "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^3.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        }
+      }
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "dev": true
+    },
+    "expand-braces": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
+      "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+      "dev": true,
+      "requires": {
+        "array-slice": "^0.2.3",
+        "array-unique": "^0.2.1",
+        "braces": "^0.1.2"
+      },
+      "dependencies": {
+        "array-unique": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+          "dev": true
+        },
+        "braces": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
+          "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
+          "dev": true,
+          "requires": {
+            "expand-range": "^0.1.0"
+          }
+        },
+        "expand-range": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
+          "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
+          "dev": true,
+          "requires": {
+            "is-number": "^0.1.1",
+            "repeat-string": "^0.2.2"
+          }
+        },
+        "is-number": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
+          "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
+          "dev": true
+        },
+        "repeat-string": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
+          "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
+          "dev": true
+        }
+      }
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "dev": true,
+      "requires": {
+        "fill-range": "^2.1.0"
+      },
+      "dependencies": {
+        "fill-range": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+          "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=",
+          "dev": true,
+          "requires": {
+            "is-number": "^2.1.0",
+            "isobject": "^2.0.0",
+            "randomatic": "^3.0.0",
+            "repeat-element": "^1.1.2",
+            "repeat-string": "^1.5.2"
+          }
+        },
+        "is-number": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+          "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "isobject": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+          "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+          "dev": true,
+          "requires": {
+            "isarray": "1.0.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "express": {
+      "version": "4.16.4",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
+      "integrity": "sha1-/d72GSYQniTFFeqX/S8b2/Yt8S4=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.3",
+        "content-disposition": "0.5.2",
+        "content-type": "~1.0.4",
+        "cookie": "0.3.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.1.1",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.4",
+        "qs": "6.5.2",
+        "range-parser": "~1.2.0",
+        "safe-buffer": "5.1.2",
+        "send": "0.16.2",
+        "serve-static": "1.13.2",
+        "setprototypeof": "1.1.0",
+        "statuses": "~1.4.0",
+        "type-is": "~1.6.16",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+      "integrity": "sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic=",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+      "dev": true,
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "extract-zip": {
+      "version": "1.6.7",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+      "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
+      "dev": true,
+      "requires": {
+        "concat-stream": "1.6.2",
+        "debug": "2.6.9",
+        "mkdirp": "0.5.1",
+        "yauzl": "2.4.1"
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
+    },
+    "fastparse": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+      "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "fd-slicer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+      "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+      "dev": true,
+      "requires": {
+        "pend": "~1.2.0"
+      }
+    },
+    "figgy-pudding": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
+      "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=",
+      "dev": true
+    },
+    "figures": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz",
+      "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.0.2",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "file-saver": {
+      "version": "1.3.3",
+      "resolved": "http://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz",
+      "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI="
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true
+    },
+    "fileset": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
+      "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.3",
+        "minimatch": "^3.0.3"
+      }
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+      "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "statuses": "~1.4.0",
+        "unpipe": "~1.0.0"
+      }
+    },
+    "find-cache-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
+      "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^1.0.0",
+        "pkg-dir": "^2.0.0"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "requires": {
+        "locate-path": "^2.0.0"
+      }
+    },
+    "flat": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-2.0.1.tgz",
+      "integrity": "sha1-cOKRiKdL4MPIlAnu0fqVd5B64y8=",
+      "dev": true,
+      "requires": {
+        "is-buffer": "~1.1.2"
+      }
+    },
+    "flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz",
+      "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==",
+      "dev": true,
+      "requires": {
+        "debug": "=3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "font-awesome": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
+      "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "for-own": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.1"
+      }
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs": {
+      "version": "0.0.1-security",
+      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
+      "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=",
+      "dev": true
+    },
+    "fs-access": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
+      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+      "dev": true,
+      "requires": {
+        "null-check": "^1.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
+      "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^2.1.0",
+        "klaw": "^1.0.0"
+      }
+    },
+    "fs-minipass": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
+      "integrity": "sha1-BsJ3IYRU7CiN93raVKA7hwKqy50=",
+      "dev": true,
+      "requires": {
+        "minipass": "^2.2.1"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz",
+      "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "^2.9.2",
+        "node-pre-gyp": "^0.10.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true
+        },
+        "minipass": {
+          "version": "2.3.5",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.2.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "^2.1.2",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.10.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.1",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.2.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "^0.6.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "bundled": true,
+          "dev": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.4",
+            "minizlib": "^1.1.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "^1.0.2 || 2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "bundled": true,
+          "dev": true
+        }
+      }
+    },
+    "fstream": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      }
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.0.3",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.0",
+        "object-assign": "^4.1.0",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wide-align": "^1.1.0"
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "globule": "^1.0.0"
+      }
+    },
+    "genfun": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz",
+      "integrity": "sha1-ndlxCgaQClxKW/V6yl2k5S/nZTc=",
+      "dev": true
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "dev": true
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "gettext-parser": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.2.2.tgz",
+      "integrity": "sha1-HvDadcHnWa4wicc++k0Z5AKYdI4=",
+      "dev": true,
+      "requires": {
+        "encoding": "0.1.12"
+      }
+    },
+    "glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "dev": true,
+      "requires": {
+        "glob-parent": "^2.0.0",
+        "is-glob": "^2.0.0"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^2.0.0"
+          }
+        },
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^1.0.0"
+          }
+        }
+      }
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
+      "requires": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=",
+      "dev": true
+    },
+    "globby": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "dev": true,
+      "requires": {
+        "array-union": "^1.0.1",
+        "dir-glob": "^2.0.0",
+        "glob": "^7.1.2",
+        "ignore": "^3.3.5",
+        "pify": "^3.0.0",
+        "slash": "^1.0.0"
+      }
+    },
+    "globule": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+      "integrity": "sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "~7.1.1",
+        "lodash": "~4.17.10",
+        "minimatch": "~3.0.2"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.15",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+      "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=",
+      "dev": true
+    },
+    "handle-thing": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
+      "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
+      "dev": true
+    },
+    "handlebars": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz",
+      "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==",
+      "dev": true,
+      "requires": {
+        "async": "^2.5.0",
+        "optimist": "^0.6.1",
+        "source-map": "^0.6.1",
+        "uglify-js": "^3.1.4"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+      "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.5.5",
+        "har-schema": "^2.0.0"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "has-binary2": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+      "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=",
+      "dev": true,
+      "requires": {
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        }
+      }
+    },
+    "has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "hasha": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
+      "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
+      "dev": true,
+      "requires": {
+        "is-stream": "^1.0.1",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=",
+      "dev": true
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "dev": true
+    },
+    "htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.1",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.1.1"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz",
+          "integrity": "sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "http-cache-semantics": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+      "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=",
+      "dev": true
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": ">= 1.4.0 < 2"
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
+      "integrity": "sha1-1l7b7ehDSdDcMDIIFaFdOcw8u9g=",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+      "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^3.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-agent": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
+      "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=",
+      "dev": true,
+      "requires": {
+        "agent-base": "4",
+        "debug": "3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
+      "integrity": "sha1-CYfmu1pWBuWmkWjY+WeofxXdiqs=",
+      "dev": true,
+      "requires": {
+        "http-proxy": "^1.16.2",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.5",
+        "micromatch": "^3.1.9"
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "https-proxy-agent": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+      "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=",
+      "dev": true,
+      "requires": {
+        "agent-base": "^4.1.0",
+        "debug": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
+          "dev": true
+        }
+      }
+    },
+    "humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
+      "dev": true,
+      "requires": {
+        "ms": "^2.0.0"
+      }
+    },
+    "iconv-lite": {
+      "version": "0.4.23",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+      "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "ieee754": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
+      "integrity": "sha1-UL8k5bnIu5ivSWTJQc2wkY2ntgs=",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "3.3.10",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+      "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=",
+      "dev": true
+    },
+    "ignore-walk": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
+      "integrity": "sha1-qD5i59JyrA47VRqqgoMaGbafgvg=",
+      "dev": true,
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "dev": true,
+      "optional": true
+    },
+    "immediate": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+      "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
+      "dev": true
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+      "dev": true,
+      "requires": {
+        "import-from": "^2.1.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        }
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "in-publish": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+      "dev": true,
+      "optional": true
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=",
+      "dev": true
+    },
+    "inquirer": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz",
+      "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^3.0.0",
+        "chalk": "^2.0.0",
+        "cli-cursor": "^2.1.0",
+        "cli-width": "^2.0.0",
+        "external-editor": "^3.0.0",
+        "figures": "^2.0.0",
+        "lodash": "^4.17.10",
+        "mute-stream": "0.0.7",
+        "run-async": "^2.2.0",
+        "rxjs": "^6.1.0",
+        "string-width": "^2.1.0",
+        "strip-ansi": "^5.0.0",
+        "through": "^2.3.6"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
+            }
+          }
+        },
+        "strip-ansi": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
+          "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
+              "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "internal-ip": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz",
+      "integrity": "sha1-31yZh24dLrLqLXT1IOP2aaAOzic=",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^2.6.0",
+        "ipaddr.js": "^1.5.2"
+      }
+    },
+    "interpret": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
+      "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
+      "dev": true
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=",
+      "dev": true,
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
+      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
+      "dev": true
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+      "dev": true
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "dev": true,
+      "requires": {
+        "is-primitive": "^2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-glob": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+      "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-path-cwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "^1.0.0"
+      }
+    },
+    "is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "^1.0.1"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+      "dev": true
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+      "dev": true
+    },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isbinaryfile": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+      "integrity": "sha1-XW3vPt6/boyoyunDAYOoBLX4voA=",
+      "dev": true,
+      "requires": {
+        "buffer-alloc": "^1.2.0"
+      }
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "istanbul-api": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz",
+      "integrity": "sha1-qGx3DSsD4R4/d4zXrt2C0nIgkqo=",
+      "dev": true,
+      "requires": {
+        "async": "^2.1.4",
+        "fileset": "^2.0.2",
+        "istanbul-lib-coverage": "^1.2.1",
+        "istanbul-lib-hook": "^1.2.2",
+        "istanbul-lib-instrument": "^1.10.2",
+        "istanbul-lib-report": "^1.1.5",
+        "istanbul-lib-source-maps": "^1.2.6",
+        "istanbul-reports": "^1.5.1",
+        "js-yaml": "^3.7.0",
+        "mkdirp": "^0.5.1",
+        "once": "^1.4.0"
+      }
+    },
+    "istanbul-instrumenter-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
+      "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=",
+      "dev": true,
+      "requires": {
+        "convert-source-map": "^1.5.0",
+        "istanbul-lib-instrument": "^1.7.3",
+        "loader-utils": "^1.1.0",
+        "schema-utils": "^0.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "^4.6.0",
+            "fast-deep-equal": "^1.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "^5.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-coverage": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
+      "integrity": "sha1-zPftzQoLubj3Kf7rCTBHD5r2ZPA=",
+      "dev": true
+    },
+    "istanbul-lib-hook": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz",
+      "integrity": "sha1-vGvwfxKmQfvxyFOR0Nqo8K6mv4Y=",
+      "dev": true,
+      "requires": {
+        "append-transform": "^0.4.0"
+      }
+    },
+    "istanbul-lib-instrument": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
+      "integrity": "sha1-H1XtEKw8R/K93dUweTUSZ1TQqco=",
+      "dev": true,
+      "requires": {
+        "babel-generator": "^6.18.0",
+        "babel-template": "^6.16.0",
+        "babel-traverse": "^6.18.0",
+        "babel-types": "^6.18.0",
+        "babylon": "^6.18.0",
+        "istanbul-lib-coverage": "^1.2.1",
+        "semver": "^5.3.0"
+      }
+    },
+    "istanbul-lib-report": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz",
+      "integrity": "sha1-8qZX/GKC+WFwqvKB6zCkWPf0Fww=",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "^1.2.1",
+        "mkdirp": "^0.5.1",
+        "path-parse": "^1.0.5",
+        "supports-color": "^3.1.2"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "^1.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz",
+      "integrity": "sha1-N7n/ZhWA+PyhEjJ1LuQuCMZnXY8=",
+      "dev": true,
+      "requires": {
+        "debug": "^3.1.0",
+        "istanbul-lib-coverage": "^1.2.1",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.6.1",
+        "source-map": "^0.5.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-reports": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz",
+      "integrity": "sha1-l+Tb87UV6MSEyuoV1lJO69P/Tho=",
+      "dev": true,
+      "requires": {
+        "handlebars": "^4.0.3"
+      }
+    },
+    "jasmine-core": {
+      "version": "2.99.1",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz",
+      "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=",
+      "dev": true
+    },
+    "jasmine-spec-reporter": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
+      "integrity": "sha1-HWMq7ANBZwrTJPkrqEtLMrNeniI=",
+      "dev": true,
+      "requires": {
+        "colors": "1.1.2"
+      }
+    },
+    "jasminewd2": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz",
+      "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=",
+      "dev": true
+    },
+    "js-base64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
+      "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==",
+      "dev": true,
+      "optional": true
+    },
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+      "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+          "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=",
+          "dev": true
+        }
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
+    },
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+      "dev": true
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "json3": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+      "dev": true
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.0"
+      }
+    },
+    "jsonfile": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+      "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "jszip": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz",
+      "integrity": "sha1-48KmxtcGrG5gMxQDbUPNQL7v3zc=",
+      "dev": true,
+      "requires": {
+        "core-js": "~2.3.0",
+        "es6-promise": "~3.0.2",
+        "lie": "~3.1.0",
+        "pako": "~1.0.2",
+        "readable-stream": "~2.0.6"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz",
+          "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=",
+          "dev": true
+        },
+        "es6-promise": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
+          "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=",
+          "dev": true
+        },
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~1.0.6",
+            "string_decoder": "~0.10.x",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "karma": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.1.tgz",
+      "integrity": "sha512-NetT3wPCQMNB36uiL9LLyhrOt8SQwrEKt0xD3+KpTCfm0VxVyUJdPL5oTq2Ic5ouemgL/Iz4wqXEbF3zea9kQQ==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.3.0",
+        "body-parser": "^1.16.1",
+        "chokidar": "^2.0.3",
+        "colors": "^1.1.0",
+        "combine-lists": "^1.0.0",
+        "connect": "^3.6.0",
+        "core-js": "^2.2.0",
+        "di": "^0.0.1",
+        "dom-serialize": "^2.2.0",
+        "expand-braces": "^0.1.1",
+        "glob": "^7.1.1",
+        "graceful-fs": "^4.1.2",
+        "http-proxy": "^1.13.0",
+        "isbinaryfile": "^3.0.0",
+        "lodash": "^4.17.4",
+        "log4js": "^3.0.0",
+        "mime": "^2.3.1",
+        "minimatch": "^3.0.2",
+        "optimist": "^0.6.1",
+        "qjobs": "^1.1.4",
+        "range-parser": "^1.2.0",
+        "rimraf": "^2.6.0",
+        "safe-buffer": "^5.0.1",
+        "socket.io": "2.1.1",
+        "source-map": "^0.6.1",
+        "tmp": "0.0.33",
+        "useragent": "2.2.1"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
+          "integrity": "sha1-4FH9iBNYWF8yed8zP+aU2gvP/dY=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "karma-chrome-launcher": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
+      "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=",
+      "dev": true,
+      "requires": {
+        "fs-access": "^1.0.0",
+        "which": "^1.2.1"
+      }
+    },
+    "karma-coverage-istanbul-reporter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.1.tgz",
+      "integrity": "sha512-UcgrHkFehI5+ivMouD8NH/UOHiX4oCAtwaANylzPFdcAuD52fnCUuelacq2gh8tZ4ydhU3+xiXofSq7j5Ehygw==",
+      "dev": true,
+      "requires": {
+        "istanbul-api": "^1.3.1",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "karma-jasmine": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz",
+      "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=",
+      "dev": true
+    },
+    "karma-jasmine-html-reporter": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz",
+      "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=",
+      "dev": true,
+      "requires": {
+        "karma-jasmine": "^1.0.2"
+      }
+    },
+    "karma-mocha-reporter": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz",
+      "integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.1.0",
+        "log-symbols": "^2.1.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "karma-phantomjs-launcher": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz",
+      "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.0.1",
+        "phantomjs-prebuilt": "^2.1.7"
+      }
+    },
+    "karma-source-map-support": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz",
+      "integrity": "sha1-Nt1NjKFUtirOlWliNvrjfK8Kfd4=",
+      "dev": true,
+      "requires": {
+        "source-map-support": "^0.5.5"
+      }
+    },
+    "kew": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
+      "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
+      "dev": true
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+      "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=",
+      "dev": true
+    },
+    "klaw": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+      "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.9"
+      }
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^1.0.0"
+      }
+    },
+    "less": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz",
+      "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.2",
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "mime": "^1.4.1",
+        "mkdirp": "^0.5.0",
+        "promise": "^7.1.1",
+        "request": "^2.83.0",
+        "source-map": "~0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "less-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
+      "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.1",
+        "loader-utils": "^1.1.0",
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "license-webpack-plugin": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.0.tgz",
+      "integrity": "sha512-vDiBeMWxjE9n6TabQ9J4FH8urFdsRK0Nvxn1cit9biCiR9aq1zBR0X2BlAkEiIG6qPamLeU0GzvIgLkrFc398A==",
+      "dev": true,
+      "requires": {
+        "@types/webpack-sources": "^0.1.5",
+        "webpack-sources": "^1.2.0"
+      }
+    },
+    "lie": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
+      "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
+      "dev": true,
+      "requires": {
+        "immediate": "~3.0.5"
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+      "dev": true
+    },
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
+      "requires": {
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.11",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+      "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=",
+      "dev": true
+    },
+    "lodash.assign": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+      "dev": true,
+      "optional": true
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "dev": true
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "dev": true
+    },
+    "lodash.mergewith": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
+      "integrity": "sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc=",
+      "dev": true,
+      "optional": true
+    },
+    "lodash.tail": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
+      "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
+      }
+    },
+    "log4js": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz",
+      "integrity": "sha1-5srO2Uln7uuc45n5+GgqSysoyP8=",
+      "dev": true,
+      "requires": {
+        "circular-json": "^0.5.5",
+        "date-format": "^1.2.0",
+        "debug": "^3.1.0",
+        "rfdc": "^1.1.2",
+        "streamroller": "0.7.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
+          "dev": true
+        }
+      }
+    },
+    "loglevel": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
+      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=",
+      "dev": true,
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      }
+    },
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+      "dev": true,
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "magic-string": {
+      "version": "0.25.2",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz",
+      "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==",
+      "dev": true,
+      "requires": {
+        "sourcemap-codec": "^1.4.4"
+      }
+    },
+    "make-dir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+      "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      }
+    },
+    "make-error": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
+      "integrity": "sha1-7+ToH22yjK3WBccPKcgxtY73dsg=",
+      "dev": true
+    },
+    "make-fetch-happen": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz",
+      "integrity": "sha1-FBSXy4ePJDupMTbIPYq6EsIWwIM=",
+      "dev": true,
+      "requires": {
+        "agentkeepalive": "^3.4.1",
+        "cacache": "^11.0.1",
+        "http-cache-semantics": "^3.8.1",
+        "http-proxy-agent": "^2.1.0",
+        "https-proxy-agent": "^2.2.1",
+        "lru-cache": "^4.1.2",
+        "mississippi": "^3.0.0",
+        "node-fetch-npm": "^2.0.2",
+        "promise-retry": "^1.1.1",
+        "socks-proxy-agent": "^4.0.0",
+        "ssri": "^6.0.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "11.3.2",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.3",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.3",
+            "graceful-fs": "^4.1.15",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          },
+          "dependencies": {
+            "lru-cache": {
+              "version": "5.1.1",
+              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+              "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+              "dev": true,
+              "requires": {
+                "yallist": "^3.0.2"
+              }
+            }
+          }
+        },
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+          "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=",
+          "dev": true,
+          "requires": {
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "dev": true
+        }
+      }
+    },
+    "map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=",
+      "dev": true,
+      "requires": {
+        "p-defer": "^1.0.0"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "math-random": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+      "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
+      "dev": true
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "mem": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz",
+      "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==",
+      "dev": true,
+      "requires": {
+        "map-age-cleaner": "^0.1.1",
+        "mimic-fn": "^1.0.0",
+        "p-is-promise": "^2.0.0"
+      }
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      }
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      }
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=",
+      "dev": true,
+      "optional": true
+    },
+    "mime-db": {
+      "version": "1.37.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+      "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.21",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+      "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=",
+      "dev": true,
+      "requires": {
+        "mime-db": "~1.37.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
+      "dev": true
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz",
+      "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+      "dev": true
+    },
+    "minipass": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
+      "integrity": "sha1-ys6+SSAiSX9law8PUeJoKp7S2Eg=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.2",
+        "yallist": "^3.0.0"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=",
+          "dev": true
+        }
+      }
+    },
+    "minizlib": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
+      "integrity": "sha1-3SfqYTYkPHyIBoToZyuzpF/ZthQ=",
+      "dev": true,
+      "requires": {
+        "minipass": "^2.2.1"
+      }
+    },
+    "mississippi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
+      "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^2.0.1",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mixin-object": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+      "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
+      "dev": true,
+      "requires": {
+        "for-in": "^0.1.3",
+        "is-extendable": "^0.1.1"
+      },
+      "dependencies": {
+        "for-in": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+          "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
+          "dev": true
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+          "dev": true
+        }
+      }
+    },
+    "moment": {
+      "version": "2.24.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
+      "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=",
+      "dev": true,
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+      "dev": true
+    },
+    "nan": {
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
+      "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
+      "dev": true,
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
+      "integrity": "sha1-udFeTXHGdikIZUtRg+04t1M0CDU=",
+      "dev": true
+    },
+    "ngx-bootstrap": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-3.1.2.tgz",
+      "integrity": "sha1-9Gb2KQtFaAbawqm5WhL53El5eC8="
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=",
+      "dev": true
+    },
+    "node-fetch-npm": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz",
+      "integrity": "sha1-cljJBGGC3KNFtCCO2pGNrzNpf/c=",
+      "dev": true,
+      "requires": {
+        "encoding": "^0.1.11",
+        "json-parse-better-errors": "^1.0.0",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node-forge": {
+      "version": "0.7.5",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
+      "integrity": "sha1-bBUsNFzhHFL0ZcKr2VfoY5zWdN8=",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+      "integrity": "sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "fstream": "^1.0.0",
+        "glob": "^7.0.3",
+        "graceful-fs": "^4.1.2",
+        "mkdirp": "^0.5.0",
+        "nopt": "2 || 3",
+        "npmlog": "0 || 1 || 2 || 3 || 4",
+        "osenv": "0",
+        "request": "^2.87.0",
+        "rimraf": "2",
+        "semver": "~5.3.0",
+        "tar": "^2.0.0",
+        "which": "1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "node-libs-browser": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz",
+      "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==",
+      "dev": true,
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.0",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "0.0.4"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
+    "node-releases": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.7.tgz",
+      "integrity": "sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA==",
+      "dev": true,
+      "requires": {
+        "semver": "^5.3.0"
+      }
+    },
+    "node-sass": {
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz",
+      "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "async-foreach": "^0.1.3",
+        "chalk": "^1.1.1",
+        "cross-spawn": "^3.0.0",
+        "gaze": "^1.0.0",
+        "get-stdin": "^4.0.1",
+        "glob": "^7.0.3",
+        "in-publish": "^2.0.0",
+        "lodash.assign": "^4.2.0",
+        "lodash.clonedeep": "^4.3.2",
+        "lodash.mergewith": "^4.6.0",
+        "meow": "^3.7.0",
+        "mkdirp": "^0.5.1",
+        "nan": "^2.10.0",
+        "node-gyp": "^3.8.0",
+        "npmlog": "^4.0.0",
+        "request": "^2.88.0",
+        "sass-graph": "^2.2.4",
+        "stdout-stream": "^1.4.0",
+        "true-case-path": "^1.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true,
+          "optional": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "nopt": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "abbrev": "1"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "dev": true,
+      "requires": {
+        "remove-trailing-separator": "^1.0.1"
+      }
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "npm-bundled": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
+      "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
+      "dev": true
+    },
+    "npm-package-arg": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz",
+      "integrity": "sha1-Fa4eJ1ilAn77TCUFVLhac323/ME=",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.6.0",
+        "osenv": "^0.1.5",
+        "semver": "^5.5.0",
+        "validate-npm-package-name": "^3.0.0"
+      }
+    },
+    "npm-packlist": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.3.0.tgz",
+      "integrity": "sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA==",
+      "dev": true,
+      "requires": {
+        "ignore-walk": "^3.0.1",
+        "npm-bundled": "^1.0.1"
+      }
+    },
+    "npm-pick-manifest": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz",
+      "integrity": "sha1-MhEdKpViY4uyyPK/J/fzCSyPrkA=",
+      "dev": true,
+      "requires": {
+        "figgy-pudding": "^3.5.1",
+        "npm-package-arg": "^6.0.0",
+        "semver": "^5.4.1"
+      }
+    },
+    "npm-registry-fetch": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz",
+      "integrity": "sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw==",
+      "dev": true,
+      "requires": {
+        "JSONStream": "^1.3.4",
+        "bluebird": "^3.5.1",
+        "figgy-pudding": "^3.4.1",
+        "lru-cache": "^4.1.3",
+        "make-fetch-happen": "^4.0.1",
+        "npm-package-arg": "^6.1.0"
+      }
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=",
+      "dev": true,
+      "requires": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "null-check": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
+      "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
+      "dev": true
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-component": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "dev": true,
+      "requires": {
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
+      },
+      "dependencies": {
+        "for-own": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+          "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+          "dev": true,
+          "requires": {
+            "for-in": "^1.0.1"
+          }
+        }
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "opn": {
+      "version": "5.4.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
+      "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "optimist": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+      "dev": true,
+      "requires": {
+        "minimist": "~0.0.1",
+        "wordwrap": "~0.0.2"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "0.0.10",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+          "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+          "dev": true
+        }
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=",
+      "dev": true,
+      "requires": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "lcid": "^1.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz",
+      "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+      "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
+      "dev": true,
+      "requires": {
+        "p-try": "^1.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
+      "requires": {
+        "p-limit": "^1.1.0"
+      }
+    },
+    "p-map": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+      "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=",
+      "dev": true
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true
+    },
+    "pacote": {
+      "version": "9.4.0",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.4.0.tgz",
+      "integrity": "sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.3",
+        "cacache": "^11.3.2",
+        "figgy-pudding": "^3.5.1",
+        "get-stream": "^4.1.0",
+        "glob": "^7.1.3",
+        "lru-cache": "^5.1.1",
+        "make-fetch-happen": "^4.0.1",
+        "minimatch": "^3.0.4",
+        "minipass": "^2.3.5",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "normalize-package-data": "^2.4.0",
+        "npm-package-arg": "^6.1.0",
+        "npm-packlist": "^1.1.12",
+        "npm-pick-manifest": "^2.2.3",
+        "npm-registry-fetch": "^3.8.0",
+        "osenv": "^0.1.5",
+        "promise-inflight": "^1.0.1",
+        "promise-retry": "^1.1.1",
+        "protoduck": "^5.0.1",
+        "rimraf": "^2.6.2",
+        "safe-buffer": "^5.1.2",
+        "semver": "^5.6.0",
+        "ssri": "^6.0.1",
+        "tar": "^4.4.8",
+        "unique-filename": "^1.1.1",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "11.3.2",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.3",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.3",
+            "graceful-fs": "^4.1.15",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+          "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=",
+          "dev": true,
+          "requires": {
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "semver": {
+          "version": "5.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+          "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "tar": {
+          "version": "4.4.8",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
+          "integrity": "sha1-sZ7sP94qluZGZt+f20DFyhvDdH0=",
+          "dev": true,
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.4",
+            "minizlib": "^1.1.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
+          }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=",
+          "dev": true
+        }
+      }
+    },
+    "pako": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
+      "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+      "dev": true,
+      "requires": {
+        "cyclist": "~0.2.2",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz",
+      "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^4.0.0",
+        "browserify-aes": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "dev": true,
+      "requires": {
+        "glob-base": "^0.3.0",
+        "is-dotfile": "^1.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^1.0.0"
+          }
+        }
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse5": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
+      "integrity": "sha1-xZNByXI/QUxFKXVWTHwApo1YrNI=",
+      "optional": true
+    },
+    "parseqs": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+      "dev": true,
+      "requires": {
+        "better-assert": "~1.0.0"
+      }
+    },
+    "parseuri": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+      "dev": true,
+      "requires": {
+        "better-assert": "~1.0.0"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path": {
+      "version": "0.12.7",
+      "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
+      "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
+      "dev": true,
+      "requires": {
+        "process": "^0.11.1",
+        "util": "^0.10.3"
+      },
+      "dependencies": {
+        "util": {
+          "version": "0.10.4",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+          "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.3"
+          }
+        }
+      }
+    },
+    "path-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.0.17",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
+      "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+      "dev": true
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
+    },
+    "phantomjs-prebuilt": {
+      "version": "2.1.16",
+      "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
+      "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
+      "dev": true,
+      "requires": {
+        "es6-promise": "^4.0.3",
+        "extract-zip": "^1.6.5",
+        "fs-extra": "^1.0.0",
+        "hasha": "^2.2.0",
+        "kew": "^0.7.0",
+        "progress": "^1.1.8",
+        "request": "^2.81.0",
+        "request-progress": "^2.0.1",
+        "which": "^1.2.10"
+      }
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.1.0"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz",
+      "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==",
+      "dev": true,
+      "requires": {
+        "async": "^1.5.2",
+        "debug": "^2.2.0",
+        "mkdirp": "0.5.x"
+      },
+      "dependencies": {
+        "async": {
+          "version": "1.5.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "postcss": {
+      "version": "7.0.14",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz",
+      "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "5.5.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-import": {
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz",
+      "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "postcss-value-parser": "^3.2.3",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz",
+      "integrity": "sha1-8TEt2/WRLNdHF3CDxe96GdYu5IQ=",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^4.0.0",
+        "import-cwd": "^2.0.0"
+      }
+    },
+    "postcss-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+      "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "postcss": "^7.0.0",
+        "postcss-load-config": "^2.0.0",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+      "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=",
+      "dev": true
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+      "dev": true
+    },
+    "primeflex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/primeflex/-/primeflex-1.0.0.tgz",
+      "integrity": "sha512-/K9iHXm5wu6gZycQDP/gsfX7BpJKSNVhxTOZAJBLH88idPtC2lMgUXm28qfXFqsbxaTI49oBuMYBFlg/DBmUMg=="
+    },
+    "primeicons": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-1.0.0.tgz",
+      "integrity": "sha512-p/hzIjUVccW4eJPhuORHI3AUkDpqfvCQVrjxbFEejnTEdWY4C8fomVfjiaA9jCu83fSQnBHuRIGB96iAR8R6uA=="
+    },
+    "primeng": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/primeng/-/primeng-7.0.1.tgz",
+      "integrity": "sha1-ChvqVAEWsRBbbnVBOqu3vmK5MRw="
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=",
+      "dev": true
+    },
+    "progress": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+      "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+      "dev": true
+    },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "asap": "~2.0.3"
+      }
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
+    },
+    "promise-retry": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz",
+      "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=",
+      "dev": true,
+      "requires": {
+        "err-code": "^1.0.0",
+        "retry": "^0.10.0"
+      }
+    },
+    "protoduck": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz",
+      "integrity": "sha1-A8NlnKGAB7aaUP2Cp+vMUWJhFR8=",
+      "dev": true,
+      "requires": {
+        "genfun": "^5.0.0"
+      }
+    },
+    "protractor": {
+      "version": "5.4.0",
+      "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.0.tgz",
+      "integrity": "sha512-6TSYqMhUUzxr4/wN0ttSISqPMKvcVRXF4k8jOEpGWD8OioLak4KLgfzHK9FJ49IrjzRrZ+Mx1q2Op8Rk0zEcnQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "^6.0.46",
+        "@types/q": "^0.0.32",
+        "@types/selenium-webdriver": "^3.0.0",
+        "blocking-proxy": "^1.0.0",
+        "browserstack": "^1.5.1",
+        "chalk": "^1.1.3",
+        "glob": "^7.0.3",
+        "jasmine": "2.8.0",
+        "jasminewd2": "^2.1.0",
+        "optimist": "~0.6.0",
+        "q": "1.4.1",
+        "saucelabs": "^1.5.0",
+        "selenium-webdriver": "3.6.0",
+        "source-map-support": "~0.4.0",
+        "webdriver-js-extender": "2.0.0",
+        "webdriver-manager": "^12.0.6"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "6.14.3",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.3.tgz",
+          "integrity": "sha512-V2VrQBCKo4U0rni6tW4AASRDqIO5ZTLDN/Xzrm4mNBr9SGQYZ+7zZJn+hMs89Q8ZCIHzp4aWQPyCpK+rux1YGA==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "del": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+          "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+          "dev": true,
+          "requires": {
+            "globby": "^5.0.0",
+            "is-path-cwd": "^1.0.0",
+            "is-path-in-cwd": "^1.0.0",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0",
+            "rimraf": "^2.2.8"
+          }
+        },
+        "globby": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "arrify": "^1.0.0",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "jasmine": {
+          "version": "2.8.0",
+          "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz",
+          "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=",
+          "dev": true,
+          "requires": {
+            "exit": "^0.1.2",
+            "glob": "^7.0.6",
+            "jasmine-core": "~2.8.0"
+          }
+        },
+        "jasmine-core": {
+          "version": "2.8.0",
+          "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz",
+          "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=",
+          "dev": true
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.4.18",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+          "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+          "dev": true,
+          "requires": {
+            "source-map": "^0.5.6"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        },
+        "webdriver-manager": {
+          "version": "12.1.1",
+          "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz",
+          "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==",
+          "dev": true,
+          "requires": {
+            "adm-zip": "^0.4.9",
+            "chalk": "^1.1.1",
+            "del": "^2.2.0",
+            "glob": "^7.0.3",
+            "ini": "^1.3.4",
+            "minimist": "^1.2.0",
+            "q": "^1.4.1",
+            "request": "^2.87.0",
+            "rimraf": "^2.5.2",
+            "semver": "^5.3.0",
+            "xml2js": "^0.4.17"
+          }
+        }
+      }
+    },
+    "proxy-addr": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
+      "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=",
+      "dev": true,
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.8.0"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.1.31",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
+      "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=",
+      "dev": true,
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "q": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+      "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+      "dev": true
+    },
+    "qjobs": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+      "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+      "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=",
+      "dev": true
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
+      "integrity": "sha1-fe2N+/eHncxg0KZErGdUsoOtF+8=",
+      "dev": true
+    },
+    "randomatic": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+      "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=",
+      "dev": true,
+      "requires": {
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=",
+          "dev": true
+        }
+      }
+    },
+    "randombytes": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+      "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+      "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.23",
+        "unpipe": "1.0.0"
+      }
+    },
+    "raw-loader": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz",
+      "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      }
+    },
+    "reflect-metadata": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
+      "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
+      "dev": true
+    },
+    "regenerate": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+      "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=",
+      "dev": true
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=",
+      "dev": true
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
+      "dev": true,
+      "requires": {
+        "is-equal-shallow": "^0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regexpu-core": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
+      "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.2.1",
+        "regjsgen": "^0.2.0",
+        "regjsparser": "^0.1.4"
+      }
+    },
+    "regjsgen": {
+      "version": "0.2.0",
+      "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.1.5",
+      "resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+      "dev": true,
+      "requires": {
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        }
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "request": {
+      "version": "2.88.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+      "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.0",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.4.3",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "request-progress": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
+      "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
+      "dev": true,
+      "requires": {
+        "throttleit": "^1.0.0"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
+      "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
+      "dev": true
+    },
+    "retry": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
+      "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
+      "dev": true
+    },
+    "rfdc": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz",
+      "integrity": "sha1-5uctdPXcOd6PU49l4Aw2wYAY40k=",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "run-async": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "dev": true,
+      "requires": {
+        "is-promise": "^2.1.0"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "rxjs": {
+      "version": "6.3.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+      "integrity": "sha1-PGp/pCDoRKgTkPsRWKnsYU9LrVU=",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "rxjs-compat": {
+      "version": "6.3.3",
+      "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.3.3.tgz",
+      "integrity": "sha1-KrO5rA2sDAc3SdVf75wD6h3yBFw="
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
+      "dev": true
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=",
+      "dev": true
+    },
+    "sass-graph": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "^7.0.0",
+        "lodash": "^4.0.0",
+        "scss-tokenizer": "^0.2.3",
+        "yargs": "^7.0.0"
+      }
+    },
+    "sass-loader": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz",
+      "integrity": "sha1-Fv1ROMuLQkv4p1lSihly1yqtBp0=",
+      "dev": true,
+      "requires": {
+        "clone-deep": "^2.0.1",
+        "loader-utils": "^1.0.1",
+        "lodash.tail": "^4.1.1",
+        "neo-async": "^2.5.0",
+        "pify": "^3.0.0",
+        "semver": "^5.5.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "saucelabs": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz",
+      "integrity": "sha1-lAWnPDYNRJsjKDmRmobDltN5/Z0=",
+      "dev": true,
+      "requires": {
+        "https-proxy-agent": "^2.2.1"
+      }
+    },
+    "sax": {
+      "version": "0.5.8",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
+      "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=",
+      "dev": true
+    },
+    "schema-utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
+      }
+    },
+    "scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "js-base64": "^2.1.8",
+        "source-map": "^0.4.2"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selenium-webdriver": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz",
+      "integrity": "sha1-K6h6FmLAILiYjJga5iyyoBKY6vw=",
+      "dev": true,
+      "requires": {
+        "jszip": "^3.1.3",
+        "rimraf": "^2.5.4",
+        "tmp": "0.0.30",
+        "xml2js": "^0.4.17"
+      },
+      "dependencies": {
+        "tmp": {
+          "version": "0.0.30",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
+          "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "~1.0.1"
+          }
+        }
+      }
+    },
+    "selfsigned": {
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
+      "integrity": "sha1-zdfsz8pO12NdR6CL8tXTB0CS4s0=",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.7.5"
+      }
+    },
+    "semver": {
+      "version": "5.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+      "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+      "dev": true
+    },
+    "semver-dsl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
+      "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
+      "dev": true,
+      "requires": {
+        "semver": "^5.3.0"
+      }
+    },
+    "semver-intersect": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz",
+      "integrity": "sha1-vdnAa+3N0v7bjNNSw8Q+6MYTIfM=",
+      "dev": true,
+      "requires": {
+        "semver": "^5.0.0"
+      }
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+      "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.6.2",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.0",
+        "statuses": "~1.4.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+          "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz",
+      "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==",
+      "dev": true
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+      "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.2",
+        "send": "0.16.2"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+      "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shallow-clone": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
+      "integrity": "sha1-RIDNBuiC72iyrYij6lSDLixItXE=",
+      "dev": true,
+      "requires": {
+        "is-extendable": "^0.1.1",
+        "kind-of": "^5.0.0",
+        "mixin-object": "^2.0.1"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        }
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shelljs": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz",
+      "integrity": "sha1-p/MxlSDr8J7oEnWyNorbKGZZsJc=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "smart-buffer": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz",
+      "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "socket.io": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
+      "integrity": "sha1-oGnF/qvuPmshSnW0DOBlLhz7mYA=",
+      "dev": true,
+      "requires": {
+        "debug": "~3.1.0",
+        "engine.io": "~3.2.0",
+        "has-binary2": "~1.0.2",
+        "socket.io-adapter": "~1.1.0",
+        "socket.io-client": "2.1.1",
+        "socket.io-parser": "~3.2.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "socket.io-adapter": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+      "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+      "dev": true
+    },
+    "socket.io-client": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
+      "integrity": "sha1-3LOBA0NqtFeN2wJmOK4vIbYjZx8=",
+      "dev": true,
+      "requires": {
+        "backo2": "1.0.2",
+        "base64-arraybuffer": "0.1.5",
+        "component-bind": "1.0.0",
+        "component-emitter": "1.2.1",
+        "debug": "~3.1.0",
+        "engine.io-client": "~3.2.0",
+        "has-binary2": "~1.0.2",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "object-component": "0.0.3",
+        "parseqs": "0.0.5",
+        "parseuri": "0.0.5",
+        "socket.io-parser": "~3.2.0",
+        "to-array": "0.1.4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "socket.io-parser": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
+      "integrity": "sha1-58Yii2qh+BTmFIrqMltRqpSZ4Hc=",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.2.1",
+        "debug": "~3.1.0",
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.0.1"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
+      "integrity": "sha1-EvydbLZj2lc509xftuhofalcsXc=",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.5",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "~0.11.1",
+        "inherits": "^2.0.3",
+        "json3": "^3.3.2",
+        "url-parse": "^1.4.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
+          "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+          "dev": true,
+          "requires": {
+            "websocket-driver": ">=0.5.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
+          "dev": true
+        }
+      }
+    },
+    "socks": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.3.tgz",
+      "integrity": "sha512-+2r83WaRT3PXYoO/1z+RDEBE7Z2f9YcdQnJ0K/ncXXbV5gJ6wYfNAebYFYiiUjM6E4JyXnPY8cimwyvFYHVUUA==",
+      "dev": true,
+      "requires": {
+        "ip": "^1.1.5",
+        "smart-buffer": "4.0.2"
+      }
+    },
+    "socks-proxy-agent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz",
+      "integrity": "sha1-WTa/i3B6mTB5xvN9sgkYIb/6ZHM=",
+      "dev": true,
+      "requires": {
+        "agent-base": "~4.2.0",
+        "socks": "~2.2.0"
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+      "dev": true
+    },
+    "source-map-loader": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz",
+      "integrity": "sha1-wYsNxuI79m9nkkN1V8VpoR4HInE=",
+      "dev": true,
+      "requires": {
+        "async": "^2.5.0",
+        "loader-utils": "^1.1.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.10",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
+      "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "sourcemap-codec": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz",
+      "integrity": "sha1-xj6pJ8Ap3WvZorf6A7P+wCrVbp8=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+      "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz",
+      "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==",
+      "dev": true
+    },
+    "spdy": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz",
+      "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
+          "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "speed-measure-webpack-plugin": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.0.tgz",
+      "integrity": "sha512-b9Yd0TrzceMVYSbuamM1sFsGM1oVfyFTM22gOoyLhymNvBVApuYpkdFOgYkKJpN/KhTpcCYcTGHg7X+FJ33Vvw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "split.js": {
+      "version": "1.5.11",
+      "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.5.11.tgz",
+      "integrity": "sha512-ec0sAbWnaMGpNHWo1ZgIlF3Mx7GzSyaO0GlcEBZGIFZQwYPPkbDV6JRpDmpzIshVig7USREuEPudy0ygQaskXg=="
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "dev": true,
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
+    },
+    "ssri": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+      "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "stats-webpack-plugin": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz",
+      "integrity": "sha1-zP/pt0Xei7sVVXHgY/gmP8DivAY=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.4"
+      }
+    },
+    "statuses": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+      "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=",
+      "dev": true
+    },
+    "stdout-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+      "integrity": "sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "dev": true
+    },
+    "streamroller": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
+      "integrity": "sha1-odG3z4PTmvsNYwSaWsv5NJO99ks=",
+      "dev": true,
+      "requires": {
+        "date-format": "^1.2.0",
+        "debug": "^3.1.0",
+        "mkdirp": "^0.5.1",
+        "readable-stream": "^2.3.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
+          "dev": true
+        }
+      }
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "dev": true,
+      "requires": {
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "get-stdin": "^4.0.1"
+      }
+    },
+    "style-loader": {
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
+      "integrity": "sha1-y5FUYG8+dxq2xKtjcCahBJF02SU=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "stylus": {
+      "version": "0.54.5",
+      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
+      "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
+      "dev": true,
+      "requires": {
+        "css-parse": "1.7.x",
+        "debug": "*",
+        "glob": "7.0.x",
+        "mkdirp": "0.5.x",
+        "sax": "0.5.x",
+        "source-map": "0.1.x"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
+          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.2",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "dev": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "stylus-loader": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
+      "integrity": "sha1-J6cGQgsFo44DjnyssVNXjUUFE8Y=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.0.2",
+        "lodash.clonedeep": "^4.5.0",
+        "when": "~3.6.x"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "symbol-observable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+      "integrity": "sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ=",
+      "dev": true
+    },
+    "tapable": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz",
+      "integrity": "sha1-TSl5I8WnKkI2DeKrUtrfquwAAY4=",
+      "dev": true
+    },
+    "tar": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+      "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "block-stream": "*",
+        "fstream": "^1.0.2",
+        "inherits": "2"
+      }
+    },
+    "terser": {
+      "version": "3.16.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz",
+      "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==",
+      "dev": true,
+      "requires": {
+        "commander": "~2.17.1",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.9"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz",
+      "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==",
+      "dev": true,
+      "requires": {
+        "cacache": "^11.0.2",
+        "find-cache-dir": "^2.0.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^1.4.0",
+        "source-map": "^0.6.1",
+        "terser": "^3.16.1",
+        "webpack-sources": "^1.1.0",
+        "worker-farm": "^1.5.2"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "11.3.2",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.3",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.3",
+            "graceful-fs": "^4.1.15",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "find-cache-dir": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz",
+          "integrity": "sha1-TB+u1Z9FGEUw+51/oSOk0EqYRy0=",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^1.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+          "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=",
+          "dev": true,
+          "requires": {
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "dev": true
+        }
+      }
+    },
+    "throttleit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+      "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
+      "dev": true
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "thunky": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
+      "integrity": "sha1-9d9zJFNAewkZHa5z4qjMc/OBqCY=",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
+      "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=",
+      "dev": true,
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "to-array": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+      "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+      "dev": true
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "tough-cookie": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+      "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=",
+      "dev": true,
+      "requires": {
+        "psl": "^1.1.24",
+        "punycode": "^1.4.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
+    "tree-kill": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
+      "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==",
+      "dev": true
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true,
+      "optional": true
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "true-case-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+      "integrity": "sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "^7.1.2"
+      }
+    },
+    "ts-node": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.0.tgz",
+      "integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==",
+      "dev": true,
+      "requires": {
+        "arrify": "^1.0.0",
+        "buffer-from": "^1.1.0",
+        "diff": "^3.1.0",
+        "make-error": "^1.1.1",
+        "minimist": "^1.2.0",
+        "mkdirp": "^0.5.1",
+        "source-map-support": "^0.5.6",
+        "yn": "^2.0.0"
+      }
+    },
+    "tslib": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+      "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+    },
+    "tslint": {
+      "version": "5.11.0",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz",
+      "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.22.0",
+        "builtin-modules": "^1.1.1",
+        "chalk": "^2.3.0",
+        "commander": "^2.12.1",
+        "diff": "^3.2.0",
+        "glob": "^7.1.1",
+        "js-yaml": "^3.7.0",
+        "minimatch": "^3.0.4",
+        "resolve": "^1.3.2",
+        "semver": "^5.3.0",
+        "tslib": "^1.8.0",
+        "tsutils": "^2.27.2"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.8.1",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+          "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.5"
+          }
+        }
+      }
+    },
+    "tsutils": {
+      "version": "2.29.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+      "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      }
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true
+    },
+    "type-is": {
+      "version": "1.6.16",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+      "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.18"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "typescript": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz",
+      "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "3.4.9",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+      "integrity": "sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "commander": "~2.17.1",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "ultron": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+      "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.1",
+            "to-object-path": "^0.3.0"
+          }
+        }
+      }
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=",
+      "dev": true,
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
+      "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+      "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz",
+      "integrity": "sha1-ysFVbpX6oDA2kf7Fz51aG8NGSPg=",
+      "dev": true,
+      "requires": {
+        "querystringify": "^2.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=",
+      "dev": true
+    },
+    "useragent": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz",
+      "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "2.2.x",
+        "tmp": "0.0.x"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz",
+          "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=",
+          "dev": true
+        }
+      }
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+      "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=",
+      "dev": true
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "validate-npm-package-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+      "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+      "dev": true,
+      "requires": {
+        "builtins": "^1.0.3"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "dev": true,
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+      "dev": true
+    },
+    "watchpack": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
+      "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=",
+      "dev": true,
+      "requires": {
+        "chokidar": "^2.0.2",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0"
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "webdriver-js-extender": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.0.0.tgz",
+      "integrity": "sha512-fbyKiVu3azzIc5d4+26YfuPQcFTlgFQV5yQ/0OQj4Ybkl4g1YQuIPskf5v5wqwRJhHJnPHthB6tqCjWHOKLWag==",
+      "dev": true,
+      "requires": {
+        "@types/selenium-webdriver": "^3.0.0",
+        "selenium-webdriver": "^3.0.1"
+      }
+    },
+    "webpack": {
+      "version": "4.29.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.0.tgz",
+      "integrity": "sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-module-context": "1.7.11",
+        "@webassemblyjs/wasm-edit": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11",
+        "acorn": "^6.0.5",
+        "acorn-dynamic-import": "^4.0.0",
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0",
+        "chrome-trace-event": "^1.0.0",
+        "enhanced-resolve": "^4.1.0",
+        "eslint-scope": "^4.0.0",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.3.0",
+        "loader-utils": "^1.1.0",
+        "memory-fs": "~0.4.1",
+        "micromatch": "^3.1.8",
+        "mkdirp": "~0.5.0",
+        "neo-async": "^2.5.0",
+        "node-libs-browser": "^2.0.0",
+        "schema-utils": "^0.4.4",
+        "tapable": "^1.1.0",
+        "terser-webpack-plugin": "^1.1.0",
+        "watchpack": "^1.5.0",
+        "webpack-sources": "^1.3.0"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.4.7",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+          "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "webpack-core": {
+      "version": "0.6.9",
+      "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
+      "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
+      "dev": true,
+      "requires": {
+        "source-list-map": "~0.1.7",
+        "source-map": "~0.4.1"
+      },
+      "dependencies": {
+        "source-list-map": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
+          "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.5.1.tgz",
+      "integrity": "sha512-4dwCh/AyMOYAybggUr8fiCkRnjVDp+Cqlr9c+aaNB3GJYgRGYQWJ1YX/WAKUNA9dPNHZ6QSN2lYDKqjKSI8Vqw==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "~0.4.1",
+        "mime": "^2.3.1",
+        "range-parser": "^1.0.3",
+        "webpack-log": "^2.0.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
+          "integrity": "sha1-4FH9iBNYWF8yed8zP+aU2gvP/dY=",
+          "dev": true
+        }
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.1.14",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz",
+      "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.0.0",
+        "compression": "^1.5.2",
+        "connect-history-api-fallback": "^1.3.0",
+        "debug": "^3.1.0",
+        "del": "^3.0.0",
+        "express": "^4.16.2",
+        "html-entities": "^1.2.0",
+        "http-proxy-middleware": "~0.18.0",
+        "import-local": "^2.0.0",
+        "internal-ip": "^3.0.1",
+        "ip": "^1.1.5",
+        "killable": "^1.0.0",
+        "loglevel": "^1.4.1",
+        "opn": "^5.1.0",
+        "portfinder": "^1.0.9",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.9.1",
+        "semver": "^5.6.0",
+        "serve-index": "^1.7.2",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.3.0",
+        "spdy": "^4.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^5.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "3.4.0",
+        "webpack-log": "^2.0.0",
+        "yargs": "12.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+          "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0",
+            "wrap-ansi": "^2.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
+            }
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "decamelize": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
+          "integrity": "sha1-ZW17vICUxMeI6lPFhAkIycfQY8c=",
+          "dev": true,
+          "requires": {
+            "xregexp": "4.0.0"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "invert-kv": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+          "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "lcid": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+          "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=",
+          "dev": true,
+          "requires": {
+            "invert-kv": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "mime": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
+          "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
+          "dev": true
+        },
+        "os-locale": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+          "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+          "dev": true,
+          "requires": {
+            "execa": "^1.0.0",
+            "lcid": "^2.0.0",
+            "mem": "^4.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha1-hQgLuHxkaI+keZb+j3376CEXYLE=",
+          "dev": true
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "semver": {
+          "version": "5.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
+            }
+          }
+        },
+        "webpack-dev-middleware": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz",
+          "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==",
+          "dev": true,
+          "requires": {
+            "memory-fs": "~0.4.1",
+            "mime": "^2.3.1",
+            "range-parser": "^1.0.3",
+            "webpack-log": "^2.0.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "12.0.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
+          "integrity": "sha1-/lgjQ2k5KvM+y+9TgZFx7/D1qtw=",
+          "dev": true,
+          "requires": {
+            "cliui": "^4.0.0",
+            "decamelize": "^2.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^3.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1 || ^4.0.0",
+            "yargs-parser": "^10.1.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+          "integrity": "sha1-cgImW4n36eny5XZeD+c1qQXtuqg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0"
+          }
+        }
+      }
+    },
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+      "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "webpack-merge": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz",
+      "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.5"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+      "integrity": "sha1-KijcufH0X+lg2PFJMlK17mUw+oU=",
+      "dev": true,
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
+    "webpack-subresource-integrity": {
+      "version": "1.1.0-rc.6",
+      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz",
+      "integrity": "sha1-N/bxJk4es3jkFGWpjagPrXariIY=",
+      "dev": true,
+      "requires": {
+        "webpack-core": "^0.6.8"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "dev": true,
+      "requires": {
+        "http-parser-js": ">=0.4.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=",
+      "dev": true
+    },
+    "when": {
+      "version": "3.6.4",
+      "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
+      "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+      "dev": true,
+      "optional": true
+    },
+    "wide-align": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.2 || 2"
+      }
+    },
+    "wordwrap": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+      "dev": true
+    },
+    "worker-farm": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
+      "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=",
+      "dev": true,
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "ws": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+      "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0",
+        "safe-buffer": "~5.1.0",
+        "ultron": "~1.1.0"
+      }
+    },
+    "xml2js": {
+      "version": "0.4.19",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
+      "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=",
+      "dev": true,
+      "requires": {
+        "sax": ">=0.6.0",
+        "xmlbuilder": "~9.0.1"
+      },
+      "dependencies": {
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=",
+          "dev": true
+        }
+      }
+    },
+    "xmlbuilder": {
+      "version": "9.0.7",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+      "dev": true
+    },
+    "xmlhttprequest-ssl": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+      "dev": true
+    },
+    "xregexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
+      "integrity": "sha1-5pgYneSd0qGMxWh7BeF8jkOUMCA=",
+      "dev": true
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "dev": true
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yargs": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase": "^3.0.0",
+        "cliui": "^3.2.0",
+        "decamelize": "^1.1.1",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^1.4.0",
+        "read-pkg-up": "^1.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^1.0.2",
+        "which-module": "^1.0.0",
+        "y18n": "^3.2.1",
+        "yargs-parser": "^5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true,
+          "optional": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase": "^3.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "yauzl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+      "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+      "dev": true,
+      "requires": {
+        "fd-slicer": "~1.0.1"
+      }
+    },
+    "yeast": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+      "dev": true
+    },
+    "yn": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+      "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
+      "dev": true
+    },
+    "zone.js": {
+      "version": "0.8.26",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz",
+      "integrity": "sha1-e91y92aMWnrWsRgUi06jnFnQjS0="
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/package.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/package.json
new file mode 100644
index 0000000..c49e299
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/package.json
@@ -0,0 +1,72 @@
+{
+  "name": "openMDM-Web",
+  "version": "5.1.0M8",
+  "description": "MDM web client",
+  "repository": "http://git.eclipse.org/c/mdmbl/org.eclipse.mdm.nucleus.git",
+  "license": "EPL-2.0",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build --prod",
+    "test": "ng test --reporters mocha --browsers PhantomJS",
+    "lint": "ng lint --force --format json > coverage/tslint_out.json",
+    "e2e": "ng e2e",
+    "coverage": "ng test --browsers PhantomJS --watch=false --codeCoverage=true",
+    "ci_build": "npm run coverage && ng build --prod --base-href /org.eclipse.mdm.nucleus/",
+    "extract-translations": "ngx-translate-extract --input ./src --output ./src/assets/i18n/en.json ./src/assets/i18n/de.json --clean --sort --format namespaced-json --marker TRANSLATE"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "7.2.4",
+    "@angular/cdk": "7.1.1",
+    "@angular/common": "7.2.4",
+    "@angular/compiler": "7.2.4",
+    "@angular/core": "7.2.4",
+    "@angular/forms": "7.2.4",
+    "@angular/http": "7.2.4",
+    "@angular/platform-browser": "7.2.4",
+    "@angular/platform-browser-dynamic": "7.2.4",
+    "@angular/router": "7.2.4",
+    "@ngx-translate/core": "11.0.1",
+    "@ngx-translate/http-loader": "4.0.0",
+    "bootstrap": "4.1.3",
+    "chart.js": "2.9.3",
+    "class-transformer": "0.1.6",
+    "core-js": "2.6.0",
+    "file-saver": "1.3.3",
+    "font-awesome": "4.7.0",
+    "ngx-bootstrap": "3.1.2",
+    "primeflex": "^1.0.0",
+    "primeicons": "1.0.0",
+    "primeng": "7.0.1",
+    "rxjs": "6.3.3",
+    "rxjs-compat": "6.3.3",
+    "split.js": "1.5.11",
+    "tslib": "^1.10.0",
+    "zone.js": "0.8.26"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "0.13.1",
+    "@angular/cli": "7.3.1",
+    "@angular/compiler-cli": "7.2.4",
+    "@angular/language-service": "7.2.4",
+    "@biesbjerg/ngx-translate-extract": "2.3.4",
+    "@types/jasmine": "2.8.8",
+    "@types/jasminewd2": "2.0.3",
+    "@types/node": "8.9.4",
+    "codelyzer": "4.5.0",
+    "jasmine-core": "2.99.1",
+    "jasmine-spec-reporter": "4.2.1",
+    "karma": "3.1.1",
+    "karma-chrome-launcher": "2.2.0",
+    "karma-phantomjs-launcher": "1.0.4",
+    "karma-coverage-istanbul-reporter": "2.0.1",
+    "karma-jasmine": "1.1.2",
+    "karma-jasmine-html-reporter": "0.2.2",
+    "karma-mocha-reporter": "2.2.5",
+    "protractor": "5.4.0",
+    "ts-node": "7.0.0",
+    "tslint": "5.11.0",
+    "typescript": "3.2.2"
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/proxies/development.config.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/proxies/development.config.json
new file mode 100644
index 0000000..ce26b9c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/proxies/development.config.json
@@ -0,0 +1,6 @@
+{
+  "/org.eclipse.mdm.nucleus/": {
+    "target": "http://sa:sa@localhost:8080/",
+    "secure": "false"
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/NOTICE.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/NOTICE.html
new file mode 100644
index 0000000..1bf6a90
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/NOTICE.html
@@ -0,0 +1,219 @@
+<pre>
+# Notices for Eclipse MDM|BL
+
+This content is produced and maintained by the Eclipse MDM|BL project,
+it is a project of the openMDM(R) Eclipse Working Group.
+
+* Project home: https://projects.eclipse.org/projects/technology.mdmbl
+
+## Trademarks
+
+Eclipse MDM|BL, MDM|BL and Eclipse openMDM(R) logo are registered trademarks
+of the Eclipse Foundation.
+
+## Copyright
+
+All content is the property of the following respective authors or their employers.
+For more information regarding authorship of content, please consult the listed
+source code repository logs.
+
+Copyright (c) 2016-2019 Gigatronik Ingolstadt GmbH
+Copyright (c) 2016-2020 Peak Solution GmbH
+Copyright (c) 2017-2018 science + computing AG Tuebingen (ATOS SE)
+Copyright (c) 2017-2018 Canoo Engineering AG
+Copyright (c) 2017 Florian Schmitt
+Copyright (c) 2017-2020 Angelika Wittek
+Copyright (c) 2018-2019 Elektronische Fahrwerksysteme GMBH
+Copyright (c) 2018-2020 Karakun AG
+Copyright (c) 2018-2020 Alexander Nehmer
+
+## Declared Project Licenses
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v. 2.0 which is available at
+http://www.eclipse.org/legal/epl-2.0.
+
+SPDX-License-Identifier: EPL-2.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.
+
+## Third-party Content
+
+The Content includes items that have been sourced from third parties as set out below.
+If you did not receive this Content directly from the Eclipse Foundation, the following
+is provided for informational purposes only, and you should look to
+the Redistributor's license for terms and conditions of use.
+
+
+@angular/animations:7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io/api/animations
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/cdk:7.1.1
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io/api
+    * Source:  https://github.com/angular/angular/releases/tag/7.1.1
+
+
+@angular/common@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io/api/common
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4r
+
+@angular/compiler@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/core@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/forms@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/http@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/platform-browser-dynamic@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/platform-browser@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/router@7.2.4
+    * License: MIT
+    * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+    * Project: https://angular.io
+    * Source:  https://github.com/angular/angular/releases/tag/7.2.4
+
+bootstrap@4.1.3
+    * License: MIT
+    * Licence Path: https://github.com/twbs/bootstrap/raw/master/LICENSE
+    * Project: https://getbootstrap.com/
+    * Source:  https://github.com/twbs/bootstrap
+
+class-transformer@0.1.6
+    * License: MIT
+    * Licence Path: https://github.com/typestack/class-transformer/blob/master/LICENSE
+    * Project: https://github.com/pleerock/class-transformer
+    * Source:  https://github.com/pleerock/class-transformer
+
+core-js@2.6.0
+    * License: MIT
+    * Licence Path: https://github.com/zloirock/core-js/raw/master/LICENSE
+    * Project: https://github.com/zloirock/core-js
+    * Source:  https://github.com/zloirock/core-js/releases/tag/v2.6.0
+
+file-saver@1.3.3
+    * License: MIT
+    * Licence Path: https://github.com/eligrey/FileSaver.js/raw/master/LICENSE.md
+    * Project: https://github.com/eligrey/FileSaver.js
+    * Source:  https://github.com/eligrey/FileSaver.js
+
+font-awesome@4.7.0
+    * License: MIT
+    * Licence Path: https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt
+    * Project: https://fontawesome.com/
+    * Source:  https://github.com/FortAwesome/Font-Awesome
+
+ng2-split-pane@1.3.1
+    * License: MIT
+    * Licence Path: https://github.com/wannabegeek/ng2-split-pane/raw/master/LICENSE
+    * Project: https://github.com/wannabegeek/ng2-split-pane
+    * Source:  https://github.com/wannabegeek/ng2-split-pane
+
+ngx-bootstrap@3.1.2
+    * License: MIT
+    * Licence Path: https://github.com/valor-software/ngx-bootstrap/blob/v3.1.2/LICENSE
+    * Project: https://valor-software.com/ngx-bootstrap
+    * Source:  https://github.com/valor-software/ngx-bootstrap/tree/v3.1.2
+    
+@ngx-translate/core@11.0.1
+    * License: MIT 
+    * Licence Path:   https://github.com/ngx-translate/core/blob/v11.0.1/LICENSE  
+    * Project URL:    http://www.ngx-translate.com/
+    * Source URL:     https://github.com/ngx-translate/core
+
+@ngx-translate/http-loader@4.0.0
+    * License: MIT 
+    * Licence Path:   https://github.com/ngx-translate/http-loader/blob/v4.0.0/LICENSE  
+    * Project URL:    http://www.ngx-translate.com/
+    * Source URL:     https://github.com/ngx-translate/http-loader/tree/v4.0.0
+    
+
+primeicons:1.0.0
+    * License: MIT
+    * Licence Path: https://github.com/primefaces/primeicons/blob/1.0.0/LICENSE
+    * Project: https://www.primefaces.org/primeng
+    * Source:  https://github.com/primefaces/primeicons/tree/1.0.0
+
+primeng@7.0.1
+    * License: MIT
+    * Licence Path: https://github.com/primefaces/primeng/blob/7.0.1/LICENSE.md
+    * Project: https://www.primefaces.org/primeng
+    * Source:  https://github.com/primefaces/primeng/tree/7.0.1
+
+rxjs@5.1.0
+    * License: Apache-2.0
+    * Project: https://rxjs-dev.firebaseapp.com/
+    * Source:  https://github.com/ReactiveX/rxjs/tree/6.3.3
+
+rxjs-compat:6.3.3
+    * License: Apache-2.0
+    * Project: https://rxjs-dev.firebaseapp.com/
+    * Source:  https://github.com/ReactiveX/rxjs/tree/6.3.3/compat
+
+tslib@1.9.0
+    * License: Apache-2.0
+    * Project: https://github.com/Microsoft/tslib
+    * Source:  https://github.com/Microsoft/tslib/tree/1.9.0
+
+zone.js@0.8.26
+    * License: MIT
+    * Licence Path: https://github.com/angular/zone.js/raw/master/LICENSE
+    * Project: https://github.com/angular
+    * Source:  https://github.com/angular/zone.js/releases/tag/v0.8.26
+    
+FFAMFAMFAM Silk Icon, Version 1.3
+    * License: Creative Commons Attribution 3.0 License 
+    * Licence Path: https://creativecommons.org/licenses/by/3.0/
+    * Project: http://www.famfamfam.com/lab/icons/silk/
+    * Source:  http://www.famfamfam.com/lab/icons/silk/
+
+
+## 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.
+</pre>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.css
new file mode 100644
index 0000000..ea615fe
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.css
@@ -0,0 +1,20 @@
+@charset "ISO-8859-1";
+
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+.navbar-vertical {}
+.navbar-vertical .navbar-nav {}
+.navbar-vertical .navbar-nav .navbar-brand {display:block;}
+.navbar-vertical .navbar-nav .nav-item {display:block;}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.html
new file mode 100644
index 0000000..495a99d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.html
@@ -0,0 +1,39 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+ <div class="mainnavigation">
+  <div id="leftsidenav" class="split">
+    <nav class="navbar navbar-default navbar-vertical bg-light">
+      <div class="container-fluid">
+        <div class="" id="bs-admin-navbar">
+          <a class="navbar-brand" style="font-weight: 500;">{{'administration.admin-modules.modules' | translate }}</a>
+          <ul class="nav navbar-nav mdm-link-list">
+            <li *ngFor="let m of links" [routerLinkActive]="['active']" class="nav-item">
+              <a routerLink="{{m.path}}" class="nav-link" style="cursor:pointer;">
+                {{m.name | translate}}
+              </a>
+            </li>
+          </ul>
+        </div>
+      </div>
+    </nav>
+  </div>
+  <div id="rightsidenav" class="split">
+    <div class="navigator-content" (scroll)=onScroll($event)>
+      <router-outlet></router-outlet>
+      <div *ngIf="scrollBtnVisible" style="position: fixed; bottom: 30px; right: 35px;">
+        <button class="btn btn-default" (click)="onScrollTop()" style="z-index: 10000;"><span class="fa fa-arrow-up" style="z-index: 10000;" title="{{ 'navigator-view.mdm-navigator-view.tooltip-scroll-up' | translate }}"></span></button>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.ts
new file mode 100644
index 0000000..ff7d906
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-modules.component.ts
@@ -0,0 +1,81 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, AfterViewInit} from '@angular/core';
+import {Router} from '@angular/router';
+import Split from 'split.js';
+import { TRANSLATE } from '../core/mdm-core.module';
+
+@Component({
+  selector: 'admin-modules',
+  templateUrl: 'admin-modules.component.html',
+  styleUrls: ['./admin-modules.component.css'],
+  providers: []
+})
+export class AdminModulesComponent implements AfterViewInit {
+
+  div: any;
+  scrollBtnVisible = false;
+
+  split: Split;
+
+  links = [
+    { name: TRANSLATE('administration.admin-modules.preferences'), path: 'preferences'},
+    { name: TRANSLATE('administration.admin-modules.extsystems'), path: 'extsystems'}
+  ];
+  constructor(private router: Router) { }
+
+
+  minWidthLeft() {
+    return 180;
+  }
+
+  minWidthRight() {
+    return 0.20 * window.innerWidth;
+  }
+
+  initRatio() {
+    return Math.floor(Math.max(250 / window.innerWidth, 0.20) * 100);
+  }
+  initRatioRight() {
+    return 100 - this.initRatio();
+  }
+  ngAfterViewInit(): void {
+    this.split = Split(['#leftsidenav', '#rightsidenav'], {
+      sizes: [this.initRatio(), this.initRatioRight()],
+      minSize: this.minWidthLeft(),
+      gutterSize: 10,
+      gutterStyle: function (dimension, gutterSize) {
+        return {
+          'width': gutterSize + 'px',
+          'height': (document.getElementById('leftsidenav').clientHeight - 5) + 'px'
+        };
+      },
+    });
+  }
+
+  onScrollTop() {
+    this.div.scrollTop = 0;
+  }
+
+  onScroll(event: any) {
+    if (event.target.scrollTop > 0) {
+      this.scrollBtnVisible = true;
+    } else {
+      this.scrollBtnVisible = false;
+    }
+    this.div = event.target;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-routing.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-routing.module.ts
new file mode 100644
index 0000000..f29aa38
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin-routing.module.ts
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { AdminModulesComponent } from './admin-modules.component';
+import { ExtSystemComponent } from './extsystem.component';
+import { PreferenceRoutingModule } from './preference-routing.module';
+
+const moduleRoutes: Routes = [
+  {
+    path: '', component: AdminModulesComponent,
+    children: [
+      { path: 'preferences', loadChildren: './preference.module#PreferenceModule' },
+      { path: 'extsystems', component: ExtSystemComponent },
+      { path: '', redirectTo: 'preferences', pathMatch: 'full' }
+    ]
+  }
+];
+
+@NgModule({
+  imports: [
+    RouterModule.forChild(moduleRoutes)
+  ],
+  exports: [
+    RouterModule
+  ]
+})
+
+export class AdminRoutingModule { }
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin.module.ts
new file mode 100644
index 0000000..d63d0cc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/admin.module.ts
@@ -0,0 +1,62 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { ComponentLoaderFactory } from 'ngx-bootstrap/component-loader';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { ExtSystemComponent } from './extsystem.component';
+import { ExtSystemViewerComponent } from './extsystem-viewer.component';
+import { ExtSystemEditorComponent } from './extsystem-editor.component';
+
+import { AdminModulesComponent } from './admin-modules.component';
+import { AdminRoutingModule } from './admin-routing.module';
+import { ExtSystemService } from './extsystem.service';
+import { PreferenceModule } from './preference.module';
+import { TableModule } from 'primeng/table';
+import { ContextMenuModule } from 'primeng/contextmenu';
+import { DialogModule } from 'primeng/dialog';
+import { CatalogService } from './catalog.service';
+import { AutoCompleteModule } from 'primeng/autocomplete';
+
+@NgModule( {
+    imports: [
+        AdminRoutingModule,
+        MDMCoreModule,
+        FormsModule,
+        ReactiveFormsModule,
+        PreferenceModule,
+        TableModule,
+        ContextMenuModule,
+        DialogModule,
+        AutoCompleteModule
+    ],
+    declarations: [
+        AdminModulesComponent,
+        ExtSystemComponent,
+        ExtSystemViewerComponent,
+        ExtSystemEditorComponent
+    ],
+    exports: [
+        AdminModulesComponent,
+    ],
+    providers: [
+        ComponentLoaderFactory,
+        ExtSystemService,
+        CatalogService
+    ],
+})
+export class AdminModule { }
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/catalog.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/catalog.service.ts
new file mode 100644
index 0000000..c497c0f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/catalog.service.ts
@@ -0,0 +1,78 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Injectable } from '@angular/core';
+import { Http, Response, Headers, RequestOptions } from '@angular/http';
+
+import { PropertyService } from '../core/property.service';
+
+import { plainToClass } from 'class-transformer';
+import { HttpErrorHandler } from '../core/http-error-handler';
+import { throwError as observableThrowError,  Observable } from 'rxjs';
+import { map, catchError } from 'rxjs/operators';
+import { Node } from '../navigator/node';
+
+@Injectable()
+export class CatalogService {
+
+  private prefEndpoint: string;
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService) {
+    this.prefEndpoint = _prop.getUrl('mdm/environments/');
+  }
+
+  getTplRootsForType(scope: string, type: string): Observable<Node[]> {
+    return this.http.get(this.prefEndpoint + scope + '/tplroots/' + type).pipe(
+      map(response => plainToClass(Node, response.json().data)),
+      catchError(this.handleError));
+  }
+
+  getTplCompForRoot(scope: string, type: string, rootId: string): Observable<Node[]> {
+    return this.http.get(this.prefEndpoint + scope + '/tplroots/' + type + '/' + rootId + '/tplcomps').pipe(
+      map(response => plainToClass(Node, response.json().data)),
+      catchError(this.handleError));
+  }
+
+  getTplAttrsForComp(scope: string, type: string, rootId: string, tplCompId: string): Observable<Node[]> {
+    return this.http.get(this.prefEndpoint + scope + '/tplroots/' + type + '/' + rootId + '/tplcomps/' + tplCompId + '/tplattrs').pipe(
+      map(response => plainToClass(Node, response.json().data)),
+      catchError(this.handleError));
+  }
+
+  getCatCompsForType(scope: string, type: string): Observable<Node[]> {
+    return this.http.get(this.prefEndpoint + scope + '/catcomps/' + type).pipe(
+      map(response => plainToClass(Node, response.json().data)),
+      catchError(this.handleError));
+  }
+
+  getCatAttrsForComp(scope: string, type: string, catCompId: string): Observable<Node[]> {
+    return this.http.get(this.prefEndpoint + scope + '/catcomps/' + type + '/' + catCompId + '/catattrs').pipe(
+      map(response => plainToClass(Node, response.json().data)),
+      catchError(this.handleError));
+  }
+
+  private handleError(e: Error | any) {
+    if (e instanceof Response) {
+      let response = <Response> e;
+      if (response.status !== 200) {
+        return observableThrowError('Could not request catalog element! '
+          + 'Please check if application server is running and database is configured correctly.');
+      }
+    }
+    return this.httpErrorHandler.handleError(e);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.css
new file mode 100644
index 0000000..416149e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.css
@@ -0,0 +1,32 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+@charset "ISO-8859-1";
+
+ul {
+  list-style-type: none;
+}
+textarea {
+    resize: vertical;
+}
+
+.input-group-addon {
+    min-width: 100px;
+    text-align: left;
+    font-weight: 600;
+}
+
+input[readonly] {
+     cursor: default;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.html
new file mode 100644
index 0000000..f6b3143
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.html
@@ -0,0 +1,69 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<div bsModal #lgModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
+  <div class="modal-dialog modal-lg">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" title="{{ 'administration.edit-preference.tooltip-close' | translate }}" class="close" (click)="closeDialog()" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+        <h4 class="modal-title" translate>administration.edit-preference.title-preferences-editor</h4>
+      </div>
+      <div class="modal-body">
+        <form [formGroup]="preferenceForm" novalidate>
+          <ul class="list-group">
+            <li>
+              <div class="block">
+                <label>{{ 'administration.edit-preference.lbl-key' | translate }}: </label>
+                <input type="text" class="form-control" formControlName="key" [readonly]="!isKeyEmpty">
+              </div>
+            </li>
+            <li>
+              <label>{{ 'administration.edit-preference.lbl-scope' | translate }}: </label>
+              <input type="text" class="form-control" formControlName="scope" [readonly]="true">
+            </li>
+            <li *ngIf="showSource">
+              <label>{{ 'administration.edit-preference.lbl-source' | translate }}: </label>
+              <select class="form-control" formControlName="source">
+                <option *ngFor="let env of envs">{{env.sourceName}}</option>
+              </select>
+            </li>
+            <li *ngIf="showUser">
+              <label i18n="administration_edit-preference User|User">User: </label>
+              <input type="text" class="form-control" formControlName="user" [readonly]=true placeholder="auto-generated">
+            </li>
+            <li>
+              <div class="form-group">
+                <label for="comment">{{ 'administration.edit-preference.lbl-value' | translate }}:</label>
+                <textarea class="form-control" formControlName="value" rows="5" id="value"></textarea>
+              </div>
+            </li>
+          </ul>
+          <div class="row" style="margin-top: 20px;">
+            <div class="col-md-12">
+              <button type="button" class="btn btn-default" (click)="closeDialog()">
+                <span class="fa fa-times"></span> 
+                <span translate>administration.edit-preference.btn-cancel</span>
+              </button>
+              <button type="button" class="btn btn-default pull-right" (click)="onSave()" [disabled]="!preferenceForm.valid">
+                <span class="fa fa-download"></span> <span translate>administration.edit-preference.btn-save</span>
+              </button>
+            </div>
+          </div>
+        </form>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.ts
new file mode 100644
index 0000000..7adff76
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/edit-preference.component.ts
@@ -0,0 +1,114 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, Input, Output, ViewChild, EventEmitter, OnInit } from '@angular/core';
+import { FormGroup, FormControl, FormBuilder, FormArray, Validators } from '@angular/forms';
+
+import { ModalDirective } from 'ngx-bootstrap';
+
+import { PreferenceService, Preference, Scope } from '../core/preference.service';
+import { NodeService } from '../navigator/node.service';
+import { Node } from '../navigator/node';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+
+@Component( {
+    selector: 'edit-preference',
+    templateUrl: './edit-preference.component.html',
+    styleUrls: ['./edit-preference.component.css']
+})
+export class EditPreferenceComponent implements OnInit {
+
+    @Input() scope: string;
+    showSource: boolean;
+    showUser: boolean;
+    isKeyEmpty: boolean;
+    isUserEmpty: boolean;
+    preferenceForm: FormGroup;
+    needSave = false;
+    envs: Node[];
+
+    @ViewChild( 'lgModal' ) public childModal: ModalDirective;
+
+    constructor( private formBuilder: FormBuilder,
+                 private nodeService: NodeService,
+                 private notificationService: MDMNotificationService,
+                 private translateService: TranslateService ) { }
+
+    ngOnInit() {
+        let node: Node;
+        this.nodeService.getNodes(node).subscribe(
+                env => this.envs = env,
+                error => this.notificationService.notifyError(
+                    this.translateService.instant('administration.edit-preference.err-cannot-load-data-source'), error)
+                );
+        this.setupForm( new Preference() );
+    }
+
+    setupForm( preference: Preference ) {
+        this.setOptions(preference);
+        this.preferenceForm = this.formBuilder
+            .group( {
+                scope: [preference.scope],
+                source: [preference.source],
+                user: [preference.user],
+                key: [preference.key, Validators.required],
+                value: [preference.value, Validators.required],
+                id: [preference.id]
+            });
+    }
+
+    setOptions(preference: Preference) {
+        this.needSave = false;
+        this.isKeyEmpty = preference.key === '';
+        switch ( this.scope ) {
+        case Scope.SYSTEM:
+            this.showSource = false;
+            this.showUser = false;
+            break;
+        case Scope.SOURCE:
+            this.showSource = true;
+            this.showUser = false;
+            break;
+        case Scope.USER:
+            this.showSource = false;
+            this.showUser = true;
+            break;
+        }
+    }
+
+    showDialog( preference?: Preference) {
+        if (preference == null) {
+            preference = new Preference();
+            preference.scope = this.scope;
+            if (this.scope === Scope.SOURCE) {
+                preference.source = this.envs[0].sourceName;
+            }
+        }
+        this.setupForm( preference);
+        this.childModal.show();
+    }
+
+    onSave() {
+        this.needSave = true;
+        this.childModal.hide();
+    }
+
+    closeDialog() {
+        this.childModal.hide();
+    }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-editor.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-editor.component.html
new file mode 100644
index 0000000..6701cd1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-editor.component.html
@@ -0,0 +1,106 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+
+  <div class="mdm-extsystem-editor-container">
+
+    <p-table class="ext-system-table" [value]="tableExtSystems" *ngIf="selectedEnvironment && extSystems" styleClass="table-hover">
+      <ng-template pTemplate="header">
+        <tr>
+          <th>{{ 'administration.extsystem.name' | translate }}</th>
+          <th>{{ 'administration.extsystem.description' | translate }}</th>
+        </tr>
+      </ng-template>
+      <ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
+        <tr>
+          <td>
+            <input required type="text" [(ngModel)]="rowData.name" />
+          </td>
+          <td>
+            <input type="text" *ngIf="getAttributeFromNode(rowData,'Description')" [(ngModel)]="getAttributeFromNode(rowData,'Description').value" />
+          </td>
+        </tr>
+      </ng-template>
+    </p-table>
+    <div class="commands">
+      <button type="button" class="btn btn-default pull-right" (click)="saveExtSystem()">
+        <span class="fa fa-plus"></span> {{'administration.extsystem.btn-save' | translate }}
+      </button>
+    </div>
+
+    <div *ngIf="selectedExtSystem">
+      <div class="custom-split-pane">
+        <div class="custom-split-pane-content custom-split-pane-left">
+          <div>{{ 'administration.extsystem.ext-system-attributes' | translate }}</div>
+          <p-table class="ext-system-attr-table" [value]="getExternalSystemAttributes()" selectionMode="single" [(selection)]="selectedExtSystemAttr" (onRowSelect)="onExtSystemAttrSelect($event)">
+            <ng-template pTemplate="header">
+              <tr>
+                <th style="width: 3em"></th>
+                <th>{{ 'administration.extsystem.name' | translate }}</th>
+                <th>{{ 'administration.extsystem.description' | translate }}</th>
+                <th class="actioncol"></th>
+              </tr>
+            </ng-template>
+            <ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
+              <tr [pSelectableRow]="rowData" [pSelectableRowIndex]="rowIndex">
+                <td><p-tableRadioButton [value]="rowData"></p-tableRadioButton></td>
+                <td><input required type="text" [(ngModel)]="rowData.name" (change)="updateSystemAttrModel(rowData)" /></td>
+                <td><input type="text" *ngIf="getAttributeFromNode(rowData,'Description')" [(ngModel)]="getAttributeFromNode(rowData,'Description').value" (change)="updateSystemAttrModel(rowData)" /></td>
+                <td class="actioncol"><button type="button" class="btn btn-default" (click)="removeExtSystemAttr(rowData)" title="{{ 'administration.extsystem.btn-del' | translate }}">
+                  <span class="fa fa-times"></span>
+                </button></td>
+              </tr>
+            </ng-template>
+          </p-table>
+          <div *ngIf="loadingExtSystemAttr">{{ 'administration.extsystem.loading-attributes' | translate }}</div>
+
+          <div class="commands">
+            <button type="button" class="btn btn-default pull-right" (click)="addExtSystemAttr()">
+              <span class="fa fa-plus"></span> {{'administration.extsystem.btn-add' | translate }}
+            </button>
+          </div>
+
+        </div>
+        <div class="custom-split-pane-content custom-split-pane-right">
+          <div>{{ 'administration.extsystem.mdm-attributes' | translate }}</div>
+          <p-table class="ext-system-mdmattr-table" *ngIf="selectedExtSystemAttr" [value]="getMDMAttributes()">
+            <ng-template pTemplate="header">
+              <tr>
+                <th>{{ 'administration.extsystem.component-type' | translate }}</th>
+                <th>{{ 'administration.extsystem.component-name' | translate }}</th>
+                <th>{{ 'administration.extsystem.attribute-name' | translate }}</th>
+                <th class="actioncol"></th>
+              </tr>
+            </ng-template>
+            <ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
+              <tr>
+                <td class="dropdowncol"><div><p-dropdown *ngIf="getAttributeFromNode(rowData,'CompType')" styleClass="drpdwn" [autoWidth]="false" [style]="{'width':'100%'}" [options]="mdmCompTypes" [(ngModel)]="getAttributeFromNode(rowData,'CompType').value" (onChange)="handleCompTypeSelect($event, rowData)" required="true"></p-dropdown></div></td>
+                <td class="dropdowncol"><div><p-dropdown *ngIf="getAttributeFromNode(rowData,'CompName')" styleClass="drpdwn" [autoWidth]="false" [style]="{'width':'100%'}" [options]="availableCatalogComps(rowData)" [(ngModel)]="getAttributeFromNode(rowData,'CompName').value" (onChange)="handleCompSelect($event, rowData)" editable="true"></p-dropdown></div></td>
+                <td class="dropdowncol"><div><p-dropdown *ngIf="getAttributeFromNode(rowData,'AttrName')" styleClass="drpdwn" [autoWidth]="false" [style]="{'width':'100%'}" [options]="availableAttributeComps(rowData)" [(ngModel)]="getAttributeFromNode(rowData,'AttrName').value" (onChange)="handleAttrCompSelect($event, rowData)" editable="true"></p-dropdown></div></td>
+                <td class="actioncol"><button type="button" class="btn btn-default" (click)="removeExtSystemMDMAttr(rowData)" title="{{ 'administration.extsystem.btn-del' | translate }}">
+                  <span class="fa fa-times"></span>
+                </button></td>
+              </tr>
+            </ng-template>
+          </p-table>
+
+          <div class="commands">
+            <button *ngIf="selectedExtSystemAttr" type="button" class="btn btn-default pull-right" (click)="addExtSystemMDMAttr()">
+              <span class="fa fa-plus"></span> {{'administration.extsystem.btn-add' | translate }}
+            </button>
+          </div>
+
+        </div>
+      </div>
+    </div>
+  </div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-editor.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-editor.component.ts
new file mode 100644
index 0000000..55f6d18
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-editor.component.ts
@@ -0,0 +1,615 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, OnInit, ViewChild, Input, OnDestroy, Output, EventEmitter } from '@angular/core';
+import { FormGroup, FormControl, FormBuilder, FormArray, Validators } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+import { TranslateService } from '@ngx-translate/core';
+import { DropdownModule } from 'primeng/dropdown';
+import { TreeTableModule } from 'primeng/treetable';
+import { TreeNode, MenuItem, SelectItem } from 'primeng/api';
+import { ContextMenuModule } from 'primeng/contextmenu';
+import { TreeTable, TreeTableToggler, DataTable } from 'primeng/primeng';
+import { Observable, BehaviorSubject, of, forkJoin } from 'rxjs';
+import 'rxjs/add/operator/toPromise';
+
+import { MDMNotificationService } from '../core/mdm-notification.service';
+import { ExtSystemService } from './extsystem.service';
+import { Node, Attribute, Relation } from '../navigator/node';
+import { plainToClass } from 'class-transformer';
+import { CatalogService } from './catalog.service';
+import { mergeMap, flatMap, map } from 'rxjs/operators';
+
+@Component( {
+    selector: 'mdm-extsystem-editor',
+  templateUrl: './extsystem-editor.component.html',
+  styleUrls: ['./extsystem.component.css']
+})
+export class ExtSystemEditorComponent implements OnInit, OnDestroy {
+
+  // passed down from parent
+  @Input() extSystems: Node[];
+  @Input() selectedEnvironment: Node;
+  @Input() selectedES: string;
+
+  @Output() editMode = new EventEmitter<boolean>();
+
+  // table selection
+  selectedExtSystem: Node;
+  selectedExtSystemAttr: Node;
+  tableExtSystems: Node[] = new Array();
+
+  // dropdown for table edit
+  mdmCompTypes: SelectItem[];
+  mdmCompNames: Node[];
+  mdmAttrNames: Node[];
+
+  // external system attributes
+  extSystemAttrs: Node[];
+  bsExtSystemAttrs: BehaviorSubject<Node[]> = new BehaviorSubject<Node[]>(undefined);
+
+  // loading states
+  loadingExtSystemAttr = false;
+
+  // for immediate creation only
+  tmpExtSystemAttr: Node;
+  tmpExtSystemMDMAttr: Node;
+
+  // dropdown boxes
+  availableSlctCtlgComps: any[][] = [];
+  availableSlctAttrComps: any[][] = [];
+
+  loadedTemplateRoots: any[][] = [];
+  loadedCatalogComps: any[][] = [];
+  loadedAttributeComps: any[][] = [];
+
+  constructor(private extSystemService: ExtSystemService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService,
+              private catalogService: CatalogService) {
+
+    this.bsExtSystemAttrs.subscribe(value => {
+      this.extSystemAttrs = value;
+    });
+
+    this.mdmCompTypes = [
+      { label: this.translateService.instant('administration.extsystem.dropdown-please-select'), value: '' },
+      { label: this.translateService.instant('administration.extsystem.unit-under-test'), value: 'UnitUnderTest' },
+      { label: this.translateService.instant('administration.extsystem.test-equipment'), value: 'TestEquipment' },
+      { label: this.translateService.instant('administration.extsystem.test-sequence'), value: 'TestSequence' },
+      { label: this.translateService.instant('administration.extsystem.sensor'), value: 'Sensor' }
+    ];
+  }
+
+  ngOnInit() {
+    for (let extSystem of this.extSystems) {
+      if (extSystem.type === 'ExtSystem' && extSystem.id === this.selectedES) {
+        this.selectedExtSystem = extSystem;
+        this.tableExtSystems.push(this.selectedExtSystem);
+        break;
+      }
+    }
+
+    this.loadingExtSystemAttr = true;
+    this.extSystemService.getExtSystemAttributesForScope(this.selectedEnvironment.sourceName, this.selectedExtSystem.id)
+      .subscribe(attrs => {
+        this.bsExtSystemAttrs.next(attrs);
+        this.loadingExtSystemAttr = false;
+      });
+  }
+
+  ngOnDestroy() {
+  }
+
+  getExternalSystemAttributes() {
+    if (!this.extSystemAttrs) {
+      return new Array();
+    }
+    return this.extSystemAttrs.filter(attr => attr.type === 'ExtSystemAttribute');
+  }
+  getMDMAttributes() {
+    let ids = new Array();
+      if (this.selectedExtSystemAttr.relations) {
+      for (let relation of this.selectedExtSystemAttr.relations) {
+        if (relation.entityType === 'MDMAttribute') {
+          for (let relationid of relation.ids) {
+            ids.push(relationid);
+          }
+        }
+      }
+    }
+    let data = new Array();
+    for (let attr of this.extSystemAttrs) {
+      if (attr.type === 'MDMAttribute' && ids.find(el => el === attr.id)) {
+        data.push(attr);
+      }
+    }
+    return data;
+  }
+
+  getAttributeValueFromNode(node: Node, attribute: string) {
+    if (node && node.attributes !== undefined) {
+      for (let attr of node.attributes) {
+        if (attr.name === attribute) {
+          return attr.value;
+        }
+      }
+    }
+    return '';
+  }
+
+  getAttributeFromNode(node: Node, attribute: string) {
+    if (node && node.attributes !== undefined) {
+      for (let attr of node.attributes) {
+        if (attr.name === attribute) {
+          return attr;
+        }
+      }
+    }
+    return undefined;
+  }
+
+  getNextTemporaryId() {
+    let id = -1;
+    for (let extSystem of this.extSystems) {
+      if (parseInt(extSystem.id, 10) < id) {
+        id = parseInt(extSystem.id, 10);
+      }
+    }
+    return --id;
+  }
+
+  createAttribute(name: string, value?: string) {
+    let attr = new Attribute();
+    attr.dataType = 'STRING';
+    attr.unit = '';
+    attr.value = value !== undefined ? value : '';
+    attr.name = name;
+    return attr;
+  }
+
+  getIndicesForIds(ids: string[]) {
+    let indices = new Array();
+    for (let id of ids) {
+      for (let extSystem of this.extSystems) {
+        if (extSystem.id === ids[id]) {
+          indices.push(this.extSystems.indexOf(extSystem));
+        }
+      }
+    }
+    return indices;
+  }
+
+  /**
+   * Save the external system
+   */
+  saveExtSystem() {
+    this.getAttributeFromNode(this.selectedExtSystem, 'Name').value = this.selectedExtSystem.name;
+    this.extSystemService.saveExtSystem(this.selectedEnvironment.sourceName, this.selectedExtSystem)
+      .subscribe(
+        response => { /* discard */ },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('administration.extsystem.err-cannot-update-ext-system'), error)
+      );
+  }
+
+  addExtSystemAttr() {
+    // initialze the node
+    this.tmpExtSystemAttr = new Node();
+    this.tmpExtSystemAttr.type = 'ExtSystemAttribute';
+    this.tmpExtSystemAttr.sourceType = 'ExtSystemAttr';
+    this.tmpExtSystemAttr.sourceName = this.selectedEnvironment.sourceName;
+    this.tmpExtSystemAttr.attributes = new Array();
+    this.tmpExtSystemAttr.attributes.push(this.createAttribute('Description'));
+    this.tmpExtSystemAttr.attributes.push(this.createAttribute('Name'));
+    this.tmpExtSystemAttr.attributes.push(this.createAttribute('ConverterClassname'));
+    this.tmpExtSystemAttr.attributes.push(this.createAttribute('ConverterParameter'));
+    this.tmpExtSystemAttr.attributes.push(this.createAttribute('MimeType', 'application/x-asam.aoany.extsystemattr'));
+
+    // Initialize relations on the external system if it is not defined yet
+    if (this.selectedExtSystem.relations === undefined || this.selectedExtSystem.relations.length === 0) {
+      this.selectedExtSystem.relations = new Array();
+      let relation = new Relation();
+      relation.entityType = 'ExtSystemAttribute';
+      relation.type = 'CHILDREN';
+      relation.ids = new Array();
+      this.selectedExtSystem.relations.push(relation);
+    }
+    if (this.selectedExtSystem.relations[0].ids === undefined) {
+      this.selectedExtSystem.relations[0].ids = new Array();
+    }
+
+    // Set initial name to persist the attribute
+    this.tmpExtSystemAttr.name = 'Attribut';
+    this.getAttributeFromNode(this.tmpExtSystemAttr, 'Name').value = this.tmpExtSystemAttr.name;
+    this.saveExtSystemAttr(this.tmpExtSystemAttr);
+  }
+
+  /**
+   * Remove the external system attribute
+   */
+  removeExtSystemAttr(extSystemAttr?: Node) {
+    if (extSystemAttr != undefined) {
+
+      if (extSystemAttr.id !== undefined && parseInt(extSystemAttr.id, 10) > 0 && this.extSystemAttrs.indexOf(extSystemAttr) !== -1) {
+        this.extSystemService.deleteExtSystemAttr(this.selectedEnvironment.sourceName, extSystemAttr.id).subscribe();
+        let idxES: number = this.extSystemAttrs.indexOf(extSystemAttr);
+        if (idxES !== -1) {
+          this.extSystemAttrs.splice(idxES, 1);
+          if (extSystemAttr.relations !== undefined && extSystemAttr.relations.length > 0) {
+            // remove all children
+            let indices = new Array<number>();
+            for (let h of extSystemAttr.relations) {
+              // the mdm attributes
+              indices = indices.concat(this.getIndicesForIds(h.ids));
+            }
+            indices.sort((a, b) => b - a);
+            for (let i of indices) {
+              this.extSystemAttrs.splice(indices[i], 1);
+            }
+          }
+        }
+      }
+    }
+    this.selectedExtSystemAttr = undefined;
+  }
+
+  /**
+   * Change listener on the name and description of the table element
+   */
+  updateSystemAttrModel(rowData: Node) {
+    // update the name attribute
+    this.getAttributeFromNode(rowData, 'Name').value = rowData.name;
+    // persist the change
+    this.saveExtSystemAttr(rowData);
+  }
+
+  /**
+   * Method invoked only if the save of the external system attribute succeeded
+   * This method is additional only successful if the node is a new node
+   */
+  saveExtSystemAttrSuccess(nodes: Node[]) {
+    if (this.tmpExtSystemAttr) {
+      for (let node of nodes) {
+        if (node.name === this.tmpExtSystemAttr.name && this.tmpExtSystemAttr.id === undefined) {
+          this.tmpExtSystemAttr.id = node.id;
+        }
+      }
+      this.extSystemAttrs.push(this.tmpExtSystemAttr);
+      this.tmpExtSystemAttr = undefined;
+    }
+  }
+
+  /**
+   * Save the external system attribute
+   */
+  saveExtSystemAttr(tmpAttr: Node) {
+    this.extSystemService.saveExtSystemAttr(this.selectedEnvironment.sourceName, tmpAttr, this.selectedExtSystem)
+      .subscribe(
+        response => this.saveExtSystemAttrSuccess(plainToClass(Node, response.json().data)),
+        error => {
+          this.tmpExtSystemAttr = undefined;
+          this.notificationService.notifyError(
+            this.translateService.instant('administration.extsystem.err-cannot-save-ext-system-attr'), error);
+        }
+      );
+  }
+
+  onExtSystemAttrSelect(event) {
+    let mdmAttrs = this.getMDMAttributes();
+    for (let attr of mdmAttrs) {
+      this.getCatalogComponentStr(attr);
+      this.getAttributeComponentStr(attr);
+    }
+  }
+
+  addExtSystemMDMAttr() {
+    this.tmpExtSystemMDMAttr = new Node();
+    this.tmpExtSystemMDMAttr.type = 'MDMAttribute';
+    this.tmpExtSystemMDMAttr.sourceType = 'MDMAttr';
+    this.tmpExtSystemMDMAttr.sourceName = this.selectedEnvironment.sourceName;
+    this.tmpExtSystemMDMAttr.attributes = new Array();
+    this.tmpExtSystemMDMAttr.attributes.push(this.createAttribute('AttrName'));
+    this.tmpExtSystemMDMAttr.attributes.push(this.createAttribute('CompName'));
+    this.tmpExtSystemMDMAttr.attributes.push(this.createAttribute('CompType'));
+    this.tmpExtSystemMDMAttr.attributes.push(this.createAttribute('MimeType', 'application/x-asam.aoany.mdmattr'));
+    // the name is the hierarchy from the parent elements appended with the name, set in save method
+    this.tmpExtSystemMDMAttr.attributes.push(this.createAttribute('Name'));
+
+    // add relation
+    if (this.selectedExtSystemAttr.relations === undefined || this.selectedExtSystemAttr.relations.length === 0) {
+      this.selectedExtSystemAttr.relations = new Array();
+      let relation = new Relation();
+      relation.entityType = 'MDMAttribute';
+      relation.type = 'CHILDREN';
+      relation.ids = new Array();
+      this.selectedExtSystemAttr.relations.push(relation);
+    }
+    if (this.selectedExtSystemAttr.relations[0].ids === undefined) {
+      this.selectedExtSystemAttr.relations[0].ids = new Array();
+    }
+
+    // Set initial name to persist the attribute
+    this.getAttributeFromNode(this.tmpExtSystemMDMAttr, 'CompType').value = 'UnitUnderTest';
+    this.getAttributeFromNode(this.tmpExtSystemMDMAttr, 'CompName').value = 'Komponente';
+    this.getAttributeFromNode(this.tmpExtSystemMDMAttr, 'AttrName').value = 'Attribut';
+
+    this.saveExtSystemMDMAttr(this.tmpExtSystemMDMAttr);
+  }
+
+  removeExtSystemMDMAttr(extSystemMDMAttr?: Node) {
+    if (extSystemMDMAttr != undefined) {
+      if (this.extSystemAttrs.indexOf(extSystemMDMAttr) !== -1) {
+        if (extSystemMDMAttr.id !== undefined && parseInt(extSystemMDMAttr.id, 10) > 0) {
+          this.extSystemService.deleteExtSystemMDMAttr(this.selectedEnvironment.sourceName, extSystemMDMAttr.id).subscribe();
+        }
+        this.extSystemAttrs.splice(this.extSystemAttrs.indexOf(extSystemMDMAttr), 1);
+      }
+    }
+  }
+
+  saveExtSystemMDMAttrSuccess(nodes: Node[]) {
+    if (this.tmpExtSystemMDMAttr) {
+      for (let node of nodes) {
+        if (node.name === this.tmpExtSystemMDMAttr.name && this.tmpExtSystemMDMAttr.id === undefined) {
+          this.tmpExtSystemMDMAttr.id = node.id;
+          for (let relation of this.selectedExtSystemAttr.relations) {
+            if (relation.entityType === 'MDMAttribute') {
+              if (relation.ids === undefined) {
+                relation.ids = new Array();
+              }
+              relation.ids.push(node.id);
+            }
+          }
+        }
+      }
+      this.extSystemAttrs.push(this.tmpExtSystemMDMAttr);
+      this.tmpExtSystemMDMAttr = undefined;
+    }
+  }
+
+  saveExtSystemMDMAttr(tmpAttr: Node) {
+      // update the name attribute with the hierarchy
+      tmpAttr.name = this.getAttributeValueFromNode(tmpAttr, 'CompType')
+        + '.' + this.getAttributeValueFromNode(tmpAttr, 'CompName')
+        + '.' + this.getAttributeValueFromNode(tmpAttr, 'AttrName');
+      this.getAttributeFromNode(tmpAttr, 'Name').value = tmpAttr.name;
+
+    this.extSystemService.saveExtSystemMDMAttr(this.selectedEnvironment.sourceName, tmpAttr, this.selectedExtSystemAttr)
+      .subscribe(
+        response => this.saveExtSystemMDMAttrSuccess(plainToClass(Node, response.json().data)),
+        error => {
+          this.tmpExtSystemMDMAttr = undefined;
+          this.notificationService.notifyError(
+            this.translateService.instant('administration.extsystem.err-cannot-save-ext-mdm-attr'), error);
+        }
+      );
+  }
+
+  async loadCatalogComps(type: string) {
+    if (type !== undefined && type != null && type.length > 0) {
+
+      // load the template roots if not available
+      if (this.loadedTemplateRoots[type] === undefined) {
+        this.loadedTemplateRoots[type] = [];
+        try {
+          const response = await this.catalogService.getTplRootsForType(this.selectedEnvironment.sourceName, type).toPromise();
+          this.loadedTemplateRoots[type] = response;
+        } catch (error) {
+          this.notificationService.notifyError(
+            this.translateService.instant('administration.extsystem.err-cannot-load-comp-types'), error);
+        }
+      }
+
+      // load the catalog components if not already triggered
+      if (this.loadedTemplateRoots[type] !== undefined && this.loadedTemplateRoots[type].length > 0
+        && this.loadedCatalogComps[type] === undefined) {
+        this.loadedCatalogComps[type] = [];
+        let tmpIds = this.loadedTemplateRoots[type].map(tr => tr.id);
+
+        of(tmpIds).pipe(
+          flatMap(q => forkJoin(...q.map(id => this.catalogService.getTplCompForRoot(this.selectedEnvironment.sourceName, type, id)))),
+          map(nested => [].concat(...nested))
+        ).subscribe(
+            templateComponentWithDuplicateVersions => {
+              const groupedByName = templateComponentWithDuplicateVersions.reduce((group: any[], templateComponent: any) => {
+                group[templateComponent.name] = group[templateComponent.name] || [];
+                group[templateComponent.name].push(templateComponent);
+                return group;
+              }, {});
+              let templateComponents = [];
+              for (const name of Object.keys(groupedByName)) {
+                templateComponents.push(groupedByName[name].reduce((g: any, templateComponent: any) =>
+                  g.id <= templateComponent.id ? templateComponent : g,
+                  { id: -1 }
+                ));
+              }
+              this.loadedCatalogComps[type] = templateComponents;
+            },
+            error => this.notificationService.notifyError(
+              this.translateService.instant('administration.extsystem.err-cannot-load-comp-types'), error)
+            );
+
+        return true;
+      }
+    }
+    return false;
+  }
+
+  async loadAttributeComps(type: string, comp: string) {
+    if (type !== undefined && type != null && type.length > 0 && comp !== undefined && comp != null && comp.length > 0
+      && this.loadedAttributeComps[type + comp] === undefined) {
+      let compId = '';
+      let rootId = '0';
+      if (this.loadedCatalogComps && this.loadedCatalogComps[type]) {
+        for (let catalogComp of this.loadedCatalogComps[type]) {
+          if (catalogComp.name === comp) {
+            compId = catalogComp.id;
+            break;
+          }
+        }
+      }
+      if (this.loadedTemplateRoots && this.loadedTemplateRoots[type]) {
+        for (let templateRoot of this.loadedTemplateRoots[type]) {
+          if (templateRoot.relations !== undefined) {
+            for (let relation of templateRoot.relations) {
+              if (relation.entityType === 'TemplateComponent'
+                && relation.ids !== undefined) {
+                for (let id of relation.ids) {
+                  if (id === compId) {
+                    rootId = templateRoot.id;
+                    break;
+                  }
+                }
+                if (rootId !== '0') {
+                  break;
+                }
+              }
+            }
+            if (rootId !== '0') {
+              break;
+            }
+          }
+        }
+      }
+      if (rootId !== '0' && compId !== '') {
+        this.loadedAttributeComps[type + comp] = [];
+        try {
+          const response = await this.catalogService.
+            getTplAttrsForComp(this.selectedEnvironment.sourceName, type, rootId, compId).toPromise();
+          for (let t of response) {
+            this.loadedAttributeComps[type + comp].push(t);
+          }
+        } catch (error) {
+          this.notificationService.notifyError(
+            this.translateService.instant('administration.extsystem.err-cannot-load-comp-types'), error);
+        }
+        return true;
+      }
+    } else {
+      return false;
+    }
+  }
+
+  getCatalogComponentStr(rowData: Node) {
+    let type: string = <string> this.getAttributeValueFromNode(rowData, 'CompType');
+    let data: string[] = new Array();
+    // sensor does not have catalog elements
+    if (type !== undefined && type !== 'Sensor') {
+      let components = this.getCatalogComponents(type);
+      if (components) {
+        for (let component of components) {
+          data.push(component.name);
+        }
+      }
+    }
+    return data;
+  }
+
+  getAttributeComponentStr(rowData: Node) {
+    let type: string = <string> this.getAttributeValueFromNode(rowData, 'CompType');
+    let comp: string = <string> this.getAttributeValueFromNode(rowData, 'CompName');
+    let data: string[] = new Array();
+    if (type !== undefined && comp !== undefined) {
+      let components = this.getAttributeComponents(type, comp);
+      if (components) {
+        for (let component of components) {
+          data.push(component.name);
+        }
+      }
+    }
+    return data;
+  }
+
+  getCatalogComponents(type: string) {
+    let data: Node[] = this.loadedCatalogComps[type];
+    if (data === undefined || data == null || data.length === 0) {
+      if (this.loadCatalogComps(type)) {
+        data = this.loadedCatalogComps[type];
+      }
+    }
+    return data;
+  }
+
+  getAttributeComponents(type: string, comp: string) {
+    let data: Node[] = this.loadedAttributeComps[type + comp];
+    if (data === undefined || data == null || data.length === 0) {
+      if (this.loadAttributeComps(type, comp)) {
+        data = this.loadedAttributeComps[type + comp];
+      }
+    }
+    return data;
+  }
+
+  /**
+   *
+   */
+  availableCatalogComps(rowData: Node) {
+    let result = this.availableSlctCtlgComps[rowData.id];
+    if (result === undefined) {
+      result = [];
+      result.push({ label: this.translateService.instant('administration.extsystem.dropdown-please-select'), value: '' });
+      let items = this.getCatalogComponentStr(rowData);
+      for (let item of items) {
+        if (item !== undefined) {
+          result.push({ label: item, value: item});
+        }
+      }
+      if (result.length > 1) {
+        this.availableSlctCtlgComps[rowData.id] = result;
+      }
+    }
+    return result;
+  }
+
+  availableAttributeComps(rowData: Node) {
+    let result = this.availableSlctAttrComps[rowData.id];
+    if (result === undefined) {
+      result = [];
+      result.push({ label: this.translateService.instant('administration.extsystem.dropdown-please-select'), value: '' });
+      let items = this.getAttributeComponentStr(rowData);
+      for (let item of items) {
+        if (item !== undefined) {
+          result.push({ label: item, value: item});
+        }
+      }
+      if (result.length > 1) {
+        this.availableSlctAttrComps[rowData.id] = result;
+      }
+    }
+    return result;
+  }
+
+  handleCompTypeSelect(event, rowData: Node) {
+    this.availableSlctCtlgComps[rowData.id] = undefined;
+    this.availableSlctAttrComps[rowData.id] = undefined;
+    this.getAttributeFromNode(rowData, 'CompName').value = 'Komponente';
+    this.getAttributeFromNode(rowData, 'AttrName').value = 'Attribut';
+    this.getCatalogComponentStr(rowData);
+    this.saveExtSystemMDMAttr(rowData);
+  }
+
+  handleCompSelect(event, rowData: Node) {
+    this.availableSlctAttrComps[rowData.id] = undefined;
+    this.getAttributeFromNode(rowData, 'AttrName').value = 'Attribut';
+    this.getAttributeComponentStr(rowData);
+    this.saveExtSystemMDMAttr(rowData);
+  }
+
+  handleAttrCompSelect(event, rowData: Node) {
+    this.saveExtSystemMDMAttr(rowData);
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-viewer.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-viewer.component.html
new file mode 100644
index 0000000..543a87e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-viewer.component.html
@@ -0,0 +1,127 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+
+  <div class="mdm-extsystem-viewer-container">
+
+    <p-table class="ext-system-table" [value]="getExternalSystems()" *ngIf="selectedEnvironment && extSystems" styleClass="table-hover"
+             (onRowSelect)="onExtSystemRowSelect($event)" (onRowUnselect)="onExtSystemRowUnselect($event)"
+             selectionMode="single" [(selection)]="selectedExtSystem">
+      <ng-template pTemplate="header">
+        <tr>
+          <th>{{ 'administration.extsystem.name' | translate }}</th>
+          <th>{{ 'administration.extsystem.description' | translate }}</th>
+          <th class="button-col"></th>
+          <th class="button-col"></th>
+        </tr>
+      </ng-template>
+      <ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
+        <tr [pSelectableRow]="rowData" [pSelectableRowIndex]="rowIndex" [pContextMenuRow]="rowData">
+          <td>
+            <span>{{rowData.name}}</span>
+          </td>
+          <td>
+            <span>{{getAttributeValueFromNode(rowData,'Description')}}</span>
+          </td>
+          <td>
+            <button type="button" class="btn btn-default pull-right" (click)="editExtSystem(rowData)" title="{{'administration.extsystem.btn-edit' | translate }}">
+              <span class="fa fa-pencil-square-o"></span>
+            </button>
+          </td>
+          <td>
+            <button type="button" class="btn btn-default pull-right" (click)="removeExtSystem(rowData)" title="{{'administration.extsystem.btn-del' | translate }}">
+              <span class="fa fa-times"></span>
+            </button>
+          </td>
+        </tr>
+      </ng-template>
+    </p-table>
+
+    <p-dialog header="{{ 'administration.extsystem.dialog-ext-system-delete-title' | translate }}" [(visible)]="dialogExtSystemDelete">
+      <div class="text">
+        <span>{{ 'administration.extsystem.dialog-ext-system-delete-text' | translate }}</span>
+      </div>
+      <div class="dialogcommands">
+        <button type="button" class="btn btn-default pull-right" (click)="confirmRemoveExtSystem()">
+          <span class="fa fa-plus"></span> {{'administration.extsystem.btn-del' | translate }}
+        </button>
+        <button type="button" class="btn btn-default pull-right" (click)="cancelRemoveExtSystem()">
+          <span class="fa fa-times"></span> {{'administration.extsystem.btn-cancel' | translate }}
+        </button>
+      </div>
+    </p-dialog>
+
+  <p-dialog header="{{ 'administration.extsystem.dialog-ext-system-title' | translate}}" [(visible)]="dialogExtSystemCreate">
+    <table *ngIf="tmpExtSystemCreate">
+      <tr>
+        <td>{{ 'administration.extsystem.name' | translate}}</td>
+        <td><input required type="text" [(ngModel)]="tmpExtSystemCreate.name" /></td>
+      </tr>
+     </table>
+    <div class="dialogcommands">
+      <button type="button" class="btn btn-default pull-right" (click)="saveDialogExtSystem()">
+        <span class="fa fa-plus"></span> {{'administration.extsystem.btn-save' | translate }}
+      </button>
+      <button type="button" class="btn btn-default pull-right" (click)="cancelDialogExtSystem()">
+        <span class="fa fa-times"></span> {{'administration.extsystem.btn-cancel' | translate }}
+      </button>
+    </div>
+  </p-dialog>
+
+    <div *ngIf="selectedEnvironment" class="commands">
+      <button type="button" class="btn btn-default pull-right" (click)="addExtSystem()">
+        <span class="fa fa-plus"></span> {{'administration.extsystem.btn-add' | translate }}
+      </button>
+    </div>
+
+    <div class="custom-split-pane" *ngIf="selectedExtSystem">
+      <div class="custom-split-pane-content custom-split-pane-left">
+        <div>{{ 'administration.extsystem.ext-system-attributes' | translate }}</div>
+        <p-table [value]="getExternalSystemAttributes()" selectionMode="single" [(selection)]="selectedExtSystemAttr">
+          <ng-template pTemplate="header">
+            <tr>
+              <th>{{ 'administration.extsystem.name' | translate }}</th>
+              <th>{{ 'administration.extsystem.description' | translate }}</th>
+            </tr>
+          </ng-template>
+          <ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
+            <tr [pSelectableRow]="rowData" [pSelectableRowIndex]="rowIndex" [pContextMenuRow]="rowData">
+              <td>{{rowData.name}}</td>
+              <td>{{getAttributeValueFromNode(rowData,'Description')}}</td>
+            </tr>
+          </ng-template>
+        </p-table>
+        <div *ngIf="loadingExtSystemAttr">{{ 'administration.extsystem.loading-attributes' | translate }}</div>
+      </div>
+      <div class="custom-split-pane-content custom-split-pane-right">
+        <div>{{ 'administration.extsystem.mdm-attributes' | translate }}</div>
+        <p-table *ngIf="selectedExtSystemAttr" [value]="getMDMAttributes()">
+          <ng-template pTemplate="header">
+            <tr>
+              <th>{{ 'administration.extsystem.component-type' | translate }}</th>
+              <th>{{ 'administration.extsystem.component-name' | translate }}</th>
+              <th>{{ 'administration.extsystem.attribute-name' | translate }}</th>
+            </tr>
+          </ng-template>
+          <ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
+            <tr>
+              <td>{{getAttributeValueFromNode(rowData,'CompType')}}</td>
+              <td>{{getAttributeValueFromNode(rowData,'CompName')}}</td>
+              <td>{{getAttributeValueFromNode(rowData,'AttrName')}}</td>
+            </tr>
+          </ng-template>
+        </p-table>
+      </div>
+    </div>
+
+  </div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-viewer.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-viewer.component.ts
new file mode 100644
index 0000000..6e3a0db
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem-viewer.component.ts
@@ -0,0 +1,260 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, OnInit, ViewChild, Input, OnDestroy, Output, EventEmitter } from '@angular/core';
+import { FormGroup, FormControl, FormBuilder, FormArray, Validators } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+import { TranslateService } from '@ngx-translate/core';
+import { DropdownModule } from 'primeng/dropdown';
+import { TreeTableModule } from 'primeng/treetable';
+import { TreeNode, MenuItem } from 'primeng/api';
+import { ContextMenuModule } from 'primeng/contextmenu';
+import { TreeTable, TreeTableToggler, DataTable } from 'primeng/primeng';
+import { DialogModule } from 'primeng/dialog';
+import { Observable, BehaviorSubject } from 'rxjs';
+
+import { MDMNotificationService } from '../core/mdm-notification.service';
+import { ExtSystemService } from './extsystem.service';
+import { Node, Attribute } from '../navigator/node';
+import { plainToClass } from 'class-transformer';
+
+@Component( {
+    selector: 'mdm-extsystem-viewer',
+  templateUrl: './extsystem-viewer.component.html',
+  styleUrls: ['./extsystem.component.css']
+})
+export class ExtSystemViewerComponent implements OnInit, OnDestroy {
+
+  // passed down from parent
+  @Input() extSystems: Node[];
+  @Input() selectedEnvironment: Node;
+
+  @Output() editMode = new EventEmitter<boolean>();
+  @Output() selectedES = new EventEmitter<string>();
+
+  // dialog and loading states
+  dialogExtSystemCreate = false;
+  dialogExtSystemDelete = false;
+  loadingExtSystemAttr = false;
+
+  // temporary data for dialogs
+  tmpExtSystemCreate: Node;
+  tmpExtSystemDelete: Node;
+
+  // external system attributes
+  extSystemAttrs: Node[];
+  bsExtSystemAttrs: BehaviorSubject<Node[]> = new BehaviorSubject<Node[]>(undefined);
+
+  // table selection
+  selectedExtSystem: Node;
+  selectedExtSystemAttr: Node;
+
+  constructor(private extSystemService: ExtSystemService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+
+    this.bsExtSystemAttrs.subscribe(value => {
+      this.extSystemAttrs = value;
+    });
+  }
+
+  ngOnInit() {
+    this.bsExtSystemAttrs.next(undefined);
+  }
+
+
+  ngOnDestroy() {
+  }
+
+  getExternalSystems() {
+    let data = new Array();
+    for (let i in this.extSystems) {
+      if (this.extSystems[i].type === 'ExtSystem') {
+        data.push(this.extSystems[i]);
+      }
+    }
+    return data;
+  }
+
+  getExternalSystemAttributes() {
+    if (!this.extSystemAttrs) {
+      return new Array();
+    }
+    return this.extSystemAttrs.filter(attr => attr.type === 'ExtSystemAttribute');
+  }
+
+  getMDMAttributes() {
+    let ids = new Array();
+    // need double forEach as the map function transfers the array into another array
+    this.selectedExtSystemAttr.relations.filter(rel => rel.entityType === 'MDMAttribute').map(rel => rel.ids)
+      .forEach(i => i.forEach(id => ids.push(id)));
+    return this.extSystemAttrs.filter(attr => attr.type === 'MDMAttribute' && ids.find(i => i === attr.id));
+  }
+
+  getAttributeValueFromNode(node: Node, attribute: string) {
+    for (let attr of node.attributes) {
+      if (attr.name === attribute) {
+        return attr.value;
+      }
+    }
+    return '';
+  }
+
+  getAttributeFromNode(node: Node, attribute: string) {
+    if (node.attributes !== undefined) {
+      for (let attr of node.attributes) {
+        if (attr.name === attribute) {
+          return attr;
+        }
+      }
+    }
+    return undefined;
+  }
+
+  onExtSystemRowSelect(event: any) {
+    this.selectedExtSystemAttr = undefined;
+    this.bsExtSystemAttrs.next(undefined);
+    this.loadingExtSystemAttr = true;
+    this.selectedExtSystem = event.data;
+    this.extSystemService.getExtSystemAttributesForScope(this.selectedEnvironment.sourceName, this.selectedExtSystem.id)
+      .subscribe(attrs => {
+        this.bsExtSystemAttrs.next(attrs);
+        this.loadingExtSystemAttr = false;
+      });
+  }
+
+  onExtSystemRowUnselect(event: any) {
+    this.selectedExtSystem = undefined;
+    this.bsExtSystemAttrs.next(undefined);
+  }
+
+
+  createAttribute(name: string, value?: string) {
+    let attr = new Attribute();
+    attr.dataType = 'STRING';
+    attr.unit = '';
+    attr.value = value !== undefined ? value : '';
+    attr.name = name;
+    return attr;
+  }
+
+  getIndicesForIds(ids: string[]) {
+    let indices = new Array();
+    for (let id of ids) {
+      for (let extSystem of this.extSystems) {
+        if (extSystem.id === id) {
+          indices.push(this.extSystems.indexOf(extSystem));
+        }
+      }
+    }
+    return indices;
+  }
+
+  addExtSystem() {
+    this.tmpExtSystemCreate = new Node();
+    this.tmpExtSystemCreate.type = 'ExtSystem';
+    this.tmpExtSystemCreate.sourceType = 'ExtSystem';
+    this.tmpExtSystemCreate.sourceName = this.selectedEnvironment.sourceName;
+    this.tmpExtSystemCreate.attributes = new Array();
+    this.tmpExtSystemCreate.attributes.push(this.createAttribute('Description'));
+    this.tmpExtSystemCreate.attributes.push(this.createAttribute('Name'));
+    this.tmpExtSystemCreate.attributes.push(this.createAttribute('MimeType', 'application/x-asam.aoany.extsystem'));
+    this.dialogExtSystemCreate = true;
+  }
+
+  editExtSystem(extSystem?: Node) {
+    if (extSystem != undefined) {
+      this.tmpExtSystemCreate = extSystem;
+      // this.dialogExtSystem = true;
+      this.selectedES.next(extSystem.id);
+      this.editMode.next(true);
+    }
+  }
+
+  removeExtSystem(extSystem?: Node) {
+    this.tmpExtSystemDelete = extSystem;
+    this.dialogExtSystemDelete = true;
+  }
+
+  cancelRemoveExtSystem() {
+    this.tmpExtSystemDelete = undefined;
+    this.dialogExtSystemDelete = false;
+  }
+
+  confirmRemoveExtSystem() {
+    if (this.tmpExtSystemDelete != undefined) {
+      let idxES: number = this.extSystems.indexOf(this.tmpExtSystemDelete);
+      if (idxES !== -1) {
+        this.extSystems.splice(idxES, 1);
+        if (this.tmpExtSystemDelete.relations !== undefined && this.tmpExtSystemDelete.relations.length > 0) {
+          // remove all children
+          let indices = new Array<number>();
+          for (let relation of this.tmpExtSystemDelete.relations) {
+            // the ext system attributes
+            let indicesESA = this.getIndicesForIds(relation.ids);
+            for (let ind of indicesESA) {
+              for (let r of this.extSystems[ind].relations) {
+                // the mdm attributes
+                indices = indices.concat(this.getIndicesForIds(r.ids));
+              }
+            }
+            indices = indices.concat(indicesESA);
+          }
+          indices.sort((a, b) => b - a);
+          for (let i of indices) {
+            this.extSystems.splice(i, 1);
+          }
+        }
+      }
+      if (this.tmpExtSystemDelete.id !== undefined && parseInt(this.tmpExtSystemDelete.id, 10) > 0) {
+        this.extSystemService.deleteExtSystem(this.selectedEnvironment.sourceName, this.tmpExtSystemDelete.id).subscribe();
+      }
+    }
+    this.selectedExtSystem = undefined;
+    this.tmpExtSystemDelete = undefined;
+    this.dialogExtSystemDelete = false;
+  }
+
+  // for new external systems only
+  saveDialogExtSystem() {
+    // update the name attribute
+    this.getAttributeFromNode(this.tmpExtSystemCreate, 'Name').value = this.tmpExtSystemCreate.name;
+    this.extSystemService.saveExtSystem(this.selectedEnvironment.sourceName, this.tmpExtSystemCreate)
+      .subscribe(
+        response => this.patchResponse(plainToClass(Node, response.json().data)),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('administration.extsystem.err-cannot-save-ext-system'), error)
+      );
+    this.dialogExtSystemCreate = false;
+  }
+
+  cancelDialogExtSystem() {
+    this.dialogExtSystemCreate = false;
+    this.tmpExtSystemCreate = undefined;
+  }
+
+  patchResponse(nodes: Node[]) {
+    for (let node of nodes) {
+      if (node.name === this.tmpExtSystemCreate.name) {
+        if (this.tmpExtSystemCreate.id === undefined) {
+          this.extSystems.push(this.tmpExtSystemCreate);
+        }
+        this.tmpExtSystemCreate.id = node.id;
+      }
+    }
+    this.tmpExtSystemCreate = undefined;
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.css
new file mode 100644
index 0000000..3c5823d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.css
@@ -0,0 +1,60 @@
+@charset "ISO-8859-1";
+
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+.mdm-extsystem-viewer-container,
+.mdm-extsystem-editor-container{display:block;margin-bottom:8px;}
+
+.mdm-extsystem-editor-container .commands,
+.mdm-extsystem-viewer-container .commands,
+.extsystem-comp .commands,
+.extsystem-comp .commands {
+  min-height: 30px;
+  display: block;
+  margin-bottom: 10px;
+  margin-top:6px;
+  width: 100%;
+}
+.mdm-extsystem-editor-container .commands button,
+.mdm-extsystem-viewer-container .commands button,
+.extsystem-comp .commands button,
+.extsystem-comp .commands button {
+  margin-left: 10px;
+}
+
+.custom-split-pane {
+  display: block;
+  margin-top: 20px;
+}
+.custom-split-pane-content{display: inline-block;}
+.custom-split-pane-left{width:38%;vertical-align:top;}
+.custom-split-pane-right {
+  margin-left: 1%;
+  width: 58%;
+  vertical-align: top;
+}
+
+.ext-system-table {
+    margin-top: 10px;
+}
+.ext-system-table .button-col{
+  width:60px;
+}
+
+.ext-system-table input{width:100%;}
+.ext-system-attr-table input{width:100%;}
+.ext-system-mdmattr-table .drpdwn{width:100%!important;}
+
+.actioncol{width: 65px;}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.html
new file mode 100644
index 0000000..a03a9ba
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.html
@@ -0,0 +1,35 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+
+<div class="extsystem-comp">
+  <div *ngIf="!environments">{{ 'administration.extsystem.loading' | translate }}</div>
+
+  <div class="system-selector">
+    <div *ngIf="!selectedEnvironment" style="display:inline;">{{ 'administration.extsystem.select-system' | translate }}:</div>
+    <div *ngIf="selectedEnvironment" style="display:inline;">{{ 'administration.extsystem.selected-system' | translate }}:</div>
+    <p-dropdown [options]="environments" [(ngModel)]="selectedEnvironment" optionLabel="sourceName" (onChange)="onChangeExtSystem($event)" placeholder="{{ 'administration.extsystem.dropdown-please-select' | translate }}"></p-dropdown>
+  </div>
+
+  <div *ngIf="selectedEnvironment && extSystems">
+
+    <div class="commands">
+      <button *ngIf="editorMode" type="button" class="btn btn-default pull-right" (click)="onPageBack()">
+        <span class="fa fa-reply"></span> {{'administration.extsystem.btn-back' | translate }}
+      </button>
+    </div>
+
+    <mdm-extsystem-editor *ngIf="editorMode" [selectedEnvironment]="selectedEnvironment" [extSystems]="extSystems" (editMode)="onEditModeChange($event)" [selectedES]="selectedExtSystem"></mdm-extsystem-editor>
+    <mdm-extsystem-viewer *ngIf="!editorMode" [selectedEnvironment]="selectedEnvironment" [extSystems]="extSystems" (editMode)="onEditModeChange($event)" (selectedES)="onChangeSelectedExtSystem($event)"></mdm-extsystem-viewer>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.ts
new file mode 100644
index 0000000..189356f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.component.ts
@@ -0,0 +1,101 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, OnInit, ViewChild, Input, OnDestroy } from '@angular/core';
+import { FormGroup, FormControl, FormBuilder, FormArray, Validators } from '@angular/forms';
+import { TranslateService } from '@ngx-translate/core';
+import { DropdownModule } from 'primeng/dropdown';
+import { TreeTableModule } from 'primeng/treetable';
+import { TreeNode, MenuItem } from 'primeng/api';
+import { ContextMenuModule } from 'primeng/contextmenu';
+import { TreeTable, TreeTableToggler, DataTable } from 'primeng/primeng';
+import { DialogModule } from 'primeng/dialog';
+import { Observable, BehaviorSubject } from 'rxjs';
+
+import { MDMNotificationService } from '../core/mdm-notification.service';
+import { ExtSystemService } from './extsystem.service';
+import { Node } from '../navigator/node';
+import { NodeService } from '../navigator/node.service';
+
+@Component( {
+    selector: 'mdm-extsystem',
+    templateUrl: './extsystem.component.html',
+    styleUrls: ['./extsystem.component.css']
+})
+export class ExtSystemComponent implements OnInit, OnDestroy {
+
+  // available external systems
+  extSystems: Node[];
+  bsExtSystems: BehaviorSubject<Node[]> = new BehaviorSubject<Node[]>(undefined);
+  selectedEnvironment: Node;
+
+  editorMode = false;
+  selectedExtSystem: string = undefined;
+
+  // dropdown selection
+  environments: Node[];
+
+  //  unknown -> remove
+  scope: string;
+
+  constructor(private extSystemService: ExtSystemService,
+               private notificationService: MDMNotificationService,
+    private translateService: TranslateService,
+    private nodeService: NodeService) {
+
+    this.bsExtSystems.subscribe(value => {
+      this.extSystems = value;
+    });
+  }
+
+  ngOnInit() {
+    this.nodeService.getRootNodes().subscribe(
+      envs => this.environments = envs,
+      error => this.translateService.instant('basket.mdm-basket.err-cannot-load-sources')
+        .subscribe(msg => this.notificationService.notifyError(msg, error)
+    ));
+
+    this.bsExtSystems.next(undefined);
+  }
+
+  ngOnDestroy() {
+  }
+
+  onEditModeChange(editMode: boolean) {
+    this.editorMode = editMode;
+  }
+
+  onChangeSelectedExtSystem(extSystem: string) {
+    this.selectedExtSystem = extSystem;
+  }
+
+  onChangeExtSystem(event: any) {
+    this.extSystems = undefined;
+    if (this.selectedEnvironment !== undefined) {
+      this.scope = this.selectedEnvironment.sourceName;
+    }
+    this.extSystemService.getExtSystemForScope(this.scope).subscribe(es => this.bsExtSystems.next(es));
+  }
+
+
+  onPageSwitchToEdit() {
+    this.onEditModeChange(true);
+  }
+
+  onPageBack() {
+    this.onEditModeChange(false);
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.service.ts
new file mode 100644
index 0000000..91eccd1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/extsystem.service.ts
@@ -0,0 +1,170 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Injectable } from '@angular/core';
+import { Http, Response, Headers, RequestOptions } from '@angular/http';
+
+import { PropertyService } from '../core/property.service';
+
+import { plainToClass } from 'class-transformer';
+import { HttpErrorHandler } from '../core/http-error-handler';
+import { throwError as observableThrowError,  Observable } from 'rxjs';
+import { map, catchError } from 'rxjs/operators';
+import { Node } from '../navigator/node';
+
+@Injectable()
+export class ExtSystemService {
+
+  private prefEndpoint: string;
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService) {
+    this.prefEndpoint = _prop.getUrl('mdm/administration/');
+  }
+
+  getExtSystemForScope(scope: string, key?: string): Observable<Node[]> {
+      if (key == null) {
+          key = '';
+      }
+
+    return this.http.get(this.prefEndpoint + scope + '/externalsystems').pipe(
+      map(response => plainToClass(Node, response.json().data)),
+          catchError(this.handleError));
+  }
+
+  getExtSystemAttributesForScope(scope: string, id: string, key?: string): Observable<Node[]> {
+      if (key == null) {
+          key = '';
+      }
+
+    return this.http.get(this.prefEndpoint + scope + '/externalsystems/attributes/' + id).pipe(
+      map(response => plainToClass(Node, response.json().data)),
+          catchError(this.handleError));
+  }
+
+  getExtSystem(key?: string) {
+      if (key == null) {
+          key = '';
+      }
+      return this.http.get(this.prefEndpoint + '?key=' + key).pipe(
+        map(response => plainToClass(Node, response.json().data)),
+          catchError(this.handleError));
+  }
+
+  getAttributeValueFromNode(node: Node, attribute: string) {
+    if (node.attributes !== undefined) {
+      for (let i in node.attributes) {
+        if (node.attributes[i].name === attribute) {
+          return node.attributes[i].value;
+        }
+      }
+    }
+    return '';
+  }
+
+  saveExtSystemAttr(scope: string, extSystemAttr: Node, extSystem: Node) {
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+
+    let structure = {};
+    structure['Name'] = extSystemAttr.name;
+
+    if (parseInt(extSystemAttr.id, 10) > 0) {
+      structure['Description'] = this.getAttributeValueFromNode(extSystemAttr, 'Description');
+      // update
+      return this.http.put(this.prefEndpoint + scope + '/externalsystems/attribute/' + extSystemAttr.id,
+        JSON.stringify(structure), options).pipe(
+          catchError(this.handleError)
+        );
+    } else {
+      structure['ExtSystemAttribute'] = extSystemAttr;
+      // only provide the ID as the backend will evaluate the whole json string
+      structure['ExtSystem'] = extSystem.id;
+      // create
+      return this.http.post(this.prefEndpoint + scope + '/externalsystems/attribute', JSON.stringify(structure), options).pipe(
+        catchError(this.handleError));
+    }
+  }
+
+  saveExtSystemMDMAttr(scope: string, extSystemMDMAttr: Node, extSystemAttr: Node) {
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+
+    let structure = {};
+    structure['Name'] = extSystemMDMAttr.name;
+
+    if (parseInt(extSystemMDMAttr.id, 10) > 0) {
+      structure['CompType'] = this.getAttributeValueFromNode(extSystemMDMAttr, 'CompType');
+      structure['CompName'] = this.getAttributeValueFromNode(extSystemMDMAttr, 'CompName');
+      structure['AttrName'] = this.getAttributeValueFromNode(extSystemMDMAttr, 'AttrName');
+      // update
+      return this.http.put(this.prefEndpoint + scope + '/externalsystems/mdmattribute/' + extSystemMDMAttr.id,
+        JSON.stringify(structure), options).pipe(
+          catchError(this.handleError)
+        );
+    } else {
+      structure['MDMAttribute'] = extSystemMDMAttr;
+      structure['ExtSystemAttribute'] = extSystemAttr.id;
+      // create
+      return this.http.post(this.prefEndpoint + scope + '/externalsystems/mdmattribute', JSON.stringify(structure), options).pipe(
+        catchError(this.handleError));
+    }
+  }
+
+  saveExtSystem(scope: string, extSystem: Node) {
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+
+    let structure = {};
+    structure['Name'] = extSystem.name;
+
+    if (parseInt(extSystem.id, 10) > 0) {
+      // update
+      structure['Description'] = this.getAttributeValueFromNode(extSystem, 'Description');
+      return this.http.put(this.prefEndpoint + scope + '/externalsystems/' + extSystem.id, JSON.stringify(structure), options).pipe(
+        catchError(this.handleError));
+    } else {
+      structure['ExtSystem'] = extSystem;
+      // create
+      return this.http.post(this.prefEndpoint + scope + '/externalsystems', JSON.stringify(structure), options).pipe(
+        catchError(this.handleError));
+    }
+  }
+
+  deleteExtSystem(scope: string, id: string) {
+    return this.http.delete(this.prefEndpoint + scope + '/externalsystems/' + id).pipe(
+      catchError(this.handleError));
+  }
+  deleteExtSystemAttr(scope: string, id: string) {
+    return this.http.delete(this.prefEndpoint + scope + '/externalsystems/attribute/' + id).pipe(
+      catchError(this.handleError));
+  }
+  deleteExtSystemMDMAttr(scope: string, id: string) {
+    return this.http.delete(this.prefEndpoint + scope + '/externalsystems/mdmattribute/' + id).pipe(
+      catchError(this.handleError));
+  }
+
+  private handleError(e: Error | any) {
+    if (e instanceof Response) {
+      let response = <Response> e;
+      if (response.status !== 200) {
+        return observableThrowError('Could not request extSystems! '
+          + 'Please check if application server is running and extSystem database is configured correctly.');
+      }
+    }
+    return this.httpErrorHandler.handleError(e);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-module.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-module.component.html
new file mode 100644
index 0000000..e818119
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-module.component.html
@@ -0,0 +1,30 @@
+<!--/********************************************************************************
+* Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+*
+* See the NOTICE file(s) distributed with this work for additional
+* information regarding copyright ownership.
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v. 2.0 which is available at
+* http://www.eclipse.org/legal/epl-2.0.
+*
+* SPDX-License-Identifier: EPL-2.0
+*
+********************************************************************************/-->
+
+<nav class="navbar navbar-default navbar-expand  bg-light">
+  <div class="container-fluid">
+    <div class="collapse navbar-collapse" id="bs-admin-navbar">
+      <a class="navbar-brand" style="font-weight: 500;">{{'administration.admin-modules.scope' | translate }}</a>
+      <ul class="nav navbar-nav mdm-link-list">
+        <li *ngFor="let m of links" [routerLinkActive]="['active']" class="nav-item">
+          <a (click)="onScopeChange(m.path)" routerLink="{{m.path}}" class="nav-link" style="cursor:pointer;">
+            {{m.name | translate}}
+          </a>
+        </li>
+      </ul>
+    </div>
+
+  </div>
+</nav>
+<mdm-preference [scope]="scope" [preferences]="preferences"></mdm-preference>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-module.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-module.component.ts
new file mode 100644
index 0000000..ab14b0a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-module.component.ts
@@ -0,0 +1,52 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, OnInit} from '@angular/core';
+import {Router} from '@angular/router';
+
+import { TRANSLATE } from '../core/mdm-core.module';
+import { PreferenceService, Preference } from '../core/preference.service';
+
+@Component({
+  selector: 'preference-module',
+  templateUrl: 'preference-module.component.html',
+  providers: []
+})
+export class PreferenceModuleComponent implements OnInit {
+
+  preferences: Preference[];
+  scope: string;
+  sub: any;
+
+  links = [
+    { name: TRANSLATE('administration.admin-modules.system'), path: 'system'},
+    { name: TRANSLATE('administration.admin-modules.source'), path: 'source'},
+    { name: TRANSLATE('administration.admin-modules.user'), path: 'user'}
+  ];
+  constructor(private router: Router,
+    private preferenceService: PreferenceService) { }
+
+  ngOnInit() {
+    this.onScopeChange('system');
+  }
+
+  onScopeChange(path: string) {
+    this.scope = path.toUpperCase();
+    if (this.scope !== undefined) {
+      this.preferenceService.getPreferenceForScope(this.scope)
+        .subscribe(pref => this.preferences = pref);
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-routing.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-routing.module.ts
new file mode 100644
index 0000000..b36bfc4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference-routing.module.ts
@@ -0,0 +1,41 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { PreferenceComponent } from './preference.component';
+import { PreferenceModuleComponent } from './preference-module.component';
+
+const moduleRoutes: Routes = [
+  {
+    path: '', component: PreferenceModuleComponent,
+    children: [
+      { path: ':scope', component: PreferenceComponent },
+      { path: '', redirectTo: 'system', pathMatch: 'full' }
+    ]
+  }
+];
+
+@NgModule({
+  imports: [
+    RouterModule.forChild(moduleRoutes)
+  ],
+  exports: [
+    RouterModule
+  ]
+})
+
+export class PreferenceRoutingModule { }
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.css
new file mode 100644
index 0000000..e1b304e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.css
@@ -0,0 +1,41 @@
+@charset "ISO-8859-1";
+
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+.form-group {
+  margin-bottom: 0;
+  padding-right: 0;
+ 	padding-left: 0;
+}
+
+.form-control {
+  border-radius: 0;
+}
+
+.btn {
+  border-radius: 0;
+}
+
+ul {
+  list-style-type: none;
+}
+
+#truncatelongtexts {
+  width: 100%;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.html
new file mode 100644
index 0000000..e72c10f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.html
@@ -0,0 +1,50 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+
+<table class="table table-bordered" style="table-layout: fixed;">
+  <tr>
+    <th class="col-lg-5" i18n="administration_preference Key|Key table header">Key</th>
+    <th class="col-lg-7" i18n="administration_preference Value|Value">Value</th>
+    <th style="width: 60px;"></th>
+    <th style="width: 60px;"></th>
+  </tr>
+  <tr *ngFor="let preference of preferences">
+    <td>
+      <div id="truncatelongtexts">
+        {{preference.key}}
+      </div>
+    </td>
+    <td>
+      <div id="truncatelongtexts">
+        {{preference.value}}
+      </div>
+    </td>
+    <td>
+      <button type="button" class="btn btn-default" (click)="editPreference(preference)" title="{{ 'administration.preference.btn-tooltip-edit-preference' | translate }}">
+		      <span class="fa fa-pencil-square-o"></span>
+	    </button>
+    </td>
+    <td>
+      <button type="button" class="btn btn-default" (click)="removePreference(preference)" title="{{ 'administration.preference.btn-tooltip-delete-preference' | translate }}">
+		    <span class="fa fa-times"></span>
+	    </button>
+    </td>
+  </tr>
+</table>
+<div class="col-lg-12">
+  <button type="button" class="btn btn-default pull-right" (click)="editPreference()">
+  	<span class="fa fa-plus"></span> {{'administration.preference.btn-add-preference' | translate }}
+  </button>
+</div>
+<edit-preference [scope]="scope"></edit-preference>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.ts
new file mode 100644
index 0000000..409b20c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.component.ts
@@ -0,0 +1,97 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, OnInit, ViewChild, Input, OnDestroy } from '@angular/core';
+import { FormGroup, FormControl, FormBuilder, FormArray, Validators } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+
+import { PreferenceService, Preference, Scope } from '../core/preference.service';
+import { EditPreferenceComponent } from './edit-preference.component';
+
+import { MDMNotificationService } from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+
+@Component( {
+    selector: 'mdm-preference',
+    templateUrl: './preference.component.html',
+    styleUrls: ['./preference.component.css']
+})
+export class PreferenceComponent implements OnInit, OnDestroy {
+
+  @Input() preferences: Preference[];
+  @Input() scope: string;
+  subscription: any;
+  sub: any;
+
+  @ViewChild( EditPreferenceComponent )
+  editPreferenceComponent: EditPreferenceComponent;
+
+  constructor( private formBuilder: FormBuilder,
+               private preferenceService: PreferenceService,
+               private route: ActivatedRoute,
+               private notificationService: MDMNotificationService,
+               private translateService: TranslateService) { }
+
+  ngOnInit() {
+  }
+
+  ngOnDestroy() {
+  }
+
+  editPreference( preference?: Preference ) {
+      this.subscription = this.editPreferenceComponent.childModal.onHide.subscribe(() => this.handleDialogResult() );
+      this.editPreferenceComponent.showDialog( preference );
+  }
+
+  removePreference( preference: Preference ) {
+      if (preference.id) {
+        this.preferenceService.deletePreference( preference.id )
+        .subscribe();
+      }
+      let index = this.preferences.findIndex( p => p === preference );
+      this.preferences.splice( index, 1 );
+  }
+
+  handleDialogResult() {
+      if ( !this.editPreferenceComponent.needSave ) {
+          return;
+      }
+
+      let preference = this.editPreferenceComponent.preferenceForm.value;
+      let index = this.preferences.findIndex( p => this.preferenceEqualsWithoutId( p, preference ) );
+
+      this.preferenceService.savePreference( preference )
+          .subscribe(
+            () => index !== -1 ? this.preferences[index] = preference : this.reloadPreference( preference ),
+            error => this.notificationService.notifyError(
+              this.translateService.instant('administration.preference.err-cannot-save-preference'), error)
+          );
+      this.subscription.unsubscribe();
+  }
+
+  reloadPreference( preference: Preference ) {
+      this.preferenceService.getPreferenceForScope( preference.scope, preference.key )
+          .subscribe(
+            p => this.preferences.push(p[0]),
+            error => this.notificationService.notifyError(
+              this.translateService.instant('administration.preference.err-cannot-update-preference'), error)
+          );
+  }
+
+  preferenceEqualsWithoutId( pref1: Preference, pref2: Preference ) {
+      return pref1.key === pref2.key && pref1.source === pref2.source && pref1.user === pref2.user;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.module.ts
new file mode 100644
index 0000000..49becfa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/administration/preference.module.ts
@@ -0,0 +1,45 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { NgModule } from '@angular/core';
+import { PreferenceRoutingModule } from './preference-routing.module';
+import { PreferenceModuleComponent } from './preference-module.component';
+import { PreferenceComponent } from './preference.component';
+import { EditPreferenceComponent } from './edit-preference.component';
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { PreferenceService } from '../core/preference.service';
+import { ComponentLoaderFactory } from 'ngx-bootstrap';
+
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    FormsModule,
+    ReactiveFormsModule,
+    PreferenceRoutingModule
+  ],
+  declarations: [
+    EditPreferenceComponent,
+    PreferenceModuleComponent,
+    PreferenceComponent
+  ],
+  exports: [
+  ],
+  providers: [
+    ComponentLoaderFactory,
+    PreferenceService
+  ],
+})
+export class PreferenceModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app-routing.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app-routing.module.ts
new file mode 100644
index 0000000..2198535
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app-routing.module.ts
@@ -0,0 +1,36 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule, Component } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { AuthGuard } from './authentication/authguard';
+import { Role } from './authentication/authentication.service';
+
+const appRoutes: Routes = [
+  { path: 'navigator', loadChildren: './navigator-view/mdm-navigator-view.module#MDMNavigatorViewModule' },
+  { path: 'administration', loadChildren: './administration/admin.module#AdminModule',
+    canActivate: [AuthGuard], data: { roles: [Role.Admin] } },
+  { path: '', redirectTo: 'navigator', pathMatch: 'full' }
+];
+
+@NgModule({
+  imports: [
+    RouterModule.forRoot(appRoutes)
+  ],
+  exports: [
+    RouterModule
+  ]
+})
+export class AppRoutingModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.component.html
new file mode 100644
index 0000000..e650581
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.component.html
@@ -0,0 +1,38 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+<nav class="navbar navbar-dark bg-dark fixed-top navbar-expand py-0">
+  <a class="navbar-brand" routerLink="/navigator" style="cursor:pointer;">openMDM5 Web</a>
+  <div class="collapse navbar-collapse" id="bs-mdm-navbar">
+      <ul class="navbar-nav mr-auto">
+        <li class="nav-item" *ngFor="let m of (links | authPipe | async)" [routerLinkActive]="['active']"><a class="nav-link" routerLink="{{m.path}}" style="cursor:pointer;"> {{m.name}}</a></li>
+      </ul>
+      <ul class="navbar-nav ml-md-auto">
+        <li class="nav-item"><span class="navbar-text" style="padding: 0 5px; vertical-align: middle;">{{ 'app.language' | translate }}</span> <p-dropdown [options]="languages" (onChange)="selectLanguage($event)" [(ngModel)]="selectedLanguage" [style]="{ 'margin-top': '2px' }"></p-dropdown></li>
+        <li class="nav-item"><a class="nav-link" [routerLink]="" (click)="showAboutDialog()" href="#">{{ 'app.about' | translate }}</a></li>
+        <li class="nav-item"><a class="nav-link" href="mdm/logout"><span class="fa fa-sign-in"></span> {{ 'app.logout' | translate }}<span *ngIf="user?.username" title="{{ 'app.roles' | translate }}: {{ rolesTooltip }}"> ({{ user?.username }})</span></a></li>
+      </ul>
+    </div>
+</nav>
+
+<div>
+  <router-outlet></router-outlet>
+</div>
+
+<p-dialog header="About" [(visible)]="displayAboutDialog" modal="true" dismissableMask="true" responsive="true">
+  <notice></notice>
+</p-dialog>
+
+<mdm-notifications></mdm-notifications>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.component.ts
new file mode 100644
index 0000000..abf1828
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.component.ts
@@ -0,0 +1,71 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit } from '@angular/core';
+import {DialogModule} from 'primeng/primeng';
+import { TranslateService } from '@ngx-translate/core';
+
+import {SelectItem} from 'primeng/api';
+import { User, Role } from './authentication/authentication.service';
+import { AuthenticationService } from './authentication/authentication.service';
+
+@Component({
+  selector: 'app-root',
+  templateUrl: './app.component.html'
+})
+export class AppComponent implements OnInit {
+
+  readonly TtlLogout = 'Logout';
+  readonly TtlAbout = 'About';
+  readonly TtlLanguage = 'Language';
+
+  languages = <SelectItem[]> [
+    { label: 'English', value: 'en' },
+    { label: 'Deutsch', value: 'de' },
+  ];
+
+  selectedLanguage = 'en';
+
+  links = [
+      { name: 'Administration', path: '/administration', roles: [ Role.Admin ] }
+  ];
+  displayAboutDialog = false;
+  user: User = null;
+  rolesTooltip: string;
+
+  constructor(private translate: TranslateService, private authService: AuthenticationService) {
+  }
+
+  ngOnInit() {
+    this.translate.langs = this.languages.map(i => i.value);
+    let browserLang = this.translate.getBrowserLang();
+    if (this.translate.langs.findIndex(l => l === browserLang) > -1) {
+      this.selectedLanguage = browserLang;
+    }
+    this.translate.setDefaultLang(this.selectedLanguage);
+    this.translate.use(this.selectedLanguage);
+    this.authService.getLoginUser().subscribe(value => {
+      this.user = value;
+      this.rolesTooltip = value.roles.join(', ');
+    })
+  }
+
+  selectLanguage($event: any) {
+    this.translate.use(this.selectedLanguage);
+  }
+
+  showAboutDialog() {
+    this.displayAboutDialog = true;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.module.ts
new file mode 100644
index 0000000..4cd625e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/app.module.ts
@@ -0,0 +1,97 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { BrowserModule } from '@angular/platform-browser';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { NgModule, ErrorHandler } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { HttpModule } from '@angular/http';
+import { HttpClient } from '@angular/common/http';
+
+import { TranslateModule, TranslateLoader, TranslateService } from '@ngx-translate/core';
+import { TranslateHttpLoader } from '@ngx-translate/http-loader';
+
+import { DialogModule, DropdownModule } from 'primeng/primeng';
+
+import { MDMCoreModule} from './core/mdm-core.module';
+import { MDMErrorHandler } from './core/mdm-error-handler';
+import { HttpErrorHandler } from './core/http-error-handler';
+import { MDMNotificationService } from './core/mdm-notification.service';
+
+import { AppComponent } from './app.component';
+import { AppRoutingModule } from './app-routing.module';
+
+import { NoticeComponent } from './notice.component';
+import { NodeService } from './navigator/node.service';
+import { NodeproviderService } from './navigator/nodeprovider.service';
+import { NavigatorService } from './navigator/navigator.service';
+import { BasketService } from './basket/basket.service';
+import { LocalizationService } from './localization/localization.service';
+import { FilereleaseService } from './filerelease/filerelease.service';
+import { QueryService } from './tableview/query.service';
+import { ViewService } from './tableview/tableview.service';
+import { environment } from '../environments/environment';
+import { FilesAttachableService } from './file-explorer/services/files-attachable.service';
+import { AuthenticationModule } from './authentication/authentication.module';
+
+// AoT requires an exported function for factories
+export function HttpLoaderFactory(http: HttpClient) {
+  return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
+}
+
+
+@NgModule({
+  imports: [
+    BrowserModule,
+    BrowserAnimationsModule,
+    HttpModule,
+    FormsModule,
+    MDMCoreModule,
+    AuthenticationModule,
+    DialogModule,
+    AppRoutingModule,
+    DropdownModule,
+    TranslateModule.forRoot({
+      loader: {
+          provide: TranslateLoader,
+          useFactory: HttpLoaderFactory,
+          deps: [HttpClient]
+      }
+  }),
+  ],
+  declarations: [
+    AppComponent,
+    NoticeComponent,
+  ],
+  providers: [
+    NodeService,
+    LocalizationService,
+    FilereleaseService,
+    BasketService,
+    NavigatorService,
+    QueryService,
+    NodeproviderService,
+    MDMNotificationService,
+    FilesAttachableService,
+    ViewService,
+    HttpErrorHandler,
+    TranslateService,
+    { provide: ErrorHandler, useClass: MDMErrorHandler }
+  ],
+  bootstrap: [AppComponent]
+})
+export class AppModule {
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/auth.pipe.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/auth.pipe.ts
new file mode 100644
index 0000000..a696573
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/auth.pipe.ts
@@ -0,0 +1,24 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import { AuthenticationService } from './authentication.service';
+import { forkJoin, Observable, of } from 'rxjs';
+import { map } from 'rxjs/operators';
+
+
+@Pipe({
+    name: 'authPipe',
+    pure: true
+})
+export class AuthPipe implements PipeTransform {
+    constructor(private authService: AuthenticationService) {
+    }
+
+    transform(linksWithRoles: { roles: string }[]): Observable<{ roles: string }[]> {
+        if (!linksWithRoles) {
+            return of(linksWithRoles);
+        }
+
+        return forkJoin(linksWithRoles.map(l => this.authService.isUserInRole(l.roles))).pipe(
+            map(booleanFilter => linksWithRoles.filter((l, i) => booleanFilter[i]))
+        );
+    }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authentication.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authentication.module.ts
new file mode 100644
index 0000000..0e80250
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authentication.module.ts
@@ -0,0 +1,27 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { NgModule } from '@angular/core';
+import { AuthPipe } from './auth.pipe';
+
+@NgModule({
+declarations: [
+    AuthPipe,
+],
+exports: [
+    AuthPipe,
+],
+})
+export class AuthenticationModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authentication.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authentication.service.ts
new file mode 100644
index 0000000..2a89bb8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authentication.service.ts
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Router, ResolveStart } from '@angular/router';
+import { PropertyService } from '../core/property.service';
+import { Observable } from 'rxjs';
+import { publishReplay, refCount, map, tap } from 'rxjs/operators';
+
+export class User {
+  username: string;
+  roles: string[];
+}
+
+export enum Role {
+  Admin = 'Admin',
+  User = 'DescriptiveDataAuthor',
+  Guest = 'Guest',
+}
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AuthenticationService {
+  readonly loginURL: string;
+  readonly logoutURL: string;
+  readonly currentUserURL: string;
+
+  private loginUser: Observable<User>;
+
+  constructor(private http: HttpClient,
+    private _prop: PropertyService) {
+    this.currentUserURL = _prop.getUrl('mdm/user/current');
+  }
+
+  isLoggedIn() {
+    return this.getLoginUser().pipe(map(user => user !== null));
+  }
+
+  getLoginUser() {
+    if (!this.loginUser) {
+      this.loginUser = this.loadUser().pipe(
+        publishReplay(1),
+        refCount()
+      );
+    }
+
+    return this.loginUser;
+  }
+
+  isUserInRole(roles: string | string[]) {
+    if (roles === undefined) {
+      return Observable.of(true);
+    } else if (typeof roles === 'string') {
+      roles = [ roles ];
+    }
+
+    return this.getLoginUser().pipe(
+          map(user => user.roles.filter(x => roles.includes(x)).length > 0)
+      );
+  }
+
+  private loadUser() {
+    return this.http.get<User>(this.currentUserURL, {
+      params: {
+        roles: Object.values(Role).join(',')
+      }
+    });
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authguard.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authguard.ts
new file mode 100644
index 0000000..fc126f5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/authentication/authguard.ts
@@ -0,0 +1,23 @@
+import { Injectable } from '@angular/core';
+import { CanActivate } from '@angular/router/src/utils/preactivation';
+import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
+
+import { AuthenticationService } from './authentication.service';
+
+@Injectable({
+    providedIn: 'root'
+})
+export class AuthGuard implements CanActivate {
+    path: ActivatedRouteSnapshot[];
+    route: ActivatedRouteSnapshot;
+
+    constructor(private authStateService: AuthenticationService) { }
+
+    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
+        if (route.data.roles) {
+            // check if current user has any role the route requires
+            return this.authStateService.isUserInRole(route.data.roles);
+        }
+        return true;
+    }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/basket.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/basket.service.spec.ts
new file mode 100644
index 0000000..df38fa5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/basket.service.spec.ts
@@ -0,0 +1,108 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { async, TestBed, inject } from '@angular/core/testing';
+import { BaseRequestOptions, Http, HttpModule, Response, ResponseOptions } from '@angular/http';
+import { MockBackend } from '@angular/http/testing';
+
+import { PreferenceService, Scope } from '../core/preference.service';
+import { PropertyService } from '../core/property.service';
+import { HttpErrorHandler } from '../core/http-error-handler';
+import { BasketService } from './basket.service';
+
+describe('BasketService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [
+        BasketService,
+        PropertyService,
+        PreferenceService,
+        MockBackend,
+        BaseRequestOptions,
+        HttpErrorHandler,
+        {
+          provide: Http,
+          useFactory: (mockBackend, options) => {
+            return new Http(mockBackend, options);
+          },
+          deps: [MockBackend, BaseRequestOptions]
+        }
+      ]
+    });
+  });
+
+
+  describe('getFileExtension()', () => {
+    it('should return value configured in preference', async(inject([BasketService, MockBackend], (basketService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+
+        let mockResponse = {
+          preferences: [
+          {
+            id: 2,
+            key: 'shoppingbasket.fileextensions',
+            scope: Scope.SYSTEM,
+            source: null,
+            user: null,
+            value: '[ { "label": "MyTool", "extension": "mdm-mytool" }, { "label": "OtherTool", "extension": "mdm-other" } ]'
+          }
+        ]};
+        conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+      });
+
+      basketService.getFileExtensions().subscribe(
+        ext => expect(ext).toEqual([
+          { 'label': 'MyTool', 'extension': 'mdm-mytool' },
+          { 'label': 'OtherTool', 'extension': 'mdm-other' } ]),
+        err => expect(err).toBeUndefined());
+    })));
+
+    it('should return empty array (default) if no preferences were found',
+        async(inject([BasketService, MockBackend], (basketService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+        conn.mockRespond(new Response(new ResponseOptions({ body: { preferences: [] } })));
+      });
+
+      basketService.getFileExtensions().subscribe(
+        ext => expect(ext).toEqual([]),
+        err => expect(err).toBeUndefined());
+    })));
+
+    it('should return empty array (default) if no preferences value is invalid',
+        async(inject([BasketService, MockBackend], (basketService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+        let mockResponse = {
+          preferences: [
+          {
+            id: 2,
+            key: 'shoppingbasket.fileextensions',
+            scope: Scope.SYSTEM,
+            source: null,
+            user: null,
+            value: 'asdf'
+          }
+        ]};
+        conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+      });
+
+      basketService.getFileExtensions().subscribe(
+        ext => expect(ext).toEqual([]));
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/basket.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/basket.service.ts
new file mode 100644
index 0000000..783a868
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/basket.service.ts
@@ -0,0 +1,145 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable, Output, EventEmitter} from '@angular/core';
+import { Http, Response, Headers, RequestOptions } from '@angular/http';
+
+import {of as observableOf, Observable} from 'rxjs';
+import {defaultIfEmpty, catchError, mergeMap, map} from 'rxjs/operators';
+
+import {Type, Exclude, plainToClass, serialize, deserialize} from 'class-transformer';
+
+import {MDMItem} from '../core/mdm-item';
+import {PreferenceService, Preference, Scope} from '../core/preference.service';
+
+import { HttpErrorHandler } from '../core/http-error-handler';
+import { PropertyService } from '../core/property.service';
+
+export class Basket {
+  name: string;
+  @Type(() => MDMItem)
+  items: MDMItem[] = [];
+
+  constructor(name: string, items: MDMItem[]) {
+    this.name = name;
+    this.items = items;
+  }
+}
+
+@Injectable()
+export class BasketService {
+
+  @Output() itemsAdded$ = new EventEmitter<MDMItem[]>();
+  @Output() itemsRemoved$ = new EventEmitter<MDMItem[]>();
+  readonly preferencePrefix = 'basket.nodes.';
+  readonly preferenceFileextensions = 'shoppingbasket.fileextensions';
+
+  items: MDMItem[] = [];
+
+  constructor(private _pref: PreferenceService,
+              private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService) {
+  }
+
+  public add(item: MDMItem) {
+    let existingItem = this.items.find(i => i.equals(item));
+
+    if (!existingItem) {
+      this.items.push(item);
+      this.itemsAdded$.emit([item]);
+    }
+  }
+
+  public addAll(items: MDMItem[]) {
+    let newItemsWithoutExisting = items.filter(newItem => this.items.findIndex(existingItem => existingItem.equals(newItem)) < 0);
+
+    if (newItemsWithoutExisting) {
+      newItemsWithoutExisting.forEach(item => this.items.push(item));
+      this.itemsAdded$.emit(newItemsWithoutExisting);
+    }
+  }
+
+  public remove(item: MDMItem) {
+    let itemsToRemove = this.items.filter(i => i.equals(item));
+
+    if (itemsToRemove.length >= 0) {
+      itemsToRemove.forEach(i => this.items = this.items.filter(it => !it.equals(i)));
+      this.itemsRemoved$.emit(itemsToRemove);
+    }
+  }
+
+  removeAll() {
+    this.items = [];
+  }
+
+  saveBasketWithName(name: string) {
+    return this.saveBasket(new Basket(name, this.items));
+  }
+
+  saveBasket(basket: Basket) {
+    return this._pref.savePreference(this.basketToPreference(basket)).subscribe();
+  }
+
+  getBaskets() {
+    return this._pref.getPreference(this.preferencePrefix).pipe(
+      map(preferences => preferences.map(p => this.preferenceToBasket(p))));
+  }
+
+  getItems() {
+    return this.items;
+  }
+
+  setItems(items: MDMItem[]) {
+    this.items = items;
+  }
+
+  getBasketAsXml(basket: Basket) {
+    return this.http.post(this._prop.getUrl('mdm/shoppingbasket'), basket).pipe(
+      map(r => r.text()));
+  }
+
+  getBasketAsAtfx(basket: Basket) {
+    let headers = new Headers();
+    headers.append('Content-Type', 'application/xml');
+
+    return this.getBasketAsXml(basket)
+      .flatMap(b => this.http.post(this._prop.getUrl('mdm/export'), b, { headers: headers }))
+      .map(r => r.text());
+  }
+
+  getFileExtensions() {
+    return this._pref.getPreferenceForScope(Scope.SYSTEM, this.preferenceFileextensions)
+      .flatMap(prefs => prefs)
+      .map(pref => JSON.parse(pref.value))
+      .catch(e => {
+        console.log('Unable to parse value of preference "' + this.preferenceFileextensions + '"!');
+        return Observable.of([]);
+      })
+      .defaultIfEmpty([]);
+  }
+
+  private preferenceToBasket(pref: Preference) {
+    return deserialize(Basket, pref.value);
+  }
+
+  private basketToPreference(basket: Basket) {
+    const pref = new Preference();
+    pref.value = serialize(basket);
+    pref.key = this.preferencePrefix + basket.name;
+    pref.scope = Scope.USER;
+    return pref;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.css
new file mode 100644
index 0000000..3e61b3a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.css
@@ -0,0 +1,50 @@
+@charset "ISO-8859-1";
+
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+.remove {
+  color: black;
+  cursor: pointer;
+  float: right;
+}
+
+.fileupload {
+  overflow: hidden;
+  position: relative;
+}
+
+.fileupload input.upload {
+  float: right;
+  position: absolute;
+  top: 0;
+  right: 0;
+  margin: 0;
+  padding: 0;
+  font-size: 20px;
+  cursor: pointer;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+
+a.disabled {
+  pointer-events: none;
+  cursor: not-allowed;
+}
+
+.badge{
+  margin: 0 0 2px 6px;
+  float: none;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.html
new file mode 100644
index 0000000..fc93595
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.html
@@ -0,0 +1,174 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+ <style>
+    :host /deep/ .dropdown {
+     width: 200px;
+   }
+
+    :host /deep/ .dropdown-toggle {
+     overflow: hidden;
+     padding-right: 24px/* Optional for caret */
+     ;
+     text-align: left;
+     text-overflow: ellipsis;
+     width: 100%;
+   }
+   /* Optional for caret */
+
+    :host /deep/ .dropdown-toggle .caret {
+     position: absolute;
+     right: 12px;
+     top: calc(50% - 2px);
+   }
+   .ui-button-text {
+     padding: 0;
+   }
+
+   :host /deep/ .ui-splitbutton.ui-buttonset .ui-button {
+     color: black;
+     border: 1px solid #ccc;
+     font-size: 14px;
+     height: 37px;
+     background-color: transparent;
+   }
+   :host /deep/ .ui-splitbutton.ui-buttonset .ui-button:hover {
+     color: black;
+     background-color: #e6e6e6;
+     border-color: #adadad;
+   }
+ </style>
+
+<div style="padding-top: 15px;">
+  <accordion>
+    <accordion-group #basketGroup [isOpen]="false">
+      <div accordion-heading class="thinheader container-fluid">
+        <div class="row">
+          <div class="col text-left">
+            {{'basket.mdm-basket.shopping-basket' | translate }} &nbsp;&nbsp;
+            <mdm-view (click)="onViewClick($event)"></mdm-view>
+          </div>
+          <div class="col text-right">
+            <button type="button" class="btn btn-mdm" (click)="clearBasket($event)"  title="{{'basket.mdm-basket.tooltip-clear-shopping-basket' | translate }}"><span class="fa fa-eraser"></span></button>
+            <p-splitButton icon="fa fa-arrow-circle-o-down" class="dropdown" (onClick)="saveBasketWithExtension($event, 'mdm')" (onDropdownClick)="stopEvent($event)" title="{{'basket.mdm-basket.tooltip-download-shopping-basket' | translate }}" [model]="launchers" [disabled]="isDownloadDisabled()"></p-splitButton>
+            <div class="fileupload btn btn-mdm" title="{{'basket.mdm-basket.tooltip-upload-shopping-basket' | translate }}" (click)=onUploadClick($event)>
+              <span class="fa fa-arrow-circle-o-up"></span>
+              <input title="{{'basket.mdm-basket.tooltip-upload-shopping-basket' | translate }}" class="upload" name="datei" type="file" [accept]="allowedExtensions" id="fileInput" (change)="onUploadChange($event)">
+            </div>
+            <button type="button" type="submit" class="btn btn-mdm" (click)="showLoadModal($event)"  title="{{'basket.mdm-basket.tooltip-open-shopping-basket' | translate }}"><span class="fa fa-folder-open"></span></button>
+            <button type="button" type="submit" class="btn btn-mdm btn-outline-secondary" (click)="showSaveModal($event)" title="{{'basket.mdm-basket.tooltip-save-shopping-basket' | translate }}"><span class="fa fa-floppy-o"></span></button>
+            &nbsp;&nbsp;
+            <span class="fa" [ngClass]="{'fa-chevron-down': basketGroup?.isOpen, 'fa-chevron-right': !basketGroup?.isOpen}"></span>
+          </div>
+        </div>
+      </div>
+      <div class="container-fluid">
+        <div class="row">
+          <mdm-tableview [results]="basketContent"
+                         [view]="viewComponent.selectedView"
+                         isRemovable="true"
+                         [menuItems]="contextMenuItems"
+                         [selectedEnvs]="environments"
+                         [environments]="environments">
+          </mdm-tableview>
+        </div>
+      </div>
+    </accordion-group>
+  </accordion>
+</div>
+
+<p-confirmDialog header="Information" icon="pi pi-exclamation-triangle" ></p-confirmDialog>
+
+<div bsModal #lgLoadModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="SelectSearchComponents" aria-hidden="true" (keyup.enter)="loadBasket()">
+  <div class="modal-dialog modal-md">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" title="{{ 'basket.mdm-basket.tooltip-close' | translate }}" class="close" (click)="childLoadModal.hide()" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+        <h4 class="modal-title">{{'basket.mdm-basket.load-shopping-basket' | translate }}</h4>
+      </div>
+      <div class="modal-body">
+        <div class="container-fluid">
+          <div class="row" *ngIf="baskets.length > 0">
+            <ul class="list-group" style="max-height:80vh; padding: 0; list-style-type: none; overflow-y:auto;">
+              <div style="display: table; width: 100%; border: 1px solid #ddd;">
+                <li class="list-group-item" *ngFor="let basket of baskets" [ngClass]="{'active': selectedBasket == basket}" (click)="toggleSelect(basket)" (dblclick)="loadBasket(basket)" style="cursor: pointer">
+                  {{basket.name}}<span class="badge">{{basket.items.length}}</span>
+                </li>
+              </div>
+            </ul>
+          </div>
+          <div class="row" *ngIf="baskets.length === 0">
+            {{'basket.mdm-basket.no-saved-shopping-baskets-available' | translate }}
+          </div>
+          <div class="row" style="margin-top: 20px;">
+            <button type="button" class="btn btn-outline-secondary pull-right" (click)="loadBasket()" [disabled]="baskets.length <= 0 || selectedBasket == undefined">
+              <span class="fa fa-upload"></span> {{'basket.mdm-basket.btn-load' | translate }}
+            </button>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div bsModal #lgSaveModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="SelectSearchComponents" aria-hidden="true">
+  <div class="modal-dialog modal-md">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" title="{{'basket.mdm-basket.close' | translate }}" class="close" (click)="childSaveModal.hide()" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+        <h4 class="modal-title">{{'basket.mdm-basket.save-basket-as' | translate }}:</h4>
+      </div>
+      <div class="modal-body">
+        <div class="container-fluid">
+          <div class="row" *ngIf="baskets.length > 0">
+            <p-dataTable
+              [value]="baskets"
+              resizableColumns="false"
+              [reorderableColumns]="false"
+              [rows]="10"
+              [paginator]="true"
+              [pageLinks]="3"
+              [rowsPerPageOptions]="[10,20,50]"
+              [(selection)]="selectedRow"
+              (onRowClick)="onRowSelect($event)"
+              (onRowSelect)="onRowSelect($event)">
+              <p-column [style]="{'width':'30px'}" selectionMode="single"></p-column>
+              <p-column header="{{ 'basket.mdm-basket.existing-shopping-baskets' | translate }}">
+                <ng-template pTemplate="body" let-col let-row="rowData" >
+                  {{row.name}}
+                </ng-template>
+              </p-column>
+            </p-dataTable>
+          </div>
+          <div class="row" style="margin-top: 15px;">
+            <div class="col-md-10" style="padding-left: 0;">
+              <input type="text" class="form-control" placeholder="{{'basket.mdm-basket.shopping-basket-name' | translate }}" [value]="basketName" (input)="basketName = $event.target.value" (keyup.enter)="saveBasket($event)" required>
+            </div>
+            <div class="col-md-2" style="padding: 0;">
+              <button type="button" class="btn btn-outline-secondary pull-right" (click)="saveBasket($event)" [disabled]="!basketName" title="{{getSaveBtnTitle()}}">
+                <span class="fa fa-floppy-o"></span> {{'basket.mdm-basket.btn-shopping-basket' | translate }}
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<overwrite-dialog></overwrite-dialog>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.ts
new file mode 100644
index 0000000..40fa2ba
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.component.ts
@@ -0,0 +1,425 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, Input, Output, EventEmitter, OnInit, ViewChild } from '@angular/core';
+import { DomSanitizer } from '@angular/platform-browser';
+import { ModalDirective } from 'ngx-bootstrap';
+
+import { BasketService, Basket} from './basket.service';
+
+import { MDMItem} from '../core/mdm-item';
+import { OverwriteDialogComponent } from '../core/overwrite-dialog.component';
+import { NavigatorService } from '../navigator/navigator.service';
+import { Node} from '../navigator/node';
+import { NodeService } from '../navigator/node.service';
+import { TableviewComponent } from '../tableview/tableview.component';
+import { ViewComponent } from '../tableview/view.component';
+import { View } from '../tableview/tableview.service';
+import { QueryService, SearchResult, Row } from '../tableview/query.service';
+
+import { deserialize } from 'class-transformer';
+
+import {MenuItem} from 'primeng/primeng';
+import * as FileSaver from 'file-saver';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+import { streamTranslate, TRANSLATE } from '../core/mdm-core.module';
+import {ConfirmationService} from 'primeng/api';
+import { Observable } from 'rxjs/Observable';
+import { forkJoin, throwError } from 'rxjs';
+import { map, flatMap } from 'rxjs/operators';
+
+@Component({
+  selector: 'mdm-basket',
+  templateUrl: 'mdm-basket.component.html',
+  styleUrls: ['./mdm-basket.component.css'],
+})
+export class MDMBasketComponent implements OnInit {
+  @Output() onActive = new EventEmitter<Node>();
+  @Output() onSelect = new EventEmitter<Node>();
+  @Input() activeNode: Node;
+
+  exportableTypes = ['Project', 'Pool', 'Test', 'TestStep', 'Measurement'];
+
+  basketName = '';
+  basketContent: SearchResult = new SearchResult();
+  basket = 'Warenkorb';
+
+  baskets: Basket[] = [];
+  selectedBasket: Basket;
+  environments: Node[];
+
+  public selectedRow: string;
+  public lazySelectedRow: string;
+
+  _currentChange: any;
+
+  contextMenuItems: MenuItem[] = [
+      { label: 'Remove selection from basket', icon: 'fa fa-times', command: (event) => this.removeSelected() }
+  ];
+
+  fixedLaunchers: MenuItem[] = [
+    {label: 'ATFX', command: (event) => this.saveBasketAsATFX(event.originalEvent)}
+  ];
+  launchers: MenuItem[] = [];
+  allowedExtensions: string[] = [];
+
+  @ViewChild(TableviewComponent)
+  tableViewComponent: TableviewComponent;
+  @ViewChild(ViewComponent)
+  viewComponent: ViewComponent;
+  @ViewChild('lgLoadModal')
+  childLoadModal: ModalDirective;
+  @ViewChild('lgSaveModal')
+  childSaveModal: ModalDirective;
+  @ViewChild(OverwriteDialogComponent)
+  overwriteDialogComponent: OverwriteDialogComponent;
+
+  constructor(private _basketService: BasketService,
+              private queryService: QueryService,
+              private navigatorService: NavigatorService,
+              private sanitizer: DomSanitizer,
+              private nodeService: NodeService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService,
+              private confirmationService: ConfirmationService) {
+  }
+
+  removeSelected() {
+    this._basketService.remove(this.tableViewComponent.menuSelectedRow.getItem());
+  }
+
+  ngOnInit() {
+    streamTranslate(this.translateService, TRANSLATE('basket.mdm-basket.remove-selection')).subscribe(
+      (msg: string) => this.contextMenuItems[0].label = msg);
+
+    this.nodeService.getRootNodes().subscribe(
+      envs => this.environments = envs,
+      error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-load-sources'))
+        .subscribe(msg => this.notificationService.notifyError(msg, error)
+    ));
+
+    this._basketService.getFileExtensions()
+      .map(launchers => <{ menuItems: MenuItem[], extensions: string[] }>{
+          menuItems: launchers.map((l: { label: string; extension: string; }) =>  <MenuItem> {
+            label: l.label,
+            command: (event) => this.saveBasketWithExtension(event.originalEvent, l.extension) }),
+          extensions: launchers.map((l: { extension: string; }) => '.' + l.extension).join(',')
+      })
+      .subscribe(({menuItems, extensions}) => {
+        this.launchers = this.fixedLaunchers.concat(menuItems);
+        this.allowedExtensions = [ 'application/xml' ].concat(extensions);
+      });
+
+    this.setItems(this._basketService.items);
+
+    this._basketService.itemsAdded$.subscribe(
+      items => this.addItems(items),
+      error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-add-selection'))
+        .subscribe(msg => this.notificationService.notifyError(msg, error)
+    ));
+
+    this._basketService.itemsRemoved$.subscribe(
+      items => this.removeItems(items),
+      error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-remove-selection'))
+        .subscribe(msg => this.notificationService.notifyError(msg, error)
+    ));
+
+    this.viewComponent.viewChanged$.subscribe(
+      () => this.setItems(this._basketService.items),
+      error => this.translateService.getTranslation(TRANSLATE('basket.mdm-basket.err-cannot-select-view'))
+        .subscribe(msg => this.notificationService.notifyError(msg, error)
+    ));
+  }
+
+  onViewClick(e: Event) {
+    e.stopPropagation();
+  }
+
+  setItems(items: MDMItem[]) {
+    this.basketContent.rows = [];
+    this.addItems(items);
+  }
+
+  addItems(items: MDMItem[]) {
+    if (this.viewComponent.selectedView) {
+      this.queryService.queryItems(items, this.viewComponent.selectedView.columns.map(c => c.type + '.' + c.name))
+        .forEach(q =>
+          q.subscribe(
+          r => this.addData(r.rows),
+          error => this.notificationService.notifyError(
+            this.translateService.instant('basket.mdm-basket.err-cannot-add-items-to-shopping-basket'), error))
+        );
+    }
+  }
+
+  removeItems(items: MDMItem[]) {
+    // copy and reasign to get new object refference triggering angular change detection in tableview.
+    let tmp = Object.assign({}, this.basketContent);
+    items.forEach(item =>
+      tmp.rows = tmp.rows.filter(row =>
+        !(row.source === item.source && row.type === item.type && row.id === item.id)));
+    this.basketContent = tmp;
+  }
+
+  setView(view: View) {
+    console.log('setView', view);
+  }
+
+  saveBasket(e: Event) {
+    if (e) {
+      e.stopPropagation();
+    }
+    if (this.baskets.find(f => f.name === this.basketName) != undefined) {
+      this.childSaveModal.hide();
+      this.overwriteDialogComponent.showOverwriteModal(
+        this.translateService.instant('basket.mdm-basket.item-save-shopping-basket')).subscribe(
+          needSave => this.saveBasket2(needSave),
+          error => {
+            this.saveBasket2(false);
+            this.notificationService.notifyError(this.translateService.instant('basket.mdm-basket.err-save-shopping-basket'), error);
+        });
+    } else {
+      this.saveBasket2(true);
+    }
+  }
+
+  saveBasket2(save: boolean) {
+    if (save) {
+      this._basketService.saveBasketWithName(this.basketName);
+      this.childSaveModal.hide();
+    } else {
+      this.childSaveModal.show();
+    }
+  }
+
+  loadBasket(basket?: Basket) {
+    if (basket == undefined) {
+      basket = this.selectedBasket;
+      if (this.selectedBasket == undefined) {
+        return;
+      }
+    }
+    this.basketName = basket.name;
+    this.setItems(basket.items);
+    this._basketService.setItems(basket.items);
+    this.childLoadModal.hide();
+  }
+
+  loadBaskets() {
+    this._basketService.getBaskets().subscribe(
+      baskets => this.baskets = baskets,
+      error => this.notificationService.notifyError(
+        this.translateService.instant('basket.mdm-basket.err-cannot-load-shopping-basket'), error));
+  }
+
+  clearBasket(e: Event) {
+    e.stopPropagation();
+    this.basketContent = new SearchResult();
+    this._basketService.removeAll();
+    this.basketName = '';
+  }
+
+  showLoadModal(e: Event) {
+    e.stopPropagation();
+    this.selectedBasket = undefined;
+    this.loadBaskets();
+    this.childLoadModal.show();
+  }
+
+  showSaveModal(e: Event) {
+    e.stopPropagation();
+    this.loadBaskets();
+    this.basketName = this.selectedBasket ? this.selectedBasket.name : '';
+    this.childSaveModal.show();
+  }
+
+  stopEvent(event: Event) {
+    event.stopPropagation();
+  }
+
+  saveBasketWithExtension(event: any, extension: string) {
+    if (event) {
+      event.stopPropagation();
+    }
+    let downloadContent = new Basket(this.basketName, this._basketService.getItems());
+
+    this._basketService.getBasketAsXml(downloadContent)
+      .map(xml => new Blob([xml], { type: 'application/xml' }))
+      .subscribe(blob => this.saveAsFile(blob, extension, 'shoppingbasket'));
+  }
+
+  isExportable(item: MDMItem) {
+    return this.exportableTypes.indexOf(item.type) >= 0;
+  }
+
+  saveBasketAsATFX(event: any) {
+    if (event) {
+      event.stopPropagation();
+    }
+    const notExportableItems = this._basketService.getItems().filter(i => !this.isExportable(i));
+    const exportableItems = this._basketService.getItems().filter(i => this.isExportable(i)).map(i => i.type).join(', ');
+
+    if (exportableItems.length === 0) {
+      // No exportable item in shopping basket -> show message and cancel export
+      const msg = this.translateService.instant('basket.mdm-basket.msg-atfx-only-supports-types',
+          { types: this.exportableTypes.join(', ') })
+          + ' ' + this.translateService.instant('basket.mdm-basket.msg-only-not-exportable-types-selected',
+          { types: notExportableItems.map(i => i.type).join(', ') });
+
+      this.confirmationService.confirm({
+        message: msg,
+        acceptLabel: 'OK',
+        rejectVisible: false,
+      });
+    } else if (notExportableItems.length > 0) {
+      // shopping basket contains not exportable items -> show message and ask if export should continue
+      const msg = this.translateService.instant('basket.mdm-basket.msg-atfx-only-supports-types',
+          { types: this.exportableTypes.join(', ') })
+          + ' ' + this.translateService.instant('basket.mdm-basket.msg-not-exportable-types-continue',
+          { types: exportableItems });
+
+      this.confirmationService.confirm({
+        message: msg,
+        acceptLabel: 'Yes',
+        rejectLabel: 'No',
+        icon: 'pi pi-question-circle',
+        accept: () => this.exportItemsToAtfx(this._basketService.getItems().filter(i => this.isExportable(i))),
+        rejectVisible: true,
+      });
+    } else {
+      this.exportItemsToAtfx(this._basketService.getItems());
+    }
+  }
+
+  exportItemsToAtfx(basket: MDMItem[]) {
+    let downloadContent = new Basket(this.basketName, basket);
+
+    this._basketService.getBasketAsAtfx(downloadContent)
+      .map(atfx => new Blob([atfx], { type: 'application/xml' }))
+      .subscribe(atfx => this.saveAsFile(atfx, '.atfx'));
+  }
+
+  saveAsFile(blob: Blob, fileExtension: string, defaultFilename = 'export') {
+    let name = 'export.' + fileExtension;
+    if (this.basketName && this.basketName.trim().length !== 0) {
+      name = this.basketName + '.' + fileExtension;
+    }
+    FileSaver.saveAs(blob, name);
+  }
+
+  onUploadChange(event: Event) {
+    this._currentChange = event.target;
+    this.onUploadEvent(this._currentChange);
+  }
+
+  onUploadClick(e: Event) {
+    e.stopPropagation();
+  }
+
+  toggleSelect(basket: Basket) {
+    this.selectedBasket = this.selectedBasket === basket ? undefined : basket;
+  }
+
+  isDownloadDisabled() {
+    return this.basketContent.rows.length <= 0;
+  }
+
+  getSaveBtnTitle() {
+    return this.basketName
+      ? TRANSLATE('basket.mdm-basket.tooltip-save-shopping-basket')
+      : TRANSLATE('basket.mdm-basket.tooltip-no-name-set');
+  }
+
+  private onUploadEvent(fileInput: any) {
+    if (fileInput.files[0]) {
+      const readFile = (blob: Blob): Observable<string> => Observable.create(o => {
+        if (!(blob instanceof Blob)) {
+          o.error(new Error('Parameter `blob` must be an instance of Blob.'));
+          return;
+        }
+
+        const fileReader = new FileReader();
+        fileReader.onload = () => o.next(fileReader.result);
+        fileReader.onloadend = () => o.complete();
+        fileReader.onabort = err => o.error(err);
+        fileReader.onerror = err => o.error(err);
+        return fileReader.readAsText(blob);
+      });
+
+      readFile(fileInput.files[0]).pipe(
+        flatMap(xml => this.parseXmlShoppingBasket(xml))
+      ).subscribe(
+        basket => this.loadBasket(basket),
+        err => this.notificationService.notifyWarn('Could not load shopping basket from file.', err)
+      );
+    }
+  }
+
+  private parseXmlShoppingBasket(xml: string) {
+    let oParser = new DOMParser();
+    let oDOM = oParser.parseFromString(xml, 'application/xml');
+    // print the name of the root element or error message
+    if (oDOM.documentElement.tagName !== 'shoppingbasket') {
+      if (oDOM.documentElement.innerText) {
+        return throwError(new Error('Error while parsing shopping basket: ' + oDOM.documentElement.innerText));
+      } else {
+        return throwError(new Error('Error while parsing shopping basket: XML is missing shoppingbasket root tag'));
+      }
+    }
+
+    // load the name of the shopping basket
+    let name = '';
+    let nameTags = oDOM.documentElement.getElementsByTagName('name');
+    if (nameTags.length > 0) {
+      name = nameTags[0].textContent;
+    }
+
+    // load the business objectes defined by the resturi values in the xml file
+    let items: Observable<Node[]>[] = [];
+    let uris = oDOM.documentElement.getElementsByTagName('resturi');
+    if (uris.length === 0) {
+      return throwError(new Error('No resturis found!'));
+    }
+    for (let uri of <any>uris) {
+      let url = uri.textContent;
+      items.push(this.nodeService.getNodesByAbsoluteUrl(url));
+    }
+
+    // map business objects to MDMItems and load basket
+    return forkJoin(items).pipe(
+      map(n => n.map(x => new MDMItem(x[0].sourceName, x[0].type, x[0].id))),
+      map(i => new Basket(name, i)));
+  }
+
+  private addData(rows: Row[]) {
+    this.basketContent.rows.push(... rows);
+    // copy and reasign to get new object refference triggering angular change detection in tableview.
+    this.basketContent = Object.assign({}, this.basketContent);
+  }
+
+  onRowSelect(e: any) {
+    if (this.lazySelectedRow !== e.data) {
+      this.selectedRow = e.data;
+      this.basketName = e.data.name;
+    } else {
+      this.selectedRow = undefined;
+      this.basketName = '';
+    }
+    this.lazySelectedRow = this.selectedRow;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.module.ts
new file mode 100644
index 0000000..d74cbd6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/basket/mdm-basket.module.ts
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { NgModule } from '@angular/core';
+import { MDMBasketComponent } from './mdm-basket.component';
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { TableViewModule } from '../tableview/tableview.module';
+
+import {SplitButtonModule, ConfirmDialogModule, ConfirmationService} from 'primeng/primeng';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    TableViewModule,
+    SplitButtonModule,
+    ConfirmDialogModule,
+  ],
+  declarations: [ MDMBasketComponent ],
+  exports: [ MDMBasketComponent],
+  providers: [ ConfirmationService ],
+})
+export class MDMBasketModule { }
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/chart-viewer.style.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/chart-viewer.style.css
new file mode 100644
index 0000000..364c1cb
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/chart-viewer.style.css
@@ -0,0 +1,167 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+.toolbar {

+  background-color: #f8f8f8;

+  border-color:#ddd !important;

+  border-radius: 4px;

+  border: 1px solid;

+  margin-bottom: 4px;

+}

+

+.thin {

+  padding: 4px;

+}

+

+.toggler {

+  text-align: right;

+  color: #6c757d;

+  cursor: pointer;

+}

+

+.toggler:hover {

+  color: black;

+}

+

+p-listbox >>> .ui-listbox-item {

+  padding: 4px 0 4px 8px !important;

+}

+

+p-listbox >>> p-header {

+  display: grid; 

+  grid-template-columns: 12% 63% 25%;

+  align-items: center;

+}

+

+p-listbox >>> .ui-listbox-header {

+  border-bottom-left-radius: 0;

+  border-bottom-right-radius: 0;

+  /* border-bottom-color: rgb(166,166,166); */

+}

+

+p-listbox >>> .ui-listbox-header-w-checkbox {

+  padding: 4px 8px;

+}

+

+.hiddenList >>> .ui-listbox-list-wrapper {

+  display: none;

+}

+

+.hiddenList >>> .ui-listbox-header-w-checkbox {

+  display: none;

+}

+

+p-listbox >>> .ypanel .ui-listbox-header-w-checkbox {

+  text-align: right;

+}

+

+p-togglebutton >>> .ui-button {

+  font-size: 14px;

+  margin: 0 3px;

+  color: #6c757d;

+  background-color: transparent;

+  background-image: none;

+  border-color: #6c757d;

+}

+

+p-togglebutton >>> .ui-button.ui-state-active {

+  /* color: #333333!important; */

+  color: #fff!important;

+  background-color: #a0a0a0;

+}

+

+p-togglebutton >>> .ui-button.ui-state-active >>> .ui-button-icon-left {

+  /* color: #333333!important; */

+  color: #fff!important;

+  background-color: #a0a0a0;

+}

+

+p-togglebutton >>> .ui-button:not(.ui-state-active).ui-state-focus {

+  border-color: #6c757d;

+  background-color: transparent!important;

+}

+

+p-togglebutton >>> .ui-button:not(.ui-state-active).ui-state-focus >>> .ui-button-icon-left {

+  color: #6c757d!important;

+}

+

+p-spinner {

+  margin: 0 3px;

+}

+

+p-spinner >>> .ui-button {

+  font-size: 14px;

+  color: #6c757d;

+  background-color: transparent;

+  background-image: none;

+  border-color: #6c757d;

+}

+

+p-spinner >>> .ui-button:hover {

+  background-color:#c8c8c8;

+  border-color:#c8c8c8;

+  color:#333333;

+}

+

+p-spinner >>> .ui-spinner {

+  margin-top: -3px;

+}

+

+p-spinner >>> .ui-spinner-input {

+  height: 32px;

+}

+

+.hidden {

+  display: none;

+}

+

+.channelList {

+  list-style-type: none;

+  padding: 0;

+  margin-bottom: 0;

+  min-height: 80px;

+}

+

+.row {

+  display: grid;

+  grid-template-columns: 155px 185px;

+  align-items: center;

+  padding: 1px 8px 1px 8px;

+}

+

+p-panel >>> .ui-panel-content.ui-widget-content {

+  overflow-x: scroll;

+  overflow-y: visible;

+}

+

+p-panel >>> .ui-panel .ui-panel-titlebar {

+  background-color: inherit;

+  border-color: rgb(166,166,166);

+  padding: 6px 12px;

+}

+

+p-panel >>> .ui-panel .ui-panel-content {

+  border-color: rgb(166,166,166);

+  border-bottom-left-radius: 3px;

+  border-bottom-right-radius: 3px;

+  padding: 4px 10px

+}

+

+p-panel >>> .ui-inputtext {

+  padding: 2px 0.429em;

+}

+

+p-panel label {

+  font-weight: inherit;

+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/chartviewer.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/chartviewer.module.ts
new file mode 100644
index 0000000..efd8d58
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/chartviewer.module.ts
@@ -0,0 +1,81 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { NgModule } from '@angular/core';
+import { HttpClientModule } from '@angular/common/http';
+
+import { CheckboxModule } from 'primeng/checkbox';
+import { ButtonModule } from 'primeng/button';
+import { SliderModule } from 'primeng/slider';
+import { InputTextModule } from 'primeng/inputtext';
+import { AccordionModule } from 'primeng/accordion';
+import { TableModule } from 'primeng/table';
+import { SelectButtonModule } from 'primeng/selectbutton';
+import { ChartModule } from 'primeng/chart';
+import { ToggleButtonModule } from 'primeng/togglebutton';
+import { SpinnerModule } from 'primeng/spinner';
+import { MultiSelectModule } from 'primeng/multiselect';
+import { ListboxModule } from 'primeng/listbox';
+import { PanelModule } from 'primeng/panel';
+import { ConfirmDialogModule } from 'primeng/confirmdialog';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { ChartViewerComponent } from './components/chartviewer/chart-viewer.component';
+import { DataTableComponent } from './components/datatable/data-table.component';
+import { ChartViewerNavCardComponent } from './components/chatviewer-nav-card/chart-viewer-nav-card.component';
+import { XyChartViewerComponent } from './components/xy-chart-viewer/xy-chart-viewer.component';
+import { XyChartViewerNavCardComponent } from './components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component';
+import { RequestOptionsComponent } from './components/request-options/request-options.component';
+import { XyChartViewerToolbarComponent } from './components/xy-chart-viewer-toolbar/xy-chart-viewer-toolbar.component';
+import { XyChartDataSelectionPanelComponent } from './components/xy-chart-data-selection-panel/xy-chart-data-selection-panel.component';
+import { ConfirmationService } from 'primeng/api';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    HttpClientModule,
+    CheckboxModule,
+    ButtonModule,
+    SelectButtonModule,
+    TableModule,
+    SliderModule,
+    InputTextModule,
+    AccordionModule,
+    ChartModule,
+    ToggleButtonModule,
+    SpinnerModule,
+    MultiSelectModule,
+    ListboxModule,
+    PanelModule,
+    ConfirmDialogModule,
+  ],
+  declarations: [
+    ChartViewerNavCardComponent,
+    ChartViewerComponent,
+    DataTableComponent,
+    XyChartViewerComponent,
+    XyChartViewerNavCardComponent,
+    RequestOptionsComponent,
+    XyChartViewerToolbarComponent,
+    XyChartDataSelectionPanelComponent,
+  ],
+  exports: [
+    ChartViewerNavCardComponent,
+    XyChartViewerNavCardComponent,
+  ],
+  providers: [
+    ConfirmationService
+  ]
+})
+export class ChartviewerModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chartviewer/chart-viewer.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chartviewer/chart-viewer.component.html
new file mode 100644
index 0000000..85ba743
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chartviewer/chart-viewer.component.html
@@ -0,0 +1,31 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<p-chart #lineChart type="line" [data]="data" [options]="options"></p-chart>
+
+<p-accordion>
+    <p-accordionTab header="Optionen">
+        
+        Von <input type="number" numbersOnly pInputText [(ngModel)]="rangeValues[0]" />
+        Bis <input type="number" numbersOnly pInputText [(ngModel)]="rangeValues[1]" />
+        Gesamt {{numberOfRows}}
+        Schrittweite: <input type="text" numbersOnly pInputText [(ngModel)]="step"/>
+        Vorschauwerte<p-checkbox [(ngModel)]="previewEnabled" binary="true"></p-checkbox> <input *ngIf="previewEnabled" type="text" numbersOnly pInputText [(ngModel)]="numberOfChunks" />
+ 
+        <div style="margin: 20px 0;">
+            <p-slider [(ngModel)]="rangeValues" [range]="true" [min]="1" [max]="numberOfRows" [step]="step"></p-slider>
+        </div>
+        <p-button label="Anwenden" (onClick)="applySettings($event)"></p-button>
+    </p-accordionTab>
+</p-accordion>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chartviewer/chart-viewer.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chartviewer/chart-viewer.component.ts
new file mode 100644
index 0000000..10262be
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chartviewer/chart-viewer.component.ts
@@ -0,0 +1,165 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component,  ViewChild, Input, SimpleChanges, OnChanges } from '@angular/core';
+import { Observable } from 'rxjs';
+import { map, tap, catchError } from 'rxjs/operators';
+
+import { UIChart } from 'primeng/primeng';
+
+import { HttpErrorHandler } from '../../../core/http-error-handler';
+import { Node } from '../../../navigator/node';
+import { ChartViewerDataService, getDataArray } from '../../services/chart-viewer-data.service';
+import { MeasuredValues } from '../../model/chartviewer.model';
+
+@Component({
+  selector: 'mdm5-chartViewer',
+  templateUrl: 'chart-viewer.component.html',
+  providers: []
+})
+export class ChartViewerComponent implements OnChanges {
+
+  @Input()
+  channelGroup = new Node();
+  @Input()
+  channels = [new Node()];
+
+  @ViewChild('lineChart')
+  chart: UIChart;
+
+  maxRequestedValues = 10000;
+  previewEnabled = true;
+  numberOfChunks = 600;
+  numberOfRows = 0;
+  startIndex = 1;
+  requestedValues = 0;
+
+  // range of values to show; 1-based; start and end inclusive
+  rangeValues: number[] = [this.startIndex, this.requestedValues];
+  step = 1000;
+
+  data = {
+    labels: [],
+    datasets: [
+      {
+        label: 'No data',
+        data: [],
+        borderColor: '#fff',
+      }
+    ]
+  };
+
+  options = {
+    elements: {
+      point: {
+        radius: 0
+      },
+      line: {
+        tension: 0
+      }
+    },
+    legend: {
+      display: true,
+    },
+    plugins: {
+      zoom: {
+        pan: {
+          enabled: true,
+          mode: 'xy'
+        },
+        zoom: {
+          enabled: true,
+          mode: 'xy'
+        }
+      }
+    },
+  };
+
+  constructor(private httpErrorHandler: HttpErrorHandler,
+    private chartService: ChartViewerDataService) {
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    for (let propName in changes) {
+      if (propName === 'channelGroup' || propName === 'channels') {
+        this.channelGroup = this.channelGroup;
+        this.numberOfRows = this.chartService.getNumberOfRows(this.channelGroup);
+        if (this.numberOfRows < this.numberOfChunks) {
+          this.previewEnabled = false;
+        }
+        this.requestedValues = Math.min(this.numberOfRows, this.maxRequestedValues);
+
+        this.updateRange();
+        this.chartChannel();
+        break;
+      }
+    }
+  }
+
+  getColor(name: string) {
+    return this.data.datasets.find(dataset => dataset.label === name).borderColor;
+  }
+
+  applySettings(event: any) {
+    this.chartChannel();
+  }
+
+  chartChannel() {
+    this.chartMeasuredValues(this.chartService.loadPreviewValues(
+      this.channelGroup, [this.channels[0]], this.numberOfChunks, this.rangeValues[0] - 1, this.rangeValues[1]));
+  }
+
+  chartMeasuredValues(measuredValues: Observable<MeasuredValues[]>) {
+    measuredValues.pipe(
+      map(mvl => <any>{
+        data: {
+          labels: this.getLabels(this.rangeValues[0], this.rangeValues[1], this.getLength(mvl)),
+          datasets: mvl.map(this.convertToDataset, this)
+        }
+      }),
+      catchError(this.httpErrorHandler.handleError)
+    ).subscribe(d => {
+      console.log(d);
+      this.data = d.data;
+    });
+  }
+
+  updateRange() {
+    this.rangeValues = [this.startIndex, this.requestedValues];
+    this.step = Math.min(1000, Math.max(Math.floor(this.numberOfRows / 1000), 1));
+  }
+
+  getLabels(startIndex: number, endIndex: number, numberOfChunks: number) {
+    let labels: number[] = Array();
+    for (let i = startIndex; i <= endIndex; i += (endIndex - startIndex + 1) / numberOfChunks) {
+      labels.push(Math.floor(i));
+    }
+    return labels;
+  }
+
+  getLength(measuredValues: MeasuredValues[]) {
+    return measuredValues.map(mv => mv.length).reduce((p, l) => Math.max(p, l));
+  }
+
+  convertToDataset(measuredValues: MeasuredValues) {
+    return <any>{
+      label: measuredValues.name + ' [' + measuredValues.unit + ']',
+      unit: measuredValues.unit,
+      data: getDataArray(measuredValues).values,
+      borderColor: '#' + Math.random().toString(16).substr(-6),
+      measuredValues: map,
+      channel: new Node()
+    };
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chatviewer-nav-card/chart-viewer-nav-card.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chatviewer-nav-card/chart-viewer-nav-card.component.html
new file mode 100644
index 0000000..8cc9516
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chatviewer-nav-card/chart-viewer-nav-card.component.html
@@ -0,0 +1,27 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<div *ngIf="channels === undefined">
+        No Channel selected.
+</div>
+
+<div *ngIf="channels !== undefined">
+    <p-selectButton [options]="modes" [(ngModel)]="selectedMode"></p-selectButton>
+
+    <div [ngSwitch]="selectedMode">
+        <mdm5-chartViewer *ngSwitchCase="'chart'" [channelGroup]="channelGroup" [channels]="channels" ></mdm5-chartViewer>
+        <mdm5-dataTable *ngSwitchCase="'table'" [channelGroup]="channelGroup" [channels]="channels"></mdm5-dataTable>
+        <div *ngSwitchDefault></div>
+    </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chatviewer-nav-card/chart-viewer-nav-card.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chatviewer-nav-card/chart-viewer-nav-card.component.ts
new file mode 100644
index 0000000..7b21a64
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/chatviewer-nav-card/chart-viewer-nav-card.component.ts
@@ -0,0 +1,96 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { NavigatorService } from '../../../navigator/navigator.service';
+import { MDMNotificationService } from '../../../core/mdm-notification.service';
+import { TranslateService } from '@ngx-translate/core';
+import { NodeService } from '../../../navigator/node.service';
+import { forkJoin, Observable } from 'rxjs';
+import { Node } from '../../../navigator/node';
+import { SelectItem } from 'primeng/api';
+import { PropertyService } from 'src/app/core/property.service';
+
+@Component({
+  selector: 'mdm5-chartViewerNavCard',
+  templateUrl: 'chart-viewer-nav-card.component.html',
+  providers: []
+})
+export class ChartViewerNavCardComponent implements OnInit, OnDestroy {
+  private _contextUrl: string;
+
+  modes: SelectItem[] = [
+    { label: 'Chart', value: 'chart'},
+    { label: 'Table', value: 'table'},
+  ];
+  selectedMode = 'chart';
+
+  selectedNode: Node;
+  channelGroup: Node;
+  channels: Node[];
+  subscription: any;
+
+  showLegend = false;
+  dataAvailable = false;
+
+  constructor(private navigatorService: NavigatorService,
+    private notificationService: MDMNotificationService,
+    private translateService: TranslateService,
+    private nodeService: NodeService,
+    private _prop: PropertyService) {
+    this._contextUrl = _prop.getUrl('mdm/environments');
+  }
+
+  ngOnInit() {
+    this.onSelectedNodeChange(this.navigatorService.getSelectedNode());
+    this.subscription = this.navigatorService.selectedNodeChanged.subscribe(
+      node => this.onSelectedNodeChange(node),
+      error => this.notificationService.notifyError(this.translateService.instant('details.mdm-detail-view.cannot-update-node'), error)
+    );
+  }
+
+  ngOnDestroy() {
+    this.subscription.unsubscribe();
+  }
+
+  onSelectedNodeChange(node: Node) {
+    if (!node) {
+      this.dataAvailable = false;
+      return;
+    }
+    this.selectedNode = node;
+
+    if (node && node.type === 'Channel') {
+      this.loadChannelGroup(node)
+        .flatMap(channelGroup => forkJoin([Observable.of(channelGroup), this.loadChannels(channelGroup)]))
+        .subscribe(([channelGroup, channels]) => {
+          this.channelGroup = channelGroup;
+          this.channels = [node];
+          this.dataAvailable = true;
+        });
+    } else {
+      this.dataAvailable = false;
+    }
+  }
+
+  loadChannelGroup(channel: Node) {
+    let url = this._contextUrl + '/' + channel.sourceName + '/channelgroups?filter=Channel.Id eq \"' + channel.id + '\"';
+    return this.nodeService.getNode(url).map(channelGroup => channelGroup[0]);
+  }
+
+  loadChannels(channelgroup: Node) {
+    let url = this._contextUrl + '/' + channelgroup.sourceName + '/channels?filter=ChannelGroup.Id eq \"' + channelgroup.id + '\"';
+    return this.nodeService.getNode(url);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/datatable/data-table.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/datatable/data-table.component.html
new file mode 100644
index 0000000..fd6857b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/datatable/data-table.component.html
@@ -0,0 +1,44 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<p-table #datatable [value]="datapoints" [columns]="cols" [lazy]="true" (onLazyLoad)="loadLazy($event)" [paginator]="true" 
+[rows]="recordsPerPage" [totalRecords]="totalRecords" [loading]="tableLoading" [rowsPerPageOptions]="[10, 20, 50, 100, 1000]">
+    <ng-template pTemplate="header" let-columns>
+        <tr>
+            <th>Index</th>
+            <th *ngFor="let col of columns">
+                {{col.header}}
+            </th>
+        </tr>
+    </ng-template>
+    <ng-template pTemplate="body" let-rowData let-i="rowIndex" let-columns="columns">
+        <tr style="height:34px">
+            <td>{{i}}</td>
+            <td *ngFor="let col of columns">
+                {{rowData[col.field]}}
+            </td>
+        </tr>
+    </ng-template>
+    <ng-template pTemplate="emptymessage" let-columns>
+        <tr>
+            <td [attr.colspan]="columns.length">
+                No records found
+            </td>
+        </tr>
+    </ng-template>
+    <ng-template pTemplate="paginatorleft" let-state>
+            Total: {{state.totalRecords}}
+        </ng-template>
+    
+</p-table>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/datatable/data-table.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/datatable/data-table.component.ts
new file mode 100644
index 0000000..76370f5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/datatable/data-table.component.ts
@@ -0,0 +1,77 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, ViewChild, Input, OnChanges, SimpleChanges } from '@angular/core';
+
+import { LazyLoadEvent, Column } from 'primeng/primeng';
+import { Table } from 'primeng/table';
+
+import { Node } from '../../../navigator/node';
+import { ChartViewerDataService, getDataArray } from '../../services/chart-viewer-data.service';
+import { MeasuredValues } from '../../model/chartviewer.model';
+
+@Component({
+  selector: 'mdm5-dataTable',
+  templateUrl: 'data-table.component.html',
+  providers: []
+})
+export class DataTableComponent implements OnChanges {
+  @ViewChild('datatable')
+  private table: Table;
+
+  @Input()
+  channelGroup = new Node();
+  @Input()
+  channels = [new Node()];
+
+  tableLoading = false;
+  cols: Column[] = [];
+  totalRecords = 0;
+  recordsPerPage = 10;
+  datapoints = [];
+
+  constructor(private chartviewerService: ChartViewerDataService) {
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    for (let propName in changes) {
+      if (propName === 'channelGroup' || propName === 'channels') {
+        this.table.reset();
+      }
+    }
+  }
+
+  load(mv: MeasuredValues[]) {
+    let zip = (rows => rows[0].map((_, c) => rows.map(row => row[c])));
+
+    this.cols = mv.map((m, i) => Object.assign(new Column(), { header: m.name, field: i }));
+    this.datapoints = zip(mv.map(m => getDataArray(m).values));
+  }
+
+  loadLazy(event: LazyLoadEvent) {
+    if (this.channelGroup === undefined) {
+      return;
+    }
+
+    setTimeout(() => {
+      this.tableLoading = true;
+      this.totalRecords = this.chartviewerService.getNumberOfRows(this.channelGroup);
+      this.chartviewerService.loadMeasuredValues(this.channelGroup, this.channels, event.first, event.rows).subscribe(mv => {
+        this.load(mv);
+        this.tableLoading = false;
+      },
+      () => this.tableLoading = false);
+    }, 0);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/request-options/request-options.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/request-options/request-options.component.html
new file mode 100644
index 0000000..108ee9a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/request-options/request-options.component.html
@@ -0,0 +1,77 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<p-accordion [style]="{'width':'100%'}">
+  <p-accordionTab header="Optionen" [disabled]="!channelGroups || channelGroups.length === 0">
+    <div class="p-grid nested-grid p-align-center">
+      <!-- Row 1 -->
+        <!-- left -->
+      <div class="p-col-2">
+        <label for="rangeValStart">Von</label>
+        <p-spinner id="rangeValStart"
+          size="4"
+          [(ngModel)]="rangeValues[0]"
+          [step]="step"
+          [min]="minIndex"
+          [max]="rangeValues[1]"
+          (onChange)="onChangeValueRange($event)"
+          ></p-spinner>
+      </div>
+      <div class="p-col-2">
+        <label for="rangeValEnd">Bis</label>
+        <p-spinner id="rangeValEnd"
+          size="4"
+          [(ngModel)]="rangeValues[1]"
+          [step]="step"
+          [min]="rangeValues[0]"
+          [max]="numberOfRows"
+          (onChange)="onChangeValueRange($event)"
+          (onBlur)="onChangeValueRange($event)"
+          ></p-spinner>
+      </div>
+      <div class="p-col-4">
+        <label for="step">Schrittweite</label>
+        <p-spinner id="step" type="text" [(ngModel)]="step" size="4"></p-spinner>
+      </div>
+        <!-- right -->
+      <div class="p-col-4">
+        <label for="preview">Vorschauwerte</label>
+        <p-checkbox id="preview" [(ngModel)]="previewEnabled" binary="true"></p-checkbox>
+      </div>
+
+      <!-- Row 2 -->
+        <!-- left -->
+      <div class="p-col-7">
+        <div class="p-grid p-align-center">
+          <div class="p-col-1" style="text-align: right;">{{minIndex}}</div>
+          <div class="p-col-10"><p-slider [(ngModel)]="rangeValues" [range]="true" [min]="1" [max]="(numberOfRows + 1)" [step]="step"></p-slider></div>
+          <div class="p-col-1">{{numberOfRows + 1}}</div>
+        </div>
+      </div>
+      <div class="p-col-1">
+      </div>
+        <!-- right -->
+      <div class="p-col-4">
+        <input *ngIf="previewEnabled" type="text" numbersOnly pInputText [(ngModel)]="numberOfChunks" />
+      </div>
+
+      <!-- Row 3 -->
+      <div class="p-col-12" style="text-align: right;">
+        <button class="btn btn-mdm" (click)="onApplySettings($event)">
+          <span class="fa fa-check"></span>
+          Übernehmen
+        </button>
+      </div>
+    </div>
+  </p-accordionTab>
+</p-accordion>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/request-options/request-options.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/request-options/request-options.component.ts
new file mode 100644
index 0000000..ddbf822
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/request-options/request-options.component.ts
@@ -0,0 +1,96 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, Input, SimpleChanges, OnChanges, Output, EventEmitter } from '@angular/core';
+import { ChartViewerDataService } from '../../services/chart-viewer-data.service';
+import { Node } from '../../../navigator/node';
+import { RequestOptions } from '../../model/chartviewer.model';
+
+@Component({
+  selector: 'mdm5-request-options',
+  templateUrl: './request-options.component.html'
+})
+export class RequestOptionsComponent implements OnInit, OnChanges {
+
+  // octive accordion tab, default: -1 (= non is active).
+  public accordionIndex = undefined;
+
+  public readonly minIndex = 1;
+  // public requestedValues = 1;
+  public rangeValues: number[] = [];
+
+  private maxRequestedValues = 10000;
+
+  public numberOfRows = 0;
+  public numberOfChunks = 600;
+  public step: number;
+  public previewEnabled = true;
+
+  @Input()
+  public channelGroups: Node[];
+
+  @Output()
+  public onRequestOptionsChanged = new EventEmitter<RequestOptions>();
+
+  constructor(
+    private chartService: ChartViewerDataService) { }
+
+  ngOnInit() {
+    this.reload();
+    this.emitRequestOptionsChanged();
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    if (changes['channelGroups']) {
+      this.reload();
+      this.emitRequestOptionsChanged();
+    }
+  }
+
+  private reload() {
+    if (this.channelGroups != undefined && this.channelGroups.length > 0) {
+      this.numberOfRows = this.chartService.getNumberOfRows(this.channelGroups[0]);
+      this.step = Math.min(1000, Math.max(Math.floor(this.numberOfRows / 100), 1));
+      if (this.numberOfRows < this.numberOfChunks) {
+        this.previewEnabled = false;
+      }
+      const requestedValues = Math.min(this.numberOfRows, this.maxRequestedValues);
+      this.rangeValues = [this.minIndex, requestedValues];
+    }
+  }
+
+  public onChangeValueRange(event: Event) {
+    // check if input string is numeric, set min/max otherwise
+    if (isNaN(+this.rangeValues[0])) {
+      this.rangeValues[0] = this.minIndex;
+    }
+    if (isNaN(+this.rangeValues[1])) {
+      this.rangeValues[1] = this.numberOfRows;
+    }
+    // reassign for change detection
+    this.rangeValues = [].concat(this.rangeValues);
+  }
+
+  public onApplySettings(event: Event) {
+    // close accordion
+    this.accordionIndex = -1;
+    // emit options
+    this.emitRequestOptionsChanged();
+  }
+
+  private emitRequestOptionsChanged() {
+    this.onRequestOptionsChanged.emit(
+      new RequestOptions(this.rangeValues[1] - this.rangeValues[0], this.rangeValues[0] - 1, this.previewEnabled, this.numberOfChunks));
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-data-selection-panel/xy-chart-data-selection-panel.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-data-selection-panel/xy-chart-data-selection-panel.component.html
new file mode 100644
index 0000000..c2cfc55
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-data-selection-panel/xy-chart-data-selection-panel.component.html
@@ -0,0 +1,98 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<div class="p-grid">
+  <div class="p-col-12" style="margin-top: 4px">
+    <p-listbox
+      [options]="channelGroups"
+      [(ngModel)]="selectedChannelGroups"
+      multiple="multiple"
+      checkbox="checkbox"
+      filter="filter"
+      optionLabel="name"
+      (onChange)="onSelectedChannelGroupsChanged($event)"
+      [ngClass]="{'hiddenList': hiddenGroups}"
+      [style]="{'width':'100%'}"
+      [listStyle]="{'height':'100px'}">
+      <p-header>
+          <span class="icon channelgroup"></span>
+          {{'SubMatrix' | mdmdatasourcetranslate}}
+          <span
+            class="fa toggler"
+            [ngClass]="{'fa-chevron-down': !hiddenGroups, 'fa-chevron-right': hiddenGroups}"
+            (click)="onToggleChannelGroupPanel($event)"></span>
+      </p-header>
+    </p-listbox>
+  </div>
+  <div class="p-col-12">
+    <p-listbox [options]="yChannelOptions"
+      [(ngModel)]="selectedYChannels"
+      multiple="multiple"
+      checkbox="checkbox"
+      filter="filter"
+      optionLabel="name"
+      (onChange)="onSelectedYChannelsChanged($event)"
+      [ngClass]="{'hiddenList': hiddenYChannels}"
+      [style]="{'width':'100%'}"
+      [styleClass]="'ypanel'"
+      [listStyle]="{'height':'200px'}"
+      [showToggleAll]="false">
+      <p-header>
+        <span class="icon channel"></span>
+        Y-{{'MeaQuantity' | mdmdatasourcetranslate}}
+        <span
+        class="fa toggler"
+        [ngClass]="{'fa-chevron-down': !hiddenYChannels, 'fa-chevron-right': hiddenYChannels}"
+        (click)="onToggleYChannelPanel($event)"></span>
+      </p-header>
+    </p-listbox>
+  </div>
+  <div class="p-col-12">
+    <p-panel
+      [toggleable]="true"
+      [collapsed]="true"
+      expandIcon="fa fa-chevron-right"
+      collapseIcon="fa fa-chevron-down">
+      <p-header>
+        <span class="icon channel"></span>
+        &nbsp;X-{{'MeaQuantity' | mdmdatasourcetranslate}}
+      </p-header>
+      <ul class="channelList">
+        <li *ngFor="let rowData of selectedChannelRows">
+          <div class="row">
+            <label>
+              {{rowData.yChannel.name}}
+            </label>
+            
+            <!-- appendTo="body" is workaround for overlay is hidden in panel. Problem: AppendTo body makes overly stuck on scroll -->
+            <p-dropdown
+              [(ngModel)]="rowData.xChannel"
+              [options]="xChannelOptions[rowData.channelGroup.id]"
+              appendTo="body"
+              [filter]="xChannelOptions[rowData.channelGroup.id]?.length > 5"
+              (onChange)="onSelectedXChannelChanged($event, rowData)"
+              (onShow)="onShowSelectedXChannelChanged($event, rowData)"
+              placeholder="{{'chartviewer.xy-chart-data-selection-panel.select-channel-placeholder' | translate}}"
+              optionLabel="name"
+              [showClear]="false"
+              [style]="{'width':'95%'}">
+            </p-dropdown>
+          </div>
+        </li>
+      </ul>
+    </p-panel>
+  </div>
+</div>
+
+<p-confirmDialog icon="pi pi-exclamation-triangle"></p-confirmDialog>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-data-selection-panel/xy-chart-data-selection-panel.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-data-selection-panel/xy-chart-data-selection-panel.component.ts
new file mode 100644
index 0000000..7def935
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-data-selection-panel/xy-chart-data-selection-panel.component.ts
@@ -0,0 +1,449 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, Input, OnDestroy, EventEmitter, Output, OnChanges, SimpleChanges } from '@angular/core';
+import { ChannelSelectionRow, MeasuredValues} from '../../model/chartviewer.model';
+import { Subscription, of } from 'rxjs';
+import { ChartViewerDataService } from '../../services/chart-viewer-data.service';
+import { ChartViewerService } from '../../services/chart-viewer.service';
+import { ArrayUtilService } from 'src/app/core/services/array-util.service';
+import { MDMNotificationService } from 'src/app/core/mdm-notification.service';
+import { TYPE_MEASUREMENT, TYPE_CHANNELGROUP, TYPE_CHANNEL } from '../../model/constants';
+import { tap } from 'rxjs/operators';
+import { Node } from '../../../navigator/node';
+import {ConfirmationService} from 'primeng/api';
+import { TranslateService } from '@ngx-translate/core';
+
+@Component({
+  selector: 'mdm5-xy-chart-data-selection-panel',
+  templateUrl: './xy-chart-data-selection-panel.component.html',
+  styleUrls: ['../../chart-viewer.style.css']
+})
+export class XyChartDataSelectionPanelComponent implements OnInit, OnDestroy, OnChanges {
+
+  @Input()
+  public channelGroups: Node[];
+  @Input()
+  public channels: Map<string, Node[]>;
+
+  @Input()
+  public xyMode: boolean;
+
+  @Output()
+  public onSelectionChanged = new EventEmitter<ChannelSelectionRow[]>();
+
+  // select options for channels
+  public yChannelOptions: Node[] = [];
+  public xChannelOptions: {[key: string]: Node[]} = {};
+
+  // channel(group) selection for chart
+  // !! change via setter to update cache for workarround !!
+  public selectedChannelGroups: Node[] = [];
+  public selectedYChannels: Node[] = [];
+
+  private xYcache = new Map<string, MeasuredValues[]>();
+  private selectionChanged = false;
+
+  // listbox workarround to determine toggled item(s)
+  private lastChannelGroupSelection: Node[] = [];
+  private lastYChannelSelection: Node[] = [];
+
+  public selectedChannelRows: ChannelSelectionRow[] = [];
+
+  // Toggle selection panel visibility
+  public hiddenGroups = false;
+  public hiddenYChannels = false;
+
+  // for x-channel default value
+  private independentChannels = new Map<string, Node>();
+
+  /********** subscriptions */
+  private chartViewerSub: Subscription;
+
+  constructor(private chartviewerDataService: ChartViewerDataService,
+              private chartViewerService: ChartViewerService,
+              private arrayUtil: ArrayUtilService,
+              private confirmationService: ConfirmationService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) { }
+
+
+  /****************  Angular lifecycle-hooks ****************************/
+
+  ngOnInit() {
+    this.chartViewerSub = this.chartViewerService.onNodeMetaChange().subscribe(node => this.handleNodeSelectionInNavTree(node));
+  }
+
+  ngOnDestroy() {
+    this.chartViewerSub.unsubscribe();
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    if (changes['xyMode']) {
+      this.reloadAxisSelectOptions().subscribe(() => {
+        if (this.selectionChanged) {
+          this.fireSelectionChanged();
+          this.selectionChanged = false;
+        }
+      });
+    }
+  }
+
+  /**************** Html-template listeners *****************************/
+
+  // x-axis
+  public onSelectedXChannelChanged(event: any) {
+    if (event.value == undefined) {
+      // work around: if x-axis is deselected for an y-channel, plat over independent channel.
+      // should force selection on dropdown instead.
+      this.selectedChannelRows
+        .filter(row => row.xChannel == undefined)
+        .map(row => row.xChannel = this.getDefaultXChannel(row.channelGroup));
+    }
+    this.fireSelectionChanged();
+  }
+
+  public onShowSelectedXChannelChanged(event: any, rowData: ChannelSelectionRow) {
+    if (this.getDefaultXChannel(rowData.channelGroup) == undefined) {
+      this.confirmationService.confirm({
+        header: this.translateService.instant('chartviewer.xy-chart-data-selection-panel.no-x-channel-dialog-header'),
+        message: this.translateService.instant('chartviewer.xy-chart-data-selection-panel.no-x-channel-dialog-message'),
+        acceptLabel: 'OK',
+        rejectVisible: false
+    });
+    }
+  }
+
+  // y-axis
+  public onSelectedYChannelsChanged(event: any) {
+    let channel: Node;
+    // Deselect
+    if (this.selectedYChannels.length < this.lastYChannelSelection.length) {
+      channel = this.lastYChannelSelection.find(yChannel => !this.selectedYChannels.some(c => yChannel.id === c.id));
+      // .forEach(yChannel => this.addOrRemoveRow(this.findChannelGroup(yChannel), yChannel));
+      // Select
+    } else {
+      channel = this.selectedYChannels.find(group => !this.lastYChannelSelection.some(g => group.id === g.id));
+    }
+    this.addOrRemoveRow(this.findChannelGroup(channel), channel);
+    this.lastYChannelSelection = this.selectedYChannels;
+    this.fireSelectionChanged();
+  }
+
+  public onSelectedChannelGroupsChanged(event: any) {
+    // All deselected
+    if (this.selectedChannelGroups.length === 0) {
+      this.resetChannelData();
+      this.fireSelectionChanged();
+    } else {
+      // Deselect
+      if (this.selectedChannelGroups.length < this.lastChannelGroupSelection.length) {
+        this.lastChannelGroupSelection
+        .filter(group => !this.selectedChannelGroups.some(g => group.id === g.id))
+        .forEach(group => this.handleDeselectChannelGroup(group));
+        // Select
+      } else {
+        this.selectedChannelGroups
+        .filter(group => !this.lastChannelGroupSelection.some(g => group.id === g.id))
+        .forEach(group => this.handleSelectChannelGroup(group));
+      }
+    }
+    this.lastChannelGroupSelection = this.selectedChannelGroups;
+  }
+
+  public onToggleChannelGroupPanel(event: Event) {
+    this.hiddenGroups = !this.hiddenGroups;
+  }
+
+  public onToggleYChannelPanel(event: Event) {
+    this.hiddenYChannels = !this.hiddenYChannels;
+  }
+
+  private handleDeselectChannelGroup(channelGroup: Node) {
+    // remove rows
+    if (this.arrayUtil.isNotEmpty(this.selectedChannelRows)) {
+      this.selectedChannelRows = this.selectedChannelRows.filter(row => row.channelGroup.id !== channelGroup.id);
+    }
+    // remove selection
+    if (this.arrayUtil.isNotEmpty(this.selectedYChannels)) {
+      this.setSelectedYChannels(this.selectedYChannels.filter(channel =>
+        this.channels.get(channelGroup.id).findIndex(c => channel.id === c.id) === -1));
+    }
+    this.reloadAxisSelectOptions().subscribe(() => this.fireSelectionChanged());
+  }
+
+    /**
+   * Handle channelGroup selection via multiselect in html template
+   * @param channelGroup
+   */
+  private handleSelectChannelGroup(channelGroup: Node) {
+    const cached = this.xYcache.get(channelGroup.id);
+    if (cached != undefined) {
+      this.setChannelOptions(cached, channelGroup);
+      this.fireSelectionChanged();
+    } else {
+      this.chartviewerDataService.readAxisType(channelGroup)
+        .subscribe(mvls => {
+          this.setChannelOptions(mvls, channelGroup);
+          this.fireSelectionChanged();
+        });
+    }
+  }
+
+  private handleNodeSelectionInNavTree(node: Node) {
+    if (node != undefined) {
+      switch (node.type) {
+        case TYPE_MEASUREMENT:
+          this.xYcache.clear();
+          this.resetChannelData();
+          this.fireSelectionChanged();
+          break;
+        case TYPE_CHANNELGROUP:
+          this.cleanOldState();
+          this.addChannelGroupToSelection(node.id, node);
+          break;
+        case TYPE_CHANNEL:
+          this.cleanOldState();
+          // add related channel group to selection
+          if (this.arrayUtil.isNotEmpty(this.channelGroups) && this.channels != undefined) {
+            const channelGroup = this.findChannelGroup(node);
+            // this.addChannelGroupToSelection(channelGroupId, this.channelGroups.find(cg => cg.id === channelGroupId));
+            if (!this.isNodeIn(channelGroup, this.selectedChannelGroups)) {
+              this.setSelectedChannelGroups(this.selectedChannelGroups.concat([channelGroup]));
+              this.chartviewerDataService.readAxisType(channelGroup)
+              .subscribe(mvls => {
+                this.setChannelOptions(mvls, channelGroup);
+                this.addChannelToSelection(node, channelGroup);
+              });
+            } else {
+              // if channel is in axis type y, set as selected, if not selected already
+              this.addChannelToSelection(node, channelGroup);
+            }
+          }
+        break;
+      }
+    }
+  }
+
+    /**
+   * reset chart data, select options and selection, if selected channelgroups
+   * contain a channelGroup which does not belongto this measurement.
+   *
+   * notice: this works for channels aswell, since a channel cannot be selected without
+   * selecting the parent channelGroup aswell.
+   */
+  private cleanOldState() {
+    if (this.arrayUtil.isNotEmpty(this.selectedChannelGroups)
+      && this.selectedChannelGroups.some(selected => !this.isNodeIn(selected, this.channelGroups))) {
+      this.xYcache.clear();
+      this.resetChannelData();
+    }
+  }
+
+  /**
+   * Handle channel selection via nav-tree
+   * @param channel
+   * @param channelGroup
+   */
+  private addChannelToSelection(channel: Node, channelGroup: Node) {
+    // adds channel to selected y-channels if possible and creates row in table
+    if (this.isNodeIn(channel, this.yChannelOptions)) {
+      const index = this.selectedYChannels.findIndex(c => c.id === channel.id);
+      if (index === -1) {
+        this.setSelectedYChannels(this.selectedYChannels.concat([channel]));
+        this.addRow(channelGroup, channel);
+        this.fireSelectionChanged();
+      }
+    /**
+     *  @TODO -> expected behaviour on selecting x-channel in tree.
+     * suggestion: set it as x-channel for all selected y-channels of that channelgroup.
+     */
+    // if channel is of axis type x, set ... ?
+    } else if (this.isNodeIn(channel, this.xChannelOptions[channelGroup.id])) {
+      this.notificationService.notifyWarn('Selected X-Channel', 'Selected channel is of type x-axis. Change x/y mode.');
+    } else {
+      this.notificationService.notifyError('Unknown channel option', 'Not sure where you found this..');
+    }
+  }
+
+  /**
+   * Handle channelGroup selection via nav-tree
+   * @param id
+   * @param channelGroup
+   */
+  private addChannelGroupToSelection(id: string, channelGroup: Node) {
+    if (this.selectedChannelGroups == undefined) {
+      this.setSelectedChannelGroups([]);
+    }
+    if (!this.isNodeIn(channelGroup, this.selectedChannelGroups)) {
+      this.setSelectedChannelGroups(this.selectedChannelGroups.concat([channelGroup]));
+      this.handleSelectChannelGroup(channelGroup);
+    }
+  }
+
+  /**
+   * Adds options for x- and y-channels depending on given channelGroup
+   *
+   * @param measuredValues
+   * @param channelGroup
+   */
+  private setChannelOptions(measuredValues: MeasuredValues[], channelGroup: Node) {
+    if (channelGroup != undefined) {
+      // cache measuredValues to avoid reloading
+      this.xYcache.set(channelGroup.id, measuredValues);
+
+      // create empty array if property not exists
+      this.xChannelOptions[channelGroup.id] = this.xChannelOptions[channelGroup.id] || [];
+
+      if (this.xyMode) {
+        measuredValues.forEach(mvl => {
+          const tmpChannel = this.channels.get(channelGroup.id).filter(c => c.name === mvl.name)[0];
+          if (mvl.axisType === 'X_AXIS' || mvl.axisType === 'XY_AXIS' || ( mvl.axisType == undefined && mvl.independent)) {
+            this.xChannelOptions[channelGroup.id] = this.xChannelOptions[channelGroup.id].concat(tmpChannel);
+            // cache independent channels for default x-axis.
+            if (mvl.independent) {
+              this.independentChannels.set(channelGroup.id, tmpChannel);
+            }
+          } else if (mvl.axisType === 'Y_AXIS' || mvl.axisType === 'XY_AXIS') {
+            this.yChannelOptions = this.yChannelOptions.concat(tmpChannel);
+          }
+        });
+      } else {
+        // cache independent channel for default x-axis.
+        const value = measuredValues.find(mvl => mvl.independent);
+        if (value != undefined) {
+          const tmpChannel = this.channels.get(channelGroup.id).filter(c => c.name === value.name)[0];
+          this.independentChannels.set(channelGroup.id, tmpChannel);
+        }
+
+        const tmpChannels = this.channels.get(channelGroup.id);
+        this.xChannelOptions[channelGroup.id] = this.xChannelOptions[channelGroup.id].concat(tmpChannels);
+        this.yChannelOptions = this.yChannelOptions.concat(tmpChannels);
+      }
+    }
+  }
+
+  /**
+   * Resets selections and select options to empty state.
+   */
+  private resetChannelData() {
+    this.setSelectedChannelGroups([]);
+    this.selectedChannelRows = [];
+    this.setSelectedYChannels([]);
+    this.channelGroups = [].concat(this.channelGroups);
+    this.xChannelOptions = {};
+    this.yChannelOptions = [];
+  }
+
+    /**
+   * Reloads the select options for the x- and y-axis dropdowns
+   */
+  private reloadAxisSelectOptions() {
+    this.xChannelOptions = {};
+    this.yChannelOptions = [];
+    if (this.arrayUtil.isNotEmpty(this.selectedChannelGroups)) {
+      const cached = this.selectedChannelGroups.filter(g => this.xYcache.get(g.id) !== undefined);
+      return of(cached.map((group, index) => this.setChannelOptions(this.xYcache.get(group.id), cached[index])))
+              .pipe(tap(() => this.removeSelectionsNotMatchingXYMode()));
+    }
+    return of();
+  }
+
+  private removeSelectionsNotMatchingXYMode() {
+    if (this.selectedYChannels.length > 0) {
+      const l = this.selectedChannelRows.length;
+      this.selectedChannelRows = this.selectedChannelRows.filter(row => this.isNodeIn(row.yChannel, this.yChannelOptions));
+      this.setSelectedYChannels(this.selectedYChannels.filter(channel => this.isNodeIn(channel, this.yChannelOptions)));
+      this.selectionChanged = l !== this.selectedChannelRows.length;
+    }
+  }
+
+   /**
+   * Row control for table with x-channel selection.
+   *
+   * @param channelGroup
+   * @param yChannel
+   */
+  private addOrRemoveRow(channelGroup: Node, yChannel: Node) {
+    const index = this.selectedChannelRows.findIndex(row => row.yChannel.id === yChannel.id);
+    if (index > -1) {
+      this.selectedChannelRows.splice(index, 1);
+      this.selectedChannelRows = [].concat(this.selectedChannelRows);
+    } else {
+      this.addRow(channelGroup, yChannel);
+    }
+  }
+
+  /**
+   * Add row to selection
+   * @param channelGroup
+   * @param yChannel
+   */
+  private addRow(channelGroup: Node, yChannel: Node) {
+    const row = new ChannelSelectionRow(channelGroup, yChannel, this.getDefaultXChannel(channelGroup));
+    this.selectedChannelRows.push(row);
+  }
+
+  /**
+   * Get the default channel for x-axis. First tries to find an independent channel,
+   * if non is found the first channel with axistype X-Axis or XY-Axis is returned.
+   * @param channelGroup
+   */
+  private getDefaultXChannel(channelGroup: Node) {
+    let defaultXChannel = this.independentChannels.get(channelGroup.id);
+    if (defaultXChannel == undefined && this.xChannelOptions[channelGroup.id].length > 0) {
+      defaultXChannel = this.xChannelOptions[channelGroup.id][0];
+    }
+    return defaultXChannel;
+  }
+
+   /**
+   * Returns true if node with given id is in the given array.
+   *
+   * @param array the array
+   * @param id the id
+   */
+  private isNodeIn(node: Node, array: Node[]) {
+    let response = false;
+    if (node != undefined && this.arrayUtil.isNotEmpty(array)) {
+      response = array.findIndex(n => n.id === node.id) > -1;
+    }
+    return response;
+  }
+
+  /**
+   * Looks up parent channelGroup for channel via the channel map.
+   *
+   * @param channel
+   */
+  private findChannelGroup(channel: Node) {
+    const channelGroupId = Array.from(this.channels.keys())
+            .find(key => this.isNodeIn(channel, this.channels.get(key)));
+    return this.channelGroups.find(cg => cg.id === channelGroupId);
+  }
+
+  private fireSelectionChanged() {
+    this.onSelectionChanged.emit(this.selectedChannelRows);
+  }
+
+  private setSelectedYChannels(channels: Node[]) {
+    this.selectedYChannels = channels;
+    this.lastYChannelSelection = channels;
+  }
+
+  private setSelectedChannelGroups(channelGroups: Node[]) {
+    this.selectedChannelGroups = channelGroups;
+    this.lastChannelGroupSelection = channelGroups;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component.html
new file mode 100644
index 0000000..01b2142
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component.html
@@ -0,0 +1,23 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<div *ngIf="measurement === undefined || channelGroups === undefined || channels === undefined">
+  <div class="alert alert-info" style="margin: 0;">
+    <strong>{{'chartviewer.xy-chart-viewer-nav-card.no-node-selected' | translate}}</strong>
+  </div>
+</div>
+
+<div *ngIf="measurement !== undefined && channelGroups !== undefined && channels !== undefined">
+  <app-xy-chart-viewer [channelGroups]="channelGroups" [channels]="channels"></app-xy-chart-viewer>
+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component.ts
new file mode 100644
index 0000000..af4d82d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component.ts
@@ -0,0 +1,178 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { NavigatorService } from 'src/app/navigator/navigator.service';
+import { MDMNotificationService } from 'src/app/core/mdm-notification.service';
+import { Node } from '../../../navigator/node';
+import { TYPE_CHANNEL, TYPE_CHANNELGROUP, TYPE_MEASUREMENT } from '../../model/constants';
+import { Subscription, forkJoin } from 'rxjs';
+import { NodeService } from 'src/app/navigator/node.service';
+import { map, tap } from 'rxjs/operators';
+import { MDMItem } from 'src/app/core/mdm-item';
+import { ChartViewerService } from '../../services/chart-viewer.service';
+
+@Component({
+  selector: 'app-xy-chart-viewer-nav-card',
+  templateUrl: './xy-chart-viewer-nav-card.component.html'
+})
+export class XyChartViewerNavCardComponent implements OnInit, OnDestroy {
+
+  public channels = new Map<string, Node[]>();
+  public channelGroups: Node[];
+  public measurement: Node;
+
+  private selectedNode: Node;
+
+  // Subscriptions
+  private selectedNodeSub: Subscription;
+
+  constructor(
+    private navigatorService: NavigatorService,
+    private notificationService: MDMNotificationService,
+    private nodeService: NodeService,
+    private chartViewerService: ChartViewerService) {}
+
+  ngOnInit() {
+    this.selectedNodeChanged(this.navigatorService.getSelectedNode());
+    this.selectedNodeSub = this.navigatorService.selectedNodeChanged.subscribe(
+      node => this.selectedNodeChanged(node),
+      error => this.notificationService.notifyError('details.mdm-detail-view.cannot-update-node', error)
+    );
+  }
+
+  ngOnDestroy() {
+    this.selectedNodeSub.unsubscribe();
+  }
+
+  /**
+   * Handle node selection in navigation tree.
+   * Loads necessary data for xy chart, if not present:
+   *  - Measurement:
+   *    + Loaded if a channel or channelgroup is selected that is not present.
+   *    + Also loads all channels and channelgroups for that measurement.
+   *  - Channelgroups:
+   *    + Loaded if a measurement is selected/loaded that is not present.
+   *    + Also loads all channels for all newly loaded channelgroups.
+   *  - Channels:
+   *    + Allways loaded if some node is not present.
+   *
+   * @param node the selected node
+   */
+  private selectedNodeChanged(node: Node) {
+    this.selectedNode = node;
+    if (node != undefined) {
+      switch (node.type) {
+        case TYPE_MEASUREMENT:
+          this.selectedMeasurement(node);
+          break;
+        case TYPE_CHANNELGROUP:
+          this.selectedChannelGroup(node);
+          break;
+        case TYPE_CHANNEL:
+          this.selectedChannel(node);
+          break;
+      }
+    }
+  }
+
+  // reload all, if channel is not present yet.
+  private selectedChannel(node: Node) {
+    if (!this.isChannelPresent(node)) {
+      this.loadMeasurement(node);
+    } else {
+      this.chartViewerService.sendNodeMeta(this.selectedNode);
+    }
+  }
+
+  private selectedChannelGroup(node: Node) {
+    if (!this.isChannelGroupPresent(node)) {
+      this.loadMeasurement(node);
+    } else {
+      this.chartViewerService.sendNodeMeta(this.selectedNode);
+    }
+  }
+
+  private selectedMeasurement(node: Node) {
+    if (this.measurement == undefined || this.measurement.id !== node.id) {
+      this.measurement = node;
+      this.loadChannelGroups(node);
+    } else {
+      this.chartViewerService.sendNodeMeta(this.selectedNode);
+    }
+  }
+
+  private isChannelPresent(node: Node) {
+    if (this.channels != undefined) {
+      /**
+       * @TODO more readable code, but got the impression that performance is bad. Read up on performance topic in depth.
+       */
+      // Array.from(this.channels.values())
+      //       .reduce((a,b) => a.concat(b), [])
+      //       .findIndex(c => c.id === node.id);
+      let index = -1;
+      const iterator = this.channels.values();
+      let res = iterator.next();
+      while (index === -1 && !res.done) {
+        index = res.value.findIndex(c => c.id === node.id);
+        res = iterator.next();
+      }
+      return index > -1;
+    }
+    return false;
+  }
+
+  private isChannelGroupPresent(node: Node) {
+    if (this.channelGroups != undefined) {
+      return this.channelGroups.findIndex(channelGroup => channelGroup.id === node.id) > -1;
+    }
+    return false;
+  }
+
+  private loadMeasurement(node: Node) {
+    this.searchNodes(node, TYPE_MEASUREMENT)
+      .pipe(
+        /** @TODO in general true? */
+        // parent measurement must be distinct
+        map(measurements => measurements[0]),
+      ).subscribe(measurement => {
+        this.measurement = measurement;
+        this.loadChannelGroups(this.measurement);
+      });
+  }
+
+  private loadChannelGroups(measurement: Node) {
+    this.searchNodes(measurement, TYPE_CHANNELGROUP)
+        .subscribe(channelGroups => {
+          this.channelGroups = channelGroups;
+          if (this.channelGroups != undefined) {
+            this.loadChannels(channelGroups);
+          }
+        });
+  }
+
+  private loadChannels(channelGroups: Node[]) {
+    this.channels.clear();
+    let obsArray = channelGroups.map(channelGroup => this.searchNodes(channelGroup, TYPE_CHANNEL));
+    forkJoin(obsArray).pipe(
+        tap(array => array.forEach((channels, index) => this.channels.set(channelGroups[index].id, channels)))
+      ).subscribe(datasets => this.chartViewerService.sendNodeMeta(this.selectedNode));
+  }
+
+  private searchNodes(node: Node, targetType: string) {
+    const filter = 'filter=' + node.type + '.Id eq \"' + node.id + '\"';
+    return this.nodeService.searchNodes(filter, node.sourceName, targetType);
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-toolbar/xy-chart-viewer-toolbar.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-toolbar/xy-chart-viewer-toolbar.component.html
new file mode 100644
index 0000000..9264220
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-toolbar/xy-chart-viewer-toolbar.component.html
@@ -0,0 +1,97 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<div class="p-col-12 thin" >
+  <!-- ChannelSelection -->
+  <p-toggleButton
+    [(ngModel)]="properties.showSelection"
+    [onIcon]="'fa fa-columns'"
+    offIcon="fa fa-square-o"
+    onLabel=""
+    offLabel=""
+    (onChange)="onChangeProperty($event)"
+    title="{{(properties.showSelection ? 'chartviewer.xy-chart-viewer-toolbar.hide-data-selection-panel' : 'chartviewer.xy-chart-viewer-toolbar.show-data-selection-panel')| translate }}">
+  </p-toggleButton>
+  <!-- X/Y-mode -->
+  <p-toggleButton
+    [(ngModel)]="xyMode"
+    [onIcon]="'fa fa-filter'"
+    offIcon="fa fa-filter"
+    onLabel=""
+    offLabel=""
+    (onChange)="onToggleXyMode($event)"
+    title="{{(xyMode ? 'chartviewer.xy-chart-viewer-toolbar.deactivate-xy-mode' : 'chartviewer.xy-chart-viewer-toolbar.activate-xy-mode')| translate }}">
+  </p-toggleButton>
+  <span style="width:12px; display:inline-block;"></span>
+  <!-- Legend -->
+  <p-toggleButton
+    [onIcon]="'fa fa-map'"
+    offIcon="fa fa-map-o"
+    onLabel=""
+    offLabel=""
+    [(ngModel)]="properties.options.legend.display"
+    (onChange)="onChangeProperty($event)"
+    title="{{(properties?.options?.legend?.display ? 'chartviewer.xy-chart-viewer-toolbar.hide-chart-legend' : 'chartviewer.xy-chart-viewer-toolbar.show-chart-legend')| translate }}">
+  </p-toggleButton>
+  <!-- Linewidth -->
+  <p-spinner
+    [(ngModel)]="properties.lineWidth"
+    [min]="0.25"
+    [step]="0.25"
+    size="1"
+    (onChange)="onChangeProperty($event)"
+    title="{{'chartviewer.xy-chart-viewer-toolbar.line-width' | translate }}">
+  </p-spinner>
+  <!-- draw lines -->
+  <p-toggleButton
+    [onIcon]="'fa fa-line-chart'"
+    offIcon="fa fa-line-chart"
+    onLabel=""
+    offLabel=""
+    [(ngModel)]="properties.showLines"
+    (onChange)="onToggleShowLines($event)"
+    title="{{(properties.showLines ? 'chartviewer.xy-chart-viewer-toolbar.hide-lines' : 'chartviewer.xy-chart-viewer-toolbar.show-lines')| translate }}">
+  </p-toggleButton>
+  <!-- fill area -->
+  <p-toggleButton
+    [onIcon]="'fa fa-area-chart'"
+    offIcon="fa fa-area-chart"
+    onLabel=""
+    offLabel=""
+    [(ngModel)]="properties.fillArea"
+    (onChange)="onChangeProperty($event)"
+    [disabled]="!properties.showLines"
+    title="{{(properties.fillArea ? 'chartviewer.xy-chart-viewer-toolbar.clear-area' : 'chartviewer.xy-chart-viewer-toolbar.fill-area')| translate }}">
+  </p-toggleButton>
+  <!-- Datapoints -->
+  <p-toggleButton
+    title="Show Datapoints"
+    [onIcon]="'fa fa-share-alt'"
+    offIcon="fa fa-share-alt"
+    onLabel=""
+    offLabel=""
+    [(ngModel)]="properties.drawPoints"
+    (onChange)="onChangeProperty($event)"
+    title="{{(properties.drawPoints ? 'chartviewer.xy-chart-viewer-toolbar.hide-datapoints' : 'chartviewer.xy-chart-viewer-toolbar.show-datapoints'| translate) }}">
+  </p-toggleButton>
+  <!-- tension -->
+  <p-spinner
+    size="1"
+    [(ngModel)]="properties.lineTension"
+    [min]="0"
+    [step]="0.1"
+    [max]="1"
+    (onChange)="onChangeProperty($event)"
+    title="{{'chartviewer.xy-chart-viewer-toolbar.tension' | translate }}">
+  </p-spinner>
+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-toolbar/xy-chart-viewer-toolbar.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-toolbar/xy-chart-viewer-toolbar.component.ts
new file mode 100644
index 0000000..b22f402
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer-toolbar/xy-chart-viewer-toolbar.component.ts
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { ChartToolbarProperties } from '../../model/chartviewer.model';
+
+@Component({
+  selector: 'mdm5-xy-chart-viewer-toolbar',
+  templateUrl: './xy-chart-viewer-toolbar.component.html',
+  styleUrls: ['../../chart-viewer.style.css']
+})
+export class XyChartViewerToolbarComponent implements OnInit {
+
+  @Output()
+  public xyModeChanged = new EventEmitter<boolean>();
+  @Output()
+  public toolbarPropertiesChanged = new EventEmitter<ChartToolbarProperties>();
+
+  // if true, x- and y-channels have to be channels with axisType 'X_AXIS', or 'Y_AXIS' respectively.
+  // change xy requires reloading of select options. Thus requires own event.
+  public xyMode = true;
+  // holds actual properties
+  public properties = new ChartToolbarProperties();
+  // model for showlines.
+  public showLegend = true;
+
+  constructor() { }
+
+  ngOnInit() {
+
+    /** properties for cahrt elements */
+
+    // if true, shows pannel with channel(-group) selection
+    this.properties.showSelection = true;
+    // if true, draws datapoints
+    this.properties.drawPoints = false;
+    // the charts borderwidth (width of lines, border for points)
+    this.properties.lineWidth = 1;
+    // if true, draws lines connecting datapoints
+    this.properties.showLines = true;
+    // if true, fills are below graph
+    this.properties.fillArea = false;
+    // the interpolation degree. 0 = linear, 0.4 = Bezier
+    this.properties.lineTension = 0;
+
+    // /** properties directly passed to cahrt options */
+    // if legend.display true, shows chart legend
+    this.properties.options = {legend: {display: true}};
+
+    // emit to send initial properties to chart viewer
+    this.xyModeChanged.emit(this.xyMode);
+    this.toolbarPropertiesChanged.emit(this.properties);
+  }
+
+  // X- and y-axis options are determined by channels axis type, if xyMode toggled to true
+  public onToggleXyMode(event: Event) {
+    this.xyModeChanged.emit(this.xyMode);
+  }
+
+  public onChangeProperty(event: Event) {
+    this.toolbarPropertiesChanged.emit(this.properties);
+  }
+
+  // displays/hides lines connecting data points
+  public onToggleShowLines(event: Event) {
+    if (!this.properties.showLines) {
+      this.properties.fillArea = false;
+    }
+    this.toolbarPropertiesChanged.emit(this.properties);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer/xy-chart-viewer.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer/xy-chart-viewer.component.html
new file mode 100644
index 0000000..7273cff
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer/xy-chart-viewer.component.html
@@ -0,0 +1,42 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<div class="p-grid toolbar">
+  <mdm5-xy-chart-viewer-toolbar #toolbar
+    (xyModeChanged)="onXyModeChanged($event)"
+    (toolbarPropertiesChanged)="onToolbarPropertiesChanged($event)">
+  </mdm5-xy-chart-viewer-toolbar>
+</div>
+
+<!-- View area -->
+<div class="p-grid nested-grid">
+  <!-- Axis selection -->
+  <div [ngClass]="showSelection ? 'p-col-3' : 'hidden'">
+    <mdm5-xy-chart-data-selection-panel
+      [channelGroups]="channelGroups"
+      [channels]="channels"
+      [xyMode]="xyMode"
+      (onSelectionChanged)="onDataSelectionChanged($event)"
+    ></mdm5-xy-chart-data-selection-panel>
+  </div>
+  <!-- Chart / Table -->
+  <div [ngClass]="showSelection ? 'p-col-9' : 'p-col-12'">
+    <p-chart #xyChart type="scatter" [data]="data"></p-chart>
+  </div>
+</div>
+<div class="p-grid">
+  <div class="p-col-12">
+    <mdm5-request-options [channelGroups]="channelGroups" (onRequestOptionsChanged)="onRequestOptionsChanged($event)"></mdm5-request-options>
+  </div>
+</div>
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer/xy-chart-viewer.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer/xy-chart-viewer.component.ts
new file mode 100644
index 0000000..549a418
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/components/xy-chart-viewer/xy-chart-viewer.component.ts
@@ -0,0 +1,220 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, Input, ViewChild } from '@angular/core';
+
+import { UIChart } from 'primeng/chart';
+import { map, flatMap, tap } from 'rxjs/operators';
+
+import { Node } from '../../../navigator/node';
+
+import { ChartData, ChartDataSet, MeasuredValues, RequestOptions, ChannelSelectionRow,
+         ChartXyDataSet, ChartToolbarProperties} from '../../model/chartviewer.model';
+import { ChartViewerDataService } from '../../services/chart-viewer-data.service';
+import { ArrayUtilService } from 'src/app/core/services/array-util.service';
+import { ChartViewerService } from '../../services/chart-viewer.service';
+import { forkJoin} from 'rxjs';
+import { MDMNotificationService } from 'src/app/core/mdm-notification.service';
+
+@Component({
+  selector: 'app-xy-chart-viewer',
+  templateUrl: './xy-chart-viewer.component.html',
+  styleUrls: ['../../chart-viewer.style.css']
+})
+export class XyChartViewerComponent implements OnInit {
+
+  @ViewChild('xyChart')
+  public chart: UIChart;
+
+  @Input()
+  public channelGroups: Node[];
+  @Input()
+  public channels: Map<string, Node[]>;
+
+  // the chart data
+  public data: ChartData;
+
+  // options for meausred value data request
+  private requestOptions: RequestOptions;
+  // chart properties set via toolbar
+  private toolbarProperties: ChartToolbarProperties;
+  // shows selection pannel if true, set via toolbar
+  public showSelection: boolean;
+  // passed to selection pannel
+  public xyMode: boolean;
+
+  public selectedChannelRows: ChannelSelectionRow[] = [];
+
+  constructor(private chartviewerDataService: ChartViewerDataService,
+              private chartviewerService: ChartViewerService,
+              private arrayUtil: ArrayUtilService,
+              private notificationService: MDMNotificationService) { }
+
+  ngOnInit() {
+    this.initChartData();
+  }
+
+  /**************** Html-template listeners *****************************/
+
+  /**
+   * Draws chart when data selection changes
+   * @param rows
+   */
+  public onDataSelectionChanged(rows: ChannelSelectionRow[]) {
+    this.selectedChannelRows = rows;
+    this.doChart();
+  }
+
+  /**
+   * Passes xyModeChanges from toolbar to selection pannel
+   * @param isXyMode
+   */
+  public onXyModeChanged(isXyMode: boolean) {
+    this.xyMode = isXyMode;
+  }
+
+  /**
+   * Handles toolbar property changes
+   * @param properties
+   */
+  public onToolbarPropertiesChanged(properties: ChartToolbarProperties) {
+    this.toolbarProperties = properties;
+    this.showSelection = properties.showSelection;
+    this.chart.options = properties.options;
+    if (this.chart.data != undefined) {
+      this.chart.data.datasets.forEach( dataSet => {
+        dataSet.showLine = properties.showLines;
+        dataSet.pointRadius = properties.drawPoints ? 3 : 0;
+        dataSet.borderWidth = properties.lineWidth;
+        dataSet.lineTension = properties.lineTension;
+        dataSet.fill = properties.fillArea;
+      });
+      this.chart.reinit();
+    }
+  }
+
+  // Sets new data request options and redraws the graph
+  public onRequestOptionsChanged(options: RequestOptions) {
+    this.requestOptions = options;
+    this.doChart();
+  }
+
+  /********** private methods / class logic ********************************************************/
+
+  // empty chart on initialization
+  private initChartData() {
+    const dataset = new ChartDataSet('No data', []);
+    dataset.borderColor = '#fff';
+    this.data = new ChartData([], [dataset]);
+  }
+
+  /**
+   * Loads measured values for current selection and draws the new chart.
+   */
+  private doChart() {
+    if (this.arrayUtil.isNotEmpty(this.selectedChannelRows) && this.requestOptions != undefined) {
+      const xChannels = this.selectedChannelRows.filter(row => row.xChannel != undefined)
+        .map(row => this.chartviewerDataService.loadMeasuredValues(
+          row.channelGroup, [row.xChannel], this.requestOptions.startIndex, this.requestOptions.requestSize));
+      forkJoin(xChannels)
+        .pipe(
+          map(array => array.map((mea, index) => ({yChannel: this.selectedChannelRows[index].yChannel, measuredValues: mea[0]}))),
+          flatMap(xValues => this.loadYData(xValues)),
+          tap(x => console.log(x))
+        )
+      .subscribe(resp => this.applyData(resp));
+    } else {
+      this.initChartData();
+    }
+  }
+
+  /**
+   * Apply the ChartData to data and options attributes of the chart component
+   * @param xValues
+   */
+  private applyData(resp: ChartData) {
+    this.data = resp;
+    this.chart.options = {
+      scales: {
+        xAxes: [{
+          scaleLabel: {
+            display: true,
+            labelString: resp.datasets.map(ds => (<ChartXyDataSet> ds).xUnit).join(', ')
+          }
+        }],
+      },
+    };
+  }
+
+  /**
+   * Loads measured values for y-channels, merges them with given values for x
+   * @param xValues
+   */
+  private loadYData(xValues: {yChannel: Node; measuredValues: MeasuredValues}[]) {
+    if (xValues != undefined) {
+      const yChannels = this.groupYChannelsByChannelGroup(this.selectedChannelRows);
+      // const channelGroups = this.selectedChannelGroups.filter(cg => this.arrayUtil.isNotEmpty(yChannels[cg.id]));
+      const channelGroups = Array.from(new Set(this.selectedChannelRows.map(row => row.channelGroup)));
+
+      const obs = channelGroups.map(cg => this.chartviewerDataService.loadMeasuredValues(
+        cg, yChannels[cg.id], this.requestOptions.startIndex, this.requestOptions.requestSize));
+      // forkJoin return observables in order of input array. Therefore channelgroup id has to be like tmpChannelGroups[index].id
+      return forkJoin(obs)
+        .pipe(
+          map(array => array.map((yData, channelGroupIndex) =>
+              yData.map((yValues, yChannelIndex) => {
+                const cgId = channelGroups[channelGroupIndex].id;
+                const xMeasuredValues = this.extractXMeasuredValues(xValues, yChannels[cgId][yChannelIndex].id);
+                const dataSet = this.chartviewerService.toXyDataSet(xMeasuredValues, yValues);
+                return this.setChartProperties(dataSet);
+              }))),
+          map(sets => new ChartData([], sets.reduce((a, b) => a.concat(b), [])))
+        );
+    }
+  }
+
+  private extractXMeasuredValues(xValues: {yChannel: Node; measuredValues: MeasuredValues}[], channelId: string) {
+    const val = xValues.find(v => v.yChannel.id === channelId);
+    if (val != undefined ) {
+      return val.measuredValues;
+    }
+  }
+
+  /******* Helping functions */
+
+  private groupYChannelsByChannelGroup(array: ChannelSelectionRow[]) {
+    return array.reduce(
+      (obj, next) => {
+        const value = next.channelGroup.id;
+        obj[value] = obj[value] || [];
+        obj[value] = obj[value].concat(next.yChannel);
+        return obj;
+      }, {});
+  }
+
+  private setChartProperties(dataset: ChartXyDataSet) {
+    if (!this.toolbarProperties.drawPoints) {
+      dataset.pointRadius = 0;
+    }
+    dataset.showLine = this.toolbarProperties.showLines;
+    dataset.fill = this.toolbarProperties.fillArea;
+    dataset.lineTension = this.toolbarProperties.lineTension;
+    dataset.borderWidth = this.toolbarProperties.lineWidth;
+    const color = '#' + Math.random().toString(16).substr(-6);
+    dataset.borderColor = color;
+    dataset.backgroundColor = color;
+
+    return dataset;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/chartviewer.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/chartviewer.model.ts
new file mode 100644
index 0000000..82089da
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/chartviewer.model.ts
@@ -0,0 +1,31 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export { BooleanArray } from './types/boolean-array.class';

+export { DateArray } from './types/date-array.class';

+export { NumberArray } from './types/number-array.class';

+export { MeasuredValues } from './types/measured-values.class';

+export { MeasuredValuesResponse } from './types/measured-values-response.class';

+export { PreviewValueList } from './types/preview-value-list.class';

+export { ChartData } from './types/chart-data.class';

+export { ChartDataSet } from './types/chart-data-set.class';

+export { ChartXyDataSet } from './types/chart-xy-data-set.class';

+export { ChartPoint } from './types/chart-point.class';

+export { RequestOptions } from './types/request-options.class';

+export { ChannelSelectionRow } from './types/channel-selection-row';

+export { ChartToolbarProperties } from './types/chart-toolbar-properties.class';

+

+

+export { PrimeChartDataSet } from './primeNgHelper/prime-chart-data-set.interface';

+export { PrimeChartData } from './primeNgHelper/prime-chart-data.interface';

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/constants.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/constants.ts
new file mode 100644
index 0000000..84c8b5b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/constants.ts
@@ -0,0 +1,4 @@
+// entity types

+export const TYPE_CHANNEL = 'Channel';

+export const TYPE_CHANNELGROUP = 'ChannelGroup';

+export const TYPE_MEASUREMENT = 'Measurement';

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/primeNgHelper/prime-chart-data-set.interface.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/primeNgHelper/prime-chart-data-set.interface.ts
new file mode 100644
index 0000000..2ab3947
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/primeNgHelper/prime-chart-data-set.interface.ts
@@ -0,0 +1,18 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export interface PrimeChartDataSet {

+  label: string;

+  data: any[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/primeNgHelper/prime-chart-data.interface.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/primeNgHelper/prime-chart-data.interface.ts
new file mode 100644
index 0000000..d2a1d96
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/primeNgHelper/prime-chart-data.interface.ts
@@ -0,0 +1,19 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+import { PrimeChartDataSet } from './prime-chart-data-set.interface';

+

+export interface PrimeChartData {

+  labels: any[];

+  datasets: PrimeChartDataSet[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/boolean-array.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/boolean-array.class.ts
new file mode 100644
index 0000000..a55de67
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/boolean-array.class.ts
@@ -0,0 +1,17 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export class BooleanArray {

+  values: boolean[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/channel-selection-row.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/channel-selection-row.ts
new file mode 100644
index 0000000..23f0072
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/channel-selection-row.ts
@@ -0,0 +1,26 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+import {Node} from '../../../navigator/node';

+

+export class ChannelSelectionRow {

+  channelGroup: Node;

+  xChannel: Node;

+  yChannel: Node;

+

+  constructor(channelGroup: Node, yChannel: Node, xChannel?: Node) {

+    this.channelGroup = channelGroup;

+    this.yChannel = yChannel;

+    this.xChannel = xChannel;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-data-set.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-data-set.class.ts
new file mode 100644
index 0000000..616a91e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-data-set.class.ts
@@ -0,0 +1,36 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+import { PrimeChartDataSet } from '../chartviewer.model';

+import { Node } from '../../../navigator/node';

+import { MeasuredValues } from './measured-values.class';

+

+export class ChartDataSet implements PrimeChartDataSet {

+  label: string;

+  data: any[];

+  hidden?: boolean;

+  fill?: boolean;

+  measuredValues?: MeasuredValues;

+  channel?: Node;

+  backgroundColor?: string;

+  borderColor?: string;

+  pointBackgroundColor?: string;

+  pointBorderColor?: string;

+  pointHoverBackgroundColor?: string;

+  pointHoverBorderColor?: string;

+

+  constructor (label: string, data: any[]) {

+    this.label = label;

+    this.data = data;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-data.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-data.class.ts
new file mode 100644
index 0000000..fc5c2ee
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-data.class.ts
@@ -0,0 +1,26 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+import { PrimeChartData } from '../primeNgHelper/prime-chart-data.interface';

+import { ChartDataSet } from './chart-data-set.class';

+import { ChartXyDataSet } from './chart-xy-data-set.class';

+

+export class ChartData implements PrimeChartData {

+  labels: any[];

+  datasets: (ChartDataSet | ChartXyDataSet)[];

+

+  constructor(labels: any[], datasets: (ChartDataSet | ChartXyDataSet)[]) {

+    this.labels = labels;

+    this.datasets = datasets;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-point.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-point.class.ts
new file mode 100644
index 0000000..22e36fe
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-point.class.ts
@@ -0,0 +1,23 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export class ChartPoint {

+  x: number;

+  y: number;

+

+  constructor (x: number, y: number) {

+    this.x = x;

+    this.y = y;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-toolbar-properties.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-toolbar-properties.class.ts
new file mode 100644
index 0000000..454d718
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-toolbar-properties.class.ts
@@ -0,0 +1,31 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export class ChartToolbarProperties {

+

+  // if true, shows pannel with channel(-group) selection

+  public showSelection: boolean;

+  // if true, draws datapoints

+  public drawPoints: boolean;

+  // the charts borderwidth (width of lines, border for points)

+  public lineWidth: number;

+  // if true, draws lines connecting datapoints

+  public showLines: boolean;

+  // if true, fills are below graph

+  public fillArea: boolean;

+  // the interpolation degree. 0 = linear, 0.4 = Bezier

+  public lineTension: number;

+

+  public options: {legend: {display: boolean}};

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-xy-data-set.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-xy-data-set.class.ts
new file mode 100644
index 0000000..23da9aa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/chart-xy-data-set.class.ts
@@ -0,0 +1,54 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+import { Node } from '../../../navigator/node';

+import { MeasuredValues } from './measured-values.class';

+import { ChartPoint } from './chart-point.class';

+import { PrimeChartDataSet } from '../chartviewer.model';

+

+export class ChartXyDataSet implements PrimeChartDataSet {

+  // mandatory

+  label: string;

+  data: ChartPoint[];

+

+  xUnit?: string;

+  yUnit?: string;

+

+  // remove?

+  hidden?: boolean;

+  measuredValues?: MeasuredValues;

+  channel?: Node;

+

+  // point styles

+  pointBackgroundColor?: string;

+  pointBorderColor?: string;

+  pointHoverBackgroundColor?: string;

+  pointHoverBorderColor?: string;

+  pointRadius: number;

+  pointHoverRadius?: number;

+

+  // line styles

+  borderWidth: number;

+  fill: boolean;

+  borderColor: string;

+  lineTension: number;

+  showLine: boolean;

+

+  // general

+  backgroundColor?: string;

+

+  constructor (label: string, data: ChartPoint[]) {

+    this.label = label;

+    this.data = data;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/date-array.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/date-array.class.ts
new file mode 100644
index 0000000..4f13aee
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/date-array.class.ts
@@ -0,0 +1,18 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export class DateArray {

+  // @Type(() => Date)

+  values: string[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/measured-values-response.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/measured-values-response.class.ts
new file mode 100644
index 0000000..915b12a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/measured-values-response.class.ts
@@ -0,0 +1,19 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { MeasuredValues } from './measured-values.class';

+

+export class MeasuredValuesResponse {

+  values: MeasuredValues[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/measured-values.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/measured-values.class.ts
new file mode 100644
index 0000000..672cb1a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/measured-values.class.ts
@@ -0,0 +1,54 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { NumberArray } from './number-array.class';

+import { BooleanArray } from './boolean-array.class';

+import { DateArray } from './date-array.class';

+

+export class MeasuredValues {

+  name: string;

+  unit: string;

+  length: number;

+  independent: boolean;

+  axisType: string;

+  scalarType: string;

+  // stringArray: StringArray;

+  dateArray: DateArray;

+  booleanArray: BooleanArray;

+  // byteArray: ByteArray;

+  shortArray: NumberArray;

+  integerArray: NumberArray;

+  longArray: NumberArray;

+  floatArray: NumberArray;

+  doubleArray: NumberArray;

+  // byteStreamArray: ByteStreamArray;

+  // floatComplexArrray: FloatComplexArray;

+  // doubleComplexArrray: DoubleComplexArray;

+  flags: boolean[];

+  getDataArray() {

+    if (this.scalarType === 'INTEGER') {

+      return this.integerArray;

+    } else if (this.scalarType === 'FLOAT') {

+      return this.floatArray;

+    } else if (this.scalarType === 'DOUBLE') {

+      return this.doubleArray;

+    } else if (this.scalarType === 'DATE') {

+      return this.dateArray;

+    } else if (this.scalarType === 'SHORT') {

+      return this.shortArray;

+    } else if (this.scalarType === 'BOOLEAN') {

+      return this.booleanArray;

+    }

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/number-array.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/number-array.class.ts
new file mode 100644
index 0000000..7c3c310
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/number-array.class.ts
@@ -0,0 +1,16 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+export class NumberArray {

+  values: number[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/preview-value-list.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/preview-value-list.class.ts
new file mode 100644
index 0000000..9a42f12
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/preview-value-list.class.ts
@@ -0,0 +1,21 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { MeasuredValues } from './measured-values.class';

+

+export class PreviewValueList {

+  min: MeasuredValues[];

+  avg: MeasuredValues[];

+  max: MeasuredValues[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/request-options.class.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/request-options.class.ts
new file mode 100644
index 0000000..c818e02
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/model/types/request-options.class.ts
@@ -0,0 +1,26 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+export class RequestOptions {

+  requestSize: number;

+  startIndex: number;

+  previewEnabled: boolean;

+  numberOfChunks: number;

+

+  constructor(requestSize: number, startIndex: number, previewEnabled: boolean, numberOfChunks: number) {

+    this.requestSize = requestSize;

+    this.startIndex = startIndex;

+    this.previewEnabled = previewEnabled;

+    this.numberOfChunks = numberOfChunks;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer-data.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer-data.service.spec.ts
new file mode 100644
index 0000000..e50383c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer-data.service.spec.ts
@@ -0,0 +1,99 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';
+import { HttpErrorHandler } from '../../core/http-error-handler';
+import { PropertyService } from '../../core/property.service';
+import { Node } from '../../navigator/node';
+import { MeasuredValues, NumberArray, MeasuredValuesResponse } from '../model/chartviewer.model';
+import { ChartViewerDataService } from './chart-viewer-data.service';
+
+
+let timeChannel = new MeasuredValues();
+timeChannel.name = 'time';
+timeChannel.unit = 's';
+timeChannel.length = 5;
+timeChannel.independent = true;
+timeChannel.integerArray = new NumberArray();
+timeChannel.integerArray.values = [1, 2, 3, 4, 5];
+timeChannel.flags = [true, true, true, true, true];
+
+let channel1 = new MeasuredValues();
+channel1.name = 'channel1';
+channel1.unit = 'm';
+channel1.length = 5;
+channel1.independent = true;
+channel1.integerArray = new NumberArray();
+channel1.integerArray.values = [3, 5, 4, 3, 2];
+channel1.flags = [true, true, true, true, true];
+
+export let data = new MeasuredValuesResponse();
+data.values = [channel1, timeChannel];
+
+describe('ChartViewerDataService', () => {
+  let httpTestingController: HttpTestingController;
+  let chartViewerDataService: ChartViewerDataService;
+
+  beforeEach(() => {
+    TestBed.resetTestEnvironment();
+    TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
+    TestBed.configureTestingModule({
+      imports: [ HttpClientTestingModule ],
+      providers: [ChartViewerDataService, HttpErrorHandler, PropertyService]
+    });
+
+    httpTestingController = TestBed.get(HttpTestingController);
+    chartViewerDataService = TestBed.get(ChartViewerDataService);
+  });
+
+  it('can read values', () => {
+    let node = new Node();
+    node.sourceName = 'MDM';
+    node.id = '1';
+
+    chartViewerDataService.loadMeasuredValues(node, [node])
+      .subscribe(channelGroups => expect(channelGroups).toEqual(data.values));
+
+    const req = httpTestingController.expectOne('/org.eclipse.mdm.nucleus/mdm/environments/MDM/values/read');
+    expect(req.request.method).toEqual('POST');
+    req.flush(data);
+
+    // Finally, assert that there are no outstanding requests.
+    httpTestingController.verify();
+  });
+
+  it('can filter on data', () => {
+    let node = new Node();
+    node.sourceName = 'MDM';
+    node.id = '1';
+
+    chartViewerDataService.loadMeasuredValues(node, [node])
+      .subscribe(channelGroups => expect(channelGroups.filter(c => c.name === 'time')).toEqual([timeChannel]));
+
+    const req = httpTestingController.expectOne('/org.eclipse.mdm.nucleus/mdm/environments/MDM/values/read');
+    expect(req.request.method).toEqual('POST');
+    req.flush(data);
+
+    // Finally, assert that there are no outstanding requests.
+    httpTestingController.verify();
+  });
+
+
+  afterEach(() => {
+    // After every test, assert that there are no more pending requests.
+    httpTestingController.verify();
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer-data.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer-data.service.ts
new file mode 100644
index 0000000..7773a30
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer-data.service.ts
@@ -0,0 +1,146 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+
+import { plainToClass } from 'class-transformer';
+import { map, tap, catchError } from 'rxjs/operators';
+
+import { HttpErrorHandler } from '../../core/http-error-handler';
+import { PropertyService } from '../../core/property.service';
+import { Node } from '../../navigator/node';
+import { MeasuredValuesResponse, MeasuredValues, PreviewValueList } from '../model/chartviewer.model';
+
+export function getDataArray(m: MeasuredValues) {
+  if (m.scalarType === 'INTEGER') {
+    return m.integerArray;
+  } else if (m.scalarType === 'FLOAT') {
+    return m.floatArray;
+  } else if (m.scalarType === 'DOUBLE') {
+    return m.doubleArray;
+  } else if (m.scalarType === 'DATE') {
+    return m.dateArray;
+  } else if (m.scalarType === 'SHORT') {
+    return m.shortArray;
+  } else if (m.scalarType === 'BOOLEAN') {
+    return m.booleanArray;
+  }
+}
+
+@Injectable({
+  providedIn: 'root'
+})
+export class ChartViewerDataService {
+  private _contextUrl: string;
+
+  private httpOptions = {
+    headers: new HttpHeaders({
+      'Content-Type': 'application/json',
+      'Accept': 'application/json'
+    })
+  };
+
+  constructor(private http: HttpClient,
+    private httpErrorHandler: HttpErrorHandler,
+    private _prop: PropertyService) {
+    this._contextUrl = _prop.getUrl('mdm/environments');
+  }
+
+  loadMeasuredValues(channelGroup: Node, channels: Node[], startIndex = 0, requestSize = 0) {
+    let readRequest = {
+      'channelGroupId': channelGroup.id,
+      'channelIds': channels.map(channel => channel.id),
+      'start_index': startIndex,
+      'request_size': requestSize,
+      'valuesMode': 'CALCULATED'
+    };
+
+    return this.http.post<MeasuredValuesResponse>(this._contextUrl + '/' + channelGroup.sourceName + '/values/read',
+      readRequest, this.httpOptions)
+      .pipe(
+        map(res => plainToClass(MeasuredValues, res.values)),
+        map(measurementValues => measurementValues.sort((a, b) => a.name.localeCompare(b.name))),
+        // tap(r => console.log(r)),
+        catchError(this.httpErrorHandler.handleError)
+      );
+  }
+
+  loadPreviewValues(channelGroup: Node, channels: Node[], chunks: number, startIndex = 0, requestSize = 0) {
+    let readRequest = {
+      'channelGroupId': channelGroup.id,
+      'channelIds': channels.map(channel => channel.id),
+      'start_index': startIndex,
+      'request_size': requestSize,
+      'valuesMode': 'CALCULATED'
+    };
+    let previewRequest = {
+      'numberOfChunks': chunks,
+      'readRequest': readRequest
+    };
+
+    return this.http.post<PreviewValueList>(this._contextUrl + '/' + channelGroup.sourceName + '/values/preview',
+      previewRequest, this.httpOptions)
+      .pipe(
+        map(res => plainToClass(MeasuredValues, res.avg)),
+        // tap(r => console.log(r)),
+        catchError(this.httpErrorHandler.handleError)
+      );
+  }
+
+  // readMeasuredValuesMetadata(channelGroup: Node, channels: Node[]) {
+  //   let readRequest = {
+  //     'channelGroupId': channelGroup.id,
+  //     'channelIds': channels.map(channel => channel.id),
+  //     'valuesMode': 'CALCULATED'
+  //   };
+
+  //   return this.http.post<MeasuredValuesResponse>(this._contextUrl + '/' + channelGroup.sourceName + '/values/read',
+  //     readRequest, this.httpOptions)
+  //     .pipe(
+  //       map(res => plainToClass(MeasuredValues, res.values)),
+  //       map(measurementValues => measurementValues.sort((a, b) => a.name.localeCompare(b.name))),
+  //       tap(r => console.log(r)));
+  // }
+
+  /**
+   * @Todo workarround to get axis type. This schould be possible without accessign data. Requires RESTAPI changes.
+   */
+  readAxisType(channelGroup: Node) {
+    let readRequest = {
+      'channelGroupId': channelGroup.id,
+      'start_index': 0,
+      'request_size': 1,
+      'valuesMode': 'CALCULATED'
+    };
+
+    return this.http.post<MeasuredValuesResponse>(this._contextUrl + '/' + channelGroup.sourceName + '/values/read',
+    readRequest, this.httpOptions)
+    .pipe(
+      map(res => plainToClass(MeasuredValues, res.values)),
+      map(measurementValues => measurementValues.sort((a, b) => a.name.localeCompare(b.name))),
+      // tap(r => console.log(r))
+    );
+  }
+
+  getNumberOfRows(channelGroup: Node) {
+    let attr = channelGroup.attributes.find(a => a.name === 'SubMatrixNoRows');
+    if (attr === undefined) {
+      // TODO
+      console.log('Could not find attribute SubMatrixNoRows on ChannelGroup with id ' + channelGroup.id);
+      return;
+    }
+    return parseInt(<string> attr.value, 10);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer.service.spec.ts
new file mode 100644
index 0000000..b187abc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer.service.spec.ts
@@ -0,0 +1,12 @@
+import { TestBed } from '@angular/core/testing';
+
+import { ChartViewerService } from './chart-viewer.service';
+
+describe('ChartViewerService', () => {
+  beforeEach(() => TestBed.configureTestingModule({}));
+
+  it('should be created', () => {
+    const service: ChartViewerService = TestBed.get(ChartViewerService);
+    expect(service).toBeTruthy();
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer.service.ts
new file mode 100644
index 0000000..7e0587d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/chart-viewer.service.ts
@@ -0,0 +1,42 @@
+import { Injectable } from '@angular/core';
+import { Node } from '../../navigator/node';
+import { Subject } from 'rxjs';
+import { MeasuredValues, ChartData, ChartXyDataSet, ChartPoint } from '../model/chartviewer.model';
+import { getDataArray } from './chart-viewer-data.service';
+import { zip } from 'rxjs/operators';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class ChartViewerService {
+
+  private nodeMetaSubject = new Subject<Node>();
+
+  constructor() {}
+
+  public sendNodeMeta(nodeMeta: Node) {
+    this.nodeMetaSubject.next(nodeMeta);
+  }
+
+  public onNodeMetaChange() {
+    return this.nodeMetaSubject.asObservable();
+  }
+
+  public toXyDataSet(xData: MeasuredValues, yData: MeasuredValues) {
+    const xValues = xData.getDataArray().values as number[];
+    const yValues = getDataArray(yData).values as number[];
+    const points = this.getDataPoints(xValues, yValues);
+    const dataset = new ChartXyDataSet(yData.name + ' [' + yData.unit + ']', points);
+    dataset.xUnit = xData.unit;
+    dataset.yUnit = yData.unit;
+    return dataset;
+  }
+
+  private getDataPoints(xData: number[], yData: number[], startIndex = 0) {
+    if (xData != undefined && xData.length <= yData.length) {
+      return xData.map((x, i) => new ChartPoint(x, yData[i]));
+    } else if (xData != undefined && xData.length > yData.length) {
+      return yData.map((y, i) => new ChartPoint(xData[i], y));
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/dummy.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/dummy.service.ts
new file mode 100644
index 0000000..731c6ac
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/chartviewer/services/dummy.service.ts
@@ -0,0 +1,66 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+import { Node } from '../../navigator/node';
+import { MeasuredValues, MeasuredValuesResponse, NumberArray } from '../model/chartviewer.model';
+
+let timeChannel = new MeasuredValues();
+timeChannel.name = 'time';
+timeChannel.unit = 's';
+timeChannel.length = 5;
+timeChannel.independent = true;
+timeChannel.scalarType = 'INTEGER';
+timeChannel.integerArray = new NumberArray();
+timeChannel.integerArray.values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+timeChannel.flags = [true, true, true, true, true, true, true, true, true, true];
+
+let channel1 = new MeasuredValues();
+channel1.name = 'channel1';
+channel1.unit = 'm';
+channel1.length = 5;
+channel1.independent = true;
+channel1.scalarType = 'INTEGER';
+channel1.integerArray = new NumberArray();
+channel1.integerArray.values = [3, 5, 4, 3, 2, 5, 1, 1, 7, 2];
+channel1.flags = [true, true, true, true, true, true, true, true, true, true];
+
+let data = new MeasuredValuesResponse();
+data.values = [timeChannel, channel1];
+
+@Injectable({
+  providedIn: 'root'
+})
+export class DummyChartviewerService {
+
+  constructor() {
+  }
+
+  loadMeasuredValues(channelGroup: Node, channels: Node[], startIndex = 0, requestSize = 0) {
+    data.values[0].length = requestSize;
+    data.values[0].integerArray.values = Array.from(Array(requestSize).keys()).map((v, i) => startIndex + i);
+    data.values[0].flags = data.values[0].integerArray.values.map(v => true);
+
+    data.values[1].length = requestSize;
+    data.values[1].integerArray.values = data.values[0].integerArray.values.map(v => Math.random() * 10);
+    data.values[1].flags = data.values[1].integerArray.values.map(v => true);
+
+    return Observable.of(data.values);
+  }
+
+  readMeasuredValuesMetadata(channelGroup: Node, channels: Node[]) {
+    return Observable.of(data.values);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/http-error-handler.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/http-error-handler.ts
new file mode 100644
index 0000000..b9639be
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/http-error-handler.ts
@@ -0,0 +1,44 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Injectable } from '@angular/core';
+import { Response } from '@angular/http';
+import { isDevMode } from '@angular/core';
+
+import {throwError as observableThrowError } from 'rxjs';
+
+@Injectable()
+export class HttpErrorHandler {
+
+  handleError(error: Response | any) {
+      let errMsg: string;
+      if (error instanceof Response) {
+        try {
+          const body = error.json() || '';
+          const err = body.error || JSON.stringify(body);
+          errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
+        } catch (e) {
+          if (isDevMode()) {
+            errMsg = `${error.status} - ${error.statusText || ''} ${error.text()}`;
+          } else {
+            errMsg = `Please contact the administrator. Status code: ${error.status} - ${error.statusText || ''}`;
+          }
+        }
+      } else {
+        errMsg = error.message ? error.message : error.toString();
+      }
+      return observableThrowError(errMsg);
+    }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-core.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-core.module.ts
new file mode 100644
index 0000000..bf5dbe5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-core.module.ts
@@ -0,0 +1,119 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { HttpModule } from '@angular/http';
+import { HttpClientModule, HttpClient } from '@angular/common/http';
+import { FormsModule } from '@angular/forms';
+
+import { ModalModule } from 'ngx-bootstrap';
+import { TypeaheadModule } from 'ngx-bootstrap';
+import { DatepickerModule } from 'ngx-bootstrap';
+import { AccordionModule } from 'ngx-bootstrap';
+import { TabsModule } from 'ngx-bootstrap/tabs';
+import { PositioningService } from 'ngx-bootstrap/positioning';
+import { ComponentLoaderFactory } from 'ngx-bootstrap/component-loader';
+import { BsDropdownModule } from 'ngx-bootstrap';
+
+import { TreeModule, DataTableModule, SharedModule, ContextMenuModule } from 'primeng/primeng';
+import { GrowlModule, DropdownModule, MultiSelectModule, CalendarModule } from 'primeng/primeng';
+
+import { PropertyService } from './property.service';
+import { PreferenceService } from './preference.service';
+
+import { MDMNotificationComponent } from './mdm-notification.component';
+import { OverwriteDialogComponent } from './overwrite-dialog.component';
+
+import { AttributeValuePipe } from '../navigator/attribute-value.pipe';
+
+import { MDMDataSourceTranslationPipe } from '../localization/mdmdatasourcetranslation.pipe';
+
+import { TranslateModule, TranslateService } from '@ngx-translate/core';
+
+import { Observable } from 'rxjs/Observable';
+import { startWith, switchMap } from 'rxjs/operators';
+import { OnlyNumberDirective } from './only-number-directive';
+
+// Marker function for ngx-translate-extract:
+export function TRANSLATE(str: string) {
+  return str;
+}
+
+export function streamTranslate(translateService: TranslateService, keys: string | Array<string>, params?: any): Observable<any> {
+  return translateService.onLangChange.pipe( startWith({}),
+      switchMap(() => params ? translateService.get(keys, params) : translateService.get(keys)) );
+}
+
+@NgModule({
+  imports: [
+    HttpModule,
+    FormsModule,
+    CommonModule,
+    ModalModule,
+    TabsModule.forRoot(),
+    TypeaheadModule.forRoot(),
+    DatepickerModule.forRoot(),
+    TreeModule,
+    DataTableModule,
+    SharedModule,
+    ContextMenuModule,
+    DropdownModule,
+    MultiSelectModule,
+    GrowlModule,
+    AccordionModule.forRoot(),
+    BsDropdownModule.forRoot(),
+    HttpClientModule,
+    TranslateModule.forChild(),
+  ],
+  declarations: [
+    MDMNotificationComponent,
+    OverwriteDialogComponent,
+    MDMDataSourceTranslationPipe,
+    OnlyNumberDirective,
+    AttributeValuePipe
+  ],
+  exports: [
+    CommonModule,
+    FormsModule,
+    ModalModule,
+    DropdownModule,
+    MultiSelectModule,
+    CalendarModule,
+    TreeModule,
+    DataTableModule,
+    SharedModule,
+    ContextMenuModule,
+    GrowlModule,
+    AccordionModule,
+    BsDropdownModule,
+    TypeaheadModule,
+    DatepickerModule,
+    MDMNotificationComponent,
+    OverwriteDialogComponent,
+    TranslateModule,
+    MDMDataSourceTranslationPipe,
+    AttributeValuePipe,
+    OnlyNumberDirective,
+  ],
+  providers: [
+      PositioningService,
+      ComponentLoaderFactory,
+      PropertyService,
+      PreferenceService
+    ]
+})
+export class MDMCoreModule {
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-error-handler.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-error-handler.ts
new file mode 100644
index 0000000..ee85fd3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-error-handler.ts
@@ -0,0 +1,44 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { ErrorHandler, Injectable, OnInit } from '@angular/core';
+import { MDMNotificationService } from './mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+import { streamTranslate, TRANSLATE } from '../core/mdm-core.module';
+
+@Injectable()
+export class MDMErrorHandler extends ErrorHandler implements OnInit {
+
+  msgsError: string = 'Application Error$An application error has occurred.'
+    + ' For a detailed error message please open your browser\'s developer console.';
+
+  constructor(private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+    super();
+  }
+
+  ngOnInit() {
+    streamTranslate(this.translateService, TRANSLATE('core.mdm-error-handler.strings-error-message')).subscribe(
+            (msg: string) => this.msgsError = msg);
+  }
+
+  handleError(error) {
+    this.notificationService.notifyError(this.msgsError.split('$')[0],
+      this.msgsError.split('$')[1]);
+
+    super.handleError(error);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-item.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-item.ts
new file mode 100644
index 0000000..30f0688
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-item.ts
@@ -0,0 +1,36 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Node} from '../navigator/node';
+
+export class MDMItem {
+  source: string;
+  type: string;
+  id: string;
+
+  constructor(source: string, type: string, id: string) {
+    this.source = source;
+    this.type = type;
+    this.id = id;
+  }
+
+  equalsNode(node: Node) {
+    return this.source === node.sourceName && this.type === node.type && this.id === node.id;
+  }
+
+  equals(item: MDMItem) {
+    return this.source === item.source && this.type === item.type && this.id === item.id;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-notification.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-notification.component.ts
new file mode 100644
index 0000000..2ee0f69
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-notification.component.ts
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { Message } from 'primeng/primeng';
+import { MDMNotificationService } from './mdm-notification.service';
+import { Subscription } from 'rxjs';
+
+@Component({
+  selector: 'mdm-notifications',
+  template: '<p-growl [value]="msgs" sticky="true"></p-growl>'
+})
+export class MDMNotificationComponent implements OnInit, OnDestroy {
+  msgs: Message[] = [];
+  subscription: Subscription;
+
+  constructor(private notificationsService: MDMNotificationService) { }
+
+  ngOnInit() {
+    this.subscribeToNotifications();
+  }
+
+  subscribeToNotifications() {
+    this.subscription = this.notificationsService.notificationChange
+      .subscribe(notification => this.msgs.push(notification));
+  }
+
+  ngOnDestroy() {
+    this.subscription.unsubscribe();
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-notification.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-notification.service.ts
new file mode 100644
index 0000000..678d835
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/mdm-notification.service.ts
@@ -0,0 +1,44 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Injectable, EventEmitter } from '@angular/core';
+import { Message } from 'primeng/primeng';
+
+type Severities = 'success' | 'info' | 'warn' | 'error';
+
+@Injectable()
+export class MDMNotificationService {
+  notificationChange = new EventEmitter<Message>();
+
+  notify(severity: Severities, summary: string, detail: any) {
+    this.notificationChange.emit({ severity, summary, detail });
+  }
+
+  notifyError(summary: string, detail: any) {
+    this.notify('error', summary, detail);
+  }
+
+  notifyWarn(summary: string, detail: any) {
+    this.notify('warn', summary, detail );
+  }
+
+  notifyInfo(summary: string, detail: any) {
+    this.notify('info', summary, detail);
+  }
+
+  notifySuccess(summary: string, detail: any) {
+    this.notify('success', summary, detail);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/only-number-directive.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/only-number-directive.ts
new file mode 100644
index 0000000..74872fe
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/only-number-directive.ts
@@ -0,0 +1,19 @@
+import { Directive, ElementRef, HostListener, Input } from '@angular/core';
+import { NgControl } from '@angular/forms';
+
+@Directive({
+  selector: '[numbersOnly]'
+})
+export class OnlyNumberDirective {
+
+  constructor(private _el: ElementRef) { }
+
+  @HostListener('input', ['$event']) onInputChange(event) {
+    const initalValue = this._el.nativeElement.value;
+
+    this._el.nativeElement.value = initalValue.replace(/[^0-9]*/g, '');
+    if ( initalValue !== this._el.nativeElement.value) {
+      event.stopPropagation();
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/overwrite-dialog.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/overwrite-dialog.component.html
new file mode 100644
index 0000000..64bea5d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/overwrite-dialog.component.html
@@ -0,0 +1,35 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<div bsModal #lgOverwriteModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="SelectSearchComponents" aria-hidden="true">
+  <div class="modal-dialog modal-sm">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h4 class="modal-title">{{ 'core.overwrite-dialog.label-with-this-name-already-exists' | translate:label }}</h4>
+      </div>
+      <div class="modal-body">
+        <div class="row">
+          <div class="col-md-12">
+            <button type="button" class="btn btn-default" (click)="overwrite(false)">
+            <span class="fa fa-times"></span> {{ 'core.overwrite-dialog.btn-cancel' | translate }}
+          </button>
+            <button type="button" class="btn btn-default pull-right" (click)="overwrite(true)">
+            <span class="fa fa-check"></span>  {{ 'core.overwrite-dialog.btn-overwrite' | translate }}
+          </button>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/overwrite-dialog.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/overwrite-dialog.component.ts
new file mode 100644
index 0000000..8ae8fb3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/overwrite-dialog.component.ts
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, ViewChild, EventEmitter} from '@angular/core';
+import { ModalDirective } from 'ngx-bootstrap';
+
+@Component({
+  selector: 'overwrite-dialog',
+  templateUrl: 'overwrite-dialog.component.html'
+})
+export class OverwriteDialogComponent {
+
+  label: Object;
+  overwriteEvent = new EventEmitter<boolean>();
+
+  @ViewChild('lgOverwriteModal')
+  childOverwriteModal: ModalDirective;
+
+  constructor () {}
+
+  showOverwriteModal(label: string) {
+    this.label = {'label': label};
+    this.childOverwriteModal.show();
+    return this.overwriteEvent;
+  }
+
+  overwrite(b: boolean) {
+    this.childOverwriteModal.hide();
+    this.overwriteEvent.emit(b);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/preference.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/preference.service.spec.ts
new file mode 100644
index 0000000..c1da2c2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/preference.service.spec.ts
@@ -0,0 +1,103 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { async, TestBed, inject } from '@angular/core/testing';
+import { BaseRequestOptions, Http, HttpModule, Response, ResponseOptions, RequestMethod } from '@angular/http';
+import { MockBackend } from '@angular/http/testing';
+
+import { PreferenceService, Preference, Scope } from './preference.service';
+import { PropertyService } from './property.service';
+import { HttpErrorHandler } from '../core/http-error-handler';
+
+describe('PreferenceService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [
+        PropertyService,
+        PreferenceService,
+        MockBackend,
+        BaseRequestOptions,
+        HttpErrorHandler,
+        {
+          provide: Http,
+          useFactory: (mockBackend, options) => {
+            return new Http(mockBackend, options);
+          },
+          deps: [MockBackend, BaseRequestOptions]
+        }
+      ]
+    });
+  });
+
+
+  describe('getPreference()', () => {
+    it('should return preferences', async(inject([PreferenceService, MockBackend], (prefService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+
+        let mockResponse = {
+          preferences: [
+          {
+            id: 2,
+            key: 'preference.prefix.',
+            scope: Scope.SYSTEM,
+            source: null,
+            user: null,
+            value: 'Test'
+          }
+        ]};
+        conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+      });
+
+      prefService.getPreference(Scope.SYSTEM, 'preference.prefix.').subscribe(prefs => {
+        expect(prefs.length).toBe(1);
+        expect(prefs[0].scope).toBe(Scope.SYSTEM);
+        expect(prefs[0].value).toBe('Test');
+      });
+    })));
+
+    it('should return empty array if no preferences were found',
+        async(inject([PreferenceService, MockBackend], (prefService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+        conn.mockRespond(new Response(new ResponseOptions({ body: { preferences: [] } })));
+      });
+
+      prefService.getPreference(Scope.SYSTEM, 'preference.prefix.').subscribe(prefs => {
+        expect(prefs.length).toBe(0);
+      });
+    })));
+  });
+
+  describe('savePreference()', () => {
+    it('should post preference', async(inject([PreferenceService, MockBackend], (prefService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+        if (conn.request.url.endsWith('/preference') && conn.request.method === RequestMethod.Put) {
+          conn.mockRespond(new Response(new ResponseOptions({ body: { preferences: [] } })));
+        }
+      });
+      let newPref = new Preference();
+      newPref.scope = Scope.SYSTEM;
+      newPref.key = 'prefix.';
+      newPref.value = 'testValue';
+
+      prefService.savePreference(newPref).subscribe(prefs => {
+        expect(prefs).toBeDefined();
+      });
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/preference.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/preference.service.ts
new file mode 100644
index 0000000..9610ac1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/preference.service.ts
@@ -0,0 +1,118 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Injectable } from '@angular/core';
+import { Http, Response, Headers, RequestOptions } from '@angular/http';
+
+import { PropertyService } from './property.service';
+
+import { plainToClass } from 'class-transformer';
+import { HttpErrorHandler } from './http-error-handler';
+import { throwError as observableThrowError,  Observable } from 'rxjs';
+import { mergeMap, map, catchError } from 'rxjs/operators';
+
+export class Scope {
+   public static readonly SYSTEM = 'SYSTEM';
+   public static readonly SOURCE = 'SOURCE';
+   public static readonly USER = 'USER';
+
+   static toLabel(scope: string) {
+     return scope.charAt(0).toUpperCase() + scope.slice(1).toLowerCase();
+   }
+}
+
+export class Preference {
+  scope: string;
+  source?: string;
+  user?: string;
+  key: string;
+  value: string;
+  id: number;
+
+  static sortByScope(p1: Preference, p2: Preference) {
+    let getPriority = (scope: string) => {
+      switch (scope) {
+        case Scope.SYSTEM: return 1;
+        case Scope.SOURCE: return 2;
+        case Scope.USER: return 3;
+        default: return 4;
+      }
+    };
+    return getPriority(p1.scope) - getPriority(p2.scope);
+  }
+
+  constructor() {
+      this.key = '';
+  }
+}
+
+@Injectable()
+export class PreferenceService {
+
+  private prefEndpoint: string;
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService) {
+    this.prefEndpoint = _prop.getUrl('mdm/preferences');
+  }
+
+  getPreferenceForScope(scope: string, key?: string): Observable<Preference[]> {
+      if (key == null) {
+          key = '';
+      }
+
+      return this.http.get(this.prefEndpoint + '?scope=' + scope + '&key=' + key).pipe(
+          map(response => plainToClass(Preference, response.json().preferences)),
+          catchError(this.handleError));
+  }
+
+  getPreference(key?: string) {
+      if (key == null) {
+          key = '';
+      }
+      return this.http.get(this.prefEndpoint + '?key=' + key).pipe(
+          map(response => plainToClass(Preference, response.json().preferences)),
+          catchError(this.handleError));
+  }
+
+  savePreference(preference: Preference) {
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+
+    return this.http.put(this.prefEndpoint, JSON.stringify(preference), options).pipe(
+      catchError(this.handleError));
+  }
+
+  deletePreference(id: number) {
+    return this.http.delete(this.prefEndpoint + '/' + id).pipe(
+      catchError(this.handleError));
+  }
+
+  deletePreferenceByScopeAndKey(scope: string, key: string) {
+    return this.getPreferenceForScope(scope, key).pipe(mergeMap(p => this.deletePreference(p[0].id)));
+  }
+
+  private handleError(e: Error | any) {
+    if (e instanceof Response) {
+      let response = <Response> e;
+      if (response.status !== 200) {
+        return observableThrowError('Could not request preferences! '
+          + 'Please check if application server is running and preference database is configured correctly.');
+      }
+    }
+    return this.httpErrorHandler.handleError(e);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/property.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/property.service.ts
new file mode 100644
index 0000000..4865f11
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/property.service.ts
@@ -0,0 +1,33 @@
+// ********************************************************************************
+// * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+// *
+// * See the NOTICE file(s) distributed with this work for additional
+// * information regarding copyright ownership.
+// *
+// * This program and the accompanying materials are made available under the
+// * terms of the Eclipse Public License v. 2.0 which is available at
+// * http://www.eclipse.org/legal/epl-2.0.
+// *
+// * SPDX-License-Identifier: EPL-2.0
+// *
+// ********************************************************************************
+
+import { Injectable } from '@angular/core';
+import { environment } from '../../environments/environment';
+
+@Injectable()
+export class PropertyService {
+  data_host = 'http://sa:sa@localhost:9090/';
+
+  getDataHost(): string {
+      return this.data_host;
+  }
+
+  getUrl(restUrl: string): string {
+    if (environment.apiUrl) {
+      return environment.apiUrl + restUrl;
+    } else {
+      return restUrl;
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/services/array-util.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/services/array-util.service.ts
new file mode 100644
index 0000000..d0b42b6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/services/array-util.service.ts
@@ -0,0 +1,13 @@
+import { Injectable } from '@angular/core';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class ArrayUtilService {
+
+  constructor() { }
+
+  public isNotEmpty(array: any[]) {
+    return array != undefined && array.length > 0;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.css
new file mode 100644
index 0000000..03e0f0c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.css
@@ -0,0 +1,15 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+.attreditor {width: 80%;}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.html
new file mode 100644
index 0000000..43121f7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.html
@@ -0,0 +1,33 @@
+<!--******************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ *******************************************************************************-->
+
+ <div [ngSwitch]="attribute?.dataType">
+    <input *ngSwitchCase="'STRING'" pInputText type="text" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditor">
+    <input *ngSwitchCase="'FLOAT'" pInputText type="number" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditor">
+    <input *ngSwitchCase="'SHORT'" pInputText type="number" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditor">
+    <input *ngSwitchCase="'LONG'" pInputText type="number" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditor">
+    <input *ngSwitchCase="'LONGLONG'" pInputText type="number" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditor">
+    <input *ngSwitchCase="'DOUBLE'" pInputText type="number" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditor">
+    <p-calendar *ngSwitchCase="'DATE'" [locale]="locale" dataType="string" showTime="true" hourFormat="24" dateFormat="{{'details.mdm-detail-descriptive-data.input-dateformat' | translate}}" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditor" [style]="{'width':'80%'}" [inputStyle]="{'min-width':'0.2em','width':'80%'}"></p-calendar>
+    <input *ngSwitchCase="'BOOLEAN'" pInputText type="checkbox" [(ngModel)]="attribute.value[ident.contextGroup]" class="attreditorbool">
+    <mdm5-file-link-editor *ngSwitchCase="'FILE_LINK'"
+        class="attreditor"
+        [ident]="ident"></mdm5-file-link-editor>
+    <file-link-sequence-editor *ngSwitchCase="'FILE_LINK_SEQUENCE'"
+        class="attreditor"
+        [ident]="ident"
+        [attribute]="attribute" ></file-link-sequence-editor>
+    <div *ngSwitchDefault>{{attribute | attributeValue: ident.contextGroup | async}}</div>
+</div>
+<span *ngIf="attribute?.unit?.length > 0" class="inlinecontent">{{attribute.unit}}</span>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.ts
new file mode 100644
index 0000000..53cec5a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-editor/attribute-editor.component.ts
@@ -0,0 +1,90 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, Input } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
+
+import { Attribute } from '@navigator/node';
+import { ContextAttributeIdentifier } from '../../model/details.model';
+
+@Component({
+  selector: 'attribute-editor',
+  templateUrl: './attribute-editor.component.html',
+  styleUrls: ['./attribute-editor.component.css']
+})
+export class AttributeEditorComponent {
+
+  @Input() ident: ContextAttributeIdentifier;
+  @Input() attribute: Attribute;
+
+  locale: any;
+
+  constructor(private translateService: TranslateService) {
+    // calendar localization
+    this.locale = {
+        firstDayOfWeek: 1,
+        dayNames: [this.translateService.instant('details.attribute-editor.cal-sunday'),
+                       this.translateService.instant('details.attribute-editor.cal-monday'),
+                       this.translateService.instant('details.attribute-editor.cal-tuesday'),
+                       this.translateService.instant('details.attribute-editor.cal-wednesday'),
+                       this.translateService.instant('details.attribute-editor.cal-thursday'),
+                       this.translateService.instant('details.attribute-editor.cal-friday'),
+                       this.translateService.instant('details.attribute-editor.cal-saturday')],
+        dayNamesShort: [this.translateService.instant('details.attribute-editor.cal-sun'),
+                            this.translateService.instant('details.attribute-editor.cal-mon'),
+                            this.translateService.instant('details.attribute-editor.cal-tue'),
+                            this.translateService.instant('details.attribute-editor.cal-wed'),
+                            this.translateService.instant('details.attribute-editor.cal-thu'),
+                            this.translateService.instant('details.attribute-editor.cal-fri'),
+                            this.translateService.instant('details.attribute-editor.cal-sat')],
+        dayNamesMin: [this.translateService.instant('details.attribute-editor.cal-su'),
+                          this.translateService.instant('details.attribute-editor.cal-mo'),
+                          this.translateService.instant('details.attribute-editor.cal-tu'),
+                          this.translateService.instant('details.attribute-editor.cal-we'),
+                          this.translateService.instant('details.attribute-editor.cal-th'),
+                          this.translateService.instant('details.attribute-editor.cal-fr'),
+                          this.translateService.instant('details.attribute-editor.cal-sa')],
+        monthNames: [this.translateService.instant('details.attribute-editor.cal-january'),
+                         this.translateService.instant('details.attribute-editor.cal-february'),
+                         this.translateService.instant('details.attribute-editor.cal-march'),
+                         this.translateService.instant('details.attribute-editor.cal-april'),
+                         this.translateService.instant('details.attribute-editor.cal-may'),
+                         this.translateService.instant('details.attribute-editor.cal-june'),
+                         this.translateService.instant('details.attribute-editor.cal-july'),
+                         this.translateService.instant('details.attribute-editor.cal-august'),
+                         this.translateService.instant('details.attribute-editor.cal-september'),
+                         this.translateService.instant('details.attribute-editor.cal-october'),
+                         this.translateService.instant('details.attribute-editor.cal-november'),
+                         this.translateService.instant('details.attribute-editor.cal-december')],
+        monthNamesShort: [this.translateService.instant('details.attribute-editor.cal-jan'),
+                              this.translateService.instant('details.attribute-editor.cal-feb'),
+                              this.translateService.instant('details.attribute-editor.cal-mar'),
+                              this.translateService.instant('details.attribute-editor.cal-apr'),
+                              this.translateService.instant('details.attribute-editor.cal-may'),
+                              this.translateService.instant('details.attribute-editor.cal-jun'),
+                              this.translateService.instant('details.attribute-editor.cal-jul'),
+                              this.translateService.instant('details.attribute-editor.cal-aug'),
+                              this.translateService.instant('details.attribute-editor.cal-sep'),
+                              this.translateService.instant('details.attribute-editor.cal-oct'),
+                              this.translateService.instant('details.attribute-editor.cal-nov'),
+                              this.translateService.instant('details.attribute-editor.cal-dec')],
+        today: this.translateService.instant('details.attribute-editor.cal-today'),
+        clear: this.translateService.instant('details.attribute-editor.cal-clear'),
+        dateFormat: this.translateService.instant('details.attribute-editor.cal-format'),
+        weekHeader: this.translateService.instant('details.attribute-editor.cal-week')
+    };
+}
+
+}
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-viewer/attribute-viewer.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-viewer/attribute-viewer.component.html
new file mode 100644
index 0000000..05e62a9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-viewer/attribute-viewer.component.html
@@ -0,0 +1,20 @@
+<!--******************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ *******************************************************************************-->
+
+<div [ngSwitch]="attribute?.dataType">
+    <file-attribute-viewer *ngSwitchCase="'FILE_LINK'" [ident]="ident" [attribute]="attribute"></file-attribute-viewer>
+    <file-attribute-viewer *ngSwitchCase="'FILE_LINK_SEQUENCE'" [ident]="ident" [attribute]="attribute"></file-attribute-viewer>
+    <div *ngSwitchDefault>{{attribute | attributeValue: ident.contextGroup | async}}</div>
+</div>
+<span *ngIf="attribute?.unit?.length > 0" class="inlinecontent">{{attribute.unit}}</span>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-viewer/attribute-viewer.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-viewer/attribute-viewer.component.ts
new file mode 100644
index 0000000..6c79bd9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/attribute-viewer/attribute-viewer.component.ts
@@ -0,0 +1,29 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, Input } from '@angular/core';
+
+import { Attribute } from '@navigator/node';
+import { ContextAttributeIdentifier } from '../../model/details.model';
+
+@Component({
+  selector: 'attribute-viewer',
+  templateUrl: './attribute-viewer.component.html'
+})
+export class AttributeViewerComponent {
+
+  @Input() ident: ContextAttributeIdentifier;
+  @Input() attribute: Attribute;
+}
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.css
new file mode 100644
index 0000000..ac8087b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.css
@@ -0,0 +1,47 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+ /* defines icon and header style in panel */

+.pannel-icon-header {

+    background-repeat: no-repeat;

+    background-position: left center;

+    padding-left: 18px;

+    margin: 0;

+    float: left;

+    vertical-align: middle;

+    font-size: 16px;

+}

+

+/* defines container block for float button */

+.button-block {

+    width: 97%;

+    display: inline-block;

+    vertical-align: middle;

+}

+

+/* overwrite angular default style for thin padding in button header */

+.thin-titlebar >>> .ui-panel-titlebar {

+    padding-top: 0.3em!important;

+    padding-bottom: 0.3em!important;

+}

+

+/* overwrite angular default style for vertical align of toggle icon in button header*/

+.thin-titlebar >>> .ui-panel-titlebar-toggler {

+    margin-top: 0.3em!important;

+}

+

+/** vertical align of header and icon */

+.margin5 {

+    margin: 5px;

+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.html
new file mode 100644
index 0000000..6d36aa5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.html
@@ -0,0 +1,50 @@
+<!--******************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ *******************************************************************************-->
+
+<p-panel [toggleable]="true" [collapsed]="collapsed" [ngClass]="showButton ? 'thin-titlebar' : ''"
+         toggler="header" expandIcon="fa fa-chevron-right fa-lg" collapseIcon="fa fa-chevron-down fa-lg" >
+  <p-header >
+    <span [ngClass]="showButton ? 'button-block' : ''">
+      <span *ngIf="node" class="pannel-icon-header" [ngClass]="getClass()">
+        {{node.type | mdmdatasourcetranslate}}
+      </span>
+      <span class="btn-group" style="float: right;">
+        <button *ngIf="showButton"
+          type="button"
+          class="btn btn-mdm"
+          (click)="add2Basket()"
+          [disabled]="shoppable"
+          title="{{ 'details.mdm-detail-panel.btn-into-shopping-basket' | translate }}">
+          <span class="fa fa-shopping-cart"></span>
+        </button>
+      </span>
+    </span>
+  </p-header>
+  <table class="table table-hover" style="margin-bottom: 0;">
+    <thead>
+      <tr>
+        <th>{{ 'details.mdm-detail-panel.tblhdr-attribute' | translate }}</th>
+        <th>{{ 'details.mdm-detail-panel.tblhdr-value' | translate }}</th>
+        <th>{{ 'details.mdm-detail-panel.tblhdr-unit' | translate }}</th>
+      </tr>
+    </thead>
+    <tbody *ngIf="node">
+      <tr *ngFor="let attr of displayAttributes">
+        <td>{{attr.name}}</td>
+        <td>{{attr | attributeValue | async}}</td>
+        <td>{{attr.unit}}</td>
+      </tr>
+    </tbody>
+  </table>
+</p-panel>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.ts
new file mode 100644
index 0000000..ed4e1c6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/detail-panel/detail-panel.component.ts
@@ -0,0 +1,72 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';
+
+import { DetailViewService } from '../../services/detail-view.service';
+import { BasketService } from '@basket/basket.service';
+import { Node, Attribute} from '@navigator/node';
+import { MDMItem } from '@core/mdm-item';
+
+@Component({
+  selector: 'mdm-detail-panel',
+  templateUrl: './detail-panel.component.html',
+  styleUrls: ['./detail-panel.component.css']
+})
+export class DetailPanelComponent implements OnChanges {
+
+  // node to display
+  @Input() node: Node;
+  // handles pannel expansion state
+  @Input() collapsed: boolean;
+  // handles shopping button disabled state
+  @Input() shoppable = false;
+  // handles shopping button visible state
+  @Input() showButton = false;
+
+  // attributes of display node
+  displayAttributes: Attribute[];
+
+  constructor(
+    private detailViewService: DetailViewService,
+    private basketService: BasketService) { }
+
+  // change detection for display node
+  ngOnChanges(changes: SimpleChanges): void {
+    if (changes['node'] && this.node != undefined) {
+      this.refreshAttributes(this.node);
+    }
+  }
+
+  // refresh display attributes
+  private refreshAttributes(node: Node) {
+    if (node != undefined) {
+      this.displayAttributes = this.detailViewService.getAttributesToDisplay(this.node);
+    }
+  }
+
+  // button listener for shopping button
+  public add2Basket() {
+    if (this.node != undefined) {
+      this.basketService.add(new MDMItem(this.node.sourceName, this.node.type, this.node.id));
+    }
+  }
+
+  // provides style class for panel header (+ icon)
+  public getClass() {
+    let style = this.showButton ? 'margin5 ' : '';
+    return style + this.node.getClass();
+  }
+}
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.css
new file mode 100644
index 0000000..9b0c5b0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.css
@@ -0,0 +1,37 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+.btn-col {

+    width: 50px;

+}

+

+p-treetable >>> .ui-treetable-caption {

+  padding: .25em .5em!important;

+  text-align: right!important;

+}

+

+.toggler {

+  width: 19px;

+  height: 19px;

+  color: #6c757d;

+  margin: 0 8px 0 8px;

+}

+

+.clickable {

+  cursor: pointer;

+}

+

+.mdm-attribute-row.clickable.readOnly {

+  background-color: rgba(211, 211, 211, 0.5);

+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.html
new file mode 100644
index 0000000..8109cc7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.html
@@ -0,0 +1,122 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+ <div *ngIf="!contextComponents">
+  <div class="alert alert-info" style="margin: 0;">
+    <strong>{{status | translate}}</strong>
+  </div>
+</div>
+
+<div *ngIf="contextComponents" class="mdm-details-attributes">
+
+  <!-- <button (click)="changeTreeEdit(true, false)" *ngIf="!editMode && canEdit" class="btn btn-mdm" style="margin-bottom: 5px;">
+    <span class="fa fa-pencil"></span>
+    {{ 'details.mdm-detail-descriptive-data.btn-edit' | translate }}
+  </button>
+  <button (click)="changeTreeEdit(false, false)" *ngIf="editMode" class="btn btn-mdm" style="margin-bottom: 5px;">
+    <span class="fa fa-ban"></span>
+    {{ 'details.mdm-detail-descriptive-data.btn-cancel' | translate }}
+  </button>
+  <button (click)="changeTreeEdit(false, true)" *ngIf="editMode" class="btn btn-mdm" style="margin-bottom: 5px;">
+    <span class="fa fa-check"></span>
+    {{ 'details.mdm-detail-descriptive-data.btn-save' | translate }}
+  </button> -->
+
+  <p-treeTable #ttref [value]="treeNodes[contextType]" styleClass="table-hover">
+
+    <ng-template pTemplate="caption">
+      <div (click)="toggleTreeNodeState(ttref)" class="clickable">
+        <button (click)="onEdit($event)"
+          *ngIf="!editMode && canEdit"
+          class="btn btn-mdm"
+          title="{{ 'details.mdm-detail-descriptive-data.btn-edit' | translate }}">
+          <span class="fa fa-pencil"></span>
+        </button>
+        <button (click)="onCancelEdit($event)"
+          *ngIf="editMode"
+          class="btn btn-mdm"
+          title="{{ 'details.mdm-detail-descriptive-data.btn-cancel' | translate }}">
+          <span class="fa fa-ban"></span>
+        </button>
+        <button (click)="onSaveChanges($event)"
+          *ngIf="editMode"
+          class="btn btn-mdm"
+          title="{{ 'details.mdm-detail-descriptive-data.btn-save' | translate }}">
+          <span class="fa fa-check"></span>
+        </button>
+        <span class="fa fa-lg toggler" [ngClass]="isTreeTableExpanded ? 'fa-chevron-down': 'fa-chevron-right'"></span>
+      </div>
+    </ng-template>
+
+    <ng-template pTemplate="header">
+      <tr>
+        <th>{{ 'details.mdm-detail-descriptive-data.tblhdr-name' | translate }}</th>
+        <th>{{ 'details.mdm-detail-descriptive-data.tblhdr-ordered' | translate }}</th>
+        <th>{{ 'details.mdm-detail-descriptive-data.tblhdr-measured' | translate }}</th>
+      </tr>
+    </ng-template>
+
+    <ng-template pTemplate="body" let-rowNode let-rowData="rowData">
+      <tr>
+        <!-- name -->
+        <td class="{{rowData.header ? 'mdm-component-row' : 'mdm-attribute-row'}}">
+          <p-treeTableToggler [rowNode]="rowNode"></p-treeTableToggler>
+          <span pTooltip="{{rowData.attribute != null ? rowData.attribute.description : ''}}" tooltipPosition="bottom">{{rowData.name}}</span>
+        </td>
+
+        <!-- ordered -->
+        <td ttEditableColumn [ttEditableColumnDisabled]="!editMode || rowData?.attribute?.readOnly" class="{{rowData.header ? 'mdm-component-row' : 'mdm-attribute-row'}}"
+        [ngClass]="{'clickable': canEdit && editMode, 'readOnly': rowData?.attribute?.readOnly}">
+          <p-treeTableCellEditor>
+            <ng-template pTemplate="input">
+              <attribute-editor
+                [ident]="getIdentifier(selectedNode, rowNode?.parent?.data?.attribute, rowData?.attribute, contextGroupEnum.ORDERED, contextType)"
+                [attribute]="rowData?.attribute" >
+              </attribute-editor>
+            </ng-template>
+
+            <ng-template pTemplate="output">
+              <attribute-viewer
+                [ident]="getIdentifier(selectedNode, rowNode?.parent?.data?.attribute, rowData?.attribute, contextGroupEnum.ORDERED, contextType)"
+                [attribute]="rowData?.attribute" >
+              </attribute-viewer>
+            </ng-template>
+          </p-treeTableCellEditor>
+        </td>
+
+        <!-- measured -->
+        <td ttEditableColumn [ttEditableColumnDisabled]="!editMode || rowData?.attribute?.readOnly" class="{{rowData.header ? 'mdm-component-row' : 'mdm-attribute-row'}}"
+        [ngClass]="{'clickable': canEdit && editMode, 'readOnly': rowData?.attribute?.readOnly}">
+          <p-treeTableCellEditor>
+            <ng-template pTemplate="input">
+              <span *ngIf="rowData?.attribute?.value?.length == 2">
+                <attribute-editor
+                  [ident]="getIdentifier(selectedNode, rowNode?.parent?.data?.attribute, rowData?.attribute, contextGroupEnum.MEASURED, contextType)"
+                  [attribute]="rowData?.attribute">
+                </attribute-editor>
+              </span>
+            </ng-template>
+            <ng-template pTemplate="output">
+                <attribute-viewer *ngIf="rowData?.attribute?.value?.length == 2"
+                  [ident]="getIdentifier(selectedNode, rowNode?.parent?.data?.attribute, rowData?.attribute, contextGroupEnum.MEASURED, contextType)"
+                  [attribute]="rowData?.attribute">
+                </attribute-viewer>
+            </ng-template>
+          </p-treeTableCellEditor>
+        </td>
+      </tr>
+    </ng-template>
+  </p-treeTable>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.ts
new file mode 100644
index 0000000..d64ca38
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component.ts
@@ -0,0 +1,563 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { DatePipe } from '@angular/common';
+
+import { TreeNode } from 'primeng/api';
+import { TreeTable } from 'primeng/primeng';
+import { Observable } from 'rxjs';
+import { TranslateService } from '@ngx-translate/core';
+
+import { Node, Attribute, ContextGroup } from '@navigator/node';
+import { NavigatorService } from '@navigator/navigator.service';
+import { MDMNotificationService } from '@core/mdm-notification.service';
+import { TRANSLATE } from '@core/mdm-core.module';
+import { FileService } from '@file-explorer/services/file.service';
+import { FileLinkContextWrapper } from '@file-explorer/model/file-explorer.model';
+import { AuthenticationService } from '../../../authentication/authentication.service';
+
+import { Sensor, Components, Context, ContextAttributeIdentifier} from '../../model/details.model';
+import { ContextService } from '../../services/context.service';
+import { Role } from 'src/app/authentication/authentication.service';
+
+@Component({
+  selector: 'mdm-detail-context',
+  templateUrl: 'mdm-detail-descriptive-data.component.html',
+  styleUrls: ['mdm-detail-descriptive-data.component.css'],
+})
+
+export class MDMDescriptiveDataComponent implements OnInit {
+
+  private readonly StatusLoading = TRANSLATE('details.mdm-detail-descriptive-data.status-loading');
+  private readonly StatusSaving = TRANSLATE('details.mdm-detail-descriptive-data.status-saving');
+  private readonly StatusNoNodes = TRANSLATE('details.mdm-detail-descriptive-data.status-no-nodes-available');
+  private readonly StatusNoDescriptiveData = TRANSLATE('details.mdm-detail-descriptive-data.status-no-descriptive-data-available');
+
+  public treeNodes: {[key: string]: TreeNode[]};
+
+  // this holds the type dependant original context data in case of cancelling the edit mode
+  private tmpTreeNodes: Node[];
+
+  public selectedNode: Node;
+  public contextType: string;
+
+  public contextComponents: Components;
+  public sensors: Sensor[];
+  public status: string;
+
+  // reference to be able to use enum in html template
+  public contextGroupEnum = ContextGroup;
+
+  public editMode: boolean;
+
+  public isTreeTableExpanded = true;
+
+  constructor(private route: ActivatedRoute,
+              private _contextService: ContextService,
+              private navigatorService: NavigatorService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService,
+              private datePipe: DatePipe,
+              private authenticationService: AuthenticationService,
+              private fileService: FileService) {
+  }
+
+  public canEdit: boolean;
+
+  ngOnInit() {
+    this.authenticationService.isUserInRole([Role.Admin.toString(), Role.User.toString()]).subscribe(b => this.canEdit = b);
+    this.status = this.StatusLoading;
+    this.editMode = false;
+
+    this.refreshDetailData(this.navigatorService.getSelectedNode());
+    this.route.params
+      .subscribe(
+        params => this.refreshContextData(params['context']),
+          error => this.notificationService.notifyError(
+            this.translateService.instant('details.mdm-detail-descriptive-data.err-cannot-load-scope'), error));
+
+    // node changed from the navigation tree
+    this.navigatorService.selectedNodeChanged
+        .subscribe(
+          node => this.refreshDetailData(node),
+          error => this.notificationService.notifyError(
+            this.translateService.instant('details.mdm-detail-descriptive-data.err-cannot-load-data'), error));
+
+    // file changed
+    this.fileService.onFileChanged().subscribe(link => this.handleFileChanged(link));
+  }
+
+  handleFileChanged(fileLinkContextWrapper: FileLinkContextWrapper) {
+    if (this.treeNodes != undefined) {
+      this.treeNodes[fileLinkContextWrapper.contextType]
+          .filter(tnode => tnode.label === fileLinkContextWrapper.contextComponent.name)
+          .map(tnode => tnode.children)
+          .reduce((a, b) => a.concat(b), [])
+          .filter(tnode => tnode.data.attribute.name === fileLinkContextWrapper.attribute.name)
+          .forEach(tnode => tnode.data.attribute = fileLinkContextWrapper.attribute);
+      // spread is necessary for treeTable changeDetection
+      this.treeNodes[fileLinkContextWrapper.contextType] = [...
+        this.treeNodes[fileLinkContextWrapper.contextType]];
+    }
+  }
+
+  setContext(context: string) {
+    let contextType: string;
+
+    switch (context) {
+      case 'uut':
+        contextType = 'UNITUNDERTEST';
+        break;
+      case 'te':
+        contextType = 'TESTEQUIPMENT';
+        break;
+      case 'ts':
+        contextType = 'TESTSEQUENCE';
+        break;
+    }
+    this.contextType = contextType;
+  }
+
+  /**
+   * Listener method to change the context tab
+   *
+   * @param contextType
+   */
+  refreshContextData(contextType: string) {
+    // revert before changing the context
+    this.undoEditChanges(undefined, this.editMode);
+    this.setContext(contextType);
+    this.editMode = false;
+  }
+
+  /**
+   * Listener method to change the node
+   *
+   * @param node
+   */
+  refreshDetailData(node: Node) {
+    if (node != undefined) {
+      this.selectedNode = node;
+      this.status = this.StatusLoading;
+      this.editMode = false;
+      this.contextComponents = undefined;
+      this.treeNodes = undefined;
+      if (node.type.toLowerCase() === 'measurement' || node.type.toLowerCase() === 'teststep' || node.type.toLowerCase() === 'test') {
+        this.loadContext(node);
+      } else {
+        this.status = this.StatusNoDescriptiveData;
+      }
+    } else {
+      this.status = this.StatusNoNodes;
+    }
+  }
+
+  /**
+   * Load the context data for the provided node
+   *
+   * @param node
+   */
+  private loadContext(node: Node) {
+    this._contextService.getContext(node).subscribe(
+      components => {
+          if (components['UNITUNDERTEST'] != undefined
+              || components['TESTEQUIPMENT'] != undefined
+              || components['TESTSEQUENCE'] != undefined) {
+                this.contextComponents = components;
+                this.treeNodes = this.mapComponents(components);
+              } else {
+                this.status = this.StatusNoDescriptiveData;
+              }
+        },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('details.mdm-detail-descriptive-data.err-cannot-load-context'), error)
+      );
+  }
+
+  getIdentifier(contextDescribable: Node, contextComponent: Node, attribute: Attribute, contextGroup?: ContextGroup, contextType?: string) {
+    return new ContextAttributeIdentifier(contextDescribable, contextComponent, attribute, contextGroup, contextType);
+  }
+
+  getNodeClass(item: Node) {
+    return 'icon ' + item.type.toLowerCase();
+  }
+
+  /**
+   * Change the tree state to expanded or collapsed
+   *
+   * @param type
+   * @param expand
+   */
+  toggleTreeNodeState(tt: TreeTable) {
+    this.isTreeTableExpanded = !this.isTreeTableExpanded;
+    const nodeArray = this.treeNodes[this.contextType];
+    if (nodeArray != undefined) {
+      for (let node of nodeArray) {
+        this.recursiveChangeNodes(node, this.isTreeTableExpanded);
+      }
+    }
+
+    // invoke table update when pressing the plus or minus buttons from the table header
+    tt.updateSerializedValue();
+    tt.tableService.onUIUpdate(tt.value);
+  }
+
+  /**
+   * Change the tree node state recursively
+   *
+   * @param node
+   * @param expand
+   */
+  recursiveChangeNodes(node: TreeNode, expand: boolean) {
+    node.expanded = expand;
+    if (node.children != undefined && node.children.length > 0) {
+      for (let child of node.children) {
+        this.recursiveChangeNodes(child, expand);
+      }
+    }
+  }
+
+  /**
+   * Get the nodes from the current context
+   *
+   * @param nodes
+   * @param parentId optional parent id which will get the child nodes
+   */
+  getNodes(nodes: Node[], parentId: string) {
+    return nodes.filter(n => this.nodeIsInCurrentContext(n, parentId));
+  }
+
+  nodeIsInCurrentContext(node: Node, parentId: string) {
+    let parentNodeId = node.relations != null && node.relations.length > 0 ? node.relations[0].parentId : null;
+    return parentId == null && parentNodeId == null
+          || parentId != null && parentNodeId != null && parentId === parentNodeId;
+  }
+
+  /**
+   * Create a tree node based on the mdm entity
+   *
+   * @param node
+   * @param context
+   */
+  createTreeNode(node: Node, children: Node[]) {
+    return <TreeNode>{
+      label: node.name,
+      data: {
+        'name': node.name,
+        'attribute': node,
+        'header': true
+      },
+      children: this.createTreeChildren(node, children),
+      icon: this.getNodeClass(node),
+      expanded: true
+    };
+  }
+
+  /**
+   * Create the tree children nodes recursive based on the mdm attributes and subsequent mdm entities
+   *
+   * @param node the current node
+   * @param contexts the complete contexts
+   */
+  createTreeChildren(node: Node, children: Node[]) {
+    let list = [];
+
+    for (let attribute of node.attributes) {
+      let tmp = <TreeNode>{
+        data: {
+          'name': attribute.name,
+          'attribute': this.patchAttributeForDate(attribute),
+          'header': false
+        },
+        expanded: true
+      };
+      list.push(tmp);
+    }
+
+    if (node.relations != null && node.relations.length > 0) {
+      for (let relation of node.relations) {
+        if (relation.ids != null && relation.ids.length > 0) {
+          for (let id of relation.ids) {
+            let nodes = this.getNodes(children, id);
+            for (let n of nodes) {
+              list.push(this.createTreeNode(n, children));
+            }
+          }
+        }
+      }
+    }
+    return list;
+  }
+
+  /**
+   * Method to create a tree structure from the flat context entity and attribute map
+   *
+   * @param components
+   */
+  mapComponents(components: Components) {
+    const list: {[key: string]: TreeNode[]} = {};
+    if (components != undefined ) {
+      for (let key of Object.keys(components)) {
+        const nodes: Node[] = this.getNodes(components[key], null);
+        if (nodes != undefined) {
+          list[key] = nodes.map(node => this.createTreeNode(node, components[key]));
+        }
+      }
+    }
+    return list;
+  }
+
+  /**
+   * Convert the date for UI or backend
+   *
+   * @param attribute
+   */
+  patchAttributeForDate(attribute: Attribute) {
+    if (attribute.dataType != null && attribute.dataType.length > 0 && 'DATE' === attribute.dataType) {
+      const val = attribute.value as any[];
+      if (val != null && val.length > 0) {
+        if (val[0] != null && val[0].length > 0) {
+          val[0] = this.convertFixedDateStr(val[0], true);
+        }
+        if (val.length > 1 && val[1] != null && val[1].length > 0) {
+          val[1] = this.convertFixedDateStr(val[1], true);
+        }
+      }
+    }
+    return attribute;
+  }
+
+  /** *********************
+   * Edit functions start
+   ********************** */
+
+  convertFixedDateStr(dt: string, convertForUI: boolean) {
+    let newDt = dt;
+    let sourceFormat = '';
+
+    /**
+     * Get the translation immediately
+     */
+    sourceFormat = this.translateService.instant('details.mdm-detail-descriptive-data.transform-dateformat');
+
+    if (dt != null && dt.length > 0 && convertForUI && dt.indexOf('T') > -1) {
+      // for display purpose
+      let tmpDt = this.parseISOString(dt);
+      newDt = this.datePipe.transform(tmpDt, sourceFormat, '+0000');
+    } else if (dt != null && dt.length > 0 && !convertForUI && dt.indexOf('T') === -1) {
+      // re-convert UI date to server date for persistence
+      if (newDt.indexOf('-') === -1) {
+        // find the date patterns dd, MM and yyyy and grab the according index positions
+        let startDay = sourceFormat.indexOf('d');
+        let endDay = sourceFormat.lastIndexOf('d');
+        let startMonth = sourceFormat.indexOf('M');
+        let endMonth = sourceFormat.lastIndexOf('M');
+        let startYear = sourceFormat.indexOf('y');
+        let endYear = sourceFormat.lastIndexOf('y');
+        // manually attach the time as toISOString() will not properly transform the winter/summer time
+        newDt = dt.substring(startYear, endYear + 1) + '-' + dt.substring(startMonth, endMonth + 1)
+                  + '-' + dt.substring(startDay, endDay + 1);
+        if (dt.indexOf(' ') > -1) {
+          // use the provided timestamp
+          newDt = newDt + 'T' + dt.substring(dt.indexOf(' ') + 1) + ':00Z';
+        } else {
+          newDt = newDt + 'T00:00:00Z';
+        }
+        if (newDt.length !== 20) {
+          newDt = '';
+        }
+      }
+    }
+    return newDt;
+  }
+
+  /**
+   * Fixed parsing for ISO date string
+   *
+   * @param s
+   */
+  parseISOString(s: string) {
+    let b: any[] = s.split(/\D+/);
+    return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6]));
+  }
+
+  /**
+   * Send the changed data to the backend
+   *
+   * @param node
+   * @param type
+   */
+  private putContext(node: Node, type: string) {
+    if (type == null) {
+      return;
+    }
+    this.status = this.StatusSaving;
+    this.treeNodes = undefined;
+
+    const data = new Context();
+    data.ordered = new Components();
+    data.ordered[type] = this.getNodesWithUpdatedContent(this.contextComponents[type] as Node[], true);
+
+    data.measured = new Components();
+    data.measured[type] = this.getNodesWithUpdatedContent(this.contextComponents[type] as Node[], false);
+
+    // clear for status display
+    this.contextComponents = undefined;
+
+    this._contextService.putContext(node, data).subscribe(
+      components => {
+        if (components.hasOwnProperty('UNITUNDERTEST')
+          || components.hasOwnProperty('TESTEQUIPMENT')
+          || components.hasOwnProperty('TESTSEQUENCE')) {
+          this.contextComponents = components;
+          this.treeNodes = this.mapComponents(this.contextComponents);
+        } else {
+          this.status = this.StatusNoDescriptiveData;
+        }
+      },
+      error => this.notificationService.notifyError(
+        this.translateService.instant('details.mdm-detail-descriptive-data.err-cannot-load-context'), error)
+    );
+  }
+
+  onEdit(event: Event) {
+    event.stopPropagation();
+    this.editMode = true;
+    this.tmpTreeNodes = JSON.parse(JSON.stringify(this.contextComponents[this.contextType]));
+  }
+
+  onCancelEdit(event: Event) {
+    event.stopPropagation();
+    this.editMode = false;
+    this.isTreeTableExpanded = true;
+    this.undoEditChanges(this.contextType, true);
+  }
+
+  onSaveChanges(event: Event) {
+    event.stopPropagation();
+    this.editMode = false;
+    this.isTreeTableExpanded = true;
+    this.putContext(this.selectedNode, this.contextType);
+    this.tmpTreeNodes = undefined;
+  }
+
+  /**
+   * Method to revert table changes back to the original state
+   *
+   * @param type
+   */
+  undoEditChanges(type: string, editMode: boolean) {
+    this.refreshDetailData(this.navigatorService.getSelectedNode());
+    // if (this.contextComponents != undefined && editMode && this.tmpTreeNodes != undefined) {
+    //   if (type == undefined) {
+    //       type = this.contextType;
+    //   }
+    //   // contexts is the origin, so we revert this back as the tree attributes are just references
+    //   this.contextComponents[type] = this.tmpTreeNodes;
+    //   // revert back
+    //   this.treeNodes = this.mapComponents(this.contextComponents);
+    //   this.tmpTreeNodes = null;
+    // }
+  }
+
+  /**
+   * Get the updated nodes from the current context
+   *
+   * @param contextComponents
+   * @param type the context type
+   * @param ordered true if ordered data, false if measured data
+   */
+  getNodesWithUpdatedContent(contextComponents: Node[], ordered: boolean) {
+    let list = [];
+    for (let component of contextComponents) {
+      let parentNodeId = component.relations != null && component.relations.length > 0 ? component.relations[0].parentId : null;
+      if (parentNodeId == null) {
+        let attrs = [];
+        for (let cAttribute of component.attributes) {
+          let attr = new Attribute();
+          let addAttr = true;
+          attr.dataType = cAttribute.dataType;
+          attr.name = cAttribute.name;
+          attr.unit = cAttribute.unit;
+          attr.value = '';
+
+          if (ordered && cAttribute.value instanceof Array && cAttribute.value.length > 0) {
+            attr.value = cAttribute.value[0];
+          } else if (!ordered && cAttribute.value instanceof Array && cAttribute.value.length > 1) {
+            attr.value = cAttribute.value[1];
+          }
+          // lookup new value from treenodes
+          if (attr.dataType === 'BOOLEAN' && attr.value != null && attr.value.toString().length > 0) {
+            attr.value = attr.value.toString() === 'true' ? '1' : '0';
+          }
+
+          // BUG: don't add if non-string as this throws an parsing error in the middleware
+          if (attr.dataType !== 'STRING' && (attr.value == null || attr.value.toString().length === 0)) {
+            addAttr = false;
+          }
+
+          if (addAttr && attr.dataType === 'DATE') {
+            attr.value = this.convertFixedDateStr(attr.value as string, false);
+          }
+
+          if (addAttr) {
+            if (this.isAttributeValueModified(attr, component, ordered)) {
+              attrs.push(attr);
+            }
+          }
+        }
+        // un-merged list
+        if (attrs.length > 0) {
+          let c = JSON.parse(JSON.stringify(component));
+          c.attributes = attrs;
+          list.push(c);
+        }
+      }
+    }
+    return list;
+  }
+
+  private isAttributeValueModified(attr: Attribute, component: Node, ordered: boolean) {
+    for (let tmpNode of this.tmpTreeNodes) {
+      if (tmpNode.name === component.name) {
+        for (let attribute of tmpNode.attributes) {
+          if (attribute.name === attr.name && attribute.value instanceof Array) {
+            let orgValue = ordered ? attribute.value[0] :
+            attribute.value.length > 1 ? attribute.value[1] : undefined;
+            if (orgValue != undefined) {
+              if (attr.dataType === 'BOOLEAN') {
+                // server value = true or false, UI value = 1 or 0
+                return attr.value === '0' && orgValue === 'true'
+                  || attr.value === '1' && orgValue === 'false'
+                  || attr.value !== '' && orgValue === '';
+              } else {
+                // plain comparison
+                return attr.value !== orgValue;
+              }
+            }
+            return false;
+          }
+        }
+      }
+    }
+  }
+
+  /** *********************
+   * Edit functions end
+   ********************** */
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.html
new file mode 100644
index 0000000..ed12eeb
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.html
@@ -0,0 +1,28 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+ <div *ngIf="!selectedNode && !quantity && !unit">
+  <div class="alert alert-info" style="margin: 0;">
+    <strong>{{status | translate}}</strong>
+  </div>
+</div>
+<div *ngIf="selectedNode">
+  <mdm-detail-panel [node]="selectedNode" [shoppable]="shoppable" [showButton]=true></mdm-detail-panel>
+</div>
+<div *ngIf="quantity">
+  <mdm-detail-panel [node]="quantity" [collapsed]=true></mdm-detail-panel>
+</div>
+<div *ngIf="unit">
+  <mdm-detail-panel [node]="unit" [collapsed]=true></mdm-detail-panel>
+</div>
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.ts
new file mode 100644
index 0000000..f8a9f04
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail-view/mdm-detail-view.component.ts
@@ -0,0 +1,107 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+import { Component, OnInit, OnDestroy } from '@angular/core';
+
+import { TranslateService } from '@ngx-translate/core';
+
+import { Node } from '@navigator/node';
+import { NodeService } from '@navigator/node.service';
+import { BasketService } from '@basket/basket.service';
+import { NavigatorService } from '@navigator/navigator.service';
+import { MDMNotificationService } from '@core/mdm-notification.service';
+
+@Component({
+  selector: 'mdm-detail-view',
+  templateUrl: 'mdm-detail-view.component.html'
+})
+export class MDMDetailViewComponent implements OnInit, OnDestroy {
+
+  selectedNode: Node;
+  unit: Node;
+  quantity: Node;
+  subscription: any;
+  shoppable = false;
+
+  public status = 'file-explorer.file-explorer-nav-card.status-no-node-selected';
+
+  constructor(private basketService: BasketService,
+              private navigatorService: NavigatorService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService,
+              private nodeService: NodeService) {}
+
+  ngOnInit() {
+    this.onSelectedNodeChange(this.navigatorService.getSelectedNode());
+    this.subscription = this.navigatorService.selectedNodeChanged.subscribe(
+          node => this.onSelectedNodeChange(node),
+          error => this.notificationService.notifyError(this.translateService.instant('details.mdm-detail-view.cannot-update-node'), error)
+        );
+  }
+
+  ngOnDestroy() {
+    this.subscription.unsubscribe();
+  }
+
+  onSelectedNodeChange(node: Node) {
+    if (node != undefined) {
+      this.selectedNode = node;
+      if (node.type.toLowerCase() === 'channel') {
+        this.loadQuantity(node);
+        this.loadUnit(node);
+      } else {
+        this.quantity = undefined;
+        this.unit = undefined;
+      }
+      this.shoppable = this.isShoppable();
+    }
+  }
+
+  private loadUnit(node: Node) {
+    if (node.relations != undefined) {
+      node.relations
+          .filter(rel => rel.entityType.toLowerCase() === 'unit')
+          .filter(rel => rel.ids.length > 0)
+          .forEach(rel => this.nodeService.getNodeByRelation(node.sourceName, rel.entityType, rel.ids[0])
+                                          .subscribe(res => this.unit = res[0])
+      );
+    }
+  }
+
+  private loadQuantity(node: Node) {
+    if (node.relations != undefined) {
+      node.relations
+          .filter(rel => rel.entityType.toLowerCase() === 'quantity')
+          .filter(rel => rel.ids.length > 0)
+          .forEach(rel => this.nodeService.getNodeByRelation(node.sourceName, rel.entityType, rel.ids[0])
+                                          .subscribe(res => this.quantity = res[0])
+      );
+    }
+  }
+
+  isShoppable() {
+    if (this.selectedNode
+      && this.selectedNode.name != undefined
+      && this.selectedNode.type !== 'Environment'
+      && this.selectedNode.type !== 'Unit'
+      && this.selectedNode.type !== 'Channel') {
+      return false;
+    }
+    return true;
+  }
+
+  isReleasable() {
+    if (this.selectedNode && this.selectedNode.sourceType === 'TestStep') { return false; }
+    return true;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail/mdm-detail.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail/mdm-detail.component.html
new file mode 100644
index 0000000..51c70c9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail/mdm-detail.component.html
@@ -0,0 +1,36 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+ 
+<style>
+  .detail-nav {
+    color: #e7e7e7;
+    border: 1px solid #c8c8c8;
+  }
+</style>
+
+<nav class="navbar navbar-expand bg-light detail-nav ui-corner-all" *ngIf="isVisible()">
+  <div class="container-fluid">
+    <div class="collapse navbar-collapse" id="bs-mdm-detail-navbar">
+      <ul class="nav navbar-nav mdm-link-list">
+        <li class="nav-item" [routerLinkActive]="['active']"><a class="nav-link" routerLink="general"> {{'details.mdm-detail.general' | translate}}</a></li>
+        <li class="nav-item" [routerLinkActive]="['active']"><a class="nav-link" routerLink="uut"> {{ 'details.mdm-detail.unit-under-test' | translate }}</a></li>
+        <li class="nav-item" [routerLinkActive]="['active']"><a class="nav-link" routerLink="ts"> {{ 'details.mdm-detail.test-sequence' | translate }}</a></li>
+        <li class="nav-item" [routerLinkActive]="['active']"><a class="nav-link" routerLink="te"> {{ 'details.mdm-detail.test-equipment' | translate }}</a></li>
+        <li class="nav-item" [routerLinkActive]="['active']"><a class="nav-link" routerLink="sensors"> {{ 'details.mdm-detail.sensors' | translate }} </a></li>
+      </ul>
+    </div>
+  </div>
+</nav>
+
+<router-outlet></router-outlet>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail/mdm-detail.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail/mdm-detail.component.ts
new file mode 100644
index 0000000..f5cbbb3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/mdm-detail/mdm-detail.component.ts
@@ -0,0 +1,59 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component } from '@angular/core';
+import { Router, ActivatedRoute } from '@angular/router';
+
+import { Node } from '@navigator/node';
+import { NavigatorService } from '@navigator/navigator.service';
+
+@Component({
+  selector: 'mdm-detail',
+  templateUrl: 'mdm-detail.component.html',
+  providers: []
+})
+export class MDMDetailComponent {
+
+  visible = false;
+
+  constructor(private route: ActivatedRoute,
+    private router: Router,
+    private navigatorService: NavigatorService) {
+
+    this.refreshVisibility(this.navigatorService.getSelectedNode());
+
+    this.navigatorService.selectedNodeChanged
+      .subscribe(node => this.refreshVisibility(node));
+  }
+
+  refreshVisibility(node: Node) {
+    this.visible = false;
+    if (node != undefined && node.type != undefined && (node.type.toLowerCase() === 'measurement'
+          || node.type.toLowerCase() === 'teststep' || node.type.toLowerCase() === 'test')) {
+       this.visible = true;
+    }
+
+    // check if we are in the general node and if the context tabs are visible
+    if (!this.visible && this.router.url !== '/navigator/details/general') {
+      // redirect to correct router path
+      this.router.navigate(['/navigator/details/general']);
+    }
+  }
+
+  isVisible() {
+    return this.visible;
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/sensor/sensor.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/sensor/sensor.component.html
new file mode 100644
index 0000000..8d1e294
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/sensor/sensor.component.html
@@ -0,0 +1,42 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<div *ngIf="!sensors">
+  <div class="alert alert-info" style="margin: 0;">
+    <strong>{{ status | translate}}</strong>
+  </div>
+</div>
+<accordion *ngIf="sensors">
+  <accordion-group *ngFor="let node of sensors" #s>
+    <div accordion-heading class="thinheader">{{node.name}}
+      <span class="pull-right fa" [ngClass]="{'fa-chevron-down': s?.isOpen, 'fa-chevron-right': !s?.isOpen}"></span>
+    </div>
+    <table class="table table-hover">
+      <thead>
+        <tr>
+          <th>{{ 'details.sensor.tblhdr-name' | translate }}</th>
+          <th>{{ 'details.sensor.tblhdr-measured' | translate }}</th>
+          <th>{{ 'details.sensor.tblhdr-ordered' | translate }}</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr *ngFor="let attr of node.attributes" [ngClass]="diff(attr.value[0], attr.value[1])">
+          <td>{{attr.name[0]}}</td>
+          <td>{{attr.value[0]}}</td>
+          <td>{{attr.value[1]}}</td>
+        </tr>
+      </tbody>
+    </table>
+  </accordion-group>
+</accordion>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/sensor/sensor.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/sensor/sensor.component.ts
new file mode 100644
index 0000000..0ce9774
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/components/sensor/sensor.component.ts
@@ -0,0 +1,106 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+import { TranslateService } from '@ngx-translate/core';
+
+import { Node} from '@navigator/node';
+import { NavigatorService } from '@navigator/navigator.service';
+import { LocalizationService } from '@localization/localization.service';
+import { MDMNotificationService } from '@core/mdm-notification.service';
+import { TRANSLATE } from '@core/mdm-core.module';
+
+import { ContextService } from '../../services/context.service';
+import { Sensor, Context } from '../../model/details.model';
+
+@Component({
+  selector: 'sensors',
+  templateUrl: 'sensor.component.html',
+})
+export class SensorComponent implements OnInit {
+
+  readonly StatusLoading = TRANSLATE('details.sensor.status-loading');
+  readonly StatusNoNodes = TRANSLATE('details.sensor.status-no-nodes-available');
+  readonly StatusNoDescriptiveData = TRANSLATE('details.sensor.status-no-descriptive-data-available');
+
+  selectedNode: Node;
+  context: String;
+
+  _diff = false;
+  contexts: Context[];
+  sensors: Sensor[];
+  errorMessage: string;
+  status: string;
+
+  uut = 'Prüfling';
+  ts = 'Testablauf';
+  te = 'Messgerät';
+  s = 'Sensoren';
+
+  constructor(private route: ActivatedRoute,
+    private localService: LocalizationService,
+              private _contextService: ContextService,
+              private navigatorService: NavigatorService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {}
+
+  ngOnInit() {
+    this.status = this.StatusLoading;
+    this.route.params
+        .subscribe(
+          params => this.setContext(params['context']),
+          error => this.notificationService.notifyError(this.translateService.instant('details.sensor.err-cannot-load-scope'), error)
+    );
+
+    this.navigatorService.selectedNodeChanged
+        .subscribe(node => this.loadContext(node),
+        error => this.notificationService.notifyError(this.translateService.instant('details.sensor.err-cannot-load-data'), error)
+    );
+  }
+
+  setContext(context: string) {
+    this.context = context;
+    this.loadContext(this.navigatorService.getSelectedNode());
+  }
+
+  loadContext(node: Node) {
+    if (node != undefined) {
+      this.selectedNode = node;
+      this.contexts = undefined;
+      if (node.name != undefined && (node.type.toLowerCase() === 'measurement' || node.type.toLowerCase() === 'teststep')) {
+        this.status = this.StatusLoading;
+        this._contextService.getSensors(node).subscribe(
+            sensors => this.sensors = <Sensor[]> sensors,
+            error => this.notificationService.notifyError(
+              this.translateService.instant('details.sensor.err-cannot-load-descriptive-data'), error)
+          );
+      } else {
+        this.status = this.StatusNoDescriptiveData;
+      }
+    } else {
+      this.status = this.StatusNoNodes;
+    }
+  }
+
+  diffToggle() {
+    this._diff = !this._diff;
+  }
+
+  diff(attr1: string, attr2: string) {
+    if (attr1 !== attr2 && this._diff) {
+      return 'danger';
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/context.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/context.ts
new file mode 100644
index 0000000..eec0b08
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/context.ts
@@ -0,0 +1,32 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Node} from '../navigator/node';
+
+export class Context {
+  measured: Components;
+  ordered: Components;
+}
+
+export class Components {
+  UNITUNDERTEST: Node[];
+  TESTSEQUENCE: Node[];
+  TESTEQUIPMENT: Node[];
+}
+
+export class Sensor {
+  sensor_measured: Node[];
+  sensor_ordered: Node[];
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/mdm-detail-routing.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/mdm-detail-routing.module.ts
new file mode 100644
index 0000000..5bd4405
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/mdm-detail-routing.module.ts
@@ -0,0 +1,41 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { MDMDetailComponent } from './components/mdm-detail/mdm-detail.component';
+import { MDMDetailViewComponent } from './components/mdm-detail-view/mdm-detail-view.component';
+import { MDMDescriptiveDataComponent } from './components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component';
+import { SensorComponent } from './components/sensor/sensor.component';
+
+const detailRoutes: Routes = [
+  { path: '',  component: MDMDetailComponent, children: [
+    { path: 'general',  component: MDMDetailViewComponent },
+    { path: 'sensors',  component: SensorComponent },
+    { path: ':context', component: MDMDescriptiveDataComponent },
+    { path: '', redirectTo: 'general', pathMatch: 'full' },
+  ]}
+];
+
+@NgModule({
+  imports: [
+    RouterModule.forChild(detailRoutes)
+  ],
+  exports: [
+    RouterModule
+  ]
+})
+export class MDMDetailRoutingModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/mdm-detail.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/mdm-detail.module.ts
new file mode 100644
index 0000000..1a71acc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/mdm-detail.module.ts
@@ -0,0 +1,73 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+import { NgModule } from '@angular/core';
+import { DatePipe } from '@angular/common';
+
+import { PanelModule } from 'primeng/panel';
+import { TreeTableModule } from 'primeng/treetable';
+import { InputTextModule } from 'primeng/inputtext';
+import { TooltipModule } from 'primeng/tooltip';
+import { OverlayPanelModule } from 'primeng/overlaypanel';
+import { TableModule } from 'primeng/table';
+
+import { MDMDetailComponent } from './components/mdm-detail/mdm-detail.component';
+import { MDMDetailViewComponent } from './components/mdm-detail-view/mdm-detail-view.component';
+import { MDMDescriptiveDataComponent } from './components/mdm-detail-descriptive-data/mdm-detail-descriptive-data.component';
+import { DetailViewService } from './services/detail-view.service';
+import { SensorComponent } from './components/sensor/sensor.component';
+import { ContextService } from './services/context.service';
+import { DetailPanelComponent } from './components/detail-panel/detail-panel.component';
+import { AttributeEditorComponent } from './components/attribute-editor/attribute-editor.component';
+import { AttributeViewerComponent } from './components/attribute-viewer/attribute-viewer.component';
+import { MDMDetailRoutingModule } from './mdm-detail-routing.module';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { FileExplorerModule } from '../file-explorer/file-explorer.module';
+import { AuthenticationModule } from '../authentication/authentication.module';
+
+
+
+@NgModule({
+  imports: [
+    MDMDetailRoutingModule,
+    MDMCoreModule,
+    PanelModule,
+    TreeTableModule,
+    TooltipModule,
+    AuthenticationModule,
+    FileExplorerModule,
+    OverlayPanelModule,
+    TableModule,
+    InputTextModule
+  ],
+  declarations: [
+    MDMDetailComponent,
+    MDMDetailViewComponent,
+    MDMDescriptiveDataComponent,
+    SensorComponent,
+    DetailPanelComponent,
+    AttributeEditorComponent,
+    AttributeViewerComponent,
+  ],
+  exports: [
+    MDMDetailComponent
+  ],
+  providers: [
+    DetailViewService,
+    ContextService,
+    DatePipe
+  ]
+})
+export class MDMDetailModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/details.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/details.model.ts
new file mode 100644
index 0000000..c9f0a93
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/details.model.ts
@@ -0,0 +1,20 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+// Grouping file to enable import from central point.

+export { Components } from './types/components';

+export { Sensor } from './types/sensor';

+export { Context } from './types/context';

+export { ContextResponse } from './types/context-response';

+export { ContextAttributeIdentifier }  from './types/context-attribute-identifier';

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/components.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/components.ts
new file mode 100644
index 0000000..c1df941
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/components.ts
@@ -0,0 +1,20 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { Node } from '../../../navigator/node';

+export class Components {

+  UNITUNDERTEST: Node[];

+  TESTSEQUENCE: Node[];

+  TESTEQUIPMENT: Node[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context-attribute-identifier.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context-attribute-identifier.ts
new file mode 100644
index 0000000..2395c3b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context-attribute-identifier.ts
@@ -0,0 +1,30 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { Node, Attribute, ContextGroup } from '@navigator/node';

+

+export class ContextAttributeIdentifier {

+  contextDescribable: Node;

+  contextComponent: Node;

+  attribute: Attribute;

+  contextGroup?: ContextGroup;

+  contextType?: string;

+  constructor(contextDescribable: Node, contextComponent: Node, attribute: Attribute, contextGroup?: ContextGroup, contextType?: string) {

+    this.contextDescribable = contextDescribable;

+    this.contextComponent = contextComponent;

+    this.attribute = attribute;

+    this.contextGroup = contextGroup;

+    this.contextType = contextType;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context-response.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context-response.ts
new file mode 100644
index 0000000..7633d74
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context-response.ts
@@ -0,0 +1,21 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+import { Context } from './context';

+

+export class ContextResponse {

+  data: Context[];

+  constructor(data: Context[]) {

+    this.data = data;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context.ts
new file mode 100644
index 0000000..c016ff1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/context.ts
@@ -0,0 +1,20 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { Components } from './components';

+export class Context {

+  measured: Components;

+  ordered: Components;

+}

+

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/sensor.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/sensor.ts
new file mode 100644
index 0000000..8d21d90
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/model/types/sensor.ts
@@ -0,0 +1,20 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { Node } from '../../../navigator/node';

+

+export class Sensor {

+  sensor_measured: Node[];

+  sensor_ordered: Node[];

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/context.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/context.service.spec.ts
new file mode 100644
index 0000000..07e2518
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/context.service.spec.ts
@@ -0,0 +1,186 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { async, TestBed, inject } from '@angular/core/testing';
+import { BaseRequestOptions, Http, HttpModule } from '@angular/http';
+import { MockBackend } from '@angular/http/testing';
+
+import { ContextService } from './context.service';
+import { PropertyService } from '../../core/property.service';
+import { HttpErrorHandler } from '../../core/http-error-handler';
+import { Attribute } from '../../navigator/node';
+
+describe('ContextService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [
+        MockBackend,
+        BaseRequestOptions,
+        HttpErrorHandler,
+        {
+          provide: Http,
+          useFactory: (mockBackend, options) => {
+            return new Http(mockBackend, options);
+          },
+          deps: [MockBackend, BaseRequestOptions]
+        },
+        PropertyService,
+        ContextService
+      ]
+    });
+  });
+
+  describe('mergeAttributes()', () => {
+    it('should merge value of one attribute', async(inject([ContextService], (contextService) => {
+      let attribute1: Attribute = {
+        'name' : 'size',
+        'value' : '95R16',
+        'unit' : '',
+        'dataType' : 'STRING'
+      };
+      let attributes = [ attribute1 ];
+      let contextIndex = 2;
+      let resultAttributes: Attribute[] = [];
+
+      expect(contextService.mergeAttributes(attributes, contextIndex, resultAttributes)).toEqual(
+        [{
+          'name' : 'size',
+          'value' : [undefined, undefined, '95R16'],
+          'unit' : '',
+          'dataType' : 'STRING'
+        }]
+      );
+    })));
+
+    it('should merge values of multiple attributes', async(inject([ContextService], (contextService) => {
+      let attribute1: Attribute = {
+        'name' : 'size',
+        'value' : '95R16',
+        'unit' : '',
+        'dataType' : 'STRING'
+      };
+      let attribute2: Attribute = {
+        'name' : 'side',
+        'value' : 'Left',
+        'unit' : '',
+        'dataType' : 'STRING'
+      };
+
+      let attributes = [ attribute1, attribute2 ];
+      let contextIndex = 0;
+      let resultAttributes: Attribute[] = [];
+
+      expect(contextService.mergeAttributes(attributes, contextIndex, resultAttributes)).toEqual(
+        [{
+          'name' : 'size',
+          'value' : ['95R16'],
+          'unit' : '',
+          'dataType' : 'STRING'
+        }, {
+          'name' : 'side',
+          'value' : ['Left'],
+          'unit' : '',
+          'dataType' : 'STRING'
+        }]
+      );
+    })));
+  });
+
+  describe('mergeContextRoots()', () => {
+    it('should merge attributes values of all context components', async(inject([ContextService], (contextService) => {
+      let data = {
+        'ordered' : {
+          'UNITUNDERTEST' : [{
+              'name' : 'FL_tyre',
+              'id' : '38',
+              'type' : 'ContextComponent',
+              'sourceType' : 'tyre',
+              'sourceName' : 'MDM',
+              'attributes' : [{
+                  'name' : 'size',
+                  'value' : '95R16',
+                  'unit' : '',
+                  'dataType' : 'STRING'
+                }
+              ]
+            }
+          ]
+        },
+        'measured' : {
+          'UNITUNDERTEST' : [{
+              'name' : 'FL_tyre',
+              'id' : '39',
+              'type' : 'ContextComponent',
+              'sourceType' : 'tyre',
+              'sourceName' : 'MDM',
+              'attributes' : [{
+                  'name' : 'size',
+                  'value' : '95R17',
+                  'unit' : '',
+                  'dataType' : 'STRING'
+                }
+              ]
+            }, {
+              'name' : 'engine',
+              'id' : '12',
+              'type' : 'ContextComponent',
+              'sourceType' : 'engine',
+              'sourceName' : 'MDM',
+              'attributes' : [{
+                  'name' : 'cylinders',
+                  'value' : '2',
+                  'unit' : '',
+                  'dataType' : 'STRING'
+                }
+              ]
+            }
+          ]
+        }
+      };
+
+      let mergedData = contextService.mergeContextRoots([data.ordered, data.measured]);
+
+      // Workarround since jasmine check for type. Service returns Components, mocked object is of type Obejct.
+      expect(jasmine.objectContaining(Object.assign({}, mergedData))).toEqual({
+        'UNITUNDERTEST': [{
+          'name' : 'FL_tyre',
+          'id' : '38',
+          'type' : 'ContextComponent',
+          'sourceType' : 'tyre',
+          'sourceName' : 'MDM',
+          'attributes' : [{
+            'name' : 'size',
+            'value' : ['95R16', '95R17'],
+            'unit' : '',
+            'dataType' : 'STRING'
+          }]
+        }, {
+          'name' : 'engine',
+          'id' : '12',
+          'type' : 'ContextComponent',
+          'sourceType' : 'engine',
+          'sourceName' : 'MDM',
+          'attributes' : [{
+            'name' : 'cylinders',
+            'value' : [undefined, '2'],
+            'unit' : '',
+            'dataType' : 'STRING'
+          }]
+        }]
+      });
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/context.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/context.service.ts
new file mode 100644
index 0000000..6460127
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/context.service.ts
@@ -0,0 +1,215 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable} from '@angular/core';
+import {Http} from '@angular/http';
+
+import {catchError, map} from 'rxjs/operators';
+
+import { Sensor } from '../model/types/sensor';
+import { Components } from '../model/types/components';
+import {PropertyService} from '@core/property.service';
+import {HttpErrorHandler} from '@core/http-error-handler';
+import {Node, Attribute} from '@navigator/node';
+
+@Injectable()
+export class ContextService {
+
+  private _contextUrl: string;
+
+  private test: {};
+  private errorMessage: string;
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService) {
+    this._contextUrl = _prop.getUrl('mdm/environments');
+  }
+
+  putContext(node: Node, context: any) {
+    let url = this._contextUrl + '/' + node.sourceName;
+    url = url + '/' + node.type.toLowerCase() + 's/' + node.id + '/contexts';
+    let body = {
+      'data': [ context ]
+    };
+    return this.http.put(url, body).pipe(
+      map((res) => {
+        let data = res.json().data;
+        return this.mergeContextRoots([data[0].ordered, data[0].measured]);
+      }),
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  getContext(node: Node) {
+    let url = this._contextUrl + '/' + node.sourceName;
+    url = url + '/' + node.type.toLowerCase() + 's/' + node.id + '/contexts';
+    return this.http.get(url).pipe(
+      map((res) => {
+        let data = res.json().data;
+        let context = this.mergeContextRoots([data[0].ordered, data[0].measured]);
+        return context;
+      }),
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  getSensors(node: Node) {
+    let url = this._contextUrl + '/' + node.sourceName + '/' + node.type.toLowerCase() + 's/' + node.id + '/contexts/testequipment/sensors';
+    return this.http.get(url).pipe(
+        map((res) => { return <{}> this.merge(res.json().data); }),
+        catchError(this.httpErrorHandler.handleError));
+  }
+
+  private merge(sensor: Sensor) {
+    let sensorm = sensor[0].sensor_measured;
+    let sensoro = sensor[0].sensor_ordered;
+    let merge = [];
+    sensoro.forEach((node) => {
+      let pos = sensorm.map(function(e) { return e.name; }).indexOf(node.name);
+      if (pos === -1) {
+        merge.push(this.empty_m(node));
+      } else {
+        merge.push(this.mergeNode(node, sensorm[pos]));
+        sensorm.splice(pos, 1);
+      }
+    });
+    sensorm.forEach((node) => {
+      merge.push(this.empty_o(node));
+    });
+    return merge;
+  }
+
+  private mergeNode(oNode, mNode) {
+    oNode.attributes.forEach((attr, i) => {
+      attr.dataType = [attr.dataType, mNode.attributes[i].dataType];
+      attr.name = [attr.name, mNode.attributes[i].name];
+      attr.unit = [attr.unit, mNode.attributes[i].unit];
+      attr.value = [attr.value, mNode.attributes[i].value];
+    });
+    return oNode;
+  }
+
+  private empty_o(node) {
+    node.attributes.forEach((attr) => {
+      attr.dataType = ['', attr.dataType];
+      attr.name = ['', attr.name];
+      attr.unit = ['', attr.unit];
+      attr.value = ['', attr.value];
+    });
+    return node;
+  }
+
+  private empty_m(node) {
+    node.attributes.forEach((attr) => {
+      attr.dataType = [attr.dataType, ''];
+      attr.name = [attr.name, ''];
+      attr.unit = [attr.unit, ''];
+      attr.value = [attr.value, ''];
+    });
+    return node;
+  }
+
+  /** Merges several ContextRoots by merging their ContextComponents */
+  private mergeContextRoots(contexts) {
+    let result: Components = new Components();
+
+    for (let i = 0; i < contexts.length; ++i) {
+      for (let contextType in contexts[i]) {
+        if (contexts[i].hasOwnProperty(contextType)) {
+          result[contextType] = this.mergeComponents(contexts[i][contextType], i, result[contextType]);
+        }
+      }
+    }
+    return result;
+  }
+
+  /** Merges several ContextComponents by merging their ContextAttributes */
+  private mergeComponents(contextComponents: any, contextIndex: number, resultComponents: Node[]) {
+    if (!Array.isArray(contextComponents)) {
+      return resultComponents;
+    }
+
+    let result = resultComponents || [];
+
+    for (let contextComponent of contextComponents) {
+      if (!(contextComponent instanceof Object)) { continue; }
+
+      let resultComponent = result.find(cc => cc.name === contextComponent['name']);
+
+      if (!resultComponent) {
+        resultComponent = JSON.parse(JSON.stringify(contextComponent));
+        resultComponent['attributes'] = [];
+        result.push(resultComponent);
+      }
+
+      resultComponent['attributes'] = this.mergeAttributes(contextComponent['attributes'], contextIndex, resultComponent['attributes']);
+    }
+    return result;
+  }
+
+  /** Merges a array of ContextAttributes to a MergedContextAttribute
+   * and adds it to the given resultAttributes array. Merging the ContextAttributes
+   * copies the values of all properties (which should be identical), except the
+   * value property. The value property in MergedContextAttribute is an array
+   * with all values of the value property from all ContextAttributes.
+   */
+  private mergeAttributes(attributes: Attribute[], contextIndex: number, resultAttributes: Attribute[]) {
+    if (!Array.isArray(attributes)) {
+      return resultAttributes;
+    }
+
+    let result = resultAttributes || [];
+
+    for (let attribute of attributes) {
+      if (!(attribute instanceof Object)) { continue; }
+
+      let resultAttribute = result.find(a => a.name === attribute['name']);
+
+      if (!resultAttribute) {
+        resultAttribute = JSON.parse(JSON.stringify(attribute));
+        resultAttribute['value'] = [];
+        result.push(resultAttribute);
+      }
+      resultAttribute['value'][contextIndex] = attribute['value'];
+    }
+
+    return resultAttributes;
+  }
+}
+
+// /** Represents a ContextAttribute */
+// export class ContextAttribute {
+//   name: string;
+//   value: string;
+//   unit: string;
+//   dataType: string;
+// }
+
+// /** Represents multiple ContextAttributes with their value properties merged to an array */
+// export class MergedContextAttribute {
+//   name: string;
+//   value: string[];
+//   unit: string;
+//   dataType: string;
+// }
+
+// /** Represents merged ContextComponents */
+// export class MergedContextComponent {
+//   name: string;
+//   id: string;
+//   type: string;
+//   sourcType: string;
+//   sourceName: string;
+//   attributes: MergedContextAttribute[];
+// }
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/detail-view.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/detail-view.service.spec.ts
new file mode 100644
index 0000000..1f734e7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/detail-view.service.spec.ts
@@ -0,0 +1,88 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { async, TestBed, inject } from '@angular/core/testing';
+import { HttpModule } from '@angular/http';
+
+import { TranslateModule } from '@ngx-translate/core';
+import {of as observableOf,  Observable } from 'rxjs';
+
+import {PreferenceService, Preference, Scope} from '../../core/preference.service';
+import {DetailViewService} from './detail-view.service';
+import {MDMNotificationService} from '../../core/mdm-notification.service';
+
+class TestPreferenceService {
+  getPreference(key?: string): Observable<Preference[]> {
+    return observableOf([
+    {
+      id: 1,
+      key: 'ignoredAttributes',
+      scope: Scope.USER,
+      source: null,
+      user: 'testUser',
+      value: '[\"*.MimeType\", \"TestStep.Sortindex\"]'
+    }, {
+      id: 2,
+      key: 'ignoredAttributes',
+      scope: Scope.SYSTEM,
+      source: null,
+      user: null,
+      value: '[\"Project.*\"]'
+    }, {
+      id: 3,
+      key: 'ignoredAttributes',
+      scope: Scope.SOURCE,
+      source: 'MDMTEST',
+      user: null,
+      value: '[\"*.Id\"]'
+    }, {
+      id: 4,
+      key: 'ignoredAttributes',
+      scope: Scope.SOURCE,
+      source: 'MDM_OTHER',
+      user: null,
+      value: '[\"Pool.*\"]'
+    }
+  ]);
+  }
+}
+
+describe('DetailViewService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        HttpModule,
+        TranslateModule.forRoot(),
+      ],
+      providers: [
+        {
+          provide: PreferenceService,
+          useClass: TestPreferenceService
+        },
+        DetailViewService,
+        MDMNotificationService,
+      ]
+    });
+  });
+
+
+  describe('getFilters()', () => {
+    it('should return filtered attributes', async(inject([DetailViewService], (detailViewService) => {
+
+      expect(detailViewService.getFilters('MDMTEST')).toEqual(['Project.*', '*.Id', '*.MimeType', 'TestStep.Sortindex']);
+
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/detail-view.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/detail-view.service.ts
new file mode 100644
index 0000000..f20a265
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/details/services/detail-view.service.ts
@@ -0,0 +1,86 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Injectable} from '@angular/core';
+
+import { TranslateService } from '@ngx-translate/core';
+
+import { Preference, PreferenceService, Scope } from '@core/preference.service';
+import { MDMNotificationService } from '@core/mdm-notification.service';
+import { streamTranslate, TRANSLATE } from '@core/mdm-core.module';
+import { Node, Attribute } from '@navigator/node';
+
+@Injectable()
+export class DetailViewService {
+
+    ignoreAttributesPrefs: Preference[] = [];
+
+    msgFaultyPreferenceForAttributesToIgnore: string;
+
+    constructor (private preferenceService: PreferenceService,
+                 private notificationService: MDMNotificationService,
+                 private translateService: TranslateService) {
+      this.preferenceService.getPreference('ignoredAttributes')
+          .subscribe(
+            prefs => this.ignoreAttributesPrefs = this.ignoreAttributesPrefs.concat(prefs),
+            error => this.notificationService.notifyWarn(
+              this.translateService.instant('details.detail-view.err-cannot-load-preference-for-attributes-to-ignore'), error));
+
+      streamTranslate(this.translateService, TRANSLATE('details.detail-view.err-faulty-preference-for-attributes-to-ignore')).subscribe(
+            (msg: string) => this.msgFaultyPreferenceForAttributesToIgnore = msg);
+    }
+
+    getAttributesToDisplay(node: Node) {
+        let filterList = this.getFilters(node.sourceName)
+          .map(p => { let splitted = p.split('.'); return { type: splitted[0], attribute: splitted[1]}; })
+          .filter(p => p.type === node.type || p.type === '*')
+          .map(p => p.attribute);
+
+        return this.getFilteredAttributes(node.attributes, filterList);
+    }
+
+    getFilters(source: string): string[] {
+      if (this.ignoreAttributesPrefs.length > 0) {
+      return this.ignoreAttributesPrefs
+        .filter(p => p.scope !== Scope.SOURCE || p.source === source)
+        .sort(Preference.sortByScope)
+        .map(p => this.parsePreference(p))
+        .reduce((acc, value) => acc.concat(value), []);
+      } else {
+        return [];
+      }
+    }
+
+    private parsePreference(pref: Preference) {
+      try {
+          return <string[]> JSON.parse(pref.value);
+      } catch (e) {
+          this.notificationService.notifyError(this.msgFaultyPreferenceForAttributesToIgnore, e);
+          return [];
+      }
+    }
+
+    private processFilter(prefList: string[], type: string) {
+      return prefList.filter(p => p.split('.')[0] === type || p.split('.')[0] === '*')
+        .map(p => p.split('.')[1]);
+    }
+
+    private getFilteredAttributes(attributes: Attribute[], filter: string[]) {
+        if (filter.indexOf('*') !== -1) {
+            return [];
+        } else {
+            return attributes.filter(attr => filter.indexOf(attr.name ) === -1);
+        }
+    }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example-routing.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example-routing.module.ts
new file mode 100644
index 0000000..6e663c7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example-routing.module.ts
@@ -0,0 +1,32 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { MDMExampleComponent } from './mdm-example.component';
+
+const moduleRoutes: Routes = [
+  { path: '', component: MDMExampleComponent }
+];
+
+@NgModule({
+  imports: [
+    RouterModule.forChild(moduleRoutes)
+  ],
+  exports: [
+    RouterModule
+  ]
+})
+export class MDMExampleRoutingModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example.component.ts
new file mode 100644
index 0000000..552aa90
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example.component.ts
@@ -0,0 +1,23 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import {Component} from '@angular/core';
+
+@Component({
+  selector: 'mdm-example',
+  template: '<h1>Example Module</h1>'
+})
+export class MDMExampleComponent {
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example.module.ts
new file mode 100644
index 0000000..6d9239a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/mdm-example.module.ts
@@ -0,0 +1,31 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { MDMExampleComponent } from './mdm-example.component';
+import { MDMExampleRoutingModule } from './mdm-example-routing.module';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    MDMExampleRoutingModule
+  ],
+  declarations: [
+    MDMExampleComponent
+  ]
+})
+export class MDMExampleModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/readme.md b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/readme.md
new file mode 100644
index 0000000..ea26f1b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/example-module/readme.md
@@ -0,0 +1,27 @@
+To embed this example module in MDM you have to register this module in the MDMModules Module.
+
+This is done by registering a child route to **moduleRoutes** in **modules-routing.module.ts**:
+***
+ { path: 'example', loadChildren: '../example-module/mdm-example.module#MDMExampleModule'},
+***
+
+Furthermore you have to define a display name for the registered route in the array returned by **getLinks** in  **modules.component.ts**:
+***
+{ path: 'example', name: 'Example Module' }
+***
+
+For further information refer to the Angular 2 documentation for modules & router:
+* https://angular.io/docs/ts/latest/guide/ngmodule.html
+* https://angular.io/docs/ts/latest/guide/router.html
+
+## Copyright and License ##
+Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+
+ See the NOTICE file(s) distributed with this work for additional
+ information regarding copyright ownership.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v. 2.0 which is available at
+ http://www.eclipse.org/legal/epl-2.0.
+
+ SPDX-License-Identifier: EPL-2.0
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-display/file-attribute-display.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-display/file-attribute-display.component.html
new file mode 100644
index 0000000..77f5e4a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-display/file-attribute-display.component.html
@@ -0,0 +1,30 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<div>
+  <!-- <mdm5-file-pop-up-menu *ngIf="attribute?.dataType == 'FILE_LINK'"
+      [attribute]="attribute"
+      [contextComponent]="contextComponent"
+      [contextDescribable]="contextDescribable"
+      [contextGroup]="contextGroup"
+      [contextType]="contextType"
+      [readOnly]="readOnly">
+  </mdm5-file-pop-up-menu> -->
+  <button *ngIf="attribute?.dataType == 'FILE_LINK_SEQUENCE'"
+    type="button"
+    class="btn btn-mdm"
+    label="Show"
+    (click)="onShowFileExplorerDialog($event)">
+    <span class="fa fa-folder-open"></span>
+  </button>
+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-display/file-attribute-display.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-display/file-attribute-display.component.ts
new file mode 100644
index 0000000..4ee50b3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-display/file-attribute-display.component.ts
@@ -0,0 +1,87 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, Input } from '@angular/core';
+import { MenuItem, DialogService} from 'primeng/api';
+
+import { Attribute, Node, ContextGroup } from '@navigator/node';
+import { FileExplorerDialogComponent } from 'src/app/file-explorer/components/file-explorer-dialog/file-explorer-dialog.component';
+
+@Component({
+  selector: 'mdm5-file-attribute-display',
+  templateUrl: './file-attribute-display.component.html'
+})
+export class FileAttributeDisplayComponent implements OnInit {
+
+  @Input() attribute: Attribute;
+  @Input() contextDescribable: Node;
+  @Input() contextComponent: Node;
+  @Input() contextGroup?: ContextGroup;
+  @Input() contextType?: string;
+  @Input() readOnly: boolean;
+
+  // public link: MDMLink;
+  // public links: MDMLink[];
+
+  public menuItems: MenuItem[];
+
+  constructor(private dialogService: DialogService) { }
+
+  ngOnInit() {
+    // if (this.attribute != undefined && this.attribute.value != undefined) {
+    //   if (this.attribute.dataType === 'FILE_LINK') {
+    //     this.link = Object.assign(new MDMLink(), this.getValue<MDMLink>());
+    //   }
+    //   if (this.attribute.dataType === 'FILE_LINK_SEQUENCE' && this.getValues() != undefined) {
+    //     this.links = (this.getValues<MDMLink[]>()).map(l => Object.assign(new MDMLink(), l));
+    //   }
+    // }
+  }
+
+  // private getValue<T>() {
+  //   if (this.attribute != undefined && this.attribute.value != undefined) {
+  //     return <T> (this.contextGroup != undefined ? this.attribute.value[this.contextGroup] : this.attribute.value);
+  //   }
+  // }
+
+  // private getValues<T>() {
+  //   if (this.attribute != undefined && this.attribute.value != undefined) {
+  //     const tmp = this.contextGroup != undefined ? this.attribute.value[this.contextGroup] : this.attribute.value;
+  //     return tmp !== '' ? tmp : undefined;
+  //   }
+  // }
+
+  public onShowFileExplorerDialog() {
+    const ref = this.dialogService.open(FileExplorerDialogComponent, {
+        data: {
+          contextDescribable: this.contextDescribable,
+          contextComponent: this.contextComponent,
+          attribute: this.attribute,
+          contextGroup: this.contextGroup,
+          contextType: this.contextType,
+          readOnly: this.readOnly
+        },
+        header: 'File upload wizard for ' + this.contextComponent.name,
+        width: '70%'
+    });
+
+    // ref.onClose.subscribe(linkObs => this.handleUploadDialogResponse(linkObs));
+  }
+
+  // private handleUploadDialogResponse(linkObs: Observable<MDMLink>) {
+  //   if (linkObs != undefined) {
+  //     linkObs.subscribe(link => console.log(link));
+  //   }
+  // }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-viewer/file-attribute-viewer.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-viewer/file-attribute-viewer.component.html
new file mode 100644
index 0000000..b3437a4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-viewer/file-attribute-viewer.component.html
@@ -0,0 +1,25 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<div [ngSwitch]="attribute?.dataType">
+    <a *ngSwitchCase="'FILE_LINK'" title="{{attribute?.value[ident.contextGroup]?.description}}" target="_blank" [href]="getUrl(attribute?.value[ident.contextGroup]?.remotePath)">
+        {{attribute?.value[ident.contextGroup] | fileName}}
+    </a>
+    <div *ngSwitchCase="'FILE_LINK_SEQUENCE'" >
+        <div *ngFor="let link of attribute.value[ident.contextGroup]; index as i">
+            <a title="{{attribute?.value[ident.contextGroup][i]?.description}}" target="_blank" [href]="getUrl(attribute?.value[ident.contextGroup][i]?.remotePath)">
+                {{attribute?.value[ident.contextGroup][i] | fileName}}
+            </a>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-viewer/file-attribute-viewer.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-viewer/file-attribute-viewer.component.ts
new file mode 100644
index 0000000..56dec78
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-attribute-viewer/file-attribute-viewer.component.ts
@@ -0,0 +1,40 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, Input } from '@angular/core';
+
+import { Attribute } from '@navigator/node';
+import { ContextAttributeIdentifier } from '@details/model/details.model';
+
+import { ContextFilesService } from '../../services/context-files.service';
+
+@Component({
+  selector: 'file-attribute-viewer',
+  templateUrl: './file-attribute-viewer.component.html'
+})
+export class FileAttributeViewerComponent {
+
+  @Input() ident: ContextAttributeIdentifier;
+  @Input() attribute: Attribute;
+
+  constructor(private contextFilesService: ContextFilesService) {
+
+  }
+
+  getUrl(remotePath: string) {
+    if (remotePath != undefined) {
+      return this.contextFilesService.getUrl(this.ident, remotePath);
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-dialog/file-explorer-dialog.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-dialog/file-explorer-dialog.component.html
new file mode 100644
index 0000000..5a4c276
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-dialog/file-explorer-dialog.component.html
@@ -0,0 +1,21 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<mdm5-file-explorer
+    [contextDescribable]="contextDescribable"
+    [node]="contextComponent"
+    [contextType]="contextType"
+    [contextGroup]="contextGroup"
+    [attribute]="attribute"
+    [readOnly]="readOnly">
+</mdm5-file-explorer>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-dialog/file-explorer-dialog.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-dialog/file-explorer-dialog.component.ts
new file mode 100644
index 0000000..93679ed
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-dialog/file-explorer-dialog.component.ts
@@ -0,0 +1,47 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit } from '@angular/core';
+import { DynamicDialogRef, DynamicDialogConfig } from 'primeng/api';
+import { Node, Attribute, ContextGroup } from '@navigator/node';
+
+@Component({
+  selector: 'mdm5-file-explorer-dialog',
+  templateUrl: './file-explorer-dialog.component.html'
+})
+export class FileExplorerDialogComponent implements OnInit {
+
+  public contextComponent: Node;
+  public contextDescribable: Node;
+  public attribute: Attribute;
+  public contextGroup: ContextGroup;
+  public contextType: string;
+  public readOnly: boolean;
+
+  public constructor(
+    public ref: DynamicDialogRef,
+    public config: DynamicDialogConfig) {}
+
+  ngOnInit() {
+    if (this.config != undefined) {
+      this.contextComponent = this.config.data.contextComponent as Node;
+      this.contextDescribable = this.config.data.contextDescribable as Node;
+      this.attribute = this.config.data.attribute as Attribute;
+      this.contextGroup = this.config.data.contextGroup as ContextGroup;
+      this.contextType = this.config.data.contextType as string;
+      this.readOnly = this.config.data.readOnly as boolean;
+    }
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-nav-card/file-explorer-nav-card.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-nav-card/file-explorer-nav-card.component.html
new file mode 100644
index 0000000..bb683be
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-nav-card/file-explorer-nav-card.component.html
@@ -0,0 +1,21 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<div *ngIf="!filesAttachable">
+  <div class="alert alert-info" style="margin: 0;">
+      <strong>{{status | translate: {type: selectedNode?.type} }}</strong>
+  </div>
+</div>
+<div *ngIf="filesAttachable">
+  <mdm5-file-explorer [node]="selectedNode" [attribute]="linkAttr" [readOnly]="false"></mdm5-file-explorer>
+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-nav-card/file-explorer-nav-card.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-nav-card/file-explorer-nav-card.component.ts
new file mode 100644
index 0000000..f5838ed
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer-nav-card/file-explorer-nav-card.component.ts
@@ -0,0 +1,101 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+import { MDMNotificationService } from '@core/mdm-notification.service';
+import { MDMItem } from '@core/mdm-item';
+import { NavigatorService } from '@navigator/navigator.service';
+import { Node, Attribute } from '@navigator/node';
+import { NodeService } from '@navigator/node.service';
+
+import { FilesAttachableService } from '../../services/files-attachable.service';
+
+@Component({
+  selector: 'mdm5-file-explorer-nav-card',
+  templateUrl: './file-explorer-nav-card.component.html'
+})
+export class FileExplorerNavCardComponent implements OnInit {
+
+  private static readonly FILE_ATTACHABLE_TYPES = ['Test', 'TestStep', 'Measurement'];
+
+  // holding node selected in navigator
+  public selectedNode: Node;
+  // holding node selected in navigator
+  public filesAttachable = false;
+
+  public linkAttr: Attribute;
+
+  public status = 'file-explorer.file-explorer-nav-card.status-no-node-selected';
+
+  public constructor(
+              private route: ActivatedRoute,
+              private navigatorService: NavigatorService,
+              private nodeService: NodeService,
+              private notificationService: MDMNotificationService) {}
+
+  public ngOnInit() {
+    // init data on navigation via modules
+    this.route.url.subscribe(() => {
+      this.selectedNode = this.navigatorService.getSelectedNode();
+      // reload selected node to reflect fileLink changes from delete and create
+      this.reloadSelectedNode();
+    });
+    // init data on selected node change via navigator
+    this.navigatorService.selectedNodeChanged
+        .subscribe(
+          node => this.init(node),
+          error => this.notificationService.notifyError('Daten können nicht geladen werden.', error));
+  }
+
+  // initialize component data
+  private init(node: Node) {
+    if (node != undefined) {
+      this.selectedNode = node;
+      this.status = 'file-explorer.file-explorer-nav-card.status-node-is-no-files-attachable';
+      this.filesAttachable = this.isFileAttachable(this.selectedNode);
+      this.linkAttr = this.findLinkAttribute();
+      // if (linkAttr != undefined && linkAttr.value != undefined) {
+      //   this.links = linkAttr.value as MDMLink[];
+      // }
+    }
+  }
+
+  // reloads the selected node (and consequently all file data)
+  private reloadSelectedNode() {
+    if (this.selectedNode != undefined) {
+      this.nodeService.getNodeFromItem(new MDMItem(this.selectedNode.sourceName, this.selectedNode.type, this.selectedNode.id))
+        .subscribe(node => this.init(node));
+    }
+  }
+
+  // extract MDMLink attribute from node
+  private findLinkAttribute() {
+    let linkAttr: Attribute;
+    if (this.selectedNode != undefined && this.selectedNode.attributes != undefined && this.selectedNode.attributes.length > 0) {
+      linkAttr = this.selectedNode.attributes.find(attr => attr.name === FilesAttachableService.MDM_LINKS);
+    }
+    return linkAttr;
+  }
+
+  // returns true, if node.type is configured as file-attachable.
+  private isFileAttachable(node: Node) {
+    let isAttachable = false;
+    if (node != undefined) {
+      isAttachable = FileExplorerNavCardComponent.FILE_ATTACHABLE_TYPES.find(t => t === node.type) != undefined;
+    }
+    return isAttachable;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer.css
new file mode 100644
index 0000000..147908c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer.css
@@ -0,0 +1,61 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+.fileupload {

+overflow: hidden;

+position: relative;

+}

+  

+.fileupload input.upload {

+    float: right;

+    position: absolute;

+}

+

+input[type='file']{

+    opacity: 0;

+    cursor: pointer;

+    width: 37px;

+    height: 37.66px;

+    font-size: 0;

+    top: 0;

+    left: 0;

+}

+

+a.disabled {

+    pointer-events: none;

+    cursor: not-allowed;

+}

+

+p-table >>> .ui-table-caption {

+    padding: .25em .5em!important;

+    text-align: right!important;

+}

+  

+td {

+white-space: nowrap;

+overflow: hidden;

+text-overflow: ellipsis;

+max-width: 150px;

+}

+

+.mdmContextMenu > a:hover {

+text-decoration: none!important;

+}

+

+.btn:focus {

+box-shadow: none;

+}

+

+.no-margin-bot {

+    margin-bottom: 0;

+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer/file-explorer.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer/file-explorer.component.html
new file mode 100644
index 0000000..e3a9233
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer/file-explorer.component.html
@@ -0,0 +1,129 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+<!-- main explorer table -->
+<p-table [value]="fileMetas"
+         [columns]="columnConfigs"
+
+         selectionMode="single"
+         [(selection)]="selectedFileMeta"
+         [metaKeySelection]="true"
+
+         [contextMenu]="cm"
+         contextMenuSelectionMode="joint"
+
+         [resizableColumns]="true">
+
+    <!-- caption -->
+    <ng-template pTemplate="caption">
+      <!-- selected node -->
+      <span *ngIf="node" style="float: left; margin-top: 7px;">
+        {{'file-explorer.file-explorer.ttl-attached-to' | translate }}
+        {{node?.name}}
+      </span>
+      <!-- download -->
+      <button type="button"
+              class="btn btn-mdm"
+              (click)="onDownloadFile($event)"
+              title="{{'file-explorer.file-explorer.btn-download-file' | translate }}"
+              [disabled]="!selectedFileMeta">
+        <span class="fa fa-arrow-circle-o-down"></span>
+      </button>
+      <!-- upload -->
+      <button type="button"
+              class="btn btn-mdm"
+              (click)="onShowUploadDialog($event)"
+              title="{{'file-explorer.file-explorer.btn-upload-files' | translate }}"
+              [disabled]="readOnly">
+        <span class="fa fa-arrow-circle-o-up"></span>
+      </button>      
+      <!-- preview -->
+      <button type="button"
+               class="btn btn-mdm"
+               (click)="onPreviewFile($event)"
+               title="{{'file-explorer.file-explorer.btn-preview-file' | translate }}"
+               [disabled]="!selectedFileMeta">
+        <span class="fa fa-search"></span>
+      </button>
+      <!-- refresh -->
+      <button type="button"
+              class="btn btn-mdm"
+              (click)="onRefresh($event)"
+              title="{{'file-explorer.file-explorer.btn-refresh' | translate }}">
+        <span class="fa fa-refresh"></span>
+      </button>
+      <!-- delete -->
+      <button type="button"
+               class="btn btn-mdm"
+               (click)="onDeleteFile($event)"
+               title="{{'file-explorer.file-explorer.btn-delete-file' | translate }}"
+               [disabled]="!selectedFileMeta || readOnly">
+        <span class="fa fa-times"></span>
+      </button>
+    </ng-template>
+
+    <!-- header -->
+    <ng-template pTemplate="header" let-columns>
+        <tr>
+            <th *ngFor="let col of columns" [pSortableColumn]="col.field" pResizableColumn>
+                {{col.header | translate}}
+                <p-sortIcon [field]="col.field"
+                             ariaLabel="Activate to sort"
+                             ariaLabelDesc="Activate to sort in descending order"
+                             ariaLabelAsc="Activate to sort in ascending order">
+                </p-sortIcon>
+            </th>
+        </tr>
+    </ng-template>
+
+    <!-- body -->
+    <ng-template pTemplate="body" let-rowData let-columns="columns" let-rowIndex="rowIndex">
+        <tr [pSelectableRow]="rowData" [pSelectableRowIndex]="rowIndex" [pContextMenuRow]="rowData">
+            <td *ngFor="let col of columns">
+                {{rowData[col.field]}}
+            </td>
+        </tr>
+    </ng-template>
+
+    <!-- empty message -->
+    <ng-template pTemplate="emptymessage" let-columns>
+        <tr>
+            <td [attr.colspan]="columns?.length">
+                {{'file-explorer.file-explorer.msg-no-files-attached' | translate }}
+            </td>
+        </tr>
+    </ng-template>
+</p-table>
+
+<!-- context menu for explorer table -->
+<p-contextMenu #cm [model]="ctxMenuItems" class="mdmContextMenu"></p-contextMenu>
+
+<!-- confirm dialog for delete file from data base -->
+<p-confirmDialog #cd key="fileExplorerConfirmation"
+    header="{{'file-explorer.file-explorer.ttl-confirmation' | translate }}"
+    icon="fa fa-exclamation-triangle"
+    appendTo="body">
+    <p-footer>
+        <button type="button"
+            (click)="cd.accept()"
+            class="btn btn-mdm">
+            <span class="fa fa-check"></span>
+        </button>
+        <button type="button"
+                (click)="cd.reject()"
+                class="btn btn-mdm">
+                <span class="fa fa-times"></span>
+        </button>
+    </p-footer>
+</p-confirmDialog>
+  
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer/file-explorer.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer/file-explorer.component.ts
new file mode 100644
index 0000000..d372911
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-explorer/file-explorer.component.ts
@@ -0,0 +1,363 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';
+
+import { MenuItem, ConfirmationService, DialogService, DynamicDialogRef } from 'primeng/api';
+import { TranslateService} from '@ngx-translate/core';
+import { Observable } from 'rxjs';
+import * as FileSaver from 'file-saver';
+
+import { TRANSLATE } from '@core/mdm-core.module';
+import { Node, FileSize, Attribute, MDMLink, ContextGroup } from '@navigator/node';
+
+import { FilesAttachableService } from '../../services/files-attachable.service';
+import { ContextFilesService } from '../../services/context-files.service';
+import { FileService } from '../../services/file.service';
+import { FileExplorerColumn, FileExplorerRow, FileLinkContextWrapper } from '../../model/file-explorer.model';
+import { FileUploadDialogComponent } from '../file-upload-dialog/file-upload-dialog.component';
+import { ContextAttributeIdentifier } from '@details/model/details.model';
+
+@Component({
+  selector: 'mdm5-file-explorer',
+  templateUrl: './file-explorer.component.html',
+  styleUrls: ['../file-explorer.css'],
+  providers: [ConfirmationService]
+})
+export class FileExplorerComponent implements OnInit, OnChanges {
+
+  private readonly CONTEXT_COMPONENT = 'ContextComponent';
+
+  // holding column configuration for table
+  public columnConfigs: FileExplorerColumn[] = [];
+  // holding file metadata for table
+  public fileMetas: FileExplorerRow[] = [];
+  // holding table selection
+  public selectedFileMeta: FileExplorerRow;
+  // holding node selected in navigator
+  @Input() public node: Node;
+  @Input() public contextDescribable?: Node;
+  @Input() public attribute: Attribute;
+  @Input() public contextGroup?: ContextGroup;
+  @Input() public contextType?: string;
+  @Input() public readOnly: boolean;
+
+  public links: MDMLink[];
+
+  // items for context menu
+  public ctxMenuItems: MenuItem[];
+
+
+  public constructor(
+              private filesAttachableService: FilesAttachableService,
+              private contextFilesService: ContextFilesService,
+              private translateService: TranslateService,
+              private confirmationService: ConfirmationService,
+              private dialogService: DialogService,
+              private fileService: FileService) {}
+
+  public ngOnInit() {
+    this.initColumns();
+    // workaround for ctx menu translation, since pipe cannot be passed into primeng contextmenu.
+    this.initCtxMenu();
+    this.translateService.onLangChange.subscribe(() => this.initCtxMenu());
+    this.init();
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    if (changes['node']) {
+      this.init();
+    }
+  }
+
+  // initialize component data
+  private init() {
+
+    if (this.node != undefined) {
+      this.fileMetas = [];
+      this.selectedFileMeta = undefined;
+      if (this.attribute != undefined) {
+        this.links = this.getValues<MDMLink[]>();
+        if (this.links != undefined && this.links.length > 0) {
+            this.loadFileSizes();
+            this.fileMetas = this.links.map(mdmLink => this.link2Row(mdmLink));
+        }
+      }
+    }
+  }
+
+  // defines column configuration.
+  private initColumns() {
+    this.columnConfigs = [];
+    this.columnConfigs.push(new FileExplorerColumn('filename', TRANSLATE('file-explorer.file-explorer.hdr-filename')));
+    this.columnConfigs.push(new FileExplorerColumn('description', TRANSLATE('file-explorer.file-explorer.hdr-description')));
+    this.columnConfigs.push(new FileExplorerColumn('type', TRANSLATE('file-explorer.file-explorer.hdr-type')));
+    this.columnConfigs.push(new FileExplorerColumn('size', TRANSLATE('file-explorer.file-explorer.hdr-size')));
+  }
+
+  // defines context menu configuration.
+  private initCtxMenu() {
+    this.ctxMenuItems = [];
+    this.translateService.get('file-explorer.file-explorer.btn-preview-file')
+                          .subscribe(t => this.ctxMenuItems.push(
+                            { label: t,
+                              icon: 'fa fa-search',
+                              command: (event) => this.onPreviewFile(event)
+                            })
+                          );
+    this.translateService.get('file-explorer.file-explorer.btn-download-file')
+                        .subscribe(t => this.ctxMenuItems.push(
+                          { label: t,
+                            icon: 'fa fa-arrow-circle-o-down',
+                            command: (event) => this.onDownloadFile(event)
+                          })
+                        );
+    this.translateService.get('file-explorer.file-explorer.btn-delete-file')
+                          .subscribe(t => this.ctxMenuItems.push(
+                            { label: t,
+                            icon: 'fa fa-times',
+                            command: (event) => this.onDeleteFile(event)
+                            })
+                          );
+  }
+
+  // listener to refresh selected node
+  public onRefresh() {
+    this.reloadSelectedNode();
+  }
+
+  // reloads the selected node (and consequently all file data)
+  private reloadSelectedNode() {
+    this.init();
+  }
+
+  // mapping function to create row data object from MDMLink array entry
+  private link2Row(mdmLink: MDMLink) {
+    if (mdmLink == undefined) {
+      return new FileExplorerRow(undefined, undefined, undefined, undefined, '-');
+    }
+    let nameIndex = mdmLink.remotePath.lastIndexOf('/');
+    let name = mdmLink.remotePath.substring(nameIndex + 1);
+
+    return new FileExplorerRow(mdmLink.remotePath, name, mdmLink.description, mdmLink.mimeType, mdmLink.size);
+  }
+
+  // loads file sizes
+  private loadFileSizes() {
+    // case for files attached to context attributes
+    if (this.node.type === this.CONTEXT_COMPONENT) {
+      // NOT PROPERLY IMPLEMENTED YET. Remove line below and add proper loading mechanism for all sizes at once
+      this.links.forEach(l => this.loadSizeLazy(l.remotePath));
+    } else { // case for files attached to filesAttachables
+      this.filesAttachableService.loadFileSizes(this.node).subscribe(fileSizes => this.updateFileSizes(fileSizes));
+    }
+  }
+
+  // load size information from server for single file
+  private loadSizeLazy(remotePath: string) {
+    // case for files attached to context attributes
+    if (this.contextDescribable != undefined) {
+      // NOT PROPERLY IMPLEMENTED YET. Remove lines below and add proper loading mechanism for all sizes at once
+      if (this.contextGroup != undefined) {
+        const link = this.links.find(l => l.remotePath === remotePath);
+        if (link != undefined) {
+          this.contextFilesService.loadFileSize(link, this.getIdent())
+            .subscribe(fileSize => this.updateFileSize(fileSize));
+        }
+      }
+    } else { // case for files attached to filesAttachables
+      this.filesAttachableService.loadFileSize(remotePath, this.node)
+        .subscribe(fileSize => this.updateFileSize(fileSize));
+    }
+  }
+
+  // update size in row data for table
+  private updateFileSizes(fileSizes: FileSize[]) {
+    if (this.fileMetas != undefined && fileSizes != undefined && fileSizes.length > 0) {
+      fileSizes.forEach(fileSize => this.updateFileSize(fileSize));
+    }
+  }
+
+  // update size in row data for table for single file
+  private updateFileSize(fileSize: FileSize) {
+    this.fileMetas.find(fm => fm.remotePath === fileSize.remotePath).size = fileSize.size;
+  }
+
+  public onShowUploadDialog() {
+    let ref: DynamicDialogRef;
+    // case for files attached to context attributes
+    if (this.contextDescribable != undefined) {
+      ref = this.dialogService.open(FileUploadDialogComponent, {
+        data: { contextDescribable: this.contextDescribable,
+                node: this.node,
+                contextType: this.contextType,
+                contextGroup: this.contextGroup,
+                attribute: this.attribute
+              },
+        header: 'File upload wizard for ' + this.node.name,
+        width: '70%'
+      });
+    // case for files attached to filesAttachables
+    } else {
+      ref = this.dialogService.open(FileUploadDialogComponent, {
+        data: { node: this.node,
+                attribute: this.attribute
+              },
+        header: 'File upload wizard for ' + this.node.name,
+        width: '70%'
+      });
+    }
+
+    ref.onClose.subscribe(linkObs => this.handleUploadDialogResponse(linkObs));
+  }
+
+  // reflects file upload in client side state
+  private handleUploadDialogResponse(linkObs: Observable<MDMLink>) {
+    if (linkObs != undefined) {
+      linkObs.subscribe(link => this.handleUpload(link));
+    }
+  }
+
+  // listener to load blob from db and initialize download dialog for saving file to local filesystem.
+  public onDownloadFile(event: MouseEvent) {
+    if (this.selectedFileMeta != undefined) {
+      this.loadFile().subscribe(blob => FileSaver.saveAs(blob, this.selectedFileMeta.filename));
+    }
+  }
+
+  private loadFile() {
+    if (this.contextDescribable != undefined) {
+      // case for files attached to context attributes
+      if (this.contextGroup != undefined) {
+        const link = this.findLink(this.selectedFileMeta);
+        if (link != undefined) {
+          return this.contextFilesService.loadFile(link, this.getIdent());
+        }
+        return Observable.throwError('Cannot find link!');
+      }
+      return Observable.throwError('ContextGroup is undefined!');
+    } else {
+      // case for files attached to filesAttachables
+      return this.filesAttachableService.loadFile(this.selectedFileMeta.remotePath, this.node);
+    }
+  }
+
+  // listener for file preview
+  public onPreviewFile(event: MouseEvent) {
+    if (this.selectedFileMeta != undefined) {
+      this.loadFile().subscribe(blob => this.handlePreview(blob));
+    }
+  }
+
+  // handle preview for different browsers. Opens download dialog if preview not possible.
+  private handlePreview(blob: Blob) {
+    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+       window.navigator.msSaveOrOpenBlob(blob, this.selectedFileMeta.filename);
+    } else {
+       window.open(URL.createObjectURL(blob));
+    }
+  }
+
+  // listener for delete file button. Opens confirm dialog.
+  public onDeleteFile(event: MouseEvent) {
+    this.translateService.get('file-explorer.file-explorer.msg-confirm-delete-file-from-db')
+                         .subscribe(msg =>
+        this.confirmationService.confirm({
+          message: msg,
+          key: 'fileExplorerConfirmation',
+          accept: () => this.deleteFileConfirmed()
+        })
+    );
+  }
+
+  // Actually triggers file delete from db, when confirmed in delete dialog
+  public deleteFileConfirmed() {
+    if (this.contextDescribable != undefined) {
+      const fileLink = this.findLink(this.selectedFileMeta);
+      if (fileLink != undefined) {
+        this.contextFilesService.deleteFile(fileLink, this.getIdent()).subscribe(link => this.handleDelete(link));
+      }
+    } else { // case for files attached to filesAttachables
+      this.filesAttachableService.deleteFile(this.selectedFileMeta.remotePath, this.node)
+        .subscribe(link => this.handleDelete(link));
+    }
+    this.selectedFileMeta = undefined;
+  }
+
+
+  // removes row to fileMetas to reflect server side file delete in client state.
+  private removeRow(link: MDMLink) {
+    if (link != undefined) {
+      const i = this.fileMetas.findIndex(row => link.remotePath === row.remotePath);
+      if (i >= 0) {
+        this.fileMetas.splice(i, 1);
+      }
+    }
+  }
+
+  // adds row to fileMetas to reflect file upload in client state. Lazy loads filesize.
+  private addRow(link: MDMLink) {
+    if (link != undefined) {
+      this.fileMetas.push(this.link2Row(link));
+      if (link.size == undefined) {
+        this.loadSizeLazy(link.remotePath);
+      }
+    }
+  }
+
+  private findLink(fileMeta: FileExplorerRow) {
+    if (fileMeta != undefined) {
+      return this.links.find(l => l.remotePath === fileMeta.remotePath);
+    }
+  }
+
+  private getValues<T>() {
+    if (this.attribute != undefined && this.attribute.value != undefined) {
+      const tmp = this.contextGroup != undefined ? this.attribute.value[this.contextGroup] : this.attribute.value;
+      return tmp !== '' ? tmp : [];
+    }
+  }
+
+  private handleUpload(link: MDMLink) {
+    this.addRow(link);
+    if (this.contextGroup != undefined) {
+      let value = this.attribute.value[this.contextGroup];
+      if (value == undefined || value === '') {
+        value = [];
+      }
+      value.push(link);
+      this.fireOnChange();
+    }
+  }
+
+  private handleDelete(link: MDMLink) {
+    this.removeRow(link);
+    let index = this.attribute.value[this.contextGroup].findIndex( p => p.remotePath === link.remotePath);
+    if (this.contextGroup != undefined) {
+      this.attribute.value[this.contextGroup].splice(index, 1 );
+      this.fireOnChange();
+    }
+  }
+
+  private fireOnChange() {
+    const fileLinkContextWrapper = new FileLinkContextWrapper();
+    fileLinkContextWrapper.attribute = this.attribute;
+    fileLinkContextWrapper.contextComponent = this.node;
+    fileLinkContextWrapper.contextType = this.contextType;
+    this.fileService.fireOnFileChanged(fileLinkContextWrapper);
+  }
+
+  private getIdent() {
+    return new ContextAttributeIdentifier(this.contextDescribable, this.node, this.attribute, this.contextGroup, this.contextType);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor-dialog/file-link-editor-dialog.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor-dialog/file-link-editor-dialog.component.html
new file mode 100644
index 0000000..2253833
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor-dialog/file-link-editor-dialog.component.html
@@ -0,0 +1,137 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<div class="p-grid p-align-center">
+  <div class="p-col-2">
+    <label for="name" class="no-margin-bot">{{'file-explorer.file-explorer.hdr-filename' | translate}}</label>
+  </div>
+  <div class="p-col-8">
+    <div *ngIf="file != undefined" id="name">
+      {{file.name}}
+    </div>
+    <div *ngIf="file == undefined">
+      {{link | fileName}}
+    </div>
+  </div>
+  <div class="p-col-2" style="text-align: right;">
+    <!-- upload -->
+    <div class="fileupload btn btn-mdm"
+      title="{{'file-explorer.file-link-editor-dialog.btn-change-file' | translate }}">
+      <input #fileinput
+          id="fileUploadInput"
+          title="{{'file-explorer.file-link-editor-dialog.btn-change-file' | translate }}"
+          class="upload"
+          name="datei"
+          type="file"
+          (change)=onSelectFileForUpload($event)>
+        <span class="fa fa-pencil"></span>
+    </div>
+    <!-- delete -->
+    <button type="button"
+      class="btn btn-mdm"
+      (click)="onDeleteFile($event)"
+      title="{{'file-explorer.file-explorer.btn-delete-file' | translate }}">
+      <span class="fa fa-times"></span>
+    </button>
+    <!-- download -->
+    <!-- <button type="button"
+      class="btn btn-mdm"
+      (click)="onDownloadFile($event)"
+      title="{{'file-explorer.file-explorer.btn-download-file' | translate }}">
+      <span class="fa fa-arrow-circle-o-down"></span>
+    </button> -->
+    <!-- preview -->
+    <!-- <button type="button"
+      class="btn btn-mdm"
+      (click)="onPreviewFile($event)"
+      title="{{'file-explorer.file-explorer.btn-preview-file' | translate }}">
+    <span class="fa fa-search"></span>
+    </button> -->
+
+  </div>
+</div>
+
+<div class="p-grid p-align-center">
+  <div class="p-col-2">
+    <label for="description" class="no-margin-bot">{{'file-explorer.file-explorer.hdr-description' | translate}}</label>
+  </div>
+  <div class="p-col">
+    <input pInputText
+      id="description"
+      [(ngModel)]="link.description"
+      style ="width: 100%">
+  </div>
+</div>
+
+<div class="p-grid p-align-center" >
+  <div class="p-col-2">
+    <label for="type" class="no-margin-bot">{{'file-explorer.file-explorer.hdr-type' | translate}}</label>
+  </div>
+  <div class="p-col">
+    <input pInputText
+      id="type"
+      type="text"
+      [(ngModel)]="link.mimeType"
+      style ="width: 100%">
+  </div>
+</div>
+
+<div class="p-grid p-align-center">
+  <div class="p-col-2">
+      <label for="size" class="no-margin-bot">{{'file-explorer.file-explorer.hdr-size' | translate}}</label>
+  </div>
+  <div class="p-col" id="size">
+    {{link.size}}
+  </div>
+</div>
+
+
+<div class="p-grid p-align-center">
+  <div class="p-col-3 p-offset-6" style="text-align: right;">
+    <button type="button"
+      class="btn btn-mdm"
+      (click)="onSave($event)"
+      title="{{'file-explorer.file-link-editor-dialog.btn-save-changes' | translate }}">
+      <span class="fa fa-check"></span>
+      {{'file-explorer.file-link-editor-dialog.btn-save-changes' | translate }}
+    </button>
+  </div>
+  <div class="p-col-3">
+    <button type="button"
+      class="btn btn-mdm"
+      (click)="onCancel($event)"
+      title="{{'file-explorer.file-link-editor-dialog.btn-cancel' | translate }}">
+      <span class="fa fa-ban"></span>
+      {{'file-explorer.file-link-editor-dialog.btn-cancel' | translate }}
+    </button>
+  </div>
+</div>
+
+<!-- confirm dialog for delete file from data base -->
+<p-confirmDialog #cd key="filePopUpConfirmation"
+    header="{{'file-explorer.file-explorer.ttl-confirmation' | translate }}"
+    icon="fa fa-exclamation-triangle"
+    appendTo="body">
+    <p-footer>
+        <button type="button"
+            (click)="cd.accept()"
+            class="btn btn-mdm">
+            <span class="fa fa-check"></span>
+        </button>
+        <button type="button"
+                (click)="cd.reject()"
+                class="btn btn-mdm">
+                <span class="fa fa-times"></span>
+        </button>
+    </p-footer>
+</p-confirmDialog>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor-dialog/file-link-editor-dialog.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor-dialog/file-link-editor-dialog.component.ts
new file mode 100644
index 0000000..63c586c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor-dialog/file-link-editor-dialog.component.ts
@@ -0,0 +1,171 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, ViewChild, ElementRef} from '@angular/core';
+import { ConfirmationService, DynamicDialogRef, DynamicDialogConfig } from 'primeng/api';
+import { TranslateService } from '@ngx-translate/core';
+
+import { MDMLink } from '@navigator/node';
+
+import { FileUploadRow } from '../../model/file-explorer.model';
+import { FileReaderService } from '../../services/file-reader.service';
+import { ContextFilesService } from '../../services/context-files.service';
+import { FileService } from '../../services/file.service';
+import { ContextAttributeIdentifier } from '@details/model/details.model';
+import { FileSizePipe } from '@file-explorer/pipes/file-size.pipe';
+
+@Component({
+  selector: 'mdm5-file-link-editor-dialog',
+  templateUrl: './file-link-editor-dialog.component.html',
+  styleUrls: ['../file-explorer.css'],
+  providers: [ConfirmationService]
+})
+export class FileLinkEditorDialogComponent implements OnInit {
+
+  @ViewChild('fileinput') input: ElementRef;
+
+  public ident: ContextAttributeIdentifier;
+  public link: MDMLink;
+  public file: File;
+
+  // private translationSub: Subscription;
+
+  constructor(private translateService: TranslateService,
+              private contextFilesService: ContextFilesService,
+              private confirmationService: ConfirmationService,
+              private fileReaderService: FileReaderService,
+              private fileService: FileService,
+              public ref: DynamicDialogRef,
+              public config: DynamicDialogConfig,
+              private fileSizePipe: FileSizePipe) {}
+
+  ngOnInit() {
+    if (this.config != undefined) {
+      this.ident = this.config.data.ident as ContextAttributeIdentifier;
+    }
+    this.link = this.getLink();
+    this.loadSizeLazy();
+  }
+
+  public onUpload(event: Event) {
+    this.input.nativeElement.click();
+  }
+
+  private loadSizeLazy() {
+    if (this.link != undefined && Object.keys(this.link).length !== 0) {
+      this.contextFilesService.loadFileSize(this.link, this.ident)
+        .subscribe(fileSize => this.link.size = fileSize.size);
+    }
+  }
+
+  // listener to add files to upload selection
+  public onSelectFileForUpload(event: Event) {
+    const target = event.target as HTMLInputElement;
+    const files: FileList =  target.files;
+    for (let i = 0; i < files.length; i++) {
+      this.file = files[i];
+      const l = new MDMLink();
+      l.description = this.file.name;
+      l.mimeType = this.file.type || 'application/octet-stream';
+      l.size = this.fileSizePipe.transform(this.file.size);
+      this.link = l;
+    }
+  }
+
+  private getLink() {
+    if (this.ident != undefined && this.ident.attribute != undefined) {
+      const value = this.ident.attribute.value[this.ident.contextGroup];
+      // if (value != undefined && value !== '') {
+        return Object.assign(new MDMLink(), value as MDMLink);
+      // }
+    }
+  }
+
+  // // listener to load blob from db and initialize download dialog for saving file to local filesystem.
+  // public onDownloadFile(event: Event) {
+  //   // const link = this.getLink();
+  //   if (this.link != undefined && this.ident.contextComponent != undefined && this.ident.contextGroup != undefined) {
+  //     this.contextFilesService.loadFile(this.link, this.ident).subscribe(blob => FileSaver.saveAs(blob, this.link.getFileName()));
+  //   }
+  // }
+
+  // // listener for file preview
+  // public onPreviewFile(event: Event) {
+  //   // const link = this.getLink();
+  //   if (this.link != undefined && this.ident.contextComponent != undefined && this.ident.contextGroup != undefined) {
+  //     this.contextFilesService.loadFile(this.link, this.ident)
+  //                             .subscribe(blob => this.preview(blob));
+  //   }
+  // }
+
+  // // handle preview for different browsers. Opens download dialog if preview not possible.
+  // private preview(blob: Blob) {
+  //   // const link = this.getLink();
+  //   if (this.link != undefined) {
+  //     if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+  //         window.navigator.msSaveOrOpenBlob(blob, this.link.getFileName());
+  //     } else {
+  //         window.open(URL.createObjectURL(blob), this.link.getFileName());
+  //     }
+  //   }
+  // }
+
+  // listener for delete file button. Opens confirm dialog.
+  public onDeleteFile(event: Event) {
+    this.translateService.get('file-explorer.file-explorer.msg-confirm-delete-file-from-db')
+      .subscribe(msg =>
+        this.confirmationService.confirm({
+          message: msg,
+          key: 'filePopUpConfirmation',
+          accept: () => this.deleteFileConfirmed()
+        })
+      );
+  }
+
+  // Actually triggers file delete from db, when confirmed in delete dialog
+  private deleteFileConfirmed() {
+    const link = this.getLink();
+    if (link != undefined) {
+      this.contextFilesService.deleteFile(link, this.ident).subscribe(l => this.handleDelete(l));
+    }
+    this.ref.close();
+  }
+
+  /**
+   * Handles delete.
+   * @param link the deleted link
+   */
+  private handleDelete(link: MDMLink) {
+    this.ident.attribute.value[this.ident.contextGroup] = undefined;
+  }
+
+  private handleUplaod(link: MDMLink) {
+    this.ident.attribute.value[this.ident.contextGroup] = link;
+  }
+
+  public async onSave(event: Event) {
+    if (this.file != undefined && this.link.remotePath == undefined) {
+      const dataUrl = await this.fileReaderService.readFile(this.file);
+      const row = new FileUploadRow(this.file, this.link.description, dataUrl);
+      this.contextFilesService.uploadFile(row, this.ident).subscribe(link => this.handleUplaod(link));
+    } else {
+      this.ident.attribute.value[this.ident.contextGroup] = this.link;
+    }
+    this.ref.close();
+  }
+
+  public onCancel(event: Event) {
+    this.ref.close();
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor/file-link-editor.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor/file-link-editor.component.html
new file mode 100644
index 0000000..af308b3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor/file-link-editor.component.html
@@ -0,0 +1,17 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<a title="{{ident?.attribute?.value[ident?.contextGroup]?.description}}" href="{{ident?.attribute?.value[ident?.contextGroup]?.remotePath}}">
+    {{ident?.attribute?.value[ident?.contextGroup] | fileName}}
+</a>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor/file-link-editor.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor/file-link-editor.component.ts
new file mode 100644
index 0000000..cbad4a3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-editor/file-link-editor.component.ts
@@ -0,0 +1,64 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, Input } from '@angular/core';
+
+import { DialogService } from 'primeng/api';
+
+import { ContextAttributeIdentifier } from '@details/model/details.model';
+import { MDMLink } from '@navigator/node';
+import { FileLinkEditorDialogComponent } from '../file-link-editor-dialog/file-link-editor-dialog.component';
+import { FileService } from '@file-explorer/services/file.service';
+
+@Component({
+  selector: 'mdm5-file-link-editor',
+  templateUrl: './file-link-editor.component.html'
+})
+export class FileLinkEditorComponent implements OnInit {
+
+  @Input() ident: ContextAttributeIdentifier;
+
+  public link: MDMLink;
+  constructor(private dialogService: DialogService) { }
+
+  ngOnInit() {
+    if (this.ident.attribute != undefined && this.ident.attribute.value != undefined) {
+      this.link = Object.assign(new MDMLink(), this.getValue<MDMLink>());
+    }
+    setTimeout(() => {
+      this.showFileExplorerDialog();
+    });
+  }
+
+  private getValue<T>() {
+    if (this.ident.attribute != undefined && this.ident.attribute.value != undefined) {
+      return <T> (this.ident.contextGroup != undefined ? this.ident.attribute.value[this.ident.contextGroup] : this.ident.attribute.value);
+    }
+  }
+
+  public showFileExplorerDialog() {
+    let title = 'File upload wizard for ' + this.ident.contextComponent.name;
+    if (this.ident.attribute != undefined) {
+      title += '.' + this.ident.attribute.name;
+    }
+
+    const ref = this.dialogService.open(FileLinkEditorDialogComponent, {
+      data: {
+        ident: this.ident
+      },
+      header: title,
+      width: '650px'
+    });
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-sequence-editor/file-link-sequence-editor.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-sequence-editor/file-link-sequence-editor.component.html
new file mode 100644
index 0000000..58e5f07
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-sequence-editor/file-link-sequence-editor.component.html
@@ -0,0 +1,19 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<div *ngFor="let link of attribute.value[ident.contextGroup]; index as i">
+    <a title="{{attribute.value[ident.contextGroup][i].description}}" href="{{attribute.value[ident.contextGroup][i].remotePath}}">
+        {{attribute.value[ident.contextGroup][i] | fileName}}
+    </a>
+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-sequence-editor/file-link-sequence-editor.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-sequence-editor/file-link-sequence-editor.component.ts
new file mode 100644
index 0000000..9fad876
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-link-sequence-editor/file-link-sequence-editor.component.ts
@@ -0,0 +1,77 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, Input, OnInit } from '@angular/core';
+
+import { DialogService } from 'primeng/api';
+import { Observable } from 'rxjs';
+
+import { Attribute, MDMLink } from '@navigator/node';
+import { ContextAttributeIdentifier } from '@details/model/details.model';
+
+import { FileExplorerDialogComponent } from '../file-explorer-dialog/file-explorer-dialog.component';
+
+@Component({
+  selector: 'file-link-sequence-editor',
+  templateUrl: './file-link-sequence-editor.component.html'
+})
+export class FileLinkSequenceEditorComponent implements OnInit {
+
+  @Input() ident: ContextAttributeIdentifier;
+  @Input() attribute: Attribute;
+
+  public link: MDMLink;
+  public links: MDMLink[];
+
+  constructor(private dialogService: DialogService) { }
+
+  ngOnInit() {
+    if (this.attribute != undefined && this.attribute.value != undefined) {
+      if (this.getValues() != undefined) {
+        this.links = (this.getValues<MDMLink[]>()).map(l => Object.assign(new MDMLink(), l));
+      }
+    }
+
+    setTimeout(() => {
+      this.onShowFileExplorerDialog();
+    });
+  }
+
+  private getValues<T>() {
+    if (this.attribute != undefined && this.attribute.value != undefined) {
+      const tmp = this.ident.contextGroup != undefined ? this.attribute.value[this.ident.contextGroup] : this.attribute.value;
+      return tmp !== '' ? tmp : undefined;
+    }
+  }
+
+  public onShowFileExplorerDialog() {
+    let title = 'File upload wizard for ' + this.ident.contextComponent.name;
+    if (this.attribute != undefined) {
+      title += '.' + this.attribute.name;
+    }
+
+    const ref = this.dialogService.open(FileExplorerDialogComponent, {
+      data: {
+        contextDescribable: this.ident.contextDescribable,
+        contextComponent: this.ident.contextComponent,
+        attribute: this.attribute,
+        contextGroup: this.ident.contextGroup,
+        contextType: this.ident.contextType,
+        readOnly: false
+      },
+      header: title,
+      width: '70%'
+    });
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-upload-dialog/file-upload-dialog.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-upload-dialog/file-upload-dialog.component.html
new file mode 100644
index 0000000..4a5d6ef
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-upload-dialog/file-upload-dialog.component.html
@@ -0,0 +1,98 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<p-table [value]="selectedFileMetasUpload">
+    <!-- caption -->
+    <ng-template pTemplate="caption">
+        <!-- add -->
+        <div class="fileupload btn btn-mdm"
+            title="{{'file-explorer.file-explorer.btn-add-files' | translate }}">
+            <span class="fa fa-plus"></span>
+            <input #fileinput
+                id="fileUploadInput"
+                title="{{'file-explorer.file-explorer.btn-add-files' | translate }}"
+                class="upload"
+                name="datei"
+                type="file"
+                (change)=onSelectFileForUpload($event)
+                multiple>
+        </div>
+        <!-- upload -->
+        <button type="button"
+                class="btn btn-mdm"
+                (click)="onUploadSelectedFiles($event)"
+                title="{{'file-explorer.file-explorer.btn-upload-file-selection' | translate }}"
+                [disabled]="selectedFileMetasUpload?.length == 0">
+            <span class="fa fa-check"></span>
+        </button>
+        <!-- remove all -->
+        <button type="button"
+                class="btn btn-mdm"
+                (click)="onClearSelectedFileMetasUpload($event)"
+                title="{{'file-explorer.file-explorer.btn-remove-all-files-from-selection' | translate }}"
+                [disabled]="selectedFileMetasUpload?.length == 0">
+            <span class="fa fa-eraser"></span>
+        </button>
+    </ng-template>
+
+    <!-- header -->
+    <ng-template pTemplate="header">
+        <tr>
+            <th style="width: 50px;"></th>
+            <th>{{'file-explorer.file-explorer.hdr-filename' | translate}}</th>
+            <th>{{'file-explorer.file-explorer.hdr-description' | translate}}</th>
+            <!-- <th>{{'file-explorer.file-explorer.hdr-type' | translate}}</th> -->
+            <th>{{'file-explorer.file-explorer.hdr-size' | translate}}</th>
+            <th style="width: 68px;"></th>
+        </tr>
+    </ng-template>
+
+    <!-- body -->
+    <ng-template pTemplate="body" let-filedata>
+        <tr>
+            <td>
+                <thumbnail [imgUrl]="filedata.dataUrl" [type]="filedata.file.type"></thumbnail>
+            </td>
+            <td>{{filedata.file.name}}</td>
+            <td pEditableColumn>
+              <p-cellEditor>
+                <ng-template pTemplate="input">
+                    <input pInputText type="text" [(ngModel)]="filedata.description">
+                </ng-template>
+                <ng-template pTemplate="output">
+                    {{filedata.description}}
+                </ng-template>
+              </p-cellEditor>
+            </td>
+            <!-- <td pEditableColumn>
+                <p-cellEditor>
+                  <ng-template pTemplate="input">
+                      <input pInputText type="text" [(ngModel)]="filedata.file.type">
+                  </ng-template>
+                  <ng-template pTemplate="output">
+                      {{filedata.file.type}}
+                  </ng-template>
+                </p-cellEditor>
+            </td> -->
+            <td>{{filedata.file.size | fileSize: formatSize.BINARY}}</td>
+            <td>
+                <button type="button"
+                    class="btn btn-mdm"
+                    (click)="onRemoveFile($event, filedata)"
+                    title="{{'file-explorer.file-explorer.btn-remove-file-from-selection' | translate }}">
+                    <span class="fa fa-times"></span>
+                </button>
+            </td>
+        </tr>
+    </ng-template>
+</p-table>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-upload-dialog/file-upload-dialog.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-upload-dialog/file-upload-dialog.component.ts
new file mode 100644
index 0000000..c491cfe
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/file-upload-dialog/file-upload-dialog.component.ts
@@ -0,0 +1,125 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Component, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
+
+import { DynamicDialogRef, DynamicDialogConfig } from 'primeng/primeng';
+
+import { Node, Attribute, ContextGroup } from '@navigator/node';
+import { MDMNotificationService } from '@core/mdm-notification.service';
+
+import { FileUploadRow, FormatSize } from '../../model/file-explorer.model';
+import { FilesAttachableService } from '../../services/files-attachable.service';
+import { ContextFilesService } from './../../services/context-files.service';
+import { FileReaderService } from '../../services/file-reader.service';
+import { ContextAttributeIdentifier } from '@details/model/details.model';
+
+@Component({
+  selector: 'mdm5-file-upload-dialog',
+  templateUrl: './file-upload-dialog.component.html',
+  styleUrls: ['../file-explorer.css']
+})
+export class FileUploadDialogComponent implements OnInit, AfterViewInit {
+
+  @ViewChild('fileinput') input: ElementRef;
+
+  // make enum accessible from html template
+  public formatSize = FormatSize;
+
+  // holding table selection for context menu
+  public selectedFileMetasUpload: FileUploadRow[] = [];
+  // holding selected node and context info incase files is uploaded to context attribute
+  public node: Node;
+  public contextDescribable?: Node;
+  public attribute: Attribute;
+  public contextGroup?: ContextGroup;
+  public contextType?: string;
+
+  constructor(public ref: DynamicDialogRef,
+              public config: DynamicDialogConfig,
+              private filesAttachableService: FilesAttachableService,
+              private contextFilesService: ContextFilesService,
+              private fileReaderService: FileReaderService,
+              private notificationService: MDMNotificationService) { }
+
+  ngOnInit() {
+    this.node = this.config.data.node;
+    this.contextDescribable = this.config.data.contextDescribable;
+    this.attribute = this.config.data.attribute;
+    this.contextGroup = this.config.data.contextGroup;
+    this.contextType = this.config.data.contextType;
+  }
+
+  // opens file select menu for upload on initialization
+  ngAfterViewInit(): void {
+    if ( this.input != undefined) {
+      setTimeout(() => this.input.nativeElement.click());
+    }
+  }
+
+  // helping function to clear file selection for upload overlay panel
+  private resetFileUploadSelection() {
+    this.selectedFileMetasUpload = [];
+  }
+
+  // listener to removeFiles from selection for upload
+  public onRemoveFile(event: MouseEvent, row: FileUploadRow) {
+    let index = this.selectedFileMetasUpload.findIndex(fm => fm === row);
+    if (index > -1) {
+      this.selectedFileMetasUpload.splice(index, 1);
+    }
+  }
+
+  // listener to clear file selection for upload
+  public onClearSelectedFileMetasUpload(event: MouseEvent) {
+    this.resetFileUploadSelection();
+  }
+
+  // listener to add files to upload selection
+  public async onSelectFileForUpload(event: MouseEvent) {
+    const target = event.target as HTMLInputElement;
+    const files: FileList =  target.files;
+    for (let i = 0; i < files.length; i++) {
+        const dataUrl = await this.fileReaderService.readFile(files[i]);
+        if (this.selectedFileMetasUpload.findIndex(fm => fm.file.name === files[i].name) === -1) {
+          this.selectedFileMetasUpload.push(new FileUploadRow(files[i], '', dataUrl));
+        } else {
+          this.notificationService.notifyWarn('File could not be added.',
+            'The selection already contains a file with the name \'' + files[i].name + '\'.');
+        }
+    }
+  }
+
+  // listener to upload selected files
+  // uploads selected files, closes dialog, and returns Observable for server response
+  public onUploadSelectedFiles(event: MouseEvent) {
+    this.ref.close(this.uploadFiles(this.selectedFileMetasUpload));
+  }
+
+  // upload selected files
+  public uploadFiles(fileUploadRows: FileUploadRow[]) {
+    if (fileUploadRows != undefined && this.node != undefined) {
+      if (this.contextDescribable != undefined && this.contextType != undefined && this.contextGroup != undefined
+            && this.attribute != undefined) {
+        return this.contextFilesService.uploadFiles(fileUploadRows, this.getIdent());
+      } else {
+        return this.filesAttachableService.uploadFiles(this.node, fileUploadRows);
+      }
+    }
+  }
+
+  private getIdent() {
+    return new ContextAttributeIdentifier(this.contextDescribable, this.node, this.attribute, this.contextGroup, this.contextType);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/thumbnail/thumbnail.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/thumbnail/thumbnail.component.html
new file mode 100644
index 0000000..b743089
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/thumbnail/thumbnail.component.html
@@ -0,0 +1,61 @@
+<!-- ********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ******************************************************************************** -->

+<div [ngSwitch]="superType">

+    <!-- audio -->

+    <div *ngSwitchCase="'audio'">

+        <div [ngSwitch]="subType">

+            <span *ngSwitchDefault [ngClass]="'fa fa-file-audio-o fa-' + size + 'x'"></span>

+        </div>

+    </div>

+    <!-- application -->

+    <div *ngSwitchCase="'application'">

+        <div [ngSwitch]="subType">

+            <span *ngSwitchCase="'vnd.openxmlformats-officedocument.wordprocessingml.document'" [ngClass]="'fa fa-file-word-o fa-' + size + 'x'"></span>

+            <span *ngSwitchCase="'vnd.openxmlformats-officedocument.presentationml.presentation'" [ngClass]="'fa fa-file-powerpoint-o fa-' + size + 'x'"></span>

+            <span *ngSwitchCase="'vnd.openxmlformats-officedocument.spreadsheetml.sheet'" [ngClass]="'fa fa-file-excel-o fa-' + size + 'x'"></span>

+            <span *ngSwitchCase="'pdf'" [ngClass]="'fa fa-file-pdf-o fa-' + size + 'x'"></span>

+            <span *ngSwitchCase="'x-zip-compressed'" [ngClass]="'fa fa-file-archive-o fa-' + size + 'x'"></span>

+            <span *ngSwitchDefault [ngClass]="'fa fa-file-o fa-' + size + 'x'"></span>

+        </div>

+    </div>

+    <!-- image -->

+    <div *ngSwitchCase="'image'">

+        <div *ngIf="!imgUrl">

+            <span *ngSwitchDefault [ngClass]="'fa fa-file-image-o fa-' + size + 'x'"></span>

+        </div>

+        <div *ngIf="imgUrl" [ngSwitch]="subType">

+            <img *ngSwitchCase="'png'" [src]="imgUrl" style="max-height: 28px; max-width: 24px;">

+            <img *ngSwitchCase="'jpg'" [src]="imgUrl" style="max-height: 28px; max-width: 24px;">

+            <img *ngSwitchCase="'jpeg'" [src]="imgUrl" style="max-height: 28px; max-width: 24px;">

+            <img *ngSwitchCase="'bmp'" [src]="imgUrl" style="max-height: 28px; max-width: 24px;">

+            <span *ngSwitchDefault [ngClass]="'fa fa-file-image-o fa-' + size + 'x'"></span>

+        </div>

+    </div>

+    <!-- text -->

+    <div *ngSwitchCase="'text'">

+        <div [ngSwitch]="subType">

+            <span *ngSwitchDefault [ngClass]="'fa fa-file-text-o fa-' + size + 'x'"></span>

+        </div>

+    </div>

+    <!-- video -->

+    <div *ngSwitchCase="'video'">

+        <div [ngSwitch]="subType">

+            <span *ngSwitchDefault [ngClass]="'fa fa-file-video-o fa-' + size + 'x'"></span>

+        </div>

+    </div>

+    <!-- default -->

+    <div *ngSwitchDefault>

+        <span [ngClass]="'fa fa-file-o fa-' + size + 'x'"></span>

+    </div>

+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/thumbnail/thumbnail.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/thumbnail/thumbnail.component.ts
new file mode 100644
index 0000000..2a99815
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/components/thumbnail/thumbnail.component.ts
@@ -0,0 +1,38 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+import { Component, OnInit, Input } from '@angular/core';

+

+@Component({

+    selector: 'thumbnail',

+    templateUrl: 'thumbnail.component.html'

+})

+export class ThumbnailComponent implements OnInit {

+

+    @Input() imgUrl?: any;

+    @Input() type: string;

+    @Input() size = '2';

+

+    public superType: string;

+    public subType: string;

+

+    public ngOnInit() {

+        if (this.type != undefined) {

+            let parts = this.type.split('/');

+            this.superType = parts[0];

+            this.subType = parts[1];

+        }

+    }

+

+    // TODO: support more documents type. render thumbnail for movie files. render thumbnail for more image files.

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/file-explorer.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/file-explorer.module.ts
new file mode 100644
index 0000000..70911dc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/file-explorer.module.ts
@@ -0,0 +1,94 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+ // Angular Imports

+import { NgModule } from '@angular/core';

+

+// 3rd party modules

+import { TableModule } from 'primeng/table';

+import { FileUploadModule } from 'primeng/fileupload';

+import { ConfirmDialogModule } from 'primeng/confirmdialog';

+import { ConfirmationService, DialogService } from 'primeng/api';

+import { InputTextModule } from 'primeng/inputtext';

+import { DynamicDialogModule } from 'primeng/dynamicdialog';

+import { MenuModule } from 'primeng/menu';

+import { ContextMenuModule } from 'primeng/contextmenu';

+import {SplitButtonModule} from 'primeng/splitbutton';

+

+// MDM modules

+import { MDMCoreModule } from '../core/mdm-core.module';

+

+// This Module's Components

+import { FileSizePipe } from './pipes/file-size.pipe';

+import { ThumbnailComponent } from './components/thumbnail/thumbnail.component';

+import { FileUploadDialogComponent } from './components/file-upload-dialog/file-upload-dialog.component';

+import { FileLinkEditorDialogComponent } from './components/file-link-editor-dialog/file-link-editor-dialog.component';

+import { FileNamePipe } from './pipes/file-name.pipe';

+import { FileExplorerComponent } from './components/file-explorer/file-explorer.component';

+import { FileExplorerDialogComponent } from './components/file-explorer-dialog/file-explorer-dialog.component';

+import { FileAttributeDisplayComponent } from './components/file-attribute-display/file-attribute-display.component';

+import { FileExplorerNavCardComponent } from './components/file-explorer-nav-card/file-explorer-nav-card.component';

+import { FileAttributeViewerComponent } from './components/file-attribute-viewer/file-attribute-viewer.component';

+import { FileLinkSequenceEditorComponent } from './components/file-link-sequence-editor/file-link-sequence-editor.component';

+import { FileLinkEditorComponent } from './components/file-link-editor/file-link-editor.component';

+

+

+@NgModule({

+    imports: [

+        MDMCoreModule,

+        TableModule,

+        DynamicDialogModule,

+        FileUploadModule,

+        ConfirmDialogModule,

+        ContextMenuModule,

+        InputTextModule,

+        MenuModule,

+        SplitButtonModule

+    ],

+    declarations: [

+        ThumbnailComponent,

+        FileSizePipe,

+        FileUploadDialogComponent,

+        FileLinkEditorDialogComponent,

+        FileNamePipe,

+        FileExplorerComponent,

+        FileExplorerDialogComponent,

+        FileAttributeDisplayComponent,

+        FileAttributeViewerComponent,

+        FileLinkSequenceEditorComponent,

+        FileExplorerNavCardComponent,

+        FileLinkEditorComponent

+    ],

+    exports: [

+        FileExplorerDialogComponent,

+        FileExplorerNavCardComponent,

+        FileAttributeViewerComponent,

+        FileLinkSequenceEditorComponent,

+        FileLinkEditorComponent,

+        FileAttributeDisplayComponent,

+        FileLinkEditorDialogComponent

+    ],

+    providers: [

+        FileNamePipe,

+        FileSizePipe,

+        DialogService

+    ],

+    entryComponents: [

+        FileUploadDialogComponent,

+        FileExplorerDialogComponent,

+        FileLinkEditorDialogComponent

+    ]

+})

+export class FileExplorerModule {

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/file-explorer.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/file-explorer.model.ts
new file mode 100644
index 0000000..3da9bdf
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/file-explorer.model.ts
@@ -0,0 +1,21 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+// Grouping file to enable import from central point.

+export { FileExplorerColumn } from './types/file-explorer-column.model';

+export { FileExplorerRow } from './types/file-explorer-row.model';

+export { FileUploadRow } from './types/file-upload-row.model';

+export { FormatSize } from './types/format-size.model';

+export { MDMBlob } from './types/mdm-blob.model';

+export { FileLinkContextWrapper } from './types/filelink-context-wrapper.model';

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-explorer-column.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-explorer-column.model.ts
new file mode 100644
index 0000000..fa18213
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-explorer-column.model.ts
@@ -0,0 +1,23 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export class FileExplorerColumn {

+  field: string;

+  header: string;

+

+  constructor (field: string, header: string) {

+    this.field = field;

+    this.header = header;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-explorer-row.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-explorer-row.model.ts
new file mode 100644
index 0000000..e31def7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-explorer-row.model.ts
@@ -0,0 +1,31 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export class FileExplorerRow {

+    filename: string;

+    description: string;

+    type: string;

+    size: string;

+    // remotePath is unique for one file-attachable MDM object

+    // and is used as identifier: fileExplorerRow <-> MDMLink

+    remotePath: string;

+

+    constructor (remotePath: string, filename: string, description: string, type: string, size: string) {

+        this.remotePath = remotePath;

+        this.filename = filename;

+        this.description = description;

+        this.type = type;

+        this.size = size;

+    }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-upload-row.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-upload-row.model.ts
new file mode 100644
index 0000000..be7afec
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/file-upload-row.model.ts
@@ -0,0 +1,25 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export class FileUploadRow {

+    file: File;

+    description: string;

+    dataUrl: any;

+

+    constructor (file: File, description: string, dataUrl: any) {

+        this.file = file;

+        this.description = description;

+        this.dataUrl = dataUrl;

+    }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/filelink-context-wrapper.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/filelink-context-wrapper.model.ts
new file mode 100644
index 0000000..82dd640
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/filelink-context-wrapper.model.ts
@@ -0,0 +1,22 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { MDMLink, Attribute, Node } from 'src/app/navigator/node';

+

+export class FileLinkContextWrapper {

+    fileLink: MDMLink;

+    contextType: string;

+    contextComponent: Node;

+    attribute: Attribute;

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/format-size.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/format-size.model.ts
new file mode 100644
index 0000000..b4df183
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/format-size.model.ts
@@ -0,0 +1,18 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+export enum FormatSize {

+    DECIMAL = 1000,

+    BINARY = 1024

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/mdm-blob.model.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/mdm-blob.model.ts
new file mode 100644
index 0000000..da6b8b7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/model/types/mdm-blob.model.ts
@@ -0,0 +1,17 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+export class MDMBlob {

+    mimeType: string;

+    blob: Blob;

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-name.pipe.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-name.pipe.spec.ts
new file mode 100644
index 0000000..c40680e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-name.pipe.spec.ts
@@ -0,0 +1,22 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { FileNamePipe } from './file-name.pipe';
+
+describe('FileNamePipe', () => {
+  it('create an instance', () => {
+    const pipe = new FileNamePipe();
+    expect(pipe).toBeTruthy();
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-name.pipe.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-name.pipe.ts
new file mode 100644
index 0000000..cbec201
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-name.pipe.ts
@@ -0,0 +1,27 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Pipe, PipeTransform } from '@angular/core';
+import { MDMLink } from '@navigator/node';
+
+@Pipe({
+  name: 'fileName'
+})
+export class FileNamePipe implements PipeTransform {
+
+  transform(link: MDMLink): any {
+    return link != undefined ? Object.assign(new MDMLink(), link).getFileName() : '';
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-size.pipe.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-size.pipe.ts
new file mode 100644
index 0000000..263d0f8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/pipes/file-size.pipe.ts
@@ -0,0 +1,55 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { Pipe, PipeTransform } from '@angular/core';

+// this projects imports

+import { FormatSize } from '../model/file-explorer.model';

+

+@Pipe({name: 'fileSize'})

+export class FileSizePipe implements PipeTransform {

+

+    constructor() {}

+

+    public transform(bytes: number | string, format?: FormatSize) {

+      let result = '-';

+      if (typeof(bytes) === 'string') {

+        result = bytes;

+      } else {

+        if (bytes == undefined) {

+          result = '-';

+        }

+        if (format == undefined) {

+            format = FormatSize.BINARY;

+        }

+        if (Math.abs(bytes) < format) {

+          result =  bytes + ' B';

+        }

+        let units: string[];

+        switch (format) {

+            case FormatSize.DECIMAL:

+            units = ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

+            break;

+            case FormatSize.BINARY:

+            units = ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];

+        }

+        let u = -1;

+        do {

+            bytes /= format;

+            ++u;

+        } while (Math.abs(bytes) >= format && u < units.length - 1);

+        result = bytes.toFixed(1) + ' ' + units[u];

+      }

+      return result;

+    }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/context-files.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/context-files.service.ts
new file mode 100644
index 0000000..9ab6c93
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/context-files.service.ts
@@ -0,0 +1,147 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Injectable } from '@angular/core';
+import { Http, Headers, RequestMethod, ResponseContentType } from '@angular/http';
+
+import { map, tap, concatMap } from 'rxjs/operators';
+import { from } from 'rxjs';
+import { plainToClass } from 'class-transformer';
+
+import { HttpErrorHandler } from '@core/http-error-handler';
+import { MDMNotificationService } from '@core/mdm-notification.service';
+import { PropertyService } from '@core/property.service';
+import { MDMLink, FileSize, Node, Attribute, ContextGroup } from '@navigator/node';
+import { FileUploadRow } from '../model/file-explorer.model';
+import { ContextAttributeIdentifier } from '@details/model/details.model';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class ContextFilesService {
+
+  private contextUrl: string;
+
+  constructor (private http: Http,
+               private httpErrorHandler: HttpErrorHandler,
+               private notificationService: MDMNotificationService,
+               private _prop: PropertyService) {
+    this.contextUrl = _prop.getUrl('mdm/environments');
+  }
+
+  public getUrl(ident: ContextAttributeIdentifier, remotePath: string) {
+      return this.getFileEndpoint(ident) + '/' + this.escapeUrlCharacters(remotePath);
+  }
+
+  private getFileEndpoint(ident: ContextAttributeIdentifier) {
+    return this.contextUrl
+    + '/' + ident.contextComponent.sourceName
+    + '/' + this.contextGroupToUrl(ident.contextGroup)
+    + '/' + ident.contextDescribable.id
+    + '/contexts'
+    + '/' + ident.contextType
+    + '/' + this.escapeUrlCharacters(ident.contextComponent.name)
+    + '/' + this.escapeUrlCharacters(ident.attribute.name)
+    + '/files';
+  }
+
+  // loads file size from server for file with given remote path
+  public loadFileSize(link: MDMLink, ident: ContextAttributeIdentifier) {
+
+    const endpoint = this.getFileEndpoint(ident)
+          + '/size/' + this.escapeUrlCharacters(link.remotePath);
+
+    return this.http.get(endpoint)
+                    .pipe(
+                      map(res => plainToClass(FileSize, res.json() as FileSize))
+                    )
+                    .catch(this.httpErrorHandler.handleError);
+  }
+
+  // loads file in context from server, returns file as blob.
+  public loadFile(link: MDMLink, ident: ContextAttributeIdentifier) {
+
+    const headers = new Headers({});
+    const endpoint = this.getFileEndpoint(ident)
+                      + '/' + this.escapeUrlCharacters(link.remotePath);
+
+    return this.http.get(endpoint, { method: RequestMethod.Get,
+                                      responseType: ResponseContentType.Blob,
+                                      headers: headers })
+                    .pipe(
+                      map(res => res.blob())
+                    )
+                    .catch(this.httpErrorHandler.handleError);
+  }
+
+  // Uploads multiple files. Http requests are chained to avoid concurrency in server side update process.
+  public uploadFiles(files: FileUploadRow[], ident: ContextAttributeIdentifier) {
+    return from(files).pipe(
+              concatMap(file => this.uploadFile(file, ident))
+            );
+  }
+
+  // upload file
+  public uploadFile(fileData: FileUploadRow, ident: ContextAttributeIdentifier) {
+
+    const fd = new FormData();
+    fd.append('file', fileData.file, fileData.file.name);
+    fd.append('mimeType', fileData.file.type);
+    fd.append('description', fileData.description);
+
+    const endpoint = this.getFileEndpoint(ident);
+
+    return this.http.post(endpoint , fd)
+            .pipe(
+              map(res => plainToClass(MDMLink, res.json() as MDMLink)),
+              tap(link => this.notificationService.notifySuccess(
+                          'File created.',
+                          'The file ' + link.remotePath.substring(link.remotePath.lastIndexOf('/') + 1)
+                          + ' has been successfully created.'
+                          ))
+            )
+            .catch(this.httpErrorHandler.handleError);
+  }
+
+  // delete file from server
+  public deleteFile(link: MDMLink, ident: ContextAttributeIdentifier) {
+    const endpoint = this.getFileEndpoint(ident)
+                    + '/' + this.escapeUrlCharacters(link.remotePath);
+
+    return this.http.delete(endpoint)
+            .pipe(
+              map(res => plainToClass(MDMLink, res.json() as MDMLink)),
+              tap(flink => this.notificationService.notifySuccess(
+                          'File deleted.',
+                          'The file ' + flink.remotePath.substring(flink.remotePath.lastIndexOf('/') + 1)
+                          + ' has been successfully deleted from file system.'
+                          ))
+            )
+            .catch(this.httpErrorHandler.handleError);
+  }
+
+  private contextGroupToUrl(type: number) {
+    switch (type) {
+      case 0:
+        return 'teststeps';
+      case 1:
+        return 'measurements';
+    }
+  }
+
+  // replaces / by %2F to not break url
+  private escapeUrlCharacters(urlString: string) {
+    return urlString.replace(/\//g, '%2F').replace(/\./g, '%2E').replace(/ /g, '%20');
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file-reader.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file-reader.service.ts
new file mode 100644
index 0000000..d04b08d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file-reader.service.ts
@@ -0,0 +1,35 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+import { Injectable } from '@angular/core';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class FileReaderService {
+
+  constructor() { }
+
+  // reads file from filesystem.
+  public readFile(inputFile: File) {
+    const reader = new FileReader();
+    return new Promise((resolve, reject) => {
+      reader.onerror = () => {
+        reader.abort();
+        reject(new DOMException('Problem parsing input file.'));
+      };
+      reader.onloadend = () => resolve(reader.result);
+      reader.readAsDataURL(inputFile);
+    });
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file.service.spec.ts
new file mode 100644
index 0000000..84fcefc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file.service.spec.ts
@@ -0,0 +1,12 @@
+import { TestBed } from '@angular/core/testing';
+
+import { FileService } from './file.service';
+
+describe('FileService', () => {
+  beforeEach(() => TestBed.configureTestingModule({}));
+
+  it('should be created', () => {
+    const service: FileService = TestBed.get(FileService);
+    expect(service).toBeTruthy();
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file.service.ts
new file mode 100644
index 0000000..95b983e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/file.service.ts
@@ -0,0 +1,37 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { Injectable } from '@angular/core';
+import { Subject } from 'rxjs';
+import { FileLinkContextWrapper } from '../model/file-explorer.model';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class FileService {
+
+  private fileChangedSubject = new Subject<FileLinkContextWrapper>();
+
+  constructor() { }
+
+  // Emitter for attributes to save for default saving mechanism
+  public fireOnFileChanged(fileLinkContextWrapper: FileLinkContextWrapper) {
+    this.fileChangedSubject.next(fileLinkContextWrapper);
+  }
+
+  // Returns Observable for listners to subscribe to attributes to save for default saving mechanism
+  public onFileChanged() {
+    return this.fileChangedSubject.asObservable();
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/files-attachable.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/files-attachable.service.ts
new file mode 100644
index 0000000..2559380
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/file-explorer/services/files-attachable.service.ts
@@ -0,0 +1,150 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { Injectable} from '@angular/core';

+import { Http, Headers, RequestMethod, ResponseContentType} from '@angular/http';

+

+import { plainToClass } from 'class-transformer';

+import { map, tap, concatMap } from 'rxjs/operators';

+import { from } from 'rxjs';

+

+import { MDMNotificationService } from '@core/mdm-notification.service';

+import { HttpErrorHandler } from '@core/http-error-handler';

+import { PropertyService } from '@core/property.service';

+import { Node, MDMLink, FileSize } from '@navigator/node';

+

+import { FileUploadRow } from '../model/file-explorer.model';

+

+@Injectable()

+export class FilesAttachableService {

+

+  public static readonly MDM_LINKS = 'MDMLinks';

+

+  private contextUrl: string;

+

+  constructor (private http: Http,

+               private httpErrorHandler: HttpErrorHandler,

+               private notificationService: MDMNotificationService,

+               private _prop: PropertyService) {

+    this.contextUrl = _prop.getUrl('mdm/environments');

+  }

+

+  public getFilesEndpoint(node: Node) {

+    const urlType = this.typeToUrl(node.sourceType);

+

+    return this.contextUrl

+      + '/' + node.sourceName

+      + '/' + urlType

+      + '/' + node.id

+      + '/files';

+  }

+

+  // loads file for fileatachable from server, returns file as blob.

+  public loadFile(remotePath: string, node: Node) {

+    const headers = new Headers({});

+

+    const endpoint = this.getFilesEndpoint(node) + '/' + this.escapeUrlCharacters(remotePath);

+

+    return this.http.get(endpoint, { method: RequestMethod.Get,

+                                     responseType: ResponseContentType.Blob,

+                                     headers: headers })

+                    .pipe(

+                      map(res => res.blob())

+                    )

+                    .catch(this.httpErrorHandler.handleError);

+  }

+

+  // loads file size from server for file with given remote path

+  public loadFileSize(remotePath: string, node: Node) {

+    const endpoint = this.getFilesEndpoint(node) + '/size/' + this.escapeUrlCharacters(remotePath);

+

+    return this.http.get(endpoint)

+                    .pipe(

+                      map(res => plainToClass(FileSize, res.json() as FileSize))

+                    )

+                    .catch(this.httpErrorHandler.handleError);

+  }

+

+  // loads file sizes from server for all files attached to given entity

+  public loadFileSizes(node: Node) {

+    const endpoint = this.getFilesEndpoint(node) + '/sizes';

+

+    return this.http.get(endpoint)

+                    .pipe(

+                      map(res => plainToClass(FileSize, res.json() as FileSize[]))

+                    )

+                    .catch(this.httpErrorHandler.handleError);

+  }

+

+  // Uploads multiple files. Http requests are chained to avoid concurrency in server side update process.

+  public uploadFiles(node: Node, files: FileUploadRow[]) {

+    return from(files).pipe(

+              concatMap(file => this.uploadFile(node, file))

+            );

+  }

+

+  // upload file

+  public uploadFile(node: Node, fileData: FileUploadRow) {

+    const fd = new FormData();

+    fd.append('file', fileData.file, fileData.file.name);

+    // fd.append('size', fileData.file.size.toString());

+    fd.append('mimeType', fileData.file.type);

+    fd.append('description', fileData.description);

+

+    const endpoint = this.getFilesEndpoint(node);

+    return this.http.post(endpoint , fd)

+            .pipe(

+              map(res => plainToClass(MDMLink, res.json() as MDMLink)),

+              tap(link => this.notificationService.notifySuccess(

+                          'File created.',

+                          'The file ' + link.remotePath.substring(link.remotePath.lastIndexOf('/') + 1)

+                          + ' has been successfully created.'

+                          ))

+            )

+            .catch(this.httpErrorHandler.handleError);

+  }

+

+  // delete file from server

+  public deleteFile(remotePath: string, node: Node) {

+    const endpoint = this.getFilesEndpoint(node) + '/' + this.escapeUrlCharacters(remotePath);

+

+    return this.http.delete(endpoint)

+            .pipe(

+              map(res => plainToClass(MDMLink, res.json() as MDMLink)),

+              tap(link => this.notificationService.notifySuccess(

+                          'File deleted.',

+                          'The file ' + link.remotePath.substring(link.remotePath.lastIndexOf('/') + 1)

+                          + ' has been successfully deleted from file system.'

+                          ))

+            )

+            .catch(this.httpErrorHandler.handleError);

+  }

+

+  // helping function to map sourceType to proper url for endpoint.

+  private typeToUrl(type: string) {

+    if (type != undefined) {

+      switch (type) {

+        case 'MeaResult':

+          return 'measurements';

+        default:

+          return type.toLowerCase() + 's';

+      }

+    }

+  }

+

+  // replaces / by %2F to not break url

+  private escapeUrlCharacters(urlString: string) {

+    return urlString.replace(/\//g, '%2F').replace(/\./g, '%2E');

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/filerelease.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/filerelease.service.ts
new file mode 100644
index 0000000..4ded0ed
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/filerelease.service.ts
@@ -0,0 +1,148 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable} from '@angular/core';
+import {Http, Response, Headers, RequestOptions} from '@angular/http';
+import {catchError, map} from 'rxjs/operators';
+import {HttpErrorHandler} from '../core/http-error-handler';
+import {PropertyService} from '../core/property.service';
+
+import { TRANSLATE } from '../core/mdm-core.module';
+
+@Injectable()
+export class FilereleaseService {
+  url: string;
+  stateMap = new Array();
+  formatMap = new Array();
+  month = new Array();
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private prop: PropertyService) {
+
+    this.url = prop.getUrl('mdm/filereleases');
+
+    this.formatMap['PAK2RAW'] = TRANSLATE('filerelease.filerelease.format-pak2raw');
+    this.formatMap['PAK2ATFX'] = TRANSLATE('filerelease.filerelease.format-pak2atfx');
+
+    this.stateMap['RELEASE_ORDERED'] = TRANSLATE('filerelease.filerelease.state-release-ordered');
+    this.stateMap['RELEASE_APPROVED'] = TRANSLATE('filerelease.filerelease.state-release-approved');
+    this.stateMap['RELEASE_RELEASED'] = TRANSLATE('filerelease.filerelease.state-release-released');
+    this.stateMap['RELEASE_EXPIRED'] = TRANSLATE('filerelease.filerelease.state-release-expired');
+    this.stateMap['RELEASE_PROGRESSING_ERROR'] = TRANSLATE('filerelease.filerelease.state-release-processing-error');
+    this.stateMap['RELEASE_PROGRESSING'] = TRANSLATE('filerelease.filerelease.state-release-in-process');
+    this.stateMap['RELEASE_REJECTED'] = TRANSLATE('filerelease.filerelease.state-release-declined');
+
+    this.month[0] = '1';
+    this.month[1] = '2';
+    this.month[2] = '3';
+    this.month[3] = '4';
+    this.month[4] = '5';
+    this.month[5] = '6';
+    this.month[6] = '7';
+    this.month[7] = '8';
+    this.month[8] = '9';
+    this.month[9] = '10';
+    this.month[10] = '11';
+    this.month[11] = '12';
+  }
+
+  readAll() {
+    return this.read('');
+  }
+
+  readIncomming() {
+    return this.read('?direction=incomming');
+  }
+
+  readOutgoging() {
+    return this.read('?direction=outgoing');
+  }
+
+  create(release: Release) {
+    let body = JSON.stringify(release);
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+    return this.http.post(this.url, body, options).pipe(
+                    map(this.extractData),
+                    catchError(this.httpErrorHandler.handleError));
+  }
+
+  delete(release: Release) {
+    return this.http.delete(this.url + '/' + release.identifier).pipe(
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  approve(release: Release) {
+    release.state = 'RELEASE_APPROVED';
+    return this.update(release).pipe(
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  reject(release: Release) {
+    release.state = 'RELEASE_REJECTED';
+    return this.update(release).pipe(
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  formatDate(date) {
+    let d = new Date(date);
+    let day = d.getDate();
+    let month = this.month[d.getMonth()];
+    let year = d.getFullYear();
+    let hours = (d.getHours() < 10 ? '0' : '') + d.getHours();
+    let min = (d.getMinutes() < 10 ? '0' : '') + d.getMinutes();
+    let sec = (d.getSeconds() < 10 ? '0' : '') + d.getSeconds();
+    return day + '.' + month + '.' + year + ' ' + hours + ':' + min + ':' + sec;
+  }
+
+  private read(query: string) {
+    return this.http.get(this.url + query).pipe(
+      map(res => <Release[]> res.json().data),
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  private update(release: Release) {
+    let body = JSON.stringify(release);
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+    return this.http.post(this.url + '/' + release.identifier, body, options).pipe(
+                    map(this.extractData),
+                    catchError(this.httpErrorHandler.handleError));
+  }
+
+  private extractData(res: Response) {
+    let body = res.json();
+    return body.data || { };
+  }
+}
+
+export class Release {
+  identifier: string;
+  state: string;
+  name: string;
+  sourceName: string;
+  typeName: string;
+  id: string;
+  sender: string;
+  receiver: string;
+  orderMessage: string;
+  rejectMessage: string;
+  errorMessage: string;
+  format: string;
+  fileLink: string;
+  validity: number;
+  expire: number;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-create.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-create.component.html
new file mode 100644
index 0000000..531b588
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-create.component.html
@@ -0,0 +1,66 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+<button type="button" class="btn btn-default" (click)="lgModal.show()" [disabled]="disabled" style="border-bottom-left-radius: 0; border-top-left-radius: 0;">{{ 'filerelease.mdm-filerelease-create.btn-release-request' | translate }}</button>
+
+<div bsModal #lgModal="bs-modal" class="modal fade" tabindex="-1" role="dialog">
+  <div class="modal-dialog modal-lg">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" (click)="lgModal.hide()">
+          <span aria-hidden="true">&times;</span>
+        </button>
+        <h4 class="modal-title">{{ 'filerelease.mdm-filerelease-create.title-release' | translate }}</h4>
+      </div>
+      <div class="modal-body">
+        <form (ngSubmit)="createRelease()" #request="ngForm">
+          <div class="form-group">
+            <div [ngClass]="validity.valid ? 'has-success' : 'has-error'">
+              <label class="col-form-label col-sm-2" for="validity">{{ 'filerelease.mdm-filerelease-create.lbl-validity-days' | translate }}:</label>
+              <div class="col-sm-10">
+                <select name="validity" [(ngModel)]="release.validity" ngControl="validity" #validity="ngModel" class="form-control" required>
+                  <option *ngFor="let opt of expire" [ngValue]="opt">{{opt}}</option>
+                </select>
+              </div>
+            </div>
+
+            <div [ngClass]="format.valid ? 'has-success' : 'has-error'">
+              <label class="col-form-label col-sm-2" for="format">{{ 'filerelease.mdm-filerelease-create.lbl-format' | translate }}:</label>
+              <div class="col-sm-10">
+                <select name="format" [(ngModel)]="release.format" ngControl="format" #format="ngModel" class="form-control" required>
+                  <option *ngFor="let opt of options" [ngValue]="opt">{{ getFormat(opt) | translate }}</option>
+                </select>
+              </div>
+            </div>
+
+            <div [ngClass]="orderMessage.valid ? 'has-success' : 'has-error'">
+              <label class="col-form-label col-sm-2" for="orderMessage">{{ 'filerelease.mdm-filerelease-create.lbl-reason' | translate }}:</label>
+              <div class="col-sm-10">
+                <textarea name="orderMessage" [(ngModel)]="release.orderMessage" ngControl="orderMessage" #orderMessage="ngModel" cols="35" rows="4" class="form-control" required></textarea>
+              </div>
+            </div>
+            <div class="row">
+              <div class="col-xs-12" style="margin-top: 15px; margin-bottom:-15px; padding-right: 30px; text-align: right;">
+                <div class="btn-group">
+                  <button type="submit" class="btn btn-default" [disabled]=!request.form.valid>{{ 'filerelease.mdm-filerelease-create.btn-send' | translate }}</button>
+                </div>
+              </div>
+            </div>
+          </div>
+        </form>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-create.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-create.component.ts
new file mode 100644
index 0000000..d5a556e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-create.component.ts
@@ -0,0 +1,75 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, Input, Output, EventEmitter, ViewChild} from '@angular/core';
+import { ModalDirective } from 'ngx-bootstrap';
+import {Release, FilereleaseService} from './filerelease.service';
+import {Node} from '../navigator/node';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+
+@Component({
+  selector: 'mdm-filerelease-create',
+  templateUrl: 'mdm-filerelease-create.component.html'
+})
+export class MDMFilereleaseCreateComponent {
+
+  @Input() disabled: boolean;
+  @Input() node: Node;
+  @Output() onSubmit = new EventEmitter<boolean>();
+  release: Release = new Release;
+  options = ['PAK2RAW', 'PAK2ATFX'];
+  expire = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+
+  @ViewChild('lgModal')
+  lgModal: ModalDirective;
+
+  constructor(private service: FilereleaseService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {}
+
+  getFormat(key) {
+      return this.service.formatMap[key];
+  }
+
+  createRelease() {
+    this.release.identifier = '';
+    this.release.state = '';
+    this.release.name = this.node.name;
+    this.release.sourceName = this.node.sourceName;
+    this.release.typeName = this.node.type;
+    this.release.id = this.node.id;
+    this.release.sender = '';
+    this.release.receiver = '';
+    this.release.rejectMessage = '';
+    this.release.errorMessage = '';
+    this.release.fileLink = '';
+    this.release.expire = 0;
+    this.service.create(this.release).subscribe(
+      release => this.release = release,
+      error => this.notificationService.notifyError(
+        this.translateService.instant('filerelease.mdm-filerelease-create.err-cannot-create-release'), error)
+    );
+    this.clear();
+    this.onSubmit.emit(true);
+    this.lgModal.hide();
+  }
+
+  clear() {
+    this.release = new Release();
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-display.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-display.component.html
new file mode 100644
index 0000000..d14eb80
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-display.component.html
@@ -0,0 +1,49 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+<table class="table table-bordered">
+  <tbody>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-test-name' | translate }}:</td><td>{{release.name}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-error-message' | translate }}:</td><td>{{release.errorMessage}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-expires-on' | translate }}:</td><td>{{getDate(release.expire)}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.tlbl-format' | translate }}:</td><td>{{getFormat(release.format)}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-reason-for-release' | translate }}:</td><td>{{release.orderMessage}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-reason-for-declining' | translate }}:</td><td>{{release.rejectMessage}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-requested-by' | translate }}:</td><td>{{release.sender}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-test-responsible-person' | translate }}:</td><td>{{release.receiver}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-state' | translate }}:</td><td>{{getState(release.state)}}</td>
+    </tr>
+    <tr>
+      <td>{{ 'filerelease.mdm-filerelease-display.lbl-validity' | translate }}:</td><td>{{release.validity}} Tage</td>
+    </tr>
+  </tbody>
+</table>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-display.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-display.component.ts
new file mode 100644
index 0000000..6f79e7e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease-display.component.ts
@@ -0,0 +1,42 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, Input} from '@angular/core';
+import {Release, FilereleaseService} from './filerelease.service';
+
+@Component({
+  selector: 'mdm-filerelease-display',
+  templateUrl: 'mdm-filerelease-display.component.html',
+  styles: [],
+  providers: []
+})
+export class MDMFilereleaseDisplayComponent {
+  @Input() release: Release;
+
+  constructor(private service: FilereleaseService) {}
+
+  getFormat(format) {
+    return this.service.formatMap[format];
+  }
+
+  getState(state) {
+    return this.service.stateMap[state];
+  }
+
+  getDate(date) {
+    if (date === 0) { return; }
+    return this.service.formatDate(date);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.component.html
new file mode 100644
index 0000000..109cf23
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.component.html
@@ -0,0 +1,128 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+<style>
+  .container-fluid {
+    padding: 0;
+  }
+</style>
+<div class="container-fluid">
+  <div class="box" style="margin-bottom: 15px;">
+    <div class="well">
+      <h2>{{ 'filerelease.mdm-filerelease.incoming-release-requests' | translate }}</h2>
+    </div>
+    <table class="table table-hover">
+      <thead>
+        <tr>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-test-name' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-request-submitted-by' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-release-validity' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-release-expires-on' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-status' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-format' | translate }}</th>
+          <th></th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr *ngFor="let data of incoming" [ngClass]="getState(data)" (click)=setData(data) (click)='setEvent("approve")' (click)=lgModal.show()>
+          <td>{{ data.name }}</td>
+          <td>{{ data.sender }}</td>
+          <td>{{ data.validity }} {{ 'filerelease.mdm-filerelease.days' | translate }}</td>
+          <td>{{ getDate(data.expire) }}</td>
+          <td>{{ getTransState(data.state) | translate }}</td>
+          <td>{{ getFormat(data.format) | translate }}</td>
+          <td></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</div>
+<div class="container-fluid">
+  <div class="box">
+    <div class="well">
+      <h2>{{ 'filerelease.mdm-filerelease.outgoing-release-requests' | translate }}</h2>
+    </div>
+    <table class="table table-hover">
+      <thead>
+        <tr>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-test-name' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-test-responsible-person' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-release-validity' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-release-expires-on' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-status' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-format' | translate }}</th>
+          <th>{{ 'filerelease.mdm-filerelease.tblhdr-download' | translate }}</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr *ngFor="let data of outgoing" [ngClass]="getState(data)" (click)=setData(data) (click)='setEvent("edit")'>
+          <td (click)=lgModal.show()>{{ data.name }}</td>
+          <td (click)=lgModal.show()>{{ data.receiver }}</td>
+          <td (click)=lgModal.show()>{{ data.validity }}  {{ 'filerelease.mdm-filerelease.days' | translate }}</td>
+          <td (click)=lgModal.show()>{{ getDate(data.expire) }}</td>
+          <td (click)=lgModal.show()>{{ getTransState(data.state) | translate }}</td>
+          <td (click)=lgModal.show()>{{getFormat(data.format) | translate }}</td>
+          <td>
+            <a *ngIf="data.state == 'RELEASE_RELEASED'" href="{{dataHost}}{{data.fileLink}}" download><span class="fa fa-arrow-circle-o-down"></span></a>
+            <span *ngIf="data.state != 'RELEASE_RELEASED'" class="fa fa-ban"></span>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</div>
+
+<div bsModal #lgModal="bs-modal" class="modal fade" tabindex="-1" role="dialog">
+  <div class="modal-dialog modal-lg">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" (click)="lgModal.hide()">
+          <span aria-hidden="true">&times;</span>
+        </button>
+        <h4 class="modal-title"> {{ 'filerelease.mdm-filerelease.release' | translate }}</h4>
+      </div>
+      <div class="modal-body">
+        <mdm-filerelease-display [release]=release ></mdm-filerelease-display>
+        <div class="btn-group" *ngIf='event=="approve"'>
+          <button type="button" class="btn btn-success" (click)="approveRelease()" (click)="lgModal.hide()" [disabled]="isReleaseable()"> {{ 'filerelease.mdm-filerelease.btn-approve' | translate }}</button>
+          <button type="button" class="btn btn-danger" (click)="smModal.show()" (click)="lgModal.hide()" [disabled]="isReleaseable()"> {{ 'filerelease.mdm-filerelease.btn-decline' | translate }}</button>
+        </div>
+        <div class="btn-group" *ngIf='event=="edit"'>
+          <button type="button" class="btn btn-default" (click)="deleteRelease()" (click)="lgModal.hide()" [disabled]=isDeletable()> {{ 'filerelease.mdm-filerelease.btn-cancel-request' | translate }}</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div bsModal #smModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
+  <div class="modal-dialog modal-sm">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" aria-label="Close" (click)="smModal.hide()">
+          <span aria-hidden="true">&times;</span>
+        </button>
+        <h4 class="modal-title"> {{ 'filerelease.mdm-filerelease.reason' | translate }}</h4>
+      </div>
+      <div class="modal-body">
+        <textarea #reason cols="35" rows="4" class="form-control"></textarea>
+        <div class="btn-group">
+          <button type="button" class="btn btn-danger" (click)="rejectRelease(reason.value)" (click)=smModal.hide() (click)="reason.value = ''"> {{ 'filerelease.mdm-filerelease.btn-decline' | translate }}</button>
+          <button type="button" class="btn btn-default" (click)="smModal.hide()" (click)="reason.value = ''"> {{ 'filerelease.mdm-filerelease.btn-cancel' | translate }}</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.component.ts
new file mode 100644
index 0000000..e2281a2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.component.ts
@@ -0,0 +1,127 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {FilereleaseService, Release} from './filerelease.service';
+import {PropertyService} from '../core/property.service';
+import { ModalDirective } from 'ngx-bootstrap';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+
+@Component({
+  selector: 'mdm-filerelease',
+  templateUrl: 'mdm-filerelease.component.html',
+  styles: ['.box {border: 1px solid #ddd; border-radius: 4px;}']
+})
+export class MDMFilereleaseComponent implements OnInit {
+
+  incoming: Release[] = [];
+  outgoing: Release[] = [];
+  release: Release = new Release;
+  event = 'display';
+  dataHost: string;
+
+  @ViewChild('lgModal')
+  lgModal: ModalDirective;
+
+  @ViewChild('smModal')
+  smModal: ModalDirective;
+
+  constructor(private service: FilereleaseService,
+              private prop: PropertyService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+    this.dataHost = prop.getDataHost();
+  }
+
+  ngOnInit() {
+    this.getReleases();
+  }
+
+  getReleases() {
+    this.service.readOutgoging().subscribe(
+      releases => this.outgoing = releases,
+      error => this.notificationService.notifyError(
+        this.translateService.instant('filerelease.mdm-filerelease.err-cannot-read-outgoing-release'), error)
+    );
+    this.service.readIncomming().subscribe(
+      releases => this.incoming = releases,
+      error => this.notificationService.notifyError(
+        this.translateService.instant('filerelease.mdm-filerelease.err-cannot-read-outgoing-release'), error)
+    );
+  }
+  setData(release) {
+    this.release = release;
+  }
+  getState(release: Release) {
+    if (release.state === 'RELEASE_ORDERED') { return 'info'; }
+    if (release.state === 'RELEASE_APPROVED') { return 'warning'; }
+    if (release.state === 'RELEASE_RELEASED') { return 'success'; }
+    if (release.state === 'RELEASE_EXPIRED') { return 'danger'; }
+    if (release.state === 'RELEASE_REJECTED') { return 'danger'; }
+    if (release.state === 'RELEASE_PROGRESSING_ERROR') { return 'danger'; }
+    if (release.state === 'RELEASE_PROGRESSING') { return 'warning'; }
+    return 'info';
+  }
+  rejectRelease(reason: string) {
+    this.release.rejectMessage = reason;
+    this.service.reject(this.release).subscribe(
+      release => this.updateList(release),
+      error => this.notificationService.notifyError(
+        this.translateService.instant('filerelease.mdm-filerelease.err-error-declining-release'), error)
+    );
+  }
+  approveRelease() {
+    this.service.approve(this.release).subscribe(
+      release => this.updateList(release),
+      error => this.notificationService.notifyError(
+        this.translateService.instant('filerelease.mdm-filerelease.err-error-approving-release'), error)
+    );
+    this.release.state = 'RELEASE_PROGRESSING';
+  }
+  updateList(id) {
+    let pos = this.outgoing.map(function(e) { return e.identifier; }).indexOf(id);
+    if (pos !== -1) { this.outgoing.splice(pos, 1); }
+    pos = this.incoming.map(function(e) { return e.identifier; }).indexOf(id);
+    if (pos !== -1) { this.incoming.splice(pos, 1); }
+  }
+  isDeletable() {
+    if (this.release.state !== 'RELEASE_PROGRESSING') { return false; }
+    return true;
+  }
+  deleteRelease() {
+    let id = this.release.identifier;
+    this.service.delete(this.release).subscribe(data => this.updateList(id), err => console.log(err));
+  }
+  setEvent(event) {
+    this.event = event;
+  }
+  isReleaseable() {
+    if (this.release.state !== 'RELEASE_ORDERED') { return true; }
+    return false;
+  }
+  getFormat(format) {
+    return this.service.formatMap[format];
+  }
+  getTransState(state) {
+    return this.service.stateMap[state];
+  }
+  getDate(date) {
+    if (date === 0) { return; }
+    return this.service.formatDate(date);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.module.ts
new file mode 100644
index 0000000..e5034a8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/filerelease/mdm-filerelease.module.ts
@@ -0,0 +1,40 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+
+import { MDMFilereleaseComponent } from './mdm-filerelease.component';
+import { MDMFilereleaseCreateComponent } from './mdm-filerelease-create.component';
+import { MDMFilereleaseDisplayComponent } from './mdm-filerelease-display.component';
+
+@NgModule({
+  imports: [
+    MDMCoreModule
+  ],
+  declarations: [
+    MDMFilereleaseComponent,
+    MDMFilereleaseCreateComponent,
+    MDMFilereleaseDisplayComponent,
+  ],
+  exports: [
+    MDMFilereleaseComponent,
+    MDMFilereleaseCreateComponent,
+    MDMFilereleaseDisplayComponent,
+  ]
+})
+export class MDMFilereleaseModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/localization.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/localization.service.ts
new file mode 100644
index 0000000..e494eb3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/localization.service.ts
@@ -0,0 +1,74 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable} from '@angular/core';
+import {Http, Response} from '@angular/http';
+import {Localization} from './localization';
+import {Node} from '../navigator/node';
+import {NodeService} from '../navigator/node.service';
+import {PropertyService} from '../core/property.service';
+import {HttpErrorHandler} from '../core/http-error-handler';
+import {MDMNotificationService} from '../core/mdm-notification.service';
+import {forkJoin as observableForkJoin, Observable} from 'rxjs';
+import {catchError, mergeMap, publishReplay, refCount, map} from 'rxjs/operators';
+
+@Injectable()
+export class LocalizationService {
+
+  private _nodeUrl: string;
+
+  private cache: Observable<Localization[]>;
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService,
+              private _node: NodeService,
+              private notificationService: MDMNotificationService) {
+
+    this._nodeUrl = _prop.getUrl('mdm/environments');
+  }
+
+  // Caches valueLists if cache is empty. Then returns observable containing cached valueLists.
+  getLocalizations() {
+    if (!this.cache) {
+      this.cache = this._node.getNodes(undefined).pipe(
+                mergeMap(envs => this.initLocalizations(envs)),
+                publishReplay(1),
+                refCount());
+    }
+    return this.cache;
+  }
+
+  private initLocalizations(envs: Node[]) {
+    return observableForkJoin(envs.map(env => this.getLocalization(env))).pipe(
+                     map(locs => locs.reduce((a, b) => a.concat(b), [])));
+  }
+
+  private getLocalization(node: Node): Observable<Localization[]> {
+    let url = this._nodeUrl + '/' + node.sourceName;
+    if (node.sourceType === 'Environment') {
+      url = url + '/localizations?all=true';
+    } else {
+      url = url + '/' + node.type.toLowerCase() + 's/localizations';
+    }
+    return this.get(url);
+  }
+
+  private get(url: string) {
+    return this.http.get(url).pipe(
+    map(res => <Localization[]> res.json().data),
+    catchError(this.httpErrorHandler.handleError));
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/localization.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/localization.ts
new file mode 100644
index 0000000..b72de68
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/localization.ts
@@ -0,0 +1,19 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+export class Localization {
+  name: string;
+  localizedName: string;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/mdmdatasourcetranslation.pipe.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/mdmdatasourcetranslation.pipe.ts
new file mode 100644
index 0000000..22e5b2b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/localization/mdmdatasourcetranslation.pipe.ts
@@ -0,0 +1,47 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Pipe, PipeTransform } from '@angular/core';
+import {LocalizationService} from '../localization/localization.service';
+import {Localization} from './localization';
+
+@Pipe({
+  name: 'mdmdatasourcetranslate',
+  pure: false
+})
+export class MDMDataSourceTranslationPipe implements PipeTransform {
+
+  private translation: string;
+
+  constructor(private localService: LocalizationService) {}
+
+  transform(type: string, attr?: string): any {
+    return type ? this.getTrans(type, attr) : type;
+  }
+
+  private getTrans(type: string, attr: string) {
+    this.localService.getLocalizations()
+                     .map(locs => this.getTranslation(locs, type, attr))
+                     .subscribe(t => this.translation = t);
+    return this.translation;
+  }
+
+  private getTranslation(locs: Localization[], type: string, attr: string) {
+    let trans = attr ? type + '.' + attr : type;
+    let temp = locs.find(l => l.name === trans);
+    return temp ? temp.localizedName : trans;
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules-routing.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules-routing.module.ts
new file mode 100644
index 0000000..9921f6b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules-routing.module.ts
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { MDMModulesComponent } from '../modules/mdm-modules.component';
+import { MDMSearchComponent } from '../search/mdm-search.component';
+import { ChartViewerNavCardComponent } from '../chartviewer/components/chatviewer-nav-card/chart-viewer-nav-card.component';
+import { XyChartViewerNavCardComponent } from '../chartviewer/components/xy-chart-viewer-nav-card/xy-chart-viewer-nav-card.component';
+import { FileExplorerNavCardComponent } from '../file-explorer/components/file-explorer-nav-card/file-explorer-nav-card.component';
+
+const moduleRoutes: Routes = [
+  { path: '', component: MDMModulesComponent, children: [
+    { path: '', redirectTo: 'search', pathMatch: 'full' },
+    { path: 'details', loadChildren: '../details/mdm-detail.module#MDMDetailModule'},
+    { path: 'search', component: MDMSearchComponent },
+    { path: 'quickviewer', component: ChartViewerNavCardComponent },
+    { path: 'xychartviewer', component: XyChartViewerNavCardComponent },
+    { path: 'files', component: FileExplorerNavCardComponent },
+  ]}
+];
+
+@NgModule({
+  imports: [
+    RouterModule.forChild(moduleRoutes)
+  ],
+  exports: [
+    RouterModule
+  ]
+})
+export class MDMModulesRoutingModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.component.html
new file mode 100644
index 0000000..fd566dc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.component.html
@@ -0,0 +1,38 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<style>
+  .nav-item > .nav-link {
+  border-color: #e9ecef #e9ecef #dee2e6;
+  }
+ .nav-item > .nav-link:focus {
+    border-color: #ddd #ddd #dee2e6;
+  }
+  .nav-item > .nav-link:active {
+    border-color: #ddd #ddd #dee2e6;
+  }
+</style>
+
+<ul class="nav nav-tabs mdm-link-list" role="tablist">
+  <li *ngFor="let m of links" [routerLinkActive]="['active']" class="nav-item">
+    <a routerLink="{{m.path}}" class="nav-link" role="tab" data-toggle="tab" style="cursor:pointer;">
+      {{m.name | translate}}
+    </a>
+  </li>
+</ul>
+
+<div class="tab-content" style="border: 1px solid #ddd; border-top: 0; padding: 1em;">
+  <div class="tab-pane active">
+    <router-outlet></router-outlet>
+  <div>
+</div>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.component.ts
new file mode 100644
index 0000000..aab9a85
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.component.ts
@@ -0,0 +1,36 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component} from '@angular/core';
+import {Router} from '@angular/router';
+
+import {TRANSLATE} from '../core/mdm-core.module';
+
+@Component({
+  selector: 'modules',
+  templateUrl: 'mdm-modules.component.html',
+  providers: []
+})
+export class MDMModulesComponent {
+
+  links = [
+    { name: TRANSLATE('modules.mdm-modules.details'), path: 'details'},
+    { name: TRANSLATE('modules.mdm-modules.mdm-search'), path: 'search'},
+    { name: 'QuickViewer', path: 'quickviewer'},
+    { name: 'X/Y-ChartViewer', path: 'xychartviewer'},
+    { name: TRANSLATE('modules.mdm-modules.file-explorer'), path: 'files'}
+  ];
+  constructor(private router: Router) {}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.module.ts
new file mode 100644
index 0000000..1194a7d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/modules/mdm-modules.module.ts
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+
+import { MDMModulesComponent } from './mdm-modules.component';
+import { MDMModulesRoutingModule } from './mdm-modules-routing.module';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { MDMDetailModule } from '../details/mdm-detail.module';
+import { MDMSearchModule } from '../search/mdm-search.module';
+import { ChartviewerModule } from '../chartviewer/chartviewer.module';
+import { FileExplorerModule} from '../file-explorer/file-explorer.module';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    MDMModulesRoutingModule,
+    MDMDetailModule,
+    MDMSearchModule,
+    ChartviewerModule,
+    FileExplorerModule
+  ],
+  declarations: [
+    MDMModulesComponent
+  ],
+  exports: [
+    MDMModulesComponent,
+  ]
+})
+export class MDMModulesModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view-routing.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view-routing.module.ts
new file mode 100644
index 0000000..a247f55
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view-routing.module.ts
@@ -0,0 +1,35 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { MDMNavigatorViewComponent } from './mdm-navigator-view.component';
+
+const navigatorViewRoutes: Routes = [
+  { path: '', component: MDMNavigatorViewComponent, children: [
+      { path: '', loadChildren: '../modules/mdm-modules.module#MDMModulesModule'}
+    ]}
+];
+
+@NgModule({
+  imports: [
+    RouterModule.forChild(navigatorViewRoutes)
+  ],
+  exports: [
+    RouterModule
+  ]
+})
+export class MDMNavigatorViewRoutingModule {}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.css
new file mode 100644
index 0000000..7ba52f7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.css
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+.panel-body {
+  padding: 0;
+}
+.list-group {
+  margin-bottom: 0;
+}
+.list-group-item {
+  white-space: nowrap;
+}
+.list-group-item:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.list-group-item:last-child {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  border-bottom-style: none;
+}
+
+
+.navigator {
+  position: relative;
+  margin: 0;
+}
+
+.navigator-content {
+  margin-left: 8px;
+  min-height: calc(100vh - 53px);
+  max-height: calc(100vh - 53px);
+  overflow: auto;
+}
+
+.navbar-default {
+    background-color: #f8f8f8;
+    border-color: #e7e7e7!important;
+}
+
+.navigator .navbar {
+  border-radius: 4px;
+  border: 1px solid;
+}
+
+.navigator .navbar-right {
+  position: relative;
+  right: 15px;
+  z-index: 1;
+}
+
+.navigator .navbar-header {
+  position: relative;
+  background-color: #f8f8f8;
+  z-index: 2;
+}
+
+vertical-split-separator {
+  margin: 0;
+  border: none !important;
+}
+
+.navigator .navbar-right > li {
+  text-align: right;
+}
+
+.navigator .navbar-right > li > ul.dropdown-menu {
+  position: absolute;
+  left: -75px !important;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.html
new file mode 100644
index 0000000..0215a8c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.html
@@ -0,0 +1,51 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+  <div class="mainnavigation">
+    <div id="leftsidenav" class="split">
+      <nav class="navigator">
+        <div class="navbar navbar-default container-fluid" style="padding: 0px 5px;">
+          <div class="navbar-header">
+            <a class="navbar-brand" (click)="activate('Navigation')" style="cursor:pointer;">{{ 'navigator-view.mdm-navigator-view.navigator' | translate }}</a>
+          </div>
+          <div>
+            <ul class="nav navbar-nav navbar-right">
+              <li [ngClass]="isDropActive('Dropdown')" title="{{ 'navigator-view.mdm-navigator-view.select-node-provider' | translate }}" dropdown>
+                <a (click)="activate('Dropdown')" class="dropdown-toggle" dropdownToggle aria-haspopup="true" aria-expanded="false" style="cursor:pointer;">
+                  {{activeNodeprovider.name}}
+                  <em class="caret"></em>
+                </a>
+                <ul class="dropdown-menu" *dropdownMenu>
+                  <li *ngFor="let np of getNodeproviders()">
+                    <a class="dropdown-item" (click)="activateNodeProvider(np)" style="cursor:pointer;">
+                      {{np.name}}
+                    </a>
+                  </li>
+                </ul>
+              </li>
+            </ul>
+          </div>
+        </div>
+        <mdm-navigator></mdm-navigator>
+      </nav>
+    </div>
+    <div id="rightsidenav" class="split">
+      <div class="navigator-content" (scroll)=onScroll($event)>
+        <router-outlet></router-outlet>
+        <mdm-basket (onSelect)="updateSelectedNode($event)" [activeNode]=activeNode (onActive)="updateActiveNode($event)"></mdm-basket>
+        <div *ngIf="scrollBtnVisible" style="position: fixed; bottom: 30px; right: 35px;">
+          <button class="btn btn-default" (click)="onScrollTop()" style="z-index: 10000;"><span class="fa fa-arrow-up" style="z-index: 10000;" title="{{ 'navigator-view.mdm-navigator-view.tooltip-scroll-up' | translate }}"></span></button>
+        </div>
+      </div>
+    </div>
+  </div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.ts
new file mode 100644
index 0000000..10f3dc3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.component.ts
@@ -0,0 +1,142 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, ViewEncapsulation, OnInit, OnDestroy, AfterViewInit } from '@angular/core';
+
+import { BsDropdownModule, AccordionConfig, BsDropdownConfig } from 'ngx-bootstrap';
+
+import {NodeService} from '../navigator/node.service';
+import {Node} from '../navigator/node';
+import {NodeproviderService} from '../navigator/nodeprovider.service';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+import Split from 'split.js';
+
+@Component({
+  selector: 'mdm-navigator-view',
+  templateUrl: 'mdm-navigator-view.component.html',
+  styleUrls: [ './mdm-navigator-view.component.css' ],
+  providers: [BsDropdownConfig, AccordionConfig],
+  encapsulation: ViewEncapsulation.None
+})
+export class MDMNavigatorViewComponent implements OnInit, OnDestroy, AfterViewInit {
+
+  selectedNode = new Node;
+  activeNode: Node;
+  closeOther = false;
+
+  activeNodeprovider: any;
+  _comp = 'Navigation';
+  subscription: any;
+
+  div: any;
+  scrollBtnVisible = false;
+
+  split: Split;
+
+  constructor(private nodeProviderService: NodeproviderService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {}
+
+  onScrollTop() {
+    this.div.scrollTop = 0;
+  }
+
+  onScroll(event: any) {
+    if (event.target.scrollTop > 0) {
+      this.scrollBtnVisible = true;
+    } else {
+      this.scrollBtnVisible = false;
+    }
+    this.div = event.target;
+  }
+
+  updateSelectedNode(node: Node) {
+    this.selectedNode = node;
+  }
+  updateActiveNode(node: Node) {
+    this.activeNode = node;
+  }
+  activateNodeProvider(nodeprovider: any) {
+    this.nodeProviderService.setActiveNodeprovider(nodeprovider);
+  }
+
+  getNodeproviders() {
+    return this.nodeProviderService.getNodeproviders();
+  }
+
+  ngOnInit() {
+    this.activeNodeprovider = this.nodeProviderService.getActiveNodeprovider();
+    this.subscription = this.nodeProviderService.nodeProviderChanged
+        .subscribe(
+          np => this.activeNodeprovider = np,
+          error => this.notificationService.notifyError(
+            this.translateService.instant('navigator-view.mdm-navigator-view.err-cannot-update-node-provider'), error)
+    );
+
+  }
+
+  ngAfterViewInit(): void {
+    this.split = Split(['#leftsidenav', '#rightsidenav'], {
+      sizes: [this.initRatio(), this.initRatioRight()],
+      minSize: this.minWidthLeft(),
+      gutterSize: 10,
+      gutterStyle: function (dimension, gutterSize) {
+        return {
+          'width': gutterSize + 'px',
+          'height': (document.getElementById('leftsidenav').clientHeight - 5) + 'px'
+        };
+      },
+    });
+  }
+
+  ngOnDestroy() {
+    this.subscription.unsubscribe();
+  }
+
+  activate(comp: string) {
+    this._comp = comp;
+  }
+
+  isActive(comp: string) {
+    if (comp === this._comp) {
+      return 'active';
+    }
+  }
+
+  isDropActive(comp: string) {
+    if (comp === this._comp) {
+      return 'open ';
+    }
+  }
+
+   minWidthLeft() {
+     return 180;
+   }
+
+   minWidthRight() {
+     return 0.20 * window.innerWidth;
+   }
+
+  initRatio() {
+    return Math.floor(Math.max(250 / window.innerWidth, 0.20) * 100);
+  }
+  initRatioRight() {
+    return 100 - this.initRatio();
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.module.ts
new file mode 100644
index 0000000..6db2fae
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator-view/mdm-navigator-view.module.ts
@@ -0,0 +1,44 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+
+import { MDMNavigatorViewRoutingModule } from './mdm-navigator-view-routing.module';
+
+import { MDMNavigatorViewComponent } from './mdm-navigator-view.component';
+
+import { MDMNavigatorModule } from '../navigator/mdm-navigator.module';
+import { MDMModulesModule } from '../modules/mdm-modules.module';
+import { MDMBasketModule } from '../basket/mdm-basket.module';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    MDMNavigatorViewRoutingModule,
+    MDMNavigatorModule,
+    MDMModulesModule,
+    MDMBasketModule
+  ],
+  declarations: [
+    MDMNavigatorViewComponent
+  ],
+  exports: [
+    MDMNavigatorViewRoutingModule
+  ]
+})
+export class MDMNavigatorViewModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/attribute-value.pipe.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/attribute-value.pipe.ts
new file mode 100644
index 0000000..ed5bef2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/attribute-value.pipe.ts
@@ -0,0 +1,60 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+import { Pipe, PipeTransform } from '@angular/core';

+import { TranslateService } from '@ngx-translate/core';

+import { Observable, of } from 'rxjs';

+import { Attribute, MDMLink, ContextGroup } from '../navigator/node';

+

+@Pipe({name: 'attributeValue'})

+export class AttributeValuePipe implements PipeTransform {

+

+  constructor(private translateService: TranslateService) {}

+

+  transform(attr: Attribute, contextGroup?: ContextGroup) {

+    let display = new Observable<string>();

+

+    if (attr != undefined && attr.value != undefined) {

+

+      const value = contextGroup != undefined ? attr.value[contextGroup] : attr.value;

+

+      if (value != undefined) {

+        switch (attr.dataType) {

+          case 'FILE_LINK':

+            const link: MDMLink = Object.assign(new MDMLink(), value);

+            display = of(link.getFileName());

+            break;

+          case 'FILE_LINK_SEQUENCE':

+            const links = value as MDMLink[];

+            if (links != undefined) {

+              switch (links.length) {

+                case 0:

+                  display = this.translateService.get('navigator.attribute-value.msg-no-files-attached');

+                  break;

+                case 1:

+                  display = this.translateService.get('navigator.attribute-value.msg-one-file-attached');

+                  break;

+                default:

+                  display = this.translateService.get('navigator.attribute-value.msg-x-files-attached', {numberOfFiles: links.length});

+              }

+            }

+            break;

+          default:

+            display = of(value);

+        }

+      }

+    }

+    return display;

+  }

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/defaultnodeprovider.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/defaultnodeprovider.json
new file mode 100644
index 0000000..ffcea4d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/defaultnodeprovider.json
@@ -0,0 +1,40 @@
+{
+	"name" : "Default",
+	"type" : "Environment",
+	"children" : {
+		"type" : "Project",
+		"attribute" : "Name",
+		"query" : "/projects",
+		"children" : {
+			"type" : "Pool",
+			"attribute" : "Name",
+			"query" : "/pools?filter=Project.Id eq \"{Project.Id}\"",
+			"children" : {
+				"type" : "Test",
+				"attribute" : "Name",
+				"query" : "/tests?filter=Pool.Id eq \"{Pool.Id}\"",
+				"children" : {
+					"type" : "TestStep",
+					"attribute" : "Name",
+					"query" : "/teststeps?filter=Test.Id eq \"{Test.Id}\"",
+					"children" : {
+						"type" : "Measurement",
+						"attribute" : "Name",
+						"query" : "/measurements?filter=TestStep.Id eq \"{TestStep.Id}\"",
+						"children" : {
+							"type" : "ChannelGroup",
+							"attribute" : "Name",
+							"query" : "/channelgroups?filter=Measurement.Id eq \"{Measurement.Id}\"",
+							"caption" : "ChannelGroup.Name",
+							"children" : {
+								"type" : "Channel",
+								"attribute" : "Name",
+								"query" : "/channels?filter=ChannelGroup.Id eq \"{ChannelGroup.Id}\""
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.MockNodes.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.MockNodes.ts
new file mode 100644
index 0000000..5c5e1e3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.MockNodes.ts
@@ -0,0 +1,101 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+export const MockEnvNodes = {
+  'type': 'Environment',
+  'data': [
+    {
+      'name': 'Test Environment',
+      'id': 'id1',
+      'type': 'Environment',
+      'sourceType': 'Environment',
+      'sourceName': 'Test Environment',
+      'attributes': [
+        {
+          'name': 'Timezone',
+          'value': 'GMT',
+          'unit': '',
+          'dataType': 'STRING'
+        }
+      ]
+    }
+  ]
+};
+
+export const MockTestNodes = {
+    'type': 'Test',
+    'data': [
+      {
+        'name': 'Test 1',
+        'id': 'id10',
+        'type': 'Test',
+        'sourceType': 'Test',
+        'sourceName': 'Test Environment',
+        'attributes': [
+          {
+            'name': 'DateClosed',
+            'value': '',
+            'unit': '',
+            'dataType': 'DATE'
+          }
+        ]
+      },
+      {
+        'name': 'Test 2',
+        'id': 'id20',
+        'type': 'Test',
+        'sourceType': 'Test',
+        'sourceName': 'Test Environment',
+        'attributes': [
+          {
+            'name': 'DateClosed',
+            'value': '',
+            'unit': '',
+            'dataType': 'DATE'
+          }
+        ]
+      },
+      {
+        'name': 'Test 3',
+        'id': 'id30',
+        'type': 'Test',
+        'sourceType': 'Test',
+        'sourceName': 'Test Environment',
+        'attributes': [
+          {
+            'name': 'DateClosed',
+            'value': '',
+            'unit': '',
+            'dataType': 'DATE'
+          }
+        ]
+      }
+    ]
+};
+
+export const MockNodeProvider = {
+  'name' : 'Channels',
+  'type' : 'Environment',
+  'children' : {
+    'type' : 'Test',
+    'attribute' : 'Name',
+    'query' : '/tests',
+    'children' : {
+      'type' : 'Channel',
+      'attribute' : 'Name',
+      'query' : '/channels?filter=Test.Id eq "{Test.Id}"'
+    }
+  }
+};
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.html
new file mode 100644
index 0000000..f83da77
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.html
@@ -0,0 +1,29 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+<p-contextMenu #cm [model]="contextMenuItems" appendTo="body"></p-contextMenu>
+
+<p-tree class="mdmtree"
+    [value]="nodes"
+    selectionMode="multiple"
+    [(selection)]="selectedNodes"
+    (onNodeExpand)="loadNode($event)"
+    (onNodeSelect)="nodeSelect($event)"
+    [contextMenu]="cm"
+    >
+  <ng-template let-node pTemplate="default">
+        <span [title]="node.label" [id]="getId(node)">{{ node.label }}</span>
+  </ng-template>
+</p-tree>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.spec.ts
new file mode 100644
index 0000000..8443c21
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.spec.ts
@@ -0,0 +1,79 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { DebugElement } from '@angular/core';
+import { By } from '@angular/platform-browser';
+import {Observable} from 'rxjs';
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Node } from './node';
+import { MockEnvNodes, MockNodeProvider } from './mdm-navigator.MockNodes';
+import { NodeService } from './node.service';
+import { NavigatorService } from './navigator.service';
+import { MDMNavigatorComponent } from './mdm-navigator.component';
+/*
+describe ( 'Navigator Tree, navigator component', () => {
+
+    class NodeServiceMock {
+        nodeProviderChanged: Observable<any> = Observable.of(MockNodeProvider);
+
+        getNodes(): Observable<Node[]> { return Observable.of(MockEnvNodes.data); };
+
+        compareNode() { return true; };
+    }
+
+    let fixture: ComponentFixture<MDMNavigatorComponent>;
+    let comp: MDMNavigatorComponent;
+    let de, listElement_span, listElement_a: DebugElement;
+
+    beforeEach(() => {
+        TestBed.configureTestingModule({
+            declarations: [MDMNavigatorComponent,
+                           MDMNodeProviderComponent
+                           ],
+            providers: [NavigatorService],
+            imports: []
+        });
+        TestBed.overrideComponent(MDMNavigatorComponent, {
+            set: {
+                providers: [{provide: NodeService, useClass: NodeServiceMock}]
+            }
+        });
+
+        fixture = TestBed.createComponent(MDMNavigatorComponent);
+        comp = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should show environment Node', () => {
+       expect(comp.nodes).toEqual(MockEnvNodes.data);
+       de = fixture.debugElement.query(By.css('li'));
+       expect(de.nativeElement.textContent).toContain(comp.nodes[0].name);
+    });
+
+    it('should open Node after click and emit active node', () => {
+        listElement_span = fixture.debugElement.query(By.css('span'));
+        listElement_span.nativeElement.click();
+        expect(comp.nodes[0].active).toBeTruthy();
+
+        listElement_a = fixture.debugElement.query(By.css('a'));
+        listElement_a.nativeElement.click();
+        comp.onActive.subscribe(node => {
+            expect(node).toEqual(comp.nodes);
+        });
+     });
+});
+*/
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.ts
new file mode 100644
index 0000000..7b56a98
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.component.ts
@@ -0,0 +1,271 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, OnInit} from '@angular/core';
+import {TreeNode, MenuItem} from 'primeng/primeng';
+
+import {map, tap, startWith, filter, flatMap} from 'rxjs/operators';
+
+import {MDMItem} from '../core/mdm-item';
+import {Node} from '../navigator/node';
+import {NodeService} from '../navigator/node.service';
+import {QueryService} from '../tableview/query.service';
+import {NodeproviderService} from './nodeprovider.service';
+import {NavigatorService} from './navigator.service';
+import {BasketService} from '../basket/basket.service';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+import { streamTranslate, TRANSLATE } from '../core/mdm-core.module';
+import { ActivatedRoute } from '@angular/router';
+import { forkJoin, combineLatest } from 'rxjs';
+
+@Component({
+  selector: 'mdm-navigator',
+  templateUrl: './mdm-navigator.component.html',
+  styles: [
+    '>>>.ui-tree { overflow: auto; max-height: calc(100vh - 7em); min-height: calc(100vh - 7em); '
+    + 'padding: .25em .25em .5em .25em !important; }',
+    '>>>.ui-tree .ui-tree-container { overflow: visible; }'
+  ]
+})
+export class MDMNavigatorComponent implements OnInit {
+
+  AlrtItemTypeNotSupported = 'This node type is not supported by the current view!';
+
+  selectedNodes: TreeNode[] = [];
+  nodes: TreeNode[] = [];
+  lastClickTime = 0;
+
+  loadingNode = <TreeNode>{
+    label: 'Loading subordinate items...',
+    leaf: true,
+    icon: 'fa fa-spinner fa-pulse fa-fw'
+  };
+
+  contextMenuItems: MenuItem[] = [
+    { label: 'Add to shopping basket', icon: 'fa fa-shopping-cart', command: (event) => this.addSelectionToBasket() }
+  ];
+
+  constructor(private nodeService: NodeService,
+    private queryService: QueryService,
+    private basketService: BasketService,
+    private nodeproviderService: NodeproviderService,
+    private navigatorService: NavigatorService,
+    private notificationService: MDMNotificationService,
+    private translateService: TranslateService,
+    private route: ActivatedRoute) {
+  }
+
+  ngOnInit() {
+    streamTranslate(this.translateService, TRANSLATE('navigator.mdm-navigator.loading-subordinate-items')).subscribe(
+            (msg: string) => this.loadingNode.label = msg);
+    streamTranslate(this.translateService, TRANSLATE('navigator.mdm-navigator.add-to-shopping-basket')).subscribe(
+            (msg: string) => this.contextMenuItems[0].label = msg);
+    streamTranslate(this.translateService, TRANSLATE('navigator.mdm-navigator.msg-item-type-not-supported')).subscribe(
+            (msg: string) => this.AlrtItemTypeNotSupported = msg);
+
+    // make sure navigate parameter is handled after nodes are loaded
+    this.loadRootNodes().subscribe(
+        treeNodes => {
+          this.nodes = treeNodes;
+          this.loadNavigateItems().subscribe(selectItems => {
+            this.navigatorService.fireOnOpenInTree(selectItems);
+          });
+        },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('navigator.mdm-navigator.err-cannot-update-navigation-tree'), error)
+    );
+
+    this.nodeproviderService.nodeProviderChanged.subscribe(
+        np => this.reloadTree(),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('navigator.mdm-navigator.err-cannot-update-navigation-tree'), error)
+      );
+
+    this.navigatorService.onOpenInTree
+      .subscribe(
+        items => this.openInTree(items),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('navigator.mdm-navigator.err-cannot-open-node-in-navigation-tree'), error)
+      );
+  }
+
+  loadRootNodes() {
+    return this.nodeService.getRootNodes()
+      .pipe(
+        map(n => n.map(node => this.mapNode(node)))
+      );
+  }
+
+  loadNavigateItems() {
+    return this.route.queryParamMap
+      .pipe(
+          map(params => params.get('navigate')),
+          filter(url => url !== null),
+          flatMap(url => this.nodeService.getNodesByUrl(url)),
+          map(nodes => nodes.map(node => new MDMItem(node.sourceName, node.type, node.id)))
+      );
+  }
+
+  nodeSelect(event) {
+    if (event.node.data) {
+      this.navigatorService.setSelectedItem(event.node.data);
+    }
+    if (event.originalEvent.timeStamp - this.lastClickTime < 300) {
+      if (!event.node.expanded && !event.node.children) {
+        this.loadNode(event);
+      }
+      event.node.expanded = !event.node.expanded;
+    }
+    this.lastClickTime = event.originalEvent.timeStamp;
+  }
+
+  loadNode(event) {
+    if (event.node && event.node.children == undefined && !event.node.leaf) {
+      return this.getChildren(event.node).pipe(
+        startWith([this.loadingNode]),
+        tap(nodes => (nodes && nodes.length === 0) ? event.node.leaf = true : event.node.leaf = false))
+        .subscribe(
+          nodes => event.node.children = nodes,
+          error => this.notificationService.notifyError(
+            this.translateService.instant('navigator.mdm-navigator.err-cannot-load-nodes'), error)
+        );
+    }
+  }
+
+  reloadTree() {
+    this.loadRootNodes()
+      .subscribe(
+        n => this.nodes = n,
+        error => this.notificationService.notifyError(
+          this.translateService.instant('navigator.mdm-navigator.err-cannot-update-navigation-tree'), error)
+      );
+  }
+
+  onFocus(event: { eventName: string, node: TreeNode }) {
+    this.navigatorService.setSelectedItem(event.node.data.item);
+  }
+
+  getNodeClass(item: MDMItem) {
+    return 'icon ' + item.type.toLowerCase();
+  }
+
+  mapNode(node: Node) {
+    let item = new MDMItem(node.sourceName, node.type, node.id);
+    return <TreeNode>{
+      label: node.name,
+      leaf: this.nodeproviderService.getSubNodeprovider(item) == undefined,
+      data: item,
+      icon: this.getNodeClass(item)
+    };
+  }
+
+  getChildren(node: TreeNode) {
+    return this.nodeService.getNodesByUrl(this.nodeproviderService.getQueryForChildren(node.data)).pipe(
+      map(nodes => nodes.map(n => this.mapNode(n))),
+      map(treenodes => treenodes.sort((n1, n2) => n1.label.localeCompare(n2.label))));
+  }
+
+  addSelectionToBasket() {
+    this.basketService.addAll(this.selectedNodes.map(node => <MDMItem>node.data));
+  }
+
+  openInTree(items: MDMItem[]) {
+    this.selectedNodes = [];
+    items.forEach(item => {
+      let pathTypes = this.nodeproviderService.getPathTypes(item.type);
+      if (pathTypes.length === 0) {
+        alert(this.AlrtItemTypeNotSupported);
+      } else {
+        let env = this.nodes.find(e => item.source === e.data.source);
+        env.expanded = true;
+        this.openChildrenRecursive(item, env, pathTypes, 1);
+      }
+    });
+  }
+
+  openChildrenRecursive(item: MDMItem, current: TreeNode, pathTypes: string[], iii: number) {
+    if (current.children) {
+      this.expander(item, current, pathTypes, iii);
+    } else {
+      this.getChildren(current).pipe(
+        startWith([this.loadingNode]),
+        tap(n => current.children = n))
+        .subscribe(
+          () => this.expander(item, current, pathTypes, iii),
+          error => this.notificationService.notifyError(
+            this.translateService.instant('navigator.mdm-navigator.err-cannot-open-node'), error)
+        );
+    }
+  }
+
+  expander(item: MDMItem, current: TreeNode, pathTypes: string[], iii: number) {
+    let expandList: string[] = [];
+    this.nodeService.searchNodes('filter=' + item.type + '.Id eq "' + item.id + '"',
+      item.source, pathTypes[iii])
+      .subscribe(
+        nodes => {
+          expandList = nodes.map(n => n.id);
+          current.children.filter(node => expandList.findIndex(
+            i => node.data ? i === node.data.id : false) > -1
+          )
+          .forEach(node => {
+            if (++iii < pathTypes.length) {
+              node.expanded = true;
+              this.openChildrenRecursive(item, node, pathTypes, iii);
+              this.scrollToSelectionPrimeNgDataTable(node);
+            } else {
+              this.selectedNodes.push(node);
+              let length = this.selectedNodes.length;
+              if (length === 1) {
+                this.nodeService.getNodeFromItem(this.selectedNodes[length - 1].data)
+                    .subscribe(
+                      n => this.navigatorService.setSelectedNode(n),
+                      error => this.notificationService.notifyError(
+                        this.translateService.instant('navigator.mdm-navigator.err-cannot-open-node'), error)
+                    );
+              }
+              this.scrollToSelectionPrimeNgDataTable(node);
+            }
+          });
+        },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('navigator.mdm-navigator.err-cannot-open-node'), error)
+      );
+  }
+
+  /**
+   * PrimeNG does not support scroll to view. This methods implements a
+   * workaround by using HTML element IDs.
+   * @see https://github.com/primefaces/primeng/issues/1278
+   */
+  scrollToSelectionPrimeNgDataTable(node: TreeNode) {
+    let list = document.querySelectorAll('p-tree span#' + this.getId(node));
+
+    if (list && list.length > 0) {
+        list.item(0).scrollIntoView();
+    }
+  }
+
+  getId(node: TreeNode) {
+    if (node && node.data) {
+      return 'node_' + node.data.source + '_' + node.data.type + '_' + node.data.id;
+    } else {
+      return '';
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.module.ts
new file mode 100644
index 0000000..a6a0319
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/mdm-navigator.module.ts
@@ -0,0 +1,34 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+
+import { MDMNavigatorComponent } from './mdm-navigator.component';
+
+@NgModule({
+  imports: [
+    MDMCoreModule
+  ],
+  declarations: [
+    MDMNavigatorComponent
+  ],
+  exports: [
+    MDMNavigatorComponent
+  ]
+})
+export class MDMNavigatorModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/navigator.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/navigator.service.ts
new file mode 100644
index 0000000..a9ec00a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/navigator.service.ts
@@ -0,0 +1,67 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable, Output, EventEmitter} from '@angular/core';
+import {Http, Response, Headers, RequestOptions} from '@angular/http';
+import {Observable} from 'rxjs';
+
+import {MDMItem} from '../core/mdm-item';
+import {Node} from './node';
+import {PropertyService} from '../core/property.service';
+import {NodeService} from './node.service';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+
+@Injectable()
+export class NavigatorService {
+
+  @Output() onOpenInTree = new EventEmitter<MDMItem[]>();
+
+  public selectedNodeChanged: EventEmitter<Node> = new EventEmitter<Node>();
+  private selectedNode: Node;
+
+  constructor(private nodeService: NodeService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+
+  }
+
+  setSelectedNode(node: Node) {
+    this.selectedNode = node;
+    this.fireSelectedNodeChanged(node);
+  }
+
+  fireSelectedNodeChanged(node: Node) {
+    this.selectedNodeChanged.emit(node);
+  }
+
+  setSelectedItem(item: MDMItem) {
+      this.nodeService.getNodeFromItem(item)
+        .subscribe(
+          node => this.setSelectedNode(node),
+          error => this.notificationService.notifyError(this.translateService.instant('navigator.navigator.err-cannot-set-item'), error)
+        );
+  }
+
+  getSelectedNode(): Node {
+    return this.selectedNode;
+  }
+
+  fireOnOpenInTree(items: MDMItem[]) {
+    this.onOpenInTree.emit(items);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/node.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/node.service.ts
new file mode 100644
index 0000000..b7dea7d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/node.service.ts
@@ -0,0 +1,151 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+import {Injectable, EventEmitter} from '@angular/core';
+import {Http, Response, Headers, RequestOptions} from '@angular/http';
+import {Observable} from 'rxjs';
+import {catchError, map} from 'rxjs/operators';
+
+import {MDMItem} from '../core/mdm-item';
+import {Node} from './node';
+import {PropertyService} from '../core/property.service';
+import {PreferenceService, Preference} from '../core/preference.service';
+import {QueryService, Query} from '../tableview/query.service';
+import {HttpErrorHandler} from '../core/http-error-handler';
+import {plainToClass} from 'class-transformer';
+
+@Injectable()
+export class NodeService {
+
+  private _nodeUrl: string;
+
+  static mapSourceNameToName(environments: Node[], sourceName: string) {
+    let env = environments.find(n => n.sourceName === sourceName);
+    return env ? env.name : sourceName;
+  }
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService,
+              private queryService: QueryService,
+              private preferenceService: PreferenceService) {
+      this._nodeUrl = _prop.getUrl('mdm/environments');
+  }
+
+  searchNodes(query, env, type) {
+    return this.http.get(this._nodeUrl + '/' + env + '/' + this.typeToUrl(type) + '?' + query).pipe(
+              map(res => plainToClass(Node, res.json().data)),
+              catchError(this.httpErrorHandler.handleError));
+  }
+
+  searchFT(query, env) {
+    return this.http.get(this._nodeUrl + '/' + env + '/search?q=' + query).pipe(
+              map(res => plainToClass(Node, res.json().data)),
+              catchError(this.httpErrorHandler.handleError));
+  }
+
+  getNodes(node?: Node) {
+    if (node == undefined) {
+      return this.getRootNodes();
+    }
+    return this.getNode(this.getUrl(node));
+  }
+
+  addNode (name: string): Observable<Node> {
+    let body = JSON.stringify({ name });
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+
+    return this.http.post(this._nodeUrl, body, options).pipe(
+                    map(res => plainToClass(Node, res.json().data)[0]),
+                    catchError(this.httpErrorHandler.handleError));
+  }
+
+  deleteNode(node: Node) {
+    return this.http.delete(this.getUrl(node)).pipe(
+      map(res => plainToClass(Node, res.json().data)),
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  compareNode(node1, node2) {
+    if (node1 == undefined || node2 == undefined) { return; }
+    let n1 = node1.name + node1.id + node1.type + node1.sourceName;
+    let n2 = node2.name + node2.id + node2.type + node2.sourceName;
+    if (n1 === n2) { return true; }
+    return false;
+  }
+
+  getRootNodes() {
+    return this.http.get(this._nodeUrl).pipe(
+      map(res => plainToClass(Node, res.json().data)),
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  getNodeFromItem(mdmItem: MDMItem) {
+    if (mdmItem.type === 'Environment') {
+      return this.getNode(this._nodeUrl + '/' + mdmItem.source).pipe(
+        map(nodes => (nodes && nodes.length > 0) ? nodes[0] : undefined));
+    } else {
+      return this.getNode(this._nodeUrl + '/' + mdmItem.source + '/' + this.typeToUrl(mdmItem.type) + '/' + mdmItem.id).pipe(
+        map(nodes => (nodes && nodes.length > 0) ? nodes[0] : undefined));
+    }
+  }
+
+  getNodesFromItem(mdmItem: MDMItem) {
+    return this.getNode(this._nodeUrl + '/' + mdmItem.source + '/' + this.typeToUrl(mdmItem.type) + '/' + mdmItem.id).pipe(
+      map(nodes => (nodes && nodes.length > 0) ? nodes[0] : undefined));
+  }
+
+  typeToUrl(type: string) {
+    switch (type) {
+      case 'StructureLevel':
+        return 'pools';
+      case 'MeaResult':
+        return 'measurements';
+      case 'SubMatrix':
+        return 'channelgroups';
+      case 'MeaQuantity':
+        return 'channels';
+      case 'Quantity':
+        return 'quantities';
+      default:
+        return type.toLowerCase() + 's';
+    }
+  }
+
+  getNode(url: string) {
+    return this.http.get(url).pipe(
+      map(res => plainToClass(Node, res.json().data)),
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+  getNodesByUrl(url: string) {
+    // return this.http.get(this._nodeUrl + url).pipe(
+    //   map(res => plainToClass(Node, res.json().data)),
+    //   catchError(this.httpErrorHandler.handleError));
+    return this.getNode(this._nodeUrl + url);
+  }
+
+  getNodesByAbsoluteUrl(url: string) {
+    return this.getNode(url);
+  }
+
+  getNodeByRelation(sourceName: string, type: string, id: string) {
+    return this.getNode(this._nodeUrl + '/' + sourceName + '/' + this.typeToUrl(type) + '/' + id);
+  }
+
+  private getUrl(node: Node) {
+    return this._nodeUrl + '/' + node.sourceName + '/' + node.type + '/' + node.id;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/node.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/node.ts
new file mode 100644
index 0000000..f97e60d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/node.ts
@@ -0,0 +1,97 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Type } from 'class-transformer';
+
+export enum ContextGroup {
+  ORDERED = 0,
+  MEASURED = 1
+}
+
+export class Attribute {
+  name: string;
+  unit: string;
+  dataType: string;
+  value: string | string [] | MDMLink | MDMLink[] | MDMLink[][];
+  sortIndex?: number;
+  readOnly?: boolean;
+  mandatory?: boolean;
+  description?: string;
+}
+
+export class MergedSensorAttribute {
+  name: string[];
+  unit: string[];
+  dataType: string[];
+  value: (string | MDMLink | MDMLink[])[];
+}
+
+export class MDMLink {
+  remotePath: string;
+  mimeType: string;
+  description: string;
+  size: string;
+
+  public getFileName() {
+    let fileName = '';
+    if (this.remotePath != undefined) {
+      const index = this.remotePath.lastIndexOf('/') + 1;
+      fileName = this.remotePath.substring(index);
+    }
+    return fileName;
+  }
+}
+
+export class FileSize {
+  remotePath: string;
+  size: string;
+}
+
+export class Relation {
+  name: string;
+  type: string;
+  entityType: string;
+  contextType: string;
+  ids: string[];
+  parentId: string;
+}
+
+export class Node {
+  name: string;
+  id: string;
+  type: string;
+  sourceType: string;
+  sourceName: string;
+  @Type(() => Attribute)
+  attributes: (Attribute)[];
+  @Type(() => Relation)
+  relations: Relation[];
+  active: boolean;
+
+  getClass() {
+    switch (this.type) {
+      case 'StructureLevel':
+        return 'pool';
+      case 'MeaResult':
+        return 'measurement';
+      case 'SubMatrix':
+        return 'channelgroup';
+      case 'MeaQuantity':
+        return 'channel';
+      default:
+        return this.type.toLowerCase();
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider.service.spec.ts
new file mode 100644
index 0000000..3f0697c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider.service.spec.ts
@@ -0,0 +1,84 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { HttpModule } from '@angular/http';
+import { TestBed, inject } from '@angular/core/testing';
+
+import { TranslateModule } from '@ngx-translate/core';
+import { of as observableOf,  Observable } from 'rxjs';
+
+import { PropertyService } from '../core/property.service';
+import { NodeproviderService } from './nodeprovider.service';
+import { NodeService } from '../navigator/node.service';
+import { PreferenceService, Preference } from '../core/preference.service';
+import { MDMNotificationService } from '../core/mdm-notification.service';
+import { QueryService } from '../tableview/query.service';
+import { MDMItem } from '../core/mdm-item';
+import { HttpErrorHandler } from '../core/http-error-handler';
+
+declare function require(path: string): any;
+const defaultNodeProvider = require('../navigator/defaultnodeprovider.json');
+
+class TestPreferenceService {
+  getPreferenceForScope( scope: string, key?: string ): Observable<Preference[]> {
+    let p = new Preference();
+    p.value = JSON.stringify(defaultNodeProvider);
+    return observableOf([p]);
+  }
+}
+
+describe ( 'NodeproviderService', () => {
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        HttpModule,
+        TranslateModule.forRoot(),
+      ],
+      providers: [
+        PropertyService,
+        {
+          provide: PreferenceService,
+          useClass: TestPreferenceService
+        },
+        NodeproviderService,
+        MDMNotificationService,
+        QueryService,
+        HttpErrorHandler,
+        NodeService]
+    });
+  });
+
+  it('getSubNodeprovider', inject([NodeproviderService], (nodeproviderService) => {
+      let item = new MDMItem('MDMNVH', 'Project', 'id1');
+      let query = nodeproviderService.getSubNodeprovider(item);
+
+      expect(query).toEqual('/pools?filter=Project.Id eq "{Project.Id}"');
+  }));
+
+  it('getSubNodeprovider not found', inject([NodeproviderService], (nodeproviderService) => {
+      let item = new MDMItem('MDMNVH', 'xxx', 'id1');
+      let query = nodeproviderService.getSubNodeprovider(item, defaultNodeProvider);
+
+      expect(query).toEqual(undefined);
+  }));
+
+  it('replace', inject([NodeproviderService], (nodeproviderService) => {
+      let item = new MDMItem('MDMNVH', 'Project', 'id1');
+      let query = nodeproviderService.replace('/pools?filter=Project.Id eq "{Project.Id}"', item);
+
+      expect(query).toEqual('/MDMNVH/pools?filter=Project.Id eq "id1"');
+  }));
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider.service.ts
new file mode 100644
index 0000000..5ba4f4b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider.service.ts
@@ -0,0 +1,122 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable, EventEmitter} from '@angular/core';
+import {Http} from '@angular/http';
+import {map} from 'rxjs/operators';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+import {PreferenceService, Scope} from '../core/preference.service';
+import {QueryService} from '../tableview/query.service';
+import {PropertyService} from '../core/property.service';
+import {MDMItem} from '../core/mdm-item';
+
+import { TranslateService } from '@ngx-translate/core';
+import { TRANSLATE } from '../core/mdm-core.module';
+
+declare function require(path: string): any;
+const defaultNodeProvider = require('./defaultnodeprovider.json');
+
+@Injectable()
+export class NodeproviderService {
+
+  public nodeProviderChanged: EventEmitter<any> = new EventEmitter<any>();
+  private nodeproviders = [defaultNodeProvider];
+
+  private activeNodeprovider: any = this.nodeproviders[0];
+
+  constructor(private http: Http,
+              private _prop: PropertyService,
+              private queryService: QueryService,
+              private preferenceService: PreferenceService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+      this.loadNodeproviders();
+  }
+
+  setActiveNodeprovider(nodeprovider: any) {
+    this.activeNodeprovider = nodeprovider;
+    this.nodeProviderChanged.emit(this.activeNodeprovider);
+  }
+
+  getActiveNodeprovider() {
+    return this.activeNodeprovider;
+  }
+
+  getNodeproviders() {
+    return this.nodeproviders;
+  }
+
+  loadNodeproviders() {
+   this.preferenceService.getPreferenceForScope(Scope.SYSTEM, 'nodeprovider.').pipe(
+      map(prefs => prefs.map(p => JSON.parse(p.value))))
+      .subscribe(
+        nodeproviders => this.setNewNodeproviders(nodeproviders),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('navigator.nodeprovider.err-cannot-load-node-provider-from-settings'), error)
+      );
+  }
+
+  setNewNodeproviders(nodeproviders) {
+    this.nodeproviders = nodeproviders;
+    this.nodeproviders.unshift(defaultNodeProvider);
+  }
+
+  getQueryForChildren(item: MDMItem) {
+    return this.replace(this.getSubNodeprovider(item), item);
+  }
+
+  getSubNodeprovider(item: MDMItem) {
+    let current = this.activeNodeprovider;
+    do {
+      if (current.type === item.type && current.children) {
+        return current.children.query;
+      } else {
+        current = current.children;
+      }
+    }
+    while (current);
+
+    return current;
+  }
+
+replace(query: string, item: MDMItem) {
+    return '/' + item.source + query.replace(/{(\w+)\.(\w+)}/g, function(match, type, attr) {
+
+      if (type !== item.type) {
+        this.notificationService.notifyWarn(
+          this.translateService.instant(TRANSLATE('navigator.nodeprovider.err-unsupported-type'),
+          <any>{'type': type, 'typeToUse': item.type}));
+      }
+
+      if (attr === 'Id') {
+        return item.id;
+      }
+    });
+}
+
+  getPathTypes(type: string): string[] {
+    let current = this.activeNodeprovider;
+    let ancestorList: string[] = [];
+    while (current) {
+        ancestorList.push(current.type);
+        if (current.type === type) {
+          return ancestorList;
+        }
+        current = current.children;
+   }
+    return [];
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider2.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider2.json
new file mode 100644
index 0000000..8db3731
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/navigator/nodeprovider2.json
@@ -0,0 +1,14 @@
+{
+  "name" : "Channels",
+  "type" : "Environment",
+  "children" : {
+    "type" : "Test",
+    "attribute" : "Name",
+    "query" : "/tests",
+    "children" : {
+      "type" : "Channel",
+      "attribute" : "Name",
+      "query" : "/channels?filter=Test.Id eq \"{Test.Id}\""
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/notice.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/notice.component.ts
new file mode 100644
index 0000000..84324e6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/notice.component.ts
@@ -0,0 +1,25 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'notice',
+  templateUrl: './NOTICE.html',
+  styles: ['pre { overflow-y: scroll; height: 400px; }']
+})
+export class NoticeComponent {
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/edit-searchFields.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/edit-searchFields.component.html
new file mode 100644
index 0000000..15cad3e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/edit-searchFields.component.html
@@ -0,0 +1,105 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+
+<style>
+  .modal-body >>> .dropup .dropdown-menu {
+    margin-bottom: 38px !important;
+  }
+
+  .modal-body >>> .ui-tree .ui-tree-container {
+    margin: 0 0 4px 0 !important;
+    width: 100%;
+    overflow: visible;
+  }
+
+  .modal-body >>> .ui-tree {
+    min-height: 50vh !important;
+    max-height: 76vh !important;
+    overflow: auto;
+  }
+
+  .modal-body >>> .ui-tree .ui-treenode .ui-treenode-content .ui-treenode-label {
+    padding-right: .75em;
+  }
+
+  .auto-width-typeahead >>> typeahead-container {
+    width: auto!important;
+  }
+</style>
+<div bsModal #lgEditSearchFieldsModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="SelectSearchComponents" aria-hidden="true">
+  <div class="modal-dialog modal-lg">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h4 class="modal-title">{{ 'search.edit-searchfields.title-search-field-editor' | translate }}</h4>
+        <button type="button" title="{{ 'search.edit-searchfields.tooltip-close' | translate }}" class="close" (click)="childModal.hide()" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+      </div>
+      <div class="modal-body">
+        <div class="container-fluid">
+          <div class="row">
+            <div class="col-md-4 auto-width-typeahead" style="min-height: 50vh; max-height: 77vh;">
+              <input [(ngModel)]="selectedSearchAttribute" [typeahead]="typeAheadValues"
+                  (typeaheadOnSelect)="typeaheadOnSelect($event)"
+                  typeaheadOptionField="label"
+                  typeaheadGroupField="group"
+                  typeaheadOptionsLimit="15"
+                  placeholder="{{ 'search.edit-searchfields.enter-search-text' | translate }}"
+                  class="form-control"
+                  style="margin-bottom: 15px;">
+              <searchattribute-tree [searchAttributes]="searchAttributes" [environments]="environments"></searchattribute-tree>
+            </div>
+            <div class="col-md-8" style="min-height: 50vh; max-height: 77vh; overflow-y:auto;">
+              <label for="search-source" class="col-form-label" style="padding: 8px 0 15px 0;">{{ 'search.edit-searchfields.lbl-selected-search-attributes' | translate }}</label>
+              <div *ngIf="layout.getSourceNames().length === 0" style="text-align: center;">
+                {{ 'search.edit-searchfields.no-search-attributes-selected' | translate }}
+              </div>
+              <div *ngFor="let env of layout.getSourceNames()">
+              <div *ngIf="layout.getConditions(env).length > 0">
+                <span style="font-weight: bold;">{{mapSourceNameToName(env)}}</span>
+                <table class="table table-bordered searchdefinition">
+                  <colgroup>
+                    <col style="width: 44%;">
+                    <col style="width: 44%;">
+                    <col style="width: 4%;">
+                    <col style="width: 4%;">
+                    <col style="width: 4%;">
+                  </colgroup>
+                  <tr *ngFor="let condition of layout.getConditions(env)">
+                    <td>{{condition?.type}}</td>
+                    <td>{{condition?.attribute}}</td>
+                    <td style="width: 30px; text-align: center; vertical-align: middle;">
+                      <span class="fa fa-chevron-up" [ngStyle]="{'visibility': isFirst(condition) ? 'hidden': 'visible'}" style="cursor: pointer; margin-bottom: 0;" (click)="moveUp(condition)"></span>
+                    </td>
+                    <td style="width: 30px; text-align: center; vertical-align: middle;">
+                      <span class="fa fa-chevron-down" [ngStyle]="{'visibility': isLast(condition)? 'hidden': 'visible'}" style="cursor: pointer;" (click)="moveDown(condition)"></span>
+                    </td>
+                    <td style="text-align: center;"><span class="fa fa-times" style="cursor: pointer" title="{{ 'search.edit-searchfields.remove' | translate }}" (click)="removeCondition(condition)"></span></td>
+                  </tr>
+                </table>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="row" style="margin-top: 15px;">
+          <div class="col-md-12">
+            <button type="button" class="btn btn-default pull-right" (click)="addSearchFields()" [disabled]="conditions.length === 0">
+              <span class="fa fa-check"></span> {{ 'search.edit-searchfields.btn-apply-changes' | translate }}
+            </button>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/edit-searchFields.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/edit-searchFields.component.ts
new file mode 100644
index 0000000..3d22299
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/edit-searchFields.component.ts
@@ -0,0 +1,209 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, ViewChild, Input, Output, EventEmitter, OnChanges, SimpleChanges, OnInit} from '@angular/core';
+
+import {SearchAttribute, SearchLayout} from './search.service';
+import {FilterService, Condition, Operator} from './filter.service';
+import {NodeService} from '../navigator/node.service';
+
+import {Node} from '../navigator/node';
+import {SearchattributeTreeComponent} from '../searchattribute-tree/searchattribute-tree.component';
+
+import {TypeaheadMatch} from 'ngx-bootstrap/typeahead';
+import {ModalDirective} from 'ngx-bootstrap';
+import {TreeNode} from 'primeng/primeng';
+import {MDMNotificationService} from '../core/mdm-notification.service';
+import {classToClass} from 'class-transformer';
+
+import { TranslateService } from '@ngx-translate/core';
+
+export class SearchField {
+  group: string;
+  attribute: string;
+
+  constructor(group?: string, attribute?: string) {
+    this.group = group || '';
+    this.attribute = attribute || '';
+  }
+
+  equals(searchField: SearchField) {
+    return (searchField.group === this.group && searchField.attribute === this.attribute);
+  }
+}
+
+@Component({
+  selector: 'edit-searchFields',
+  templateUrl: 'edit-searchFields.component.html',
+})
+export class EditSearchFieldsComponent implements OnChanges, OnInit {
+
+  @ViewChild('lgEditSearchFieldsModal') public childModal: ModalDirective;
+  @ViewChild(SearchattributeTreeComponent) tree: SearchattributeTreeComponent;
+
+  @Input() environments: Node[];
+  @Input() searchAttributes: { [env: string]: SearchAttribute[] } = {};
+  typeAheadValues: { label: string, group: string, attribute: SearchAttribute }[] = [];
+
+  @Output()
+  conditionsSubmitted = new EventEmitter<Condition[]>();
+
+  layout: SearchLayout = new SearchLayout;
+  conditions: Condition[] = [];
+  selectedSearchAttribute: SearchAttribute;
+
+  subscription: any;
+
+  constructor(private filterService: FilterService,
+    private notificationService: MDMNotificationService,
+    private translateService: TranslateService) { }
+
+  ngOnInit() {
+    this.tree.onNodeSelect$.subscribe(
+          node => this.nodeSelect(node),
+          error => this.notificationService.notifyError(
+            this.translateService.instant('search.edit-searchfields.err-cannot-update-selected-node'), error)
+        );
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    if (changes['searchAttributes'] || changes['environments']) {
+      let ar = Object.keys(this.searchAttributes)
+          .map(env => this.searchAttributes[env])
+          .reduce((acc, value) => acc.concat(value), <SearchAttribute[]> [])
+          .map(sa => { return { 'label': sa.boType + '.' + sa.attrName, 'group': sa.boType, 'attribute': sa }; });
+
+      this.typeAheadValues = this.uniqueBy(ar, p => p.label);
+    }
+    if (changes['environments']) {
+      this.conditionUpdated();
+    }
+  }
+
+  show(conditions?: Condition[]) {
+    if (conditions) {
+      this.conditions = classToClass(conditions);
+    } else {
+      this.conditions = [];
+    }
+    this.conditionUpdated();
+    this.childModal.show();
+    return this.conditionsSubmitted;
+  }
+
+  conditionUpdated() {
+    let envs = (this.environments || []).map(node => node.sourceName);
+    this.layout = SearchLayout.createSearchLayout(envs, this.searchAttributes, this.conditions);
+  }
+
+  nodeSelect(node: TreeNode) {
+    if (node && node.type === 'attribute') {
+      let sa = <SearchAttribute>node.data;
+      this.pushCondition(new Condition(sa.boType, sa.attrName, Operator.EQUALS, [], sa.valueType));
+      this.conditionUpdated();
+    }
+  }
+
+  removeCondition(condition: Condition) {
+    let index = this.conditions.findIndex(c => condition.type === c.type && condition.attribute === c.attribute);
+    this.conditions.splice(index, 1);
+    this.conditionUpdated();
+  }
+
+  addSearchFields() {
+    this.childModal.hide();
+    this.conditionsSubmitted.emit(this.conditions);
+  }
+
+  public typeaheadOnSelect(match: TypeaheadMatch) {
+    this.pushCondition(new Condition(match.item.attribute.boType,
+      match.item.attribute.attrName, Operator.EQUALS, [], match.item.attribute.valueType));
+    this.conditionUpdated();
+    this.selectedSearchAttribute = undefined;
+  }
+
+  pushCondition(condition: Condition) {
+    if (this.conditions.find(c => condition.type === c.type && condition.attribute === c.attribute)) {
+      this.notificationService.notifyInfo(this.translateService.instant('search.edit-searchfields.search-field-already-selected'), 'Info');
+    } else {
+      this.conditions.push(condition);
+      this.conditionUpdated();
+    }
+  }
+
+  mapSourceNameToName(sourceName: string) {
+    return NodeService.mapSourceNameToName(this.environments, sourceName);
+  }
+
+  isLast(col: Condition) {
+    let sourceName = this.layout.getSourceName(col);
+    if (sourceName) {
+      let conditionsInSameSource = this.layout.getConditions(sourceName);
+      return conditionsInSameSource.indexOf(col) === conditionsInSameSource.length - 1;
+    }
+  }
+
+  isFirst(col: Condition) {
+    let sourceName = this.layout.getSourceName(col);
+    if (sourceName) {
+      let conditionsInSameSource = this.layout.getConditions(sourceName);
+      return conditionsInSameSource.indexOf(col) === 0;
+    }
+  }
+
+  moveUp(condition: Condition) {
+    if (!this.isFirst(condition)) {
+      let sourceName = this.layout.getSourceName(condition);
+      if (sourceName) {
+        let conditionsInSameSource = this.layout.getConditions(sourceName);
+
+        let oldIndex = conditionsInSameSource.indexOf(condition);
+        let otherCondition = conditionsInSameSource[oldIndex - 1];
+        this.swap(condition, otherCondition);
+      }
+    }
+  }
+
+  moveDown(condition: Condition) {
+    if (!this.isLast(condition)) {
+      let sourceName = this.layout.getSourceName(condition);
+      if (sourceName) {
+        let conditionsInSameSource = this.layout.getConditions(sourceName);
+
+        let oldIndex = conditionsInSameSource.indexOf(condition);
+        let otherCondition = conditionsInSameSource[oldIndex + 1];
+        this.swap(condition, otherCondition);
+      }
+    }
+  }
+
+  private swap(condition1: Condition, condition2: Condition) {
+    let index1 = this.conditions.findIndex(c => c.type === condition1.type && c.attribute === condition1.attribute);
+    let index2 = this.conditions.findIndex(c => c.type === condition2.type && c.attribute === condition2.attribute);
+
+    let tmp = this.conditions[index1];
+    this.conditions[index1] = this.conditions[index2];
+    this.conditions[index2] = tmp;
+    this.conditionUpdated();
+  }
+
+  private uniqueBy<T>(a: T[], key: (T) => any) {
+    let seen = {};
+    return a.filter(function(item) {
+      let k = key(item);
+      return seen.hasOwnProperty(k) ? false : (seen[k] = true);
+    });
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/filter.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/filter.service.spec.ts
new file mode 100644
index 0000000..d834036
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/filter.service.spec.ts
@@ -0,0 +1,106 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { HttpModule } from '@angular/http';
+import { TestBed, async, inject } from '@angular/core/testing';
+
+import { of as observableOf,  Observable } from 'rxjs';
+
+import { PreferenceService, Preference, Scope } from '../core/preference.service';
+import { PropertyService } from '../core/property.service';
+import { Operator, OperatorUtil, FilterService, SearchFilter } from './filter.service';
+
+class TestPreferenceService {
+  getPreferenceForScope(scope: string, key?: string): Observable<Preference[]> {
+    return observableOf([
+    {
+      id: 1,
+      key: 'filter.nodes.test',
+      scope: Scope.USER,
+      source: null,
+      user: 'testUser',
+      value: '{"conditions":[],"name":"TestFilter","environments":[],"resultType":"Test","fulltextQuery":""}'
+    }
+  ]);
+  }
+}
+
+describe('OperatorUtil', () => {
+
+  describe('toString()', () => {
+    it('should return associated string', () => {
+      expect(OperatorUtil.toString(Operator.EQUALS)).toMatch('=');
+      expect(OperatorUtil.toString(Operator.LESS_THAN)).toMatch('<');
+      expect(OperatorUtil.toString(Operator.GREATER_THAN)).toMatch('>');
+      expect(OperatorUtil.toString(Operator.LIKE)).toMatch('like');
+    });
+  });
+
+  describe('toFilterString()', () => {
+    it('should return associated filterstring', () => {
+      expect(OperatorUtil.toFilterString(Operator.EQUALS)).toMatch('eq');
+      expect(OperatorUtil.toFilterString(Operator.LESS_THAN)).toMatch('lt');
+      expect(OperatorUtil.toFilterString(Operator.GREATER_THAN)).toMatch('gt');
+      expect(OperatorUtil.toFilterString(Operator.LIKE)).toMatch('lk');
+    });
+  });
+});
+
+describe('FilterService', () => {
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [
+        FilterService,
+        PropertyService,
+        {
+          provide: PreferenceService,
+          useClass: TestPreferenceService
+        },
+      ]
+    });
+
+  });
+
+  describe('getFilters()', () => {
+
+    it('should return array of filters from preference',  async(inject([FilterService], (service) => {
+      let filters = [new SearchFilter('TestFilter', [], 'Test', '', [])];
+
+      service.getFilters().subscribe(f => expect(f).toEqual(filters));
+    })));
+  });
+
+  describe('filterToPreference()', () => {
+
+    it('should return preference holding input filter',  async(inject([FilterService], (service) => {
+      let filter = new SearchFilter('TestFilter', [], 'Test', '', []);
+      let pref = service.filterToPreference(filter);
+
+      expect(pref.scope).toEqual(Scope.USER);
+      expect(pref.key).toMatch('filter.nodes.TestFilter');
+      expect(pref.value).toEqual('{"conditions":[],"name":"TestFilter","environments":[],"resultType":"Test","fulltextQuery":""}');
+    })));
+
+    it('should return preference holding input filter',  async(inject([FilterService], (service) => {
+      let pref = service.filterToPreference(undefined);
+
+      expect(pref.scope).toEqual(Scope.USER);
+      expect(pref.key).toMatch('filter.nodes.');
+      expect(pref.value).toEqual(undefined);
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/filter.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/filter.service.ts
new file mode 100644
index 0000000..64bef6b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/filter.service.ts
@@ -0,0 +1,140 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable} from '@angular/core';
+import {Http} from '@angular/http';
+import {map} from 'rxjs/operators';
+
+import {PropertyService} from '../core/property.service';
+import {PreferenceService, Preference, Scope} from '../core/preference.service';
+import {Exclude, serialize, deserialize} from 'class-transformer';
+import { TRANSLATE } from '../core/mdm-core.module';
+
+export enum Operator {
+  EQUALS,
+  LESS_THAN,
+  GREATER_THAN,
+  LIKE
+}
+
+export namespace OperatorUtil {
+  export function values() {
+    return [ Operator.EQUALS, Operator.LESS_THAN, Operator.GREATER_THAN, Operator.LIKE ];
+  }
+  export function toString(operator: Operator) {
+      switch (operator) {
+          case Operator.EQUALS:
+            return '=';
+          case Operator.LESS_THAN:
+            return '<';
+          case Operator.GREATER_THAN:
+            return '>';
+          case Operator.LIKE:
+            return 'like';
+          default:
+            return undefined;
+      }
+  }
+  export function toFilterString(operator: Operator) {
+      switch (operator) {
+          case Operator.EQUALS:
+            return 'eq';
+          case Operator.LESS_THAN:
+            return 'lt';
+          case Operator.GREATER_THAN:
+            return 'gt';
+          case Operator.LIKE:
+            return 'lk';
+          default:
+            return undefined;
+      }
+  }
+}
+
+export class Condition {
+  type: string;
+  attribute: string;
+  operator: Operator;
+  value: string[];
+  valueType: string;
+
+  @Exclude()
+  sortIndex: number;
+
+  constructor(type: string, attribute: string, operator: Operator, value: string[], valueType?: string) {
+    this.type = type;
+    this.attribute = attribute;
+    this.operator = operator;
+    this.value = value;
+    if (valueType) {
+      this.valueType = valueType.toLowerCase();
+    } else {
+      this.valueType = 'string';
+    }
+  }
+}
+
+export class SearchFilter {
+  name: string;
+  environments: string[];
+  resultType: string;
+  fulltextQuery: string;
+  conditions: Condition[] = [];
+
+  constructor(name: string, environments: string[], resultType: string, fulltextQuery: string, conditions: Condition[]) {
+    this.name = name;
+    this.environments = environments;
+    this.resultType = resultType;
+    this.fulltextQuery = fulltextQuery;
+    this.conditions = conditions;
+  }
+}
+
+@Injectable()
+export class FilterService {
+  public readonly NO_FILTER_NAME = TRANSLATE('search.filter.no-filter-selected');
+  public readonly NEW_FILTER_NAME = TRANSLATE('search.filter.new-filter');
+  public readonly EMPTY_FILTER: SearchFilter = new SearchFilter(this.NO_FILTER_NAME, [], 'Test', '', []);
+
+  constructor(private http: Http,
+              private _prop: PropertyService,
+              private preferenceService: PreferenceService) {
+  }
+
+  getFilters() {
+    return this.preferenceService.getPreferenceForScope(Scope.USER, 'filter.nodes.').pipe(
+      map(preferences => preferences.map(p => this.preferenceToFilter(p))));
+  }
+
+  saveFilter(filter: SearchFilter) {
+    return this.preferenceService.savePreference(this.filterToPreference(filter));
+  }
+
+  private preferenceToFilter(pref: Preference) {
+    return deserialize(SearchFilter, pref.value);
+  }
+
+  private filterToPreference(filter: SearchFilter) {
+    let pref = new Preference();
+    pref.value = serialize(filter);
+    pref.key = filter ? 'filter.nodes.' + filter.name : 'filter.nodes.';
+    pref.scope = Scope.USER;
+    return pref;
+  }
+
+  deleteFilter(name: string) {
+    return this.preferenceService.deletePreferenceByScopeAndKey(Scope.USER, 'filter.nodes.' + name);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.component.html
new file mode 100644
index 0000000..5252208
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.component.html
@@ -0,0 +1,192 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<style>
+#searchtext .form-control, #searchtext .btn {
+    border-color: #000000;
+    outline: 0;
+    box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 0, 0,.6);
+}
+
+/* :host /deep/ .ui-multiselect .ui-multiselect-label {
+  padding: .25em 2em .25em .25em;
+} */
+</style>
+
+<div class="container" style="padding: 0;">
+  <div class="row">
+    <div class="col-sm">
+      <label for="search-source" class="col-form-label">{{ 'search.mdm-search.lbl-search-filter' | translate }}</label>
+      <p-dropdown [options]="filters" optionLabel="name" (onChange)="onFilterChange($event)" [style]="{'width': '100%'}"></p-dropdown>
+    </div>
+    <div class="col-sm">
+      <label for="search-source" class="col-form-label">{{ 'search.mdm-search.lbl-source' | translate }}</label>
+      <p-multiSelect [options]="dropdownModel" maxSelectedLabels=2 [(ngModel)]="selectedEnvs" (onChange)="selectedEnvironmentsChanged()" title="{{ 'search.mdm-search.tooltip-select-sources' | translate }}" [style]="{'width': '100%'}"></p-multiSelect>
+    </div>
+    <div class="col-sm">
+      <label for="search-resulttype" class="col-form-label">{{ 'search.mdm-search.lbl-result-type' | translate }}</label>
+      <p-dropdown [options]="definitions" optionLabel="label" (onChange)="onResultTypeChane($event)" [style]="{'width': '100%'}"></p-dropdown>
+    </div>
+  </div>
+  <div class="row" style="margin-top: 5px; margin-bottom: 10px;">
+    <div class="col-sm input-group" id="searchtext" style="width:100%">
+      <input type="text" class="form-control" name="searchText" placeholder="{{ 'search.mdm-search.enter-search-text' | translate }}" [(ngModel)]="currentFilter.fulltextQuery" (keyup.enter)="onSearch()" aria-describedby="basic-addon1" 
+        title="{{ 'search.mdm-search.tooltip-search-text' | translate }}">
+      <div class="input-group-append">
+        <button type="button" class="btn btn-mdm-no-margin" (click)="onSearch()">{{ 'search.mdm-search.btn-search' | translate }}</button>
+      </div>
+    </div>
+  </div>
+</div>
+
+<accordion>
+  <accordion-group id="advancedSearch" [isOpen]="isAdvancedSearchOpen" #advancedSearch [ngClass]="{'greyed': !isAdvancedSearchActive}">
+    <div accordion-heading class="thinheader container-fluid">
+      <div class="row">
+        <div class="col text-left">
+          <input type="checkbox" [(ngModel)]="isAdvancedSearchActive" (click)="onCheckBoxClick($event)" title="{{ getAdvancedSearchCbxTitle() | translate }}"/> &nbsp;{{ 'search.mdm-search.lbl-advanced-search' | translate }} &nbsp;&nbsp;
+          <button type="button" title="{{ 'search.mdm-search.tooltip-create-new-search-filter' | translate }}" class="btn btn-mdm" (click)="showSearchFieldsEditor($event)" [disabled]=!isAdvancedSearchActive><span class="fa fa-plus"></span></button>
+          <button type="button" title="{{ 'search.mdm-search.tooltip-edit-search-filter' | translate }}" class="btn btn-mdm" (click)="showSearchFieldsEditor($event,currentFilter.conditions)" [disabled]=!isAdvancedSearchActive><span class="fa fa-pencil-square-o"></span></button>
+          <button type="button" class="btn btn-mdm" (click)="showSaveModal($event)" title="{{ 'search.mdm-search.tooltip-save-search-filter' | translate }}" [disabled]=!isAdvancedSearchActive><span class="fa fa-floppy-o"></span></button>
+          <button type="button" class="btn btn-mdm" (click)="deleteFilter($event)" title="{{ 'search.mdm-search.tooltip-delete-search-filter' | translate }}"><span class="fa fa-times"></span></button>
+        </div>
+        <div class="col text-right">
+          <button type="button" class="btn btn-mdm" (click)="resetConditions($event)" title="{{ 'search.mdm-search.tooltip-reset-search-conditions' | translate }}" [disabled]=!isAdvancedSearchActive><span class="fa fa-eraser"></span></button>
+          <span class="fa" style="color: #333 !important; padding-left: 15px;" [ngClass]="{'fa-chevron-down': advancedSearch?.isOpen, 'fa-chevron-right': !advancedSearch?.isOpen}"></span>
+        </div>
+      </div>
+    </div>
+    <div class="container-fluid">
+      <div class="row">
+        <div class="col-md-12">
+          <div *ngIf="layout.getSourceNames().length === 0" style="text-align: center; margin-bottom: 5px;">
+            {{ 'search.mdm-search.no-search-attributes-selected' | translate }}
+          </div>
+          <div *ngFor="let env of layout.getSourceNames()">
+            <div *ngIf="layout.getConditions(env).length > 0">
+              <div style="font-weight: bold;" *ngIf="mapSourceNameToName(env) === 'Global'" title="{{ 'search.mdm-search.tooltip-global-search-attributes' | translate }}">
+                {{ 'search.mdm-search.global-search-attributes' | translate }}
+              </div>
+              <div style="font-weight: bold;" *ngIf="mapSourceNameToName(env) !== 'Global'"  title="Suchattribute, die nicht in allen Datenquellen verfügbar sind, sondern nur in der aktuellen Datenquelle.">
+                {{ 'search.mdm-search.search-attributes-from' | translate }} {{mapSourceNameToName(env)}}
+              </div>
+              <table class="table table-bordered searchdefinition">
+                <colgroup>
+                  <col style="width: 17%;">
+                  <col style="width: 17%;">
+                  <col style="width: 5%;">
+                  <col style="width: 58%;">
+                  <col style="width: 3%;">
+                </colgroup>
+                <tr search-condition class="condition" *ngFor="let condition of layout.getConditions(env)"
+                    [env]="env"
+                    [condition]="condition"
+                    [disabled]="!isAdvancedSearchActive"
+                    [selectedEnvs]="selectedEnvironments"
+                    (onRemove)="removeCondition($event)">
+                </tr>
+              </table>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </accordion-group>
+  <accordion-group  id="searchResults" [isOpen]="isSearchResultsOpen" #searchResults>
+    <div accordion-heading class="thinheader container-fluid">
+      <div class="row">
+        <div class="col text-left">
+          {{ 'search.mdm-search.results' | translate }} &nbsp;&nbsp;
+          <mdm-view (click)="onViewClick($event)"></mdm-view>
+        </div>
+        <div class="col text-right">
+          <span class="badge">{{results?.rows.length}}</span>&nbsp;
+          <button type="button" class="btn btn-mdm" (click)="clearResultlist($event)" title="{{ 'search.mdm-search.tooltip-clear-search-results' | translate }}"><span class="fa fa-eraser"></span></button>
+          <button type="button" class="btn btn-mdm" title="{{ 'search.mdm-search.tooltip-add-selection-to-shopping-basket' | translate }}" (click)="selected2Basket($event)">
+            <span class="fa fa-shopping-cart" style="color:#DADADA; margin-right: -12px;"></span>
+            <span class="fa fa-shopping-cart" style="color:#A8A4A4; margin-right: -12px;"></span>
+            <span class="fa fa-shopping-cart"></span>
+          </button>
+          <span class="fa" [ngClass]="{'fa-chevron-down': searchResults?.isOpen, 'fa-chevron-right': !searchResults?.isOpen}" style="padding-left: 15px;"></span>
+        </div>
+      </div>
+    </div>
+    <div class="container-fluid">
+      <div class="row">
+          <mdm-tableview
+            [results]="results"
+            [view]="viewComponent.selectedView"
+            isShopable="true"
+            [menuItems]="contextMenuItems"
+            [selectedEnvs]="selectedEnvironments"
+            [searchAttributes]="allSearchAttributesForCurrentResultType"
+            [environments]="environments"
+            [loading]="loading">
+          </mdm-tableview>
+      </div>
+    </div>
+  </accordion-group>
+</accordion>
+
+<div bsModal #lgSaveModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="SelectSearchComponents" aria-hidden="true">
+  <div class="modal-dialog modal-md">
+    <div class="modal-content">
+      <div class="modal-header">
+      <h4 class="modal-title">{{ 'search.mdm-search.title-save-search-filter-as' | translate }}:</h4>
+        <button type="button" class="close" (click)="childSaveModal.hide()" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+      </div>
+      <div class="modal-body">
+        <div class="container-fluid">
+          <div class="row" *ngIf="filters?.length > 0">
+            <p-dataTable
+              [value]="filters"
+              resizableColumns="false"
+              [reorderableColumns]="false"
+              [rows]="10"
+              [paginator]="true"
+              [pageLinks]="3"
+              [rowsPerPageOptions]="[10,20,50]"
+              [(selection)]="selectedRow"
+              (onRowClick)="onRowSelect($event)"
+              (onRowSelect)="onRowSelect($event)">
+              <p-column [style]="{'width':'30px'}" selectionMode="single"></p-column>
+              <p-column header="{{LblExistingFilterNames}}">
+                <ng-template pTemplate="body" let-col let-row="rowData" >
+                  {{row.name}}
+                </ng-template>
+              </p-column>
+            </p-dataTable>
+          </div>
+          <div class="row" style="margin-top: 15px;">
+            <div class="col-md-10" style="padding-left: 0;">
+            <input type="text" class="form-control" placeholder="{{ 'search.mdm-search.search-filter-name' | translate }}" [(value)]="filterName" (input)="filterName = $event.target.value" (keyup.enter)="saveFilter($event)">
+            </div>
+            <div class="col-md-2" style="padding: 0;">
+              <form class="form-inline">
+                <button type="button" class="btn btn-mdm pull-right" (click)="saveFilter($event)" [disabled]="!filterName" title="{{ getSaveFilterBtnTitle() | translate }}">
+                  <span class="fa fa-floppy-o"></span> {{ 'search.mdm-search.btn-save' | translate }}
+                </button>
+              </form>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<edit-searchFields [searchAttributes]="allSearchAttributesForCurrentResultType" [environments]="selectedEnvironments"></edit-searchFields>
+<overwrite-dialog></overwrite-dialog>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.component.ts
new file mode 100644
index 0000000..ca98675
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.component.ts
@@ -0,0 +1,459 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, ViewChild, OnInit, OnDestroy} from '@angular/core';
+
+import {SearchService, SearchDefinition, SearchAttribute, SearchLayout} from './search.service';
+import {of as observableOf, combineLatest as observableCombineLatest} from 'rxjs';
+
+import {defaultIfEmpty, mergeMap, tap} from 'rxjs/operators';
+
+import {FilterService, SearchFilter, Condition} from './filter.service';
+import {NodeService} from '../navigator/node.service';
+import {BasketService} from '../basket/basket.service';
+import {QueryService, SearchResult } from '../tableview/query.service';
+
+import {LocalizationService} from '../localization/localization.service';
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import {Node} from '../navigator/node';
+
+import {TableviewComponent} from '../tableview/tableview.component';
+import {ViewComponent} from '../tableview/view.component';
+
+import {ModalDirective} from 'ngx-bootstrap';
+import {AccordionPanelComponent} from 'ngx-bootstrap/accordion';
+
+import {MenuItem} from 'primeng/primeng';
+import {EditSearchFieldsComponent} from './edit-searchFields.component';
+import {OverwriteDialogComponent} from '../core/overwrite-dialog.component';
+
+import {classToClass, serialize, deserialize} from 'class-transformer';
+import {SelectItem} from 'primeng/primeng';
+
+import { TranslateService } from '@ngx-translate/core';
+import { streamTranslate, TRANSLATE } from '../core/mdm-core.module';
+
+@Component({
+  selector: 'mdm-search',
+  templateUrl: 'mdm-search.component.html',
+})
+export class MDMSearchComponent implements OnInit, OnDestroy {
+
+  maxResults = 1000;
+
+  filters: SearchFilter[] = [];
+  currentFilter: SearchFilter;
+  filterName = '';
+
+  environments: Node[];
+  selectedEnvironments: Node[] = [];
+
+  definitions: SearchDefinition[] = [];
+
+  results: SearchResult = new SearchResult();
+  allSearchAttributes: { [type: string]: { [env: string]: SearchAttribute[] }} = {};
+  allSearchAttributesForCurrentResultType: { [env: string]: SearchAttribute[] } = {};
+
+  isAdvancedSearchOpen = false;
+  isAdvancedSearchActive = true;
+  isSearchResultsOpen = false;
+
+  layout: SearchLayout = new SearchLayout;
+
+  public dropdownModel: SelectItem[] = [];
+  public selectedEnvs: string[] = [];
+
+  searchFields: { group: string, attribute: string }[] = [];
+
+  subscription: any;
+  searchExecuted = false;
+
+  selectedRow: SearchFilter;
+  lazySelectedRow: SearchFilter;
+  loading = false;
+
+  contextMenuItems: MenuItem[] = [
+    { label: 'Add to shopping basket', icon: 'fa fa-shopping-cart', command: (event) => this.addSelectionToBasket() }
+  ];
+
+  @ViewChild(ViewComponent)
+  viewComponent: ViewComponent;
+
+  @ViewChild(TableviewComponent)
+  tableViewComponent: TableviewComponent;
+
+  @ViewChild('lgSaveModal')
+  childSaveModal: ModalDirective;
+
+  @ViewChild(EditSearchFieldsComponent)
+  editSearchFieldsComponent: EditSearchFieldsComponent;
+
+  @ViewChild(OverwriteDialogComponent)
+  overwriteDialogComponent: OverwriteDialogComponent;
+
+  @ViewChild('advancedSearch')
+  advancedSearchPanel: AccordionPanelComponent;
+
+  @ViewChild('searchResults')
+  searchResultsPanel: AccordionPanelComponent;
+
+  constructor(private searchService: SearchService,
+    private queryService: QueryService,
+    private filterService: FilterService,
+    private nodeService: NodeService,
+    private localService: LocalizationService,
+    private notificationService: MDMNotificationService,
+    private basketService: BasketService,
+    private translateService: TranslateService) { }
+
+  ngOnInit() {
+    this.currentFilter = this.filterService.EMPTY_FILTER;
+
+    streamTranslate(this.translateService, TRANSLATE('search.mdm-search.add-to-shopping-basket')).subscribe(
+            (msg: string) => this.contextMenuItems[0].label = msg);
+
+    this.nodeService.getNodes().pipe(
+      mergeMap(envs => observableCombineLatest([
+        observableOf(envs),
+        this.searchService.loadSearchAttributesStructured(envs.map(env => env.sourceName)),
+        this.filterService.getFilters().pipe(defaultIfEmpty([this.currentFilter])),
+        this.searchService.getDefinitionsSimple()
+      ]))).subscribe(
+        ([envs, attrs, filters, definitions]) => this.init(envs, attrs, filters, definitions),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.mdm-search.err-cannot-load-data-sources'), error)
+      );
+
+    // event handlers
+    this.viewComponent.viewChanged$.subscribe(
+      () => this.onViewChanged(),
+      error => this.notificationService.notifyError(this.translateService.instant('search.mdm-search.err-cannot-update-view'), error)
+    );
+  }
+
+  ngOnDestroy() {
+     this.saveState();
+  }
+
+  init(envs: Node[], attrs: { [type: string]: { [env: string]: SearchAttribute[] }},
+      filters: SearchFilter[], definitions: SearchDefinition[]) {
+    this.environments = envs;
+    this.allSearchAttributes = attrs;
+    this.filters = filters;
+    this.definitions = definitions;
+
+    this.dropdownModel = envs.map(env => <SelectItem>{ value: env.sourceName, label: env.name });
+    this.selectedEnvs = envs.map(env => env.sourceName);
+
+    this.updateSearchAttributesForCurrentResultType();
+    this.selectedEnvironmentsChanged();
+
+    this.loadState();
+  }
+
+  loadState() {
+
+    this.results = deserialize(SearchResult, sessionStorage.getItem('mdm-search.searchResult')) || new SearchResult();
+    this.selectFilter(deserialize(SearchFilter, sessionStorage.getItem('mdm-search.currentFilter')) || this.filterService.EMPTY_FILTER);
+    this.isAdvancedSearchActive = !('false' === sessionStorage.getItem('mdm-search.isAdvancedSearchActive'));
+    this.advancedSearchPanel.isOpen = !('false' === sessionStorage.getItem('mdm-search.isAdvancedSearchOpen'));
+    this.searchResultsPanel.isOpen = !('false' === sessionStorage.getItem('mdm-search.isSearchResultsOpen'));
+  }
+
+  saveState() {
+    sessionStorage.setItem('mdm-search.isSearchResultsOpen', serialize(this.searchResultsPanel.isOpen));
+    sessionStorage.setItem('mdm-search.isAdvancedSearchOpen', serialize(this.advancedSearchPanel.isOpen));
+    sessionStorage.setItem('mdm-search.currentFilter', serialize(this.currentFilter));
+    sessionStorage.setItem('mdm-search.searchResult', serialize(this.results));
+    sessionStorage.setItem('mdm-search.isAdvancedSearchActive', this.isAdvancedSearchActive.toString());
+  }
+
+  onViewClick(e: Event) {
+    e.stopPropagation();
+  }
+
+  onCheckBoxClick(event: any) {
+    event.stopPropagation();
+    this.isAdvancedSearchActive = event.target.checked;
+  }
+
+  onViewChanged() {
+    if (this.searchExecuted) {
+      this.onSearch();
+    }
+  }
+
+  selectedEnvironmentsChanged() {
+    this.currentFilter.environments = this.selectedEnvs;
+    if (this.environments) {
+      let envs = this.environments.filter(env =>
+        this.currentFilter.environments.find(envName => envName === env.sourceName));
+
+      if (envs.length === 0) {
+        this.selectedEnvironments = this.environments;
+      } else {
+        this.selectedEnvironments = envs;
+      }
+    }
+    this.calcCurrentSearch();
+  }
+
+  loadFilters() {
+    this.filters = [];
+    this.filterService.getFilters().pipe(
+      defaultIfEmpty([this.currentFilter]))
+      .subscribe(
+        filters => this.filters = this.filters.concat(filters),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.mdm-search.err-cannot-load-search-filter'), error)
+      );
+  }
+
+  selectFilterByName(defaultFilterName: string) {
+    this.selectFilter(this.filters.find(f => f.name === defaultFilterName));
+  }
+
+  removeSearchField(searchField: { group: string, attribute: string }) {
+    let index = this.searchFields.findIndex(sf => sf.group === searchField.group && sf.attribute === searchField.attribute);
+    this.searchFields.splice(index, 1);
+  }
+
+  onResultTypeChane(e: any) {
+    this.selectResultType(e.value);
+  }
+
+  selectResultType(type: any) {
+    this.currentFilter.resultType = type.type;
+    this.updateSearchAttributesForCurrentResultType();
+  }
+
+  updateSearchAttributesForCurrentResultType() {
+    if (this.allSearchAttributes.hasOwnProperty(this.getSelectedDefinition())) {
+      this.allSearchAttributesForCurrentResultType = this.allSearchAttributes[this.getSelectedDefinition()];
+    }
+  }
+
+  getSearchDefinition(type: string) {
+    return this.definitions.find(def => def.type === type);
+  }
+
+  getSelectedDefinition() {
+    let def = this.getSearchDefinition(this.currentFilter.resultType);
+    if (def) {
+      return def.value;
+    }
+  }
+
+  onSearch() {
+    let query;
+    this.loading = true;
+    this.isSearchResultsOpen = true;
+    if (this.isAdvancedSearchActive) {
+      query = this.searchService.convertToQuery(this.currentFilter, this.allSearchAttributes, this.viewComponent.selectedView);
+    } else {
+      let filter = classToClass(this.currentFilter);
+      filter.conditions = [];
+      query = this.searchService.convertToQuery(filter, this.allSearchAttributes, this.viewComponent.selectedView);
+    }
+    this.queryService.query(query).pipe(
+      tap(result => this.generateWarningsIfMaxResultsReached(result)))
+      .subscribe(
+        result => {
+          this.results = result;
+          this.isSearchResultsOpen = true;
+          this.searchExecuted = true;
+          this.loading = false;
+        },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.mdm-search.err-cannot-process-search-query'), error)
+      );
+  }
+
+  generateWarningsIfMaxResultsReached(result: SearchResult) {
+    let resultsPerSource = result.rows
+      .map(r => r.source)
+      .reduce((prev, item) => { (prev[item]) ? prev[item] += 1 : prev[item] = 1; return prev; }, {});
+
+    Object.keys(resultsPerSource)
+      .filter(source => resultsPerSource[source] > this.maxResults)
+      .forEach(source => this.notificationService.notifyWarn(
+        this.translateService.instant('search.mdm-search.errheading-too-many-search-results'),
+        this.translateService.instant('search.mdm-search.err-too-many-search-results', {'numresults': this.maxResults, 'source': source})));
+  }
+
+  calcCurrentSearch() {
+    let environments = this.currentFilter.environments;
+    let conditions = this.currentFilter.conditions;
+    let type = this.getSelectedDefinition();
+    this.layout = SearchLayout.createSearchLayout(environments, this.allSearchAttributesForCurrentResultType, conditions);
+  }
+
+  onFilterChange(e: any) {
+    this.selectFilter(e.value);
+  }
+
+  selectFilter(filter: SearchFilter) {
+    this.currentFilter = classToClass(filter);
+    this.selectedEnvs = this.currentFilter.environments;
+    this.updateSearchAttributesForCurrentResultType();
+    this.selectedEnvironmentsChanged();
+    this.calcCurrentSearch();
+  }
+
+  resetConditions(e: Event) {
+    e.stopPropagation();
+    this.currentFilter.conditions.forEach(cond => cond.value = []);
+    this.selectFilter(this.currentFilter);
+  }
+
+  clearResultlist(e: Event) {
+    e.stopPropagation();
+    this.results = new SearchResult();
+  }
+
+  deleteFilter(e: Event) {
+    e.stopPropagation();
+    if (this.currentFilter.name === this.filterService.NO_FILTER_NAME
+          || this.currentFilter.name === this.filterService.NEW_FILTER_NAME) {
+      this.notificationService
+        .notifyInfo(this.translateService.instant('search.mdm-search.errheading-cannot-delete-search-filter-none-selected'),
+        this.translateService.instant('search.mdm-search.err-cannot-delete-search-filter-none-selected'));
+    } else {
+      this.layout = new SearchLayout;
+      this.filterService.deleteFilter(this.currentFilter.name).subscribe(
+        () => {
+          this.loadFilters();
+          this.selectFilter(new SearchFilter(this.filterService.NO_FILTER_NAME, [], 'Test', '', []));
+        },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.mdm-search.err-cannot-delete-search-filter'), error)
+      );
+    }
+  }
+
+  saveFilter(e: Event) {
+    e.stopPropagation();
+    if (this.filters.find(f => f.name === this.filterName) != undefined) {
+      this.childSaveModal.hide();
+      this.overwriteDialogComponent.showOverwriteModal(this.translateService.instant('search.mdm-search.a-filter')).subscribe(
+        needSave => this.saveFilter2(needSave),
+        error => {
+          this.saveFilter2(false);
+          this.notificationService.notifyError(this.translateService.instant('search.mdm-search.err-cannot-save-search-filter'), error);
+        }
+      );
+    } else {
+      this.saveFilter2(true);
+    }
+  }
+
+  saveFilter2(save: boolean) {
+    if (save) {
+      let filter = this.currentFilter;
+      filter.name = this.filterName;
+      this.filterService.saveFilter(filter).subscribe(
+        () => {
+          this.loadFilters();
+          this.selectFilter(filter);
+        },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.mdm-search.err-cannot-save-search-filter'), error)
+      );
+      this.childSaveModal.hide();
+    } else {
+      this.childSaveModal.show();
+    }
+  }
+
+  removeCondition(condition: Condition) {
+    this.currentFilter.conditions = this.currentFilter.conditions
+      .filter(c => !(c.type === condition.type && c.attribute === condition.attribute));
+
+    this.calcCurrentSearch();
+  }
+
+  selected2Basket(e: Event) {
+    e.stopPropagation();
+    this.tableViewComponent.selectedViewRows.forEach(row => this.basketService.add(row.getItem()));
+  }
+
+  showSaveModal(e: Event) {
+    e.stopPropagation();
+    if (this.currentFilter.name === this.filterService.NO_FILTER_NAME
+            || this.currentFilter.name === this.filterService.NEW_FILTER_NAME) {
+      this.filterName = '';
+    } else {
+      this.filterName = this.currentFilter.name;
+    }
+    this.childSaveModal.show();
+  }
+
+  showSearchFieldsEditor(e: Event, conditions?: Condition[]) {
+    e.stopPropagation();
+    this.editSearchFieldsComponent.show(conditions).subscribe(
+      conds => {
+        if (!conditions) {
+          let filter = new SearchFilter(this.filterService.NEW_FILTER_NAME, this.currentFilter.environments, 'Test', '', conds);
+          this.selectFilter(filter);
+        }
+        this.currentFilter.conditions = conds;
+        this.calcCurrentSearch();
+      },
+      error => this.notificationService.notifyError(
+        this.translateService.instant('search.mdm-search.err-cannot-display-search-field-editor'), error)
+    );
+  }
+
+  addSelectionToBasket() {
+    this.basketService.add(this.tableViewComponent.menuSelectedRow.getItem());
+  }
+
+  mapSourceNameToName(sourceName: string) {
+    return NodeService.mapSourceNameToName(this.environments, sourceName);
+  }
+
+  getSaveFilterBtnTitle () {
+    return this.filterName
+      ? TRANSLATE('search.mdm-search.tooltip-save-search-filter')
+      : TRANSLATE('search.mdm-search.tooltip-no-name-set') ;
+  }
+
+  getAdvancedSearchCbxTitle() {
+    return this.isAdvancedSearchActive
+      ? TRANSLATE('search.mdm-search.tooltip-disable-advanced-search')
+      : TRANSLATE('search.mdm-search.tooltip-enable-advanced-search');
+  }
+
+/*
+  private loadSearchAttributes(environments: string[]) {
+    this.searchService.loadSearchAttributesStructured(environments)
+      .subscribe(
+        attrs => { this.allSearchAttributes = attrs; this.updateSearchAttributesForCurrentResultType(); },
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.mdm-search.err-cannot-load-attributes'), error));
+  }
+*/
+  onRowSelect(e: any) {
+    if (this.lazySelectedRow !== e.data) {
+      this.selectedRow = e.data;
+      this.filterName = e.data.name;
+    } else {
+      this.selectedRow = undefined;
+      this.filterName = '';
+    }
+    this.lazySelectedRow = this.selectedRow;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.module.ts
new file mode 100644
index 0000000..760c623
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/mdm-search.module.ts
@@ -0,0 +1,55 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+import { DatePipe } from '@angular/common';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+
+import { MDMSearchComponent } from './mdm-search.component';
+import { SearchConditionComponent } from './search-condition.component';
+import { EditSearchFieldsComponent } from './edit-searchFields.component';
+
+import { TableViewModule } from '../tableview/tableview.module';
+import {SearchService} from './search.service';
+import {FilterService} from './filter.service';
+
+import {SearchattributeTreeModule} from '../searchattribute-tree/searchattribute-tree.module';
+import {AutoCompleteModule} from 'primeng/primeng';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    TableViewModule,
+    SearchattributeTreeModule,
+    AutoCompleteModule
+  ],
+  declarations: [
+    MDMSearchComponent,
+    SearchConditionComponent,
+    EditSearchFieldsComponent,
+  ],
+  exports: [
+    MDMSearchComponent,
+    EditSearchFieldsComponent
+  ],
+  providers: [
+    SearchService,
+    FilterService,
+    DatePipe
+  ],
+})
+export class MDMSearchModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-base.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-base.ts
new file mode 100644
index 0000000..5ef8d3d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-base.ts
@@ -0,0 +1,47 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+export class SearchBase<T> {
+  value: T;
+  t: string;
+  a: string;
+  key: string;
+  label: string;
+  required: boolean;
+  order: number;
+  controlType: string;
+  active: boolean;
+  constructor(options: {
+      value?: T,
+      t?: string,
+      a?: string,
+      key?: string,
+      label?: string,
+      required?: boolean,
+      order?: number,
+      controlType?: string,
+      active?: boolean
+    } = {}) {
+    this.value = options.value;
+    this.t = options.t;
+    this.a = options.a;
+    this.key = options.key || '';
+    this.label = options.label || '';
+    this.required = !!options.required;
+    this.order = options.order == undefined ? 1 : options.order;
+    this.controlType = options.controlType || '';
+    this.active = options.active || false;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.css
new file mode 100644
index 0000000..7cda7f7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.css
@@ -0,0 +1,51 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+table.searchdefinition td { vertical-align: middle; padding: 4px 8px; }
+
+p-autoComplete >>> .ui-inputtext.ui-state-focus {
+  border: 1px solid #66afe9 !important;
+  outline: 0 !important;
+  box-shadow: 0 0 8px rgba(102,175,233,.6) !important;
+}
+
+p-autoComplete >>> .ui-autocomplete.ui-autocomplete-multiple .ui-autocomplete-multiple-container {
+  padding: 2.5px 8px !important;
+  border: 1px solid #ccc;
+  color: #555;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
+  width: 100%;
+}
+
+p-autoComplete >>> .ui-autocomplete-multiple-container.ui-inputtext {
+  overflow: inherit !important;
+}
+
+p-autoComplete >>> .ui-autocomplete {
+  width: 100%;
+}
+
+p-autoComplete >>> .ui-widget:disabled{
+  cursor: not-allowed !important;
+  background-color: #eee;
+  color: #555 !important;
+  opacity: 1;
+}
+p-autoComplete >>> .ui-state-disabled{
+  cursor: not-allowed !important;
+  background-color: #eee !important;
+  border-color: #e3e3e3 !important;
+  opacity: 1;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.html
new file mode 100644
index 0000000..deccb96
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.html
@@ -0,0 +1,55 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<td style="vertical-align: middle">{{condition.type | mdmdatasourcetranslate}}</td> <!-- | translate -->
+<td style="vertical-align: middle">{{condition.type | mdmdatasourcetranslate: condition.attribute }}</td> <!--  | translate: condition.attribute -->
+<td style="vertical-align: middle">
+  <div class="btn-group" dropdown style="width: 66px;">
+    <button id="operator" type="button" title="{{ 'search.search-condition.tooltip-select-search-operator' | translate }}" class="btn btn-default btn-sm dropdown-toggle" dropdownToggle aria-haspopup="true" aria-expanded="false" [disabled]="disabled">
+      {{getOperatorName(condition.operator)}} <span class="caret"></span>
+    </button>
+    <ul class="dropdown-menu" *dropdownMenu>
+      <li *ngFor="let op of getOperators()">
+        <a class="dropdown-item" (click)="setOperator(op)">{{getOperatorName(op)}}</a>
+      </li>
+    </ul>
+  </div>
+</td>
+<td [ngSwitch]="condition.valueType">
+  <p-autoComplete *ngSwitchCase="'string'"
+    [(ngModel)]="condition.value"
+    [suggestions]="displayedSuggestions"
+    (completeMethod)="updateSuggestions($event)"
+    [multiple]="true"
+    [delay]="0"
+    [size]="500"
+    [scrollHeight]="'50vh'"
+    placeholder="Wert"
+    [disabled]="disabled"
+    (keyup.enter)="onEnter($event)">
+  </p-autoComplete>
+  <p-calendar *ngSwitchCase="'date'" 
+    (ngModelChange)="setDateValue($event)" 
+    [ngModel]="dateValue" 
+    dateFormat="dd.mm.yy" 
+    showTime="true" 
+    hourFormat="24" 
+    hideOnDateTimeSelect="true" 
+    [showIcon]="true" 
+    [disabled]="disabled"
+    [ngStyle]="{ 'width': '100%' }">
+  </p-calendar>
+  <input *ngSwitchDefault type="text" class="form-control input-sm" placeholder="Wert" [value]="condition.value" (input)="setValue($event.target.value)" [disabled]="disabled">
+</td>
+<td style="vertical-align: middle"><button id="remove" type="button" class="btn btn-default btn-sm fa fa-times remove" (click)="remove()" [disabled]="disabled"></button></td>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.ts
new file mode 100644
index 0000000..0fabadb
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-condition.component.ts
@@ -0,0 +1,154 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ViewChild, AfterViewInit} from '@angular/core';
+import {FormGroup} from '@angular/forms';
+import {LocalizationService} from '../localization/localization.service';
+import {Condition, Operator, OperatorUtil} from './filter.service';
+import {Node} from '../navigator/node';
+
+import {PropertyService} from '../core/property.service';
+import {QueryService} from '../tableview/query.service';
+import {AutoComplete} from 'primeng/primeng';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import {TranslateService} from '@ngx-translate/core';
+import { DatePipe } from '@angular/common';
+
+@Component({
+  selector: '[search-condition]',
+  templateUrl: 'search-condition.component.html',
+  styleUrls: ['search-condition.component.css'],
+})
+export class SearchConditionComponent implements OnChanges, AfterViewInit {
+
+  @Input() env: string;
+  @Input() condition: Condition;
+  @Input() form: FormGroup;
+  @Input() disabled: boolean;
+  @Input() selectedEnvs: Node[];
+  @Output() onRemove = new EventEmitter<Condition>();
+
+  suggestions: string[];
+  displayedSuggestions: string[] = [];
+  lastQuery: string;
+  dateValue: Date;
+
+  @ViewChild(AutoComplete) primeAutoCompleteComponent: AutoComplete;
+
+  constructor(private localservice: LocalizationService,
+              private prop: PropertyService,
+              private queryService: QueryService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService,
+              private datePipe: DatePipe) { }
+
+  ngAfterViewInit() {
+    if (this.primeAutoCompleteComponent) {
+      /* Workaround for missing onBlur handler in primeng version 2.x.
+       * We overwrite the existing implementation and additional call our own event handler.
+       * In later versions this feature was added https://github.com/primefaces/primeng/issues/2256
+       * and this workaround should be removed when using primeng version 4 or later
+       */
+      this.primeAutoCompleteComponent.onBlur = function() {
+        this.primeAutoCompleteComponent.focus = false;
+        this.primeAutoCompleteComponent.onModelTouched();
+        this.onAutocompleteBlur();
+      }.bind(this);
+    }
+  }
+
+  onAutocompleteBlur() {
+    this.onEnter(new Event('blur'));
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    if (changes['selectedEnvs'] && this.condition.valueType === 'string') {
+      this.setAutoCompleteValues();
+    }
+
+    if (this.condition.valueType === 'date') {
+      console.log(this.condition.value[0]);
+      if (this.condition.value === undefined || this.condition.value[0] === undefined) {
+        this.dateValue = new Date();
+        (<Date> this.dateValue).setHours(0, 0, 0, 0);
+      } else {
+        this.dateValue = new Date(this.condition.value[0]);
+      }
+    }
+  }
+
+  onEnter(e: Event) {
+    let hl = this.primeAutoCompleteComponent.highlightOption;
+    if (hl == undefined && this.lastQuery !== '' || hl != undefined && this.displayedSuggestions.find(s => s === hl) == undefined) {
+      if (this.primeAutoCompleteComponent.value[this.primeAutoCompleteComponent.value.length - 1] === hl) {
+        this.primeAutoCompleteComponent.value.pop();
+      }
+      this.primeAutoCompleteComponent.selectItem(this.lastQuery);
+      this.lastQuery = '';
+    }
+    this.primeAutoCompleteComponent.highlightOption = undefined;
+    this.displayedSuggestions = [];
+  }
+
+  setAutoCompleteValues() {
+    this.queryService.suggestValues(this.env === 'Global' ?
+        this.selectedEnvs.map(env => env.sourceName) :
+        [this.env], this.condition.type, this.condition.attribute)
+      .subscribe(
+        values => this.suggestions = Array.from(new Set<string>(values)),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.search-condition.err-cannot-initialize-autocompletion'), error)
+      );
+  }
+
+  updateSuggestions(e: any) {
+    if (this.suggestions) {
+    this.displayedSuggestions =
+      [...this.suggestions.filter(sug => sug.toLowerCase().indexOf(e.query.toLowerCase()) > -1).slice(0, 10)];
+    }
+    this.lastQuery = e.query;
+  }
+
+  getOperators() {
+    return OperatorUtil.values();
+  }
+
+  getOperatorName(op: Operator) {
+    return OperatorUtil.toString(op);
+  }
+
+  setOperator(operator: Operator) {
+    this.condition.operator = operator;
+  }
+
+  setValue(value: string) {
+    this.condition.value = [value];
+  }
+
+  setValues(value: string[]) {
+    this.condition.value = value;
+  }
+
+  setDateValue(value: Date) {
+    console.log(value);
+    this.condition.value = [this.datePipe.transform(value, 'yyyy-MM-dd' + 'T' + 'HH:mm:ss')];
+  }
+
+  remove() {
+    this.onRemove.emit(this.condition);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-control.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-control.service.ts
new file mode 100644
index 0000000..e859f1c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-control.service.ts
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable} from '@angular/core';
+import {FormGroup, FormBuilder, Validators} from '@angular/forms';
+import {SearchBase} from './search-base';
+
+@Injectable()
+export class SearchControlService {
+  constructor(private fb: FormBuilder) { }
+
+  toControlGroup(searches) {
+    let group = {};
+    for (let i = 0; i < searches.length; i++) {
+      searches[i].items.forEach(search => {
+        group[search.key] = search.required ? [search.value || '', Validators.required] : [search.value || ''];
+      });
+    }
+    return this.fb.group(group);
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-dropdown.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-dropdown.ts
new file mode 100644
index 0000000..233b044
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-dropdown.ts
@@ -0,0 +1,26 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {SearchBase} from './search-base';
+
+export class DropdownSearch extends SearchBase<string> {
+  controlType = 'dropdown';
+  options: {key: string, value: string}[] = [];
+
+  constructor(options: {} = {}) {
+    super(options);
+    this.options = options['options'] || [];
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-textbox.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-textbox.ts
new file mode 100644
index 0000000..e64f555
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search-textbox.ts
@@ -0,0 +1,26 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {SearchBase} from './search-base';
+
+export class TextboxSearch extends SearchBase<string> {
+  controlType = 'textbox';
+  type: string;
+
+  constructor(options: {} = {}) {
+    super(options);
+    this.type = options['type'] || '';
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search.service.spec.ts
new file mode 100644
index 0000000..77c1c18
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search.service.spec.ts
@@ -0,0 +1,320 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { BaseRequestOptions, Http, HttpModule, Response, ResponseOptions } from '@angular/http';
+import { async, TestBed, inject } from '@angular/core/testing';
+import { MockBackend } from '@angular/http/testing';
+import { of as observableOf,  Observable } from 'rxjs';
+
+import { SearchService, SearchAttribute, SearchLayout } from './search.service';
+import { PreferenceService, Preference, Scope } from '../core/preference.service';
+import { PropertyService } from '../core/property.service';
+import { LocalizationService } from '../localization/localization.service';
+import { NodeService } from '../navigator/node.service';
+import { QueryService } from '../tableview/query.service';
+import { MDMNotificationService } from '../core/mdm-notification.service';
+import { HttpErrorHandler } from '../core/http-error-handler';
+
+import { Condition, Operator } from './filter.service';
+import { TranslateModule } from '@ngx-translate/core';
+
+class TestPreferenceService {
+  getPreference(key?: string): Observable<Preference[]> {
+    return observableOf([
+    {
+      id: 1,
+      key: 'ignoredAttributes',
+      scope: Scope.USER,
+      source: null,
+      user: 'testUser',
+      value: '[\"*.Name\", \"TestStep.Id\", \"Measurement.*\"]'
+      // value: '[\"*.MimeType\", \"TestStep.Sortindex\"]'
+    }
+  ]);
+  }
+}
+
+describe ( 'SearchService', () => {
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        HttpModule,
+        TranslateModule.forRoot(),
+      ],
+      providers: [
+        LocalizationService,
+        PropertyService,
+        {
+          provide: PreferenceService,
+          useClass: TestPreferenceService
+        },
+        SearchService,
+        MDMNotificationService,
+        NodeService,
+        QueryService,
+        MockBackend,
+        BaseRequestOptions,
+        HttpErrorHandler,
+        {
+          provide: Http,
+          useFactory: (backend, options) => new Http(backend, options),
+          deps: [MockBackend, BaseRequestOptions]
+        }]
+    });
+  });
+
+  describe('groupByEnv()', () => {
+    it('should group attributes by environment', () => {
+      let attributes = [
+        new SearchAttribute('env1', 'Test', 'Name'),
+        new SearchAttribute('env1', 'Vehicle', 'Name'),
+        new SearchAttribute('env2', 'Test', 'Name'),
+        new SearchAttribute('env2', 'Uut', 'Name'),
+      ];
+
+      let conditionsPerEnv = SearchLayout.groupByEnv(attributes);
+
+      expect(Object.getOwnPropertyNames(conditionsPerEnv))
+        .toContain('env1', 'env2');
+
+      expect(conditionsPerEnv['env1'])
+        .toContain(attributes[0], attributes[1]);
+
+      expect(conditionsPerEnv['env2'])
+        .toContain(attributes[2], attributes[3]);
+    });
+  });
+
+  describe('createSearchLayout()', () => {
+    it('should create a searchLayout object from conditions', () => {
+      let cond1 = new Condition('Test', 'Name', Operator.EQUALS, []);
+      let cond2 = new Condition('Vehicle', 'Name', Operator.EQUALS, []);
+
+      let attributes = {
+        'env1': [
+          new SearchAttribute('env1', 'Test', 'Name'),
+          new SearchAttribute('env1', 'Vehicle', 'Name'),
+        ],
+        'env2': [
+          new SearchAttribute('env2', 'Test', 'Name'),
+          new SearchAttribute('env2', 'Uut', 'Name'),
+        ]
+      };
+
+      let searchLayout = SearchLayout.createSearchLayout(['env1', 'env2'], attributes, [cond1, cond2]);
+
+      expect(searchLayout.getSourceNames())
+        .toEqual(['Global', 'env1']);
+
+      expect(searchLayout.getConditions('Global'))
+        .toEqual([cond1]);
+
+      expect(searchLayout.getConditions('env1'))
+        .toEqual([cond2]);
+
+    });
+  });
+
+  describe('convert()', () => {
+    it('should convert conditions to filter string',  async(inject([SearchService, MockBackend], (service, mockBackend) => {
+      let cond1 = new Condition('Test', 'Name', Operator.LIKE, ['PBN*']);
+      let cond2 = new Condition('Vehicle', 'Number', Operator.EQUALS, ['12']);
+      let cond3 = new Condition('Vehicle', 'Created', Operator.EQUALS, ['2017-07-17T12:13:14']);
+
+      let attributes = [
+          new SearchAttribute('env1', 'Test', 'Name'),
+          new SearchAttribute('env1', 'Vehicle', 'Number', 'LONG'),
+          new SearchAttribute('env2', 'Test', 'Name'),
+          new SearchAttribute('env2', 'Uut', 'Name'),
+          new SearchAttribute('env2', 'Vehicle', 'Created', 'DATE'),
+        ];
+
+      let filter = service.convertEnv('env1', [cond1, cond2, cond3], attributes, 'test');
+
+      expect(filter.sourceName).toEqual('env1');
+      expect(filter.filter).toEqual('Test.Name ci_lk "PBN*" and Vehicle.Number eq 12 and Vehicle.Created eq "2017-07-17T12:13:14"');
+      expect(filter.searchString).toEqual('test');
+
+    })));
+  });
+
+  describe('loadSearchAttributes()', () => {
+    it('should return filtered search attributes for env',
+      async(inject([SearchService, MockBackend],
+        (searchService, mockBackend) => {
+      mockBackend.connections.subscribe(conn => {
+        let mockResponse = {
+          data: [
+            {
+              boType: 'Test',
+              attrName: 'Name',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'Test',
+              attrName: 'Id',
+              valueType: 'LONG',
+              criteria: '*'
+            },
+            {
+              boType: 'TestStep',
+              attrName: 'Name',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'TestStep',
+              attrName: 'MimeType',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'TestStep',
+              attrName: 'Id',
+              valueType: 'LONG',
+              criteria: '*'
+            },
+            {
+              boType: 'Measurement',
+              attrName: 'Name',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'Measurement',
+              attrName: 'Id',
+              valueType: 'LONG',
+              criteria: '*'
+            }
+        ]};
+        if (conn.request.url === searchService._prop.getUrl() + '/mdm/environments/TestEnv//searchattributes') {
+          conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+        } else if (conn.request.url === searchService._prop.getUrl() + '/mdm/environments/' + 'TestEnv2' + '/' + '/searchattributes') {
+          conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+        }
+      });
+      let ans = [
+        new SearchAttribute('TestEnv', 'Test', 'Id', 'LONG', '*'),
+        new SearchAttribute('TestEnv', 'TestStep', 'MimeType', 'STRING', '*'),
+      ];
+      searchService.loadSearchAttributes('', 'TestEnv').subscribe(sas => {
+        expect(sas).toEqual(ans);
+      });
+    })));
+  });
+
+  describe('getFilters()', () => {
+    it('should retrun ignoredAttributes in a string array',
+      async(inject([SearchService],
+        (searchService) => {
+      expect(searchService.getFilters(undefined)).toEqual(['*.Name', 'TestStep.Id', 'Measurement.*']);
+    })));
+  });
+
+  describe('filterIgnoredAttributes', () => {
+    it('should return searchAttributes without the ignored ones',
+      async(inject([SearchService], (searchService) => {
+
+    let input = [
+      new SearchAttribute('TestEnv', 'Test', 'Name', 'STRING'),
+      new SearchAttribute('TestEnv', 'Test', 'MimeType', 'STRING'),
+      new SearchAttribute('TestEnv', 'Test', 'Id', 'LONG'),
+      new SearchAttribute('TestEnv', 'TestStep', 'Name', 'STRING'),
+      new SearchAttribute('TestEnv', 'TestStep', 'MimeType', 'STRING'),
+      new SearchAttribute('TestEnv', 'TestStep', 'Id', 'LONG'),
+      new SearchAttribute('TestEnv', 'Measurement', 'Name', 'STRING'),
+      new SearchAttribute('TestEnv', 'Measurement', 'MimeType', 'STRING'),
+      new SearchAttribute('TestEnv', 'Measurement', 'Id', 'LONG')
+    ];
+
+  let ans = [
+    new SearchAttribute('TestEnv', 'Test', 'MimeType', 'STRING'),
+    new SearchAttribute('TestEnv', 'Test', 'Id', 'LONG'),
+    new SearchAttribute('TestEnv', 'TestStep', 'MimeType', 'STRING')
+  ];
+
+  expect(searchService.filterIgnoredAttributes(undefined, input)).toEqual(ans);
+    })));
+  });
+
+  describe('getSearchAttributes()', () => {
+    it('should return filtered search attributes for env',
+      async(inject([SearchService, MockBackend],
+        (searchService, mockBackend) => {
+      mockBackend.connections.subscribe(conn => {
+        let mockResponse = {
+          data: [
+            {
+              boType: 'Test',
+              attrName: 'Name',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'Test',
+              attrName: 'Id',
+              valueType: 'LONG',
+              criteria: '*'
+            },
+            {
+              boType: 'TestStep',
+              attrName: 'Name',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'TestStep',
+              attrName: 'MimeType',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'TestStep',
+              attrName: 'Id',
+              valueType: 'LONG',
+              criteria: '*'
+            },
+            {
+              boType: 'Measurement',
+              attrName: 'Name',
+              valueType: 'STRING',
+              criteria: '*'
+            },
+            {
+              boType: 'Measurement',
+              attrName: 'Id',
+              valueType: 'LONG',
+              criteria: '*'
+            }
+        ]};
+        if (conn.request.url === searchService._prop.getUrl() + '/mdm/environments/TestEnv//searchattributes') {
+          conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+        } else if (conn.request.url === searchService._prop.getUrl() + '/mdm/environments/TestEnv2//searchattributes') {
+          conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+        }
+      });
+      let ans = [
+        new SearchAttribute('TestEnv', 'Test', 'Id', 'LONG', '*'),
+        new SearchAttribute('TestEnv', 'TestStep', 'MimeType', 'STRING', '*'),
+        new SearchAttribute('TestEnv2', 'Test', 'Id', 'LONG', '*'),
+        new SearchAttribute('TestEnv2', 'TestStep', 'MimeType', 'STRING', '*'),
+      ];
+
+      searchService.getSearchAttributesPerEnvs(['TestEnv', 'TestEnv2'], '').subscribe(sas => expect(sas).toEqual(ans));
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search.service.ts
new file mode 100644
index 0000000..1a461e0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/search/search.service.ts
@@ -0,0 +1,316 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable} from '@angular/core';
+import {Http} from '@angular/http';
+
+import {forkJoin as observableForkJoin, of as observableOf, Observable} from 'rxjs';
+import {catchError, mergeMap, publishReplay, refCount, map} from 'rxjs/operators';
+
+import {MDMNotificationService} from '../core/mdm-notification.service';
+import {PropertyService} from '../core/property.service';
+import {LocalizationService} from '../localization/localization.service';
+import { Preference, PreferenceService, Scope } from '../core/preference.service';
+import {HttpErrorHandler} from '../core/http-error-handler';
+
+import {SearchFilter, Condition, OperatorUtil} from './filter.service';
+import {Query, Filter} from '../tableview/query.service';
+import {View} from '../tableview/tableview.service';
+
+import { TranslateService } from '@ngx-translate/core';
+
+export class SearchLayout {
+  map: { [sourceNames: string]: Condition[] } = {};
+
+  public static createSearchLayout(envs: string[], attributesPerEnv: { [env: string]: SearchAttribute[] }, conditions: Condition[]) {
+    let conditionsWithSortIndex = conditions.map((c, i) => { c.sortIndex = i; return c; });
+
+    let result = new SearchLayout();
+    let attribute2Envs = SearchLayout.mapAttribute2Environments(envs, attributesPerEnv);
+    let globalEnv = 'Global';
+    Object.keys(attribute2Envs).forEach(attr => {
+      let c = conditionsWithSortIndex.find(cond => cond.type + '.' + cond.attribute === attr);
+      if (c) {
+        if (attribute2Envs[attr].length === envs.length) {
+          result.add(globalEnv, c);
+        } else {
+          attribute2Envs[attr].forEach(e => result.add(e, c));
+        }
+      }
+    });
+    return result;
+  }
+
+  public static groupByEnv(attrs: SearchAttribute[]) {
+    let attributesPerEnv: { [environment: string]: SearchAttribute[] } = {};
+
+    attrs.forEach(attr => {
+      attributesPerEnv[attr.source] = attributesPerEnv[attr.source] || [];
+      attributesPerEnv[attr.source].push(attr);
+    });
+    return attributesPerEnv;
+  }
+
+  private static mapAttribute2Environments(envs: string[], attributesPerEnv: { [environment: string]: SearchAttribute[] }) {
+    let attribute2Envs: { [attribute: string]: string[] } = {};
+
+    Object.keys(attributesPerEnv)
+      .filter(env => envs.find(e => e === env))
+      .forEach(env =>
+        attributesPerEnv[env].forEach(sa => {
+          let attr = sa.boType + '.' + sa.attrName;
+
+          attribute2Envs[attr] = attribute2Envs[attr] || [];
+          attribute2Envs[attr].push(env);
+        })
+      );
+
+    return attribute2Envs;
+  }
+
+  getSourceNames() {
+    return Object.keys(this.map).sort((s1, s2) => {
+      if (s1 === 'Global') {
+        return -1;
+      } else if ( s2 === 'Global') {
+        return 1;
+      } else if (s1) {
+        return s1.localeCompare(s2);
+      } else {
+        return -1;
+      }
+    });
+  }
+
+  getConditions(sourceName: string) {
+    return this.map[sourceName].sort((c1, c2) => c1.sortIndex - c2.sortIndex) || [];
+  }
+
+  getSourceName(condition: Condition) {
+    if (condition) {
+      let sourceName;
+
+      Object.keys(this.map)
+        .forEach(env => {
+            if (this.map[env].find(c => c.type === condition.type && c.attribute === condition.attribute)) {
+              sourceName = env;
+            }
+          }
+        );
+      return sourceName;
+    }
+  }
+
+  set(sourceName: string, conditions: Condition[]) {
+    this.map[sourceName] = conditions;
+  }
+
+  add(sourceName: string, condition: Condition) {
+    this.map[sourceName] = this.map[sourceName] || [];
+    this.map[sourceName].push(condition);
+  }
+}
+
+export class SearchAttribute {
+  source: string;
+  boType: string;
+  attrName: string;
+  valueType: string;
+  criteria: string;
+
+  constructor(source: string, boType: string, attrName: string, valueType?: string, criteria?: string) {
+    this.source = source;
+    this.boType = boType;
+    this.attrName = attrName;
+    this.valueType = valueType || 'string';
+    this.criteria = criteria || '';
+  }
+}
+
+export class SearchDefinition {
+  key: string;
+  value: string;
+  type: string;
+  label: string;
+}
+
+@Injectable()
+export class SearchService {
+
+  private _searchUrl: string;
+  private errorMessage: string;
+
+  private defs: SearchAttribute[];
+
+  ignoreAttributesPrefs: Preference[] = [];
+
+  private cachedAttributes: Observable<any>;
+
+  constructor(private http: Http,
+    private httpErrorHandler: HttpErrorHandler,
+    private localService: LocalizationService,
+    private _prop: PropertyService,
+    private preferenceService: PreferenceService,
+    private notificationService: MDMNotificationService,
+    private translateService: TranslateService) {
+    this.preferenceService.getPreference('ignoredAttributes').subscribe(
+        prefs => this.ignoreAttributesPrefs = this.ignoreAttributesPrefs.concat(prefs),
+        error => this.notificationService.notifyError(
+          this.translateService.instant('search.search.err-cannot-load-preference-for-attributes-to-ignore'), error)
+      );
+    }
+
+  loadSearchAttributes(type: string, env: string) {
+    return this.http.get(this._prop.getUrl('mdm/environments/' + env + '/' + type + '/searchattributes')).pipe(
+      map(response => <SearchAttribute[]>response.json().data),
+      map(sas => sas.map(sa => { sa.source = env; return sa; })),
+      map(sas => this.filterIgnoredAttributes(env, sas)),
+      catchError(this.httpErrorHandler.handleError));
+  }
+
+// TODO TRANSLATION
+  getDefinitionsSimple() {
+    return observableOf([
+      <SearchDefinition>{ key: '1', value: 'tests', type: 'Test', label: 'Versuche' },
+      <SearchDefinition>{ key: '2', value: 'teststeps', type: 'TestStep', label: 'Versuchsschritte' },
+      <SearchDefinition>{ key: '3', value: 'measurements', type: 'Measurement', label: 'Messungen' }
+    ]);
+  }
+
+  getSearchAttributesPerEnvs(envs: string[], type: string) {
+    return observableForkJoin(envs.map(env => this.loadSearchAttributes(type, env).pipe(
+      map(sas => sas.map(sa => { sa.source = env; return sa; }))))).pipe(
+      map(x => x.reduce(function(explored, toExplore) {
+        return explored.concat(toExplore);
+      }, [])));
+  }
+
+  loadSearchAttributesStructured(environments: string[]) {
+    if (!this.cachedAttributes) {
+      this.cachedAttributes = this.getDefinitionsSimple().pipe(
+        map(defs => defs.map(d => d.value)),
+        mergeMap(defs => this.loadSearchAttributesForAllDefs(defs, environments)),
+        publishReplay(1),
+        refCount());
+    }
+    return this.cachedAttributes;
+  }
+
+  loadSearchAttributesForAllDefs(types: string[], environments: string[]) {
+    return observableForkJoin(types.map(type => this.loadSearchAttributesForDef(type, environments))).pipe(
+      map(type2AttributesPerEnv =>
+        type2AttributesPerEnv.reduce(
+          function(acc, value) {
+            acc[value.type] = value.attributesPerEnv;
+            return acc; },
+          <{ [type: string]: { [env: string]: SearchAttribute[] }}> {})
+        ));
+  }
+
+  loadSearchAttributesForDef(type: string, environments: string[]) {
+    return observableForkJoin(environments.map(env => this.loadSearchAttributes(type, env).pipe(
+      catchError(error => {
+        console.log('Could not load search attributes for type ' + type + ' in environment ' + env);
+        return observableOf(<SearchAttribute[]> []);
+      }),
+      map(attrs => { return { 'env': env, 'attributes': attrs}; })))).pipe(
+      map(attrsPerEnv => attrsPerEnv.reduce(
+        function(acc, value) {acc[value.env] = value.attributes; return acc; },
+         <{ [env: string]: SearchAttribute[] }> {})
+       ),
+      map(attrsPerEnv => { return { 'type': type, 'attributesPerEnv': attrsPerEnv}; }));
+  }
+
+  convertToQuery(searchFilter: SearchFilter, attr: { [type: string]: { [env: string]: SearchAttribute[] }}, view: View) {
+    let q = new Query();
+
+    q.resultType = searchFilter.resultType;
+    if (attr['tests']) {
+      q.filters = this.convert(searchFilter.environments, searchFilter.conditions, attr['tests'], searchFilter.fulltextQuery); // TODO
+    }
+    q.columns = view.columns.map(c => c.type + '.' + c.name);
+    console.log('Query', q);
+
+    return q;
+  }
+
+  convert(envs: string[], conditions: Condition[], attr: { [env: string]: SearchAttribute[] }, fullTextQuery: string): Filter[] {
+    return envs.map(e => this.convertEnv(e, conditions, attr[e], fullTextQuery));
+  }
+
+  convertEnv(env: string, conditions: Condition[], attrs: SearchAttribute[], fullTextQuery: string): Filter {
+
+    let filterString = conditions
+      .map(c => c.value.map(value => c.type + '.' + c.attribute + ' ' + this.adjustOperator(OperatorUtil.toFilterString(c.operator),
+         this.getValueType(c, attrs)) + ' ' + this.quoteValue(value, this.getValueType(c, attrs))).join(' or '))
+      .filter(c => c.length > 0)
+      .join(' and ');
+
+    return new Filter(env, filterString, fullTextQuery);
+  }
+
+  quoteValue(value: string, valueType: string) {
+    if (valueType.toLowerCase() === 'string' || valueType.toLowerCase() === 'date') {
+      return '"' + value + '"';
+    } else {
+      return value;
+    }
+  }
+
+  getValueType(c: Condition, attrs: SearchAttribute[]) {
+    return attrs.find(a => a.boType === c.type && a.attrName === c.attribute).valueType;
+  }
+  adjustOperator(operator: string, valueType: string) {
+    if (valueType.toLowerCase() === 'string') {
+      return 'ci_' + operator;
+    } else {
+      return operator;
+    }
+  }
+
+  isAttributeIgnored(attributeName: string, sa: SearchAttribute) {
+    let x = attributeName.split('.', 2);
+    let fType = x[0];
+    let fName = x[1];
+    return ((fType === sa.boType || fType === '*') && (fName === sa.attrName || fName === '*'));
+  }
+
+  private filterIgnoredAttributes(environment: string, searchAttributes: SearchAttribute[]) {
+    let filters = this.getFilters(environment);
+    filters.forEach(f =>
+      searchAttributes = searchAttributes.filter(sa => !this.isAttributeIgnored(f, sa))
+    );
+    return searchAttributes;
+  }
+
+  getFilters(source: string): string[] {
+    return this.ignoreAttributesPrefs
+      .filter(p => p.scope !== Scope.SOURCE || p.source === source)
+      .sort(Preference.sortByScope)
+      .map(p => this.parsePreference(p))
+      .reduce((acc, value) => acc.concat(value), []);
+  }
+
+  private parsePreference(pref: Preference) {
+    try {
+        return <string[]> JSON.parse(pref.value);
+    } catch (e) {
+        this.notificationService.notifyError(
+          this.translateService.instant('search.search.err-faulty-preference-for-attributes-to-ignore'), e);
+        return [];
+    }
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.component.html
new file mode 100644
index 0000000..80dd927
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.component.html
@@ -0,0 +1,24 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<p-tree class="mdmtree"
+        [value]="nodes"
+        selectionMode="single"
+        (onNodeExpand)="loadNodes($event)"
+        (onNodeSelect)="nodeSelect($event)">
+
+    <ng-template let-node pTemplate="default">
+        <span [title]="node.label" >{{ node.label }}</span>
+    </ng-template>
+</p-tree>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.component.ts
new file mode 100644
index 0000000..e04f2dd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.component.ts
@@ -0,0 +1,125 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, OnInit, Input, OnChanges, SimpleChanges, EventEmitter} from '@angular/core';
+
+import {SearchService, SearchDefinition, SearchAttribute, SearchLayout} from '../search/search.service';
+import {Preference, PreferenceService} from '../core/preference.service';
+import {Node} from '../navigator/node';
+import {MDMItem} from '../core/mdm-item';
+
+import {TypeaheadMatch} from 'ngx-bootstrap/typeahead';
+import {ModalDirective} from 'ngx-bootstrap';
+import {TreeModule, TreeNode} from 'primeng/primeng';
+
+@Component({
+  selector: 'searchattribute-tree',
+  templateUrl: './searchattribute-tree.component.html'
+})
+export class SearchattributeTreeComponent implements OnChanges {
+
+  @Input() environments: Node[];
+  @Input() searchAttributes: { [env: string]: SearchAttribute[] } = {};
+
+  lastClickTime = 0;
+  nodes: TreeNode[] = [];
+  selectedAttribute: { label: string, group: string, attribute: SearchAttribute };
+  public onNodeSelect$ = new EventEmitter<TreeNode>();
+
+  constructor(private searchService: SearchService) {}
+
+  ngOnChanges(changes: SimpleChanges) {
+    if ((changes['searchAttributes'] || changes['environments']) && this.environments && this.environments.length > 0) {
+      this.nodes = this.environments.map(n => this.mapRootNode(n));
+    }
+  }
+
+  mapRootNode(node: Node) {
+    let item = new MDMItem(node.sourceName, node.type, node.id);
+
+    return <TreeNode>{
+      label: node.name,
+      leaf: false,
+      type: 'env',
+      data: item
+    };
+  }
+
+  loadNodes(event: any) {
+    if (event.node) {
+      event.node.children = this.getChildren(event.node);
+    }
+  }
+
+  mapType(group: { boType: string, attributes: SearchAttribute[] }) {
+    return <TreeNode>{
+      label: group.boType,
+      leaf: false,
+      type: 'group',
+      data: group.attributes
+    };
+  }
+
+  mapAttribute(attribute: SearchAttribute) {
+    return <TreeNode>{
+      label: attribute.attrName,
+      leaf: true,
+      type: 'attribute',
+      data: attribute
+    };
+  }
+
+  getChildren(node: TreeNode): TreeNode[] {
+    if (node.type === 'env') {
+      return this.getSearchableGroups(node.data.source)
+        .sort((a, b) => a.boType.localeCompare(b.boType))
+        .map(g => this.mapType(g));
+    } else if (node.type === 'group') {
+      return (<SearchAttribute[]> node.data)
+        .sort((a, b) => a.attrName.localeCompare(b.attrName))
+        .map(a => this.mapAttribute(a));
+    } else {
+      return [];
+    }
+  }
+
+  getSearchableGroups(env: string): { boType: string, attributes: SearchAttribute[] }[] {
+    let distinctGroupArray: { boType: string, attributes: SearchAttribute[] }[] = [];
+    if (this.searchAttributes.hasOwnProperty(env)) {
+      this.searchAttributes[env].forEach(attribute => {
+          let item = distinctGroupArray.find(p => p.boType === attribute.boType);
+          if (item && item.attributes.every(a => a.attrName !== attribute.attrName)) {
+            item.attributes.push(attribute);
+          } else if (!item) {
+            distinctGroupArray.push({ boType: attribute.boType, attributes: [attribute]});
+          }
+      });
+    }
+
+    return distinctGroupArray;
+  }
+
+  nodeSelect(event) {
+    this.onNodeSelect$.emit(event.node);
+    if (event.originalEvent.timeStamp - this.lastClickTime < 300) {
+      if (!event.node.expanded && !event.node.children) {
+        this.loadNodes(event);
+      }
+      event.node.expanded = !event.node.expanded;
+    }
+    this.lastClickTime = event.originalEvent.timeStamp;
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.module.ts
new file mode 100644
index 0000000..95ac63a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/searchattribute-tree/searchattribute-tree.module.ts
@@ -0,0 +1,36 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+import { MDMNavigatorModule } from '../navigator/mdm-navigator.module';
+
+import { SearchattributeTreeComponent } from './searchattribute-tree.component';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    MDMNavigatorModule,
+  ],
+  declarations: [
+    SearchattributeTreeComponent,
+  ],
+  exports: [
+    SearchattributeTreeComponent,
+  ]
+})
+export class SearchattributeTreeModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/editview.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/editview.component.html
new file mode 100644
index 0000000..76148ed
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/editview.component.html
@@ -0,0 +1,107 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<style>
+  .modal-body >>> .ui-tree .ui-tree-container {
+    margin: 0 0 4px 0 !important;
+    width: 100%;
+    overflow: visible;
+  }
+
+  .modal-body >>> .ui-tree {
+    min-height: 50vh !important;
+    max-height: 72vh !important;
+    overflow: auto;
+  }
+
+  .modal-body >>> .ui-tree .ui-treenode .ui-treenode-content .ui-treenode-label {
+    padding-right: .75em;
+  }
+
+  .modal-body {
+    font-size: 14px;
+  }
+
+  .auto-width-typeahead >>> typeahead-container {
+    width: auto!important;
+  }
+
+  >>> .ui-growl {z-index: 999999 !important;}
+</style>
+
+<div bsModal #lgModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="SelectSearchComponents" aria-hidden="true">
+  <div class="modal-dialog modal-lg">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h4 class="modal-title">{{ 'tableview.editview.title-view-editor' | translate }}</h4>
+        <button type="button" class="close" (click)="closeDialog()" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+      </div>
+      <div class="modal-body">
+        <div class="container-fluid">
+          <div class="row">
+            <div class="col-md-4 auto-width-typeahead" style="min-height: 50vh; max-height: 72vh;">
+                <input [(ngModel)]="selectedAttribute"
+                      [typeahead]="typeAheadValues"
+                      (typeaheadOnSelect)="typeaheadOnSelect($event)"
+                      typeaheadOptionField="label"
+                      typeaheadGroupField="group"
+                      typeaheadOptionsLimit="15"
+                      placeholder="{{ 'tableview.editview.enter-search-text' | translate }}"
+                      class="form-control"
+                      style="margin-bottom: 15px;">
+              <searchattribute-tree [searchAttributes]="searchAttributes" [environments]="environments"></searchattribute-tree>
+            </div>
+            <div class="col-md-8" style="min-height: 50vh; max-height: 72vh; overflow-y:auto;">
+            <label for="search-source" class="col-form-label" style="padding: 8px 0 15px 0;">{{ 'tableview.editview.lbl-selected-attributes' | translate }}</label>
+            <div *ngIf="currentView.columns.length === 0" style="text-align: center;">
+              {{ 'tableview.editview.no-attributes-selected' | translate }}
+            </div>
+            <table class="table table-bordered" style="padding: 0; overflow-y:auto; table-layout: fixed;">
+              <tr *ngFor="let col of currentView.columns">
+                <td style="width: 50%;" >
+                  {{col.type}}
+                </td>
+                <td style="width: 50%;" >
+                   {{col.name}}
+                </td>
+                <td style="width: 30px; text-align: center; vertical-align: middle;">
+                  <span class="fa fa-chevron-up" [ngStyle]="{'visibility': isFirst(col) ? 'hidden': 'visible'}" style="cursor: pointer; margin-bottom: 0;" (click)="moveUp(col)"></span>
+                </td>
+                <td style="width: 30px; text-align: center; vertical-align: middle;">
+                  <span class="fa fa-chevron-down" [ngStyle]="{'visibility': isLast(col)? 'hidden': 'visible'}" style="cursor: pointer;" (click)="moveDown(col)"></span>
+                </td>
+                <td style="width: 30px; text-align: center; vertical-align: middle;">
+                  <span class="fa" [ngClass]="{'glyphicon-sort': isNone(col), 'fa-sort-alpha-desc': isDesc(col), 'fa-sort-alpha-asc': isAsc(col)}" style="cursor: pointer;" (click)="toggleSort(col)"></span>
+                </td>
+                <td style="width: 30px; text-align: center; vertical-align: middle;">
+                  <span class="fa fa-times" [ngClass]="" style="cursor: pointer;" (click)="remove(col)"></span>
+                </td>
+              </tr>
+            </table>
+            </div>
+          </div>
+          <div class="row" style="margin-top: 15px;">
+            <div class="col-md-12">
+              <button type="button" class="btn btn-default pull-right" (click)="applyChanges()">
+                <span class="fa fa-check"></span> {{ 'tableview.editview.btn-apply-changes' | translate }}
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/editview.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/editview.component.ts
new file mode 100644
index 0000000..e642426
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/editview.component.ts
@@ -0,0 +1,189 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Component, ViewChild, OnInit, Output, EventEmitter} from '@angular/core';
+
+import {map} from 'rxjs/operators';
+import {View, ViewColumn, ViewService} from './tableview.service';
+import {NodeService} from '../navigator/node.service';
+import {Node} from '../navigator/node';
+import {SearchService, SearchAttribute} from '../search/search.service';
+import {SearchattributeTreeComponent} from '../searchattribute-tree/searchattribute-tree.component';
+import {MDMNotificationService} from '../core/mdm-notification.service';
+import {TreeNode} from 'primeng/primeng';
+import {ModalDirective} from 'ngx-bootstrap';
+import {TypeaheadMatch} from 'ngx-bootstrap/typeahead';
+import {classToClass} from 'class-transformer';
+import { TranslateService } from '@ngx-translate/core';
+
+@Component({
+  selector: 'edit-view',
+  templateUrl: './editview.component.html',
+  styles: ['.remove {color:black; cursor: pointer; float: right}', '.icon { cursor: pointer; margin: 0px 5px; }']
+})
+export class EditViewComponent implements OnInit {
+
+  @ViewChild('lgModal') public childModal: ModalDirective;
+  @ViewChild(SearchattributeTreeComponent) tree: SearchattributeTreeComponent;
+
+  environments: Node[] = [];
+  isReadOnly = false;
+  currentView: View = new View();
+  searchAttributes: { [env: string]: SearchAttribute[] } = {};
+  typeAheadValues: {label: string, group: string, attribute: SearchAttribute }[] = [];
+
+  selectedAttribute: SearchAttribute;
+
+  @Output()
+  coloumnsSubmitted = new EventEmitter<View>();
+
+  constructor(private nodeService: NodeService,
+    private viewService: ViewService,
+    private searchService: SearchService,
+    private notificationService: MDMNotificationService,
+    private translateService: TranslateService) { }
+
+  ngOnInit() {
+    this.tree.onNodeSelect$.subscribe(
+      node => this.selectNode(node),
+      error => this.notificationService.notifyError(this.translateService.instant('tableview.editview.err-cannot-select-node'), error)
+    );
+
+    this.nodeService.getNodes()
+      .subscribe(
+        envs => {
+          this.searchService.loadSearchAttributesStructured(envs.map(e => e.sourceName)).pipe(
+            map(attrs => attrs['measurements']))
+            .subscribe(
+              attrs => this.refreshTypeAheadValues(attrs, envs),
+              error => this.notificationService.notifyError(
+                this.translateService.instant('tableview.editview.err-cannot-load-search-attributes'), error)
+            );
+        },
+        error => this.notificationService.notifyError(this.translateService.instant('tableview.editview.err-cannot-load-nodes'), error)
+      );
+  }
+
+  refreshTypeAheadValues(searchAttributes: { [env: string]: SearchAttribute[] }, environments: Node[]) {
+
+    this.searchAttributes = searchAttributes;
+    this.environments = environments;
+
+    let ar = Object.keys(this.searchAttributes)
+        .map(env => this.searchAttributes[env])
+        .reduce((acc, value) => acc.concat(value), <SearchAttribute[]> [])
+        .map(sa => { return { 'label': sa.boType + '.' + sa.attrName, 'group': sa.boType, 'attribute': sa }; });
+
+    this.typeAheadValues = this.uniqueBy(ar, p => p.label);
+  }
+
+  showDialog(currentView: View) {
+    this.currentView = classToClass(currentView);
+    this.isNameReadOnly();
+    this.childModal.show();
+    return this.coloumnsSubmitted;
+  }
+
+  closeDialog() {
+    this.childModal.hide();
+  }
+
+  remove(col: ViewColumn) {
+    this.currentView.columns = this.currentView.columns.filter(c => c !== col);
+  }
+
+  isLast(col: ViewColumn) {
+    return this.currentView.columns.indexOf(col) === this.currentView.columns.length - 1;
+  }
+
+  isFirst(col: ViewColumn) {
+    return this.currentView.columns.indexOf(col) === 0;
+  }
+
+  moveUp(col: ViewColumn) {
+    if (!this.isFirst(col)) {
+      let oldIndex = this.currentView.columns.indexOf(col);
+      let otherCol = this.currentView.columns[oldIndex - 1];
+      this.currentView.columns[oldIndex] = otherCol;
+      this.currentView.columns[oldIndex - 1] = col;
+    }
+  }
+
+  moveDown(col: ViewColumn) {
+    if (!this.isLast(col)) {
+      let oldIndex = this.currentView.columns.indexOf(col);
+      let otherCol = this.currentView.columns[oldIndex + 1];
+      this.currentView.columns[oldIndex] = otherCol;
+      this.currentView.columns[oldIndex + 1] = col;
+    }
+  }
+
+  selectNode(node: TreeNode) {
+    if (node.type !== 'attribute') {
+      return;
+    }
+    this.pushViewCol(new ViewColumn(node.parent.label, node.label));
+  }
+
+  pushViewCol(viewCol: ViewColumn) {
+    if (viewCol && this.currentView.columns.findIndex(c => viewCol.equals(c)) === -1 ) {
+      this.currentView.columns.push(viewCol);
+    } else {
+      this.notificationService.notifyInfo(this.translateService.instant('tableview.editview.attribute-already-selected'), 'Info');
+    }
+  }
+
+  isAsc(col: ViewColumn) {
+    return col.sortOrder === 1;
+  }
+  isDesc(col: ViewColumn) {
+    return col.sortOrder === -1;
+  }
+  isNone(col: ViewColumn) {
+    return col.sortOrder === null;
+  }
+
+  toggleSort(col: ViewColumn) {
+    if (col.sortOrder === null) {
+      this.currentView.setSortOrder(col.type, col.name, 1);
+    } else if (col.sortOrder === 1) {
+      this.currentView.setSortOrder(col.type, col.name, -1);
+    } else if (col.sortOrder === -1) {
+      this.currentView.setSortOrder(col.type, col.name, null);
+    }
+  }
+
+  private uniqueBy<T>(a: T[], key: (T) => any) {
+    let seen = {};
+    return a.filter(function(item) {
+      let k = key(item);
+      return seen.hasOwnProperty(k) ? false : (seen[k] = true);
+    });
+  }
+
+  public typeaheadOnSelect(match: TypeaheadMatch) {
+    this.pushViewCol(new ViewColumn(match.item.attribute.boType, match.item.attribute.attrName));
+    this.selectedAttribute = undefined;
+  }
+
+  private isNameReadOnly() {
+    return this.isReadOnly = (this.currentView.name === '') ? false : true;
+  }
+
+  applyChanges() {
+    this.coloumnsSubmitted.emit(this.currentView);
+    this.closeDialog();
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/query.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/query.service.spec.ts
new file mode 100644
index 0000000..4d4999c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/query.service.spec.ts
@@ -0,0 +1,103 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { async, TestBed, inject } from '@angular/core/testing';
+import { BaseRequestOptions, Http, HttpModule, Response, ResponseOptions, RequestMethod} from '@angular/http';
+import { MockBackend, MockConnection } from '@angular/http/testing';
+import { HttpErrorHandler } from '../core/http-error-handler';
+import { of as observableOf } from 'rxjs';
+
+import { MDMItem } from '../core/mdm-item';
+import { PropertyService } from '../core/property.service';
+import { QueryService, Query, SearchResult } from './query.service';
+
+describe ( 'QueryService', () => {
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpModule],
+      providers: [
+        PropertyService,
+        QueryService,
+        MockBackend,
+        BaseRequestOptions,
+        HttpErrorHandler,
+        {
+          provide: Http,
+          useFactory: (backend, options) => new Http(backend, options),
+          deps: [MockBackend, BaseRequestOptions]
+        }]
+    });
+  });
+
+  describe('query()', () => {
+    it('should return result for simple query', async(inject([QueryService, MockBackend], (queryService, mockBackend) => {
+      mockBackend.connections.subscribe((conn: MockConnection) => {
+        if (conn.request.url.endsWith('/query') && conn.request.method === RequestMethod.Post) {
+          let mockResponse = { rows: [
+            {source: 'MDMNVH', type: 'Test', id: 'id1', columns: [{type: 'Test', attribute: 'Name', value: 'TestNumberOne'}]}
+          ]};
+          conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+        }
+        return;
+      });
+
+      queryService.query(new Query()).subscribe(results => {
+        expect(results.rows.length).toBe(1);
+        expect(results.rows[0].columns[0].value).toEqual('TestNumberOne');
+      });
+    })));
+  });
+
+  describe('queryType()', () => {
+    it('should quote IDs', async(inject([QueryService], (queryService) => {
+      let spy = spyOn(queryService, 'query').and.returnValue(observableOf(new SearchResult()));
+
+      let query = new Query();
+      query.resultType = 'TestStep';
+      query.addFilter('MDM', 'Test.Id eq "id1"');
+      query.columns = ['TestStep.Name', 'TestStep.Id'];
+
+      queryService.queryType('TestStep', [{ source: 'MDM', type: 'Test', id: 'id1'}], ['TestStep.Name']).subscribe(results => {
+        expect(queryService.query).toHaveBeenCalledWith(query);
+      });
+    })));
+  });
+
+  describe('queryItems()', () => {
+    it('should return result for simple query', async(inject([QueryService, MockBackend], (queryService, mockBackend) => {
+      mockBackend.connections.subscribe((conn: MockConnection) => {
+        if (conn.request.url.endsWith('/query') && conn.request.method === RequestMethod.Post) {
+          let queryObject = <Query>JSON.parse(conn.request.getBody());
+          let mockResponse = { rows: [
+            {source: 'MDMNVH', type: queryObject.resultType, id: 'id1', columns:
+              [{type: 'Test', attribute: 'Name', value: 'TestNumberOne'}]}
+          ]};
+          conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+        }
+        return;
+      });
+      let item = new MDMItem('MDMNVH', 'Test', 'id1');
+
+      let result = queryService.queryItems([item], ['Test.Name']);
+      expect(result.length).toBe(1);
+      result[0].subscribe(results => {
+        expect(results.rows.length).toBe(1);
+        expect(results.rows[0].type).toEqual('Test');
+        expect(results.rows[0].columns[0].value).toEqual('TestNumberOne');
+      });
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/query.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/query.service.ts
new file mode 100644
index 0000000..abf5e97
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/query.service.ts
@@ -0,0 +1,144 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import {Injectable} from '@angular/core';
+import {Http, Headers, RequestOptions} from '@angular/http';
+
+import {of as observableOf,  Observable } from 'rxjs';
+import {catchError, map} from 'rxjs/operators';
+import {PropertyService} from '../core/property.service';
+import {MDMItem} from '../core/mdm-item';
+import {HttpErrorHandler} from '../core/http-error-handler';
+import {Type, deserialize} from 'class-transformer';
+
+export class Filter {
+  sourceName: string;
+  filter: string;
+  searchString: string;
+
+  constructor(sourceName: string, filter: string, searchString: string) {
+    this.sourceName = sourceName;
+    this.filter = filter;
+    this.searchString = searchString;
+  }
+}
+export class Query {
+  resultType: string;
+  @Type(() => Filter)
+  filters: Filter[] = [];
+  columns: String[] = [];
+
+  addFilter(sourceName: string, filter: string) {
+    let f = this.filters.find(i => i.sourceName === sourceName);
+    if (f) {
+      f.filter += ' or ' + filter; // TODO
+    } else {
+      this.filters.push(new Filter(sourceName, filter, ''));
+    }
+  }
+}
+
+export class Columns {
+  type: string;
+  attribute: string;
+  value: string;
+}
+
+export class Row {
+  source: string;
+  type: string;
+  id: string;
+  @Type(() => Columns)
+  columns: Columns[] = [];
+
+  getColumn(col: string) {
+    let column = this.columns.find(c => c.type + '.' + c.attribute === col);
+    if (column) {
+      return column.value;
+    } else {
+      return '';
+    }
+  }
+
+  equals (row: Row) {
+    return this.source === row.source && this.type === row.type && this.id === row.id;
+  }
+
+  public getItem() {
+    return new MDMItem(this.source, this.type, this.id);
+  }
+}
+
+export class SearchResult {
+  @Type(() => Row)
+  rows: Row[] = [];
+}
+
+@Injectable()
+export class QueryService {
+  private queryUrl: string;
+
+  constructor(private http: Http,
+              private httpErrorHandler: HttpErrorHandler,
+              private _prop: PropertyService) {
+    this.queryUrl = _prop.getUrl('mdm/query');
+  }
+
+  query(query: Query): Observable<SearchResult> {
+    return this.http.post(this.queryUrl, query).pipe(
+               map(res => deserialize(SearchResult, res.text())),
+               catchError(this.httpErrorHandler.handleError));
+  }
+
+  queryItems(items: MDMItem[], columns: string[]): Observable<SearchResult>[] {
+    let byType = items.reduce((acc: [string, MDMItem[]], item: MDMItem) => {
+      let key = item.type;
+      acc[key] = acc[key] || [];
+      acc[key].push(item);
+      return acc;
+    }, {});
+
+    return Object.keys(byType).map(type => this.queryType(type, byType[type], columns));
+  }
+
+  queryType(type: string, items: MDMItem[], columns: string[]) {
+    if (items && items.length > 0) {
+      let query = new Query();
+      query.resultType = type;
+      query.columns = columns;
+
+      query.columns.push(type + '.Id');
+      items.forEach(i => query.addFilter(i.source, i.type + '.Id eq "' + i.id + '"'));
+
+      return this.query(query);
+    } else {
+      return observableOf(new SearchResult());
+    }
+  }
+
+  suggestValues(environments: string[], type: string, attribute: string) {
+    let body = JSON.stringify({
+      'sourceNames': environments,
+      'type': type,
+      'attrName': attribute
+    });
+    let headers = new Headers({ 'Content-Type': 'application/json' });
+    let options = new RequestOptions({ headers: headers });
+    let url =  this._prop.getUrl('mdm/suggestions');
+    return this.http.post(url, body, options).pipe(
+      map(res => res.json().data),
+      catchError(this.httpErrorHandler.handleError));
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.css
new file mode 100644
index 0000000..0e6b71d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.css
@@ -0,0 +1,34 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+.table > tbody > tr.active > td {
+	background-color: #66afe9; /*#337ab7;*/
+}
+
+.noselect {
+  -webkit-touch-callout: none; /* iOS Safari */
+    -webkit-user-select: none; /* Safari */
+     -khtml-user-select: none; /* Konqueror HTML */
+       -moz-user-select: none; /* Firefox */
+        -ms-user-select: none; /* Internet Explorer/Edge */
+            user-select: none; /* Non-prefixed version, currently
+                                  supported by Chrome and Opera */
+}
+
+>>> thead >>> .ui-state-active {
+	background-color: #e7e7e7 !important;
+	border-color: #c7c7c7 !important;
+	color: inherit !important;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.html
new file mode 100644
index 0000000..d1305d7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.html
@@ -0,0 +1,129 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+<div *ngIf="loading" style="text-align: center; margin: 1em;">
+  <div class="fa fa-spinner fa-pulse fa-fw"></div>
+  <!--   Suchergebnisse werden geladen-->
+  {{ 'tableview.tableview.loading-search-results' | translate }}
+</div>
+<div *ngIf="!loading" style="overflow-x: auto;">
+
+  <p-contextMenu #cm [model]="menuItems" appendTo="body"></p-contextMenu>
+  <p-table [value]="viewRows"
+           [columns]="turboViewColumns"
+
+           [resizableColumns]="true"
+           columnResizeMode="expand"
+           [reorderableColumns]="true"
+
+           sortMode="single"
+           [customSort]=true
+           (sortFunction)="customSort($event)"
+           [sortField]="view?.sortField"
+           [sortOrder]="view?.sortOrder"
+
+           [(selection)]="selectedViewRows"
+           dataKey="id"
+
+           [(contextMenuSelection)]="menuSelectedRow"
+           [contextMenu]="cm"
+
+           [paginator]="true"
+           [pageLinks]="3"
+           [rows]="10"
+           [rowsPerPageOptions]="[3,10,20,50,100,200,500,1000]"
+
+           (onColReorder)="onColReorder($event)"
+           (onColResize)="onColResize($event)"
+           (onSort)="onSort($event)"
+           (onContextMenuSelect)="onContextMenuSelect($event)"
+           (onRowClick)="onRowClick($event)"
+>
+           <!--
+           [scrollable]="true"
+           [style]="{width:'200px;'}"
+
+           [sortField]="view?.getSortField()"
+           [sortOrder]="view?.getSortOrder()"
+           (sortFunction)="onSort($event)"
+
+           (onColReorder)="onColReorder($event)"
+
+
+           stateStorage="local"
+           stateKey="state01" -->
+    <!-- <ng-template pTemplate="colgroup" let-columns>
+          <colgroup>
+            <col style="width: 3em">
+            <col style="width: 3em">
+            <col style="width: 3em">
+            <col *ngFor="let col of columns" [style]="{'width': col.width +'px;'}">
+          </colgroup>
+    </ng-template> -->
+    <ng-template pTemplate="header" let-columns>
+      <tr>
+        <th style="width: 3em">
+          <p-tableHeaderCheckbox></p-tableHeaderCheckbox>
+        </th>
+        <th style="width: 3em"></th>
+        <th style="width: 3em"></th>
+        <!--
+            [style]="{'width': col.width +'px;'}" -->
+        <th *ngFor="let col of columns"
+            [pSortableColumn]="col.field"
+            pReorderableColumn
+            pResizableColumn>
+          {{col.header}}
+          <p-sortIcon [field]="col.field"></p-sortIcon>
+        </th>
+      </tr>
+    </ng-template>
+    <ng-template pTemplate="body"
+                 let-rowData
+                 let-columns="columns">
+      <tr [pSelectableRow]="rowData" [pContextMenuRow]="rowData">
+        <td>
+          <p-tableCheckbox [value]="rowData"></p-tableCheckbox>
+        </td>
+        <td>
+          <a class="icon"
+             [ngClass]="getNodeClass(rowData.type)"
+             title="{{getRowTitle(rowData)}}"
+             style="color:black; cursor: pointer;"
+             (click)="openInTree(rowData, $event)"
+             > </a>
+        </td>
+        <td>
+          <span class="fa"
+                [ngClass]="{'fa-shopping-cart': isShopable, 'fa-times': isRemovable}"
+                style="cursor: pointer"
+                title="{{ getIconTitle() | translate }}"
+                (click)="functionalityProvider(rowData)">
+          </span>
+        </td>
+        <td *ngFor="let col of columns">
+          {{rowData[col.field]}}
+        </td>
+      </tr>
+    </ng-template>
+
+    <!-- add 3 cols for the button columns -->
+    <ng-template pTemplate="emptymessage" let-columns>
+        <tr>
+            <td [attr.colspan]="columns?.length + 3">
+                {{ 'tableview.tableview.no-records-found' | translate }}
+            </td>
+        </tr>
+    </ng-template>
+  </p-table>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.ts
new file mode 100644
index 0000000..d1ccecc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.component.ts
@@ -0,0 +1,326 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, Input, ViewChild, OnInit, OnChanges, SimpleChanges, DoCheck} from '@angular/core';
+
+import { View, ViewColumn} from './tableview.service';
+import { NavigatorService } from '../navigator/navigator.service';
+import { SearchAttribute } from '../search/search.service';
+import { BasketService} from '../basket/basket.service';
+
+import { EditViewComponent } from './editview.component';
+import { SearchResult, Row } from './query.service';
+import { Node } from '../navigator/node';
+import { NodeService } from '../navigator/node.service';
+
+import {DataTableModule, SharedModule, ContextMenuModule, MenuItem, SortEvent} from 'primeng/primeng';
+import {MDMNotificationService} from '../core/mdm-notification.service';
+
+import { TranslateService } from '@ngx-translate/core';
+import { streamTranslate, TRANSLATE } from '../core/mdm-core.module';
+
+export class TurboViewColumn {
+
+  field: string;
+  header: string;
+  width: number;
+  sortOrder: number;
+
+  constructor (field: string, header: string, width?: number, sortOrder?: number) {
+    this.field = field;
+    this.header = header;
+    this.sortOrder = sortOrder != undefined ? sortOrder : 0;
+    this.width = width;
+  }
+}
+
+
+@Component({
+  selector: 'mdm-tableview',
+  templateUrl: 'tableview.component.html',
+  styleUrls: ['./tableview.component.css']
+})
+export class TableviewComponent implements OnInit, OnChanges {
+
+  public static readonly pageSize = 5;
+  readonly buttonColumns = 3;
+
+  @Input() view: View;
+  @Input() results: SearchResult;
+
+  /** @todo: Bad practice. value defined in template will be assumed to be a string.
+  example: in template: [isShopable]="false", in component if(isShopable) {console.log('yes')} else { console.log('no')} will log yes!
+  **/
+  @Input() isShopable = false;
+  @Input() isRemovable  = false;
+  @Input() menuItems: MenuItem[] = [];
+  @Input() selectedEnvs: Node[];
+  @Input() searchAttributes: { [env: string]: SearchAttribute[] };
+  @Input() environments: Node[];
+  @Input() loading: true;
+  @Input() loadingIcon = 'fa-spinner';
+
+  public menuSelectedRow: Row;
+  public selectedRows: Row[] = [];
+  public columnsToShow: ViewColumn[];
+  public readonly buttonColStyle = {'width': '3%'};
+  public btnColHidden = false;
+
+  public viewRows: Row[];
+  public turboViewColumns: TurboViewColumn[];
+  public selectedViewRows: Row[] = [];
+
+
+  constructor(private basketService: BasketService,
+              private navigatorService: NavigatorService,
+              private nodeService: NodeService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+  }
+
+  ngOnInit() {
+    streamTranslate(this.translateService, TRANSLATE('tableview.tableview.show-in-tree'))
+    .subscribe(labels => this.menuItems.push({
+      label: labels,
+      icon: 'fa fa-tree',
+      command: (event) => this.openInTree(this.menuSelectedRow)
+    }));
+
+    streamTranslate(this.translateService, TRANSLATE('tableview.tableview.reset-selection'))
+    .subscribe(labels => this.menuItems.push({
+      label: labels,
+      icon: 'fa fa-square-o',
+      command: (event) => {
+        this.selectedViewRows = [];
+        this.menuSelectedRow = undefined;
+      }
+    }));
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    if (changes['results'] && this.view != undefined) {
+      this.customSort({ 'field': this.view.getSortField(), 'order': this.view.getSortOrder() });
+      this.viewRows = this.results.rows.map(row => this.mapRow2View(row));
+    }
+    if (changes['view'] && this.view != undefined) {
+      this.turboViewColumns = this.view.columns.map(viewCol => this.mapColumn2Turbo(viewCol));
+    }
+    if (changes['selectedEnvs'] || changes['view']) {
+      this.updateColumnsToShow();
+    }
+  }
+
+
+  mapRow2View(row: Row) {
+    let viewRow: Row = new Row();
+    row.columns.forEach(col => viewRow[col.type + '_' + col.attribute] = col.value != undefined ? col.value : '-');
+    viewRow['id'] = row.id;
+    viewRow['type'] = row.type;
+    viewRow['source'] = row.source;
+    return viewRow;
+  }
+
+  mapColumn2Turbo(viewCol: ViewColumn) {
+    return new TurboViewColumn(viewCol.type + '_' + viewCol.name, viewCol.type + ' ' + viewCol.name, viewCol.width);
+  }
+
+  /** @TODO: update for viewRows/columns
+  **/
+  updateColumnsToShow() {
+    if (this.view && this.selectedEnvs && this.selectedEnvs.length > 0
+        && this.searchAttributes && this.searchAttributes[this.selectedEnvs[0].sourceName]) {
+
+      let relevantCols: string[] = [];
+      this.selectedEnvs.forEach(env =>
+        relevantCols = relevantCols.concat(this.searchAttributes[env.sourceName].map(sa =>
+          sa.boType.toLowerCase() + sa.attrName.toLowerCase())
+        )
+      );
+      relevantCols = Array.from(new Set(relevantCols));
+
+      this.view.columns.filter(col => {
+        if (relevantCols.findIndex(ct => ct === col.type.toLowerCase() + col.name.toLowerCase()) > -1) {
+          col.hidden = false;
+        } else {
+          col.hidden = true;
+        }
+        this.btnColHidden = false;
+      });
+    } else if (this.view && this.selectedEnvs && this.selectedEnvs.length === 0) {
+      this.btnColHidden = true;
+      this.view.columns.forEach(vc => vc.hidden = true);
+    }
+  }
+
+  onContextMenuSelect(event: any) {
+    this.menuSelectedRow = event.data;
+  }
+
+  /** @todo: p-table is not supporting manual column width. Might be kept as guide line in case
+  * future version of p-table support checkbox with multi selection.
+  *   @deprecated
+  **/
+  onColResize(event: any) {
+    let index = event.element.cellIndex - this.buttonColumns;
+    if (index > -1) {
+      this.view.columns[index].width = event.element.clientWidth;
+    }
+  }
+
+  onColReorder(event: any) {
+    let tmp = this.view.columns[event.dragIndex];
+    this.view.columns[event.dragIndex] = this.view.columns[ event.dropIndex];
+    this.view.columns[event.dropIndex] = tmp;
+  }
+
+  onSort(event: any) {
+    if (this.view != undefined) {
+      this.view.sortField = event.field;
+      this.view.sortOrder = event.order;
+    }
+  }
+
+  customSort(event: SortEvent) {
+    let comparer = function(row1: Row, row2: Row): number {
+      let value1 = row1[event.field];
+      let value2 = row2[event.field];
+
+      if (value1 == null && value2 != null) {
+        return -1;
+      } else if (value1 != null && value2 == null) {
+        return 1;
+      } else if (value1 == null && value2 == null) {
+        return 0;
+      } else if (!isNaN(<any>value1) && !isNaN(<any>value2)) {
+        if (value1 === value2) {
+          return 0;
+        } else {
+          return (+value1 < +value2 ? -1 : 1) * event.order;
+        }
+      } else {
+        return value1.localeCompare(value2) * -event.order;
+      }
+    };
+    if (event.data) {
+      event.data.sort(comparer);
+    }
+  }
+
+  functionalityProvider(row: Row) {
+    let item = row.getItem();
+    if (this.isShopable) {
+      this.basketService.add(item);
+    } else {
+      this.basketService.remove(item);
+    }
+  }
+
+  /** @todo: should be converted to pipe. avoid function calls from template (apart from event binding) for performance.
+  **/
+  getNodeClass(type: string) {
+    switch (type) {
+      case 'StructureLevel':
+        return 'pool';
+      case 'MeaResult':
+        return 'measurement';
+      case 'SubMatrix':
+        return 'channelgroup';
+      case 'MeaQuantity':
+        return 'channel';
+      default:
+        return type.toLowerCase();
+    }
+  }
+
+  /** @todo: should be converted to pipe. avoid function calls from template (apart from event binding) for performance.
+  **/
+  getRowTitle(row: Row) {
+    return this.translateService.instant('tableview.tableview.tooltip-open-in')
+      + ': ' + [NodeService.mapSourceNameToName(this.environments, row.source), row.type, row.id].join('/');
+  }
+
+  /** @todo: should be converted to pipe. avoid function calls from template for performance.
+  *           option b) convert to componant field, since its not depending on result data.
+  **/
+  getIconTitle() {
+    return this.isShopable
+      ? TRANSLATE('tableview.tableview.tooltip-add-to-shopping-basket')
+      : TRANSLATE('tableview.tableview.tooltip-remove-from-shopping-basket');
+  }
+
+  /** @todo: helping function for multi select in p-datatable. p-table does not support select mode
+  * multiple with check box. Thus, this is not used at the moment. Might be kept as guide line in case
+  * future version of p-table support checkbox with multi selection.
+  *   @deprecated
+  **/
+  onRowClick(e: any) {
+    let row: Row = e.data;
+    this.nodeService.getNodeFromItem(row.getItem()).subscribe(
+      node => this.navigatorService.fireSelectedNodeChanged(node),
+      error => this.notificationService.notifyError(this.translateService.instant('tableview.tableview.err-cannot-calculate-node'), error)
+    );
+    let event: MouseEvent = e.originalEvent;
+    if (event.shiftKey && this.selectedRows.length > 0) {
+      let lastRow = this.selectedRows[this.selectedRows.length - 1];
+      let lastIndex = this.results.rows.findIndex(r => r.equals(lastRow));
+      let thisIndex = this.results.rows.findIndex(r => r.equals(row));
+      if (this.selectedRows.findIndex(sr => sr.equals(row)) > -1) {
+      } else {
+        let min = Math.min(lastIndex, thisIndex);
+        let max = Math.max(lastIndex, thisIndex);
+        this.results.rows.slice(min, max + 1)
+          .forEach(r => {
+            if (this.selectedRows.findIndex(sr => sr.equals(r)) === -1) {
+              this.selectedRows.push(r);
+            }
+          });
+      }
+    } else if (event.ctrlKey) {
+      this.selectRow(row);
+    } else {
+      if (this.selectedRows.length > 1 || (this.selectedRows.length !== 0 && !row.equals(this.selectedRows[0]))) {
+        this.selectedRows = [];
+      }
+      this.selectRow(row);
+    }
+  }
+
+  /** @todo: helping function for multi select in p-datatable. p-table does not support select mode
+  * multiple with check box. Thus, this is not used at the moment. Might be kept as guide line in case
+  * future version of p-table support checkbox with multi selection.
+  *   @deprecated
+  **/
+  selectRow(row: Row) {
+    let index = this.selectedRows.findIndex(ai => ai.equals(row));
+    if (index === -1) {
+      this.selectedRows.push(row);
+    } else {
+      this.selectedRows.splice(index, 1);
+    }
+  }
+
+  openInTree(row?: Row) {
+    if (row != undefined) {
+      this.selectedViewRows = [row];
+    }
+    if (this.selectedViewRows != undefined && this.selectedViewRows.length === 0 && this.menuSelectedRow != undefined) {
+      this.navigatorService.fireOnOpenInTree([this.menuSelectedRow.getItem()]);
+    } else if (row) {
+      this.navigatorService.fireOnOpenInTree([row.getItem()]);
+    } else {
+      this.navigatorService.fireOnOpenInTree(this.selectedRows.map(r => r.getItem()));
+    }
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.module.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.module.ts
new file mode 100644
index 0000000..2cfde41
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.module.ts
@@ -0,0 +1,50 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { NgModule } from '@angular/core';
+
+import { MDMCoreModule } from '../core/mdm-core.module';
+
+import { TableviewComponent } from './tableview.component';
+import { EditViewComponent } from './editview.component';
+import { ViewComponent } from './view.component';
+import {SearchattributeTreeModule} from '../searchattribute-tree/searchattribute-tree.module';
+
+import {TableModule} from 'primeng/table';
+import {DataTableModule, SharedModule} from 'primeng/primeng';
+
+@NgModule({
+  imports: [
+    MDMCoreModule,
+    SearchattributeTreeModule,
+    TableModule,
+    DataTableModule,
+    SharedModule
+  ],
+  declarations: [
+    TableviewComponent,
+    EditViewComponent,
+    ViewComponent
+  ],
+  exports: [
+    TableviewComponent,
+    EditViewComponent,
+    ViewComponent,
+  ],
+  providers: [
+  ]
+})
+export class TableViewModule {
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.service.spec.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.service.spec.ts
new file mode 100644
index 0000000..6d64e58
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.service.spec.ts
@@ -0,0 +1,92 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { async, TestBed, inject } from '@angular/core/testing';
+import { BaseRequestOptions, Http, HttpModule, Response, ResponseOptions } from '@angular/http';
+import { MockBackend } from '@angular/http/testing';
+
+import { ViewService } from './tableview.service';
+import { PropertyService } from '../core/property.service';
+import { PreferenceService, Scope } from '../core/preference.service';
+import { HttpErrorHandler } from '../core/http-error-handler';
+
+import { MDMNotificationService } from '../core/mdm-notification.service';
+import { TranslateModule } from '@ngx-translate/core';
+
+describe ( 'TableviewService', () => {
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        HttpModule,
+        TranslateModule.forRoot(),
+      ],
+      providers: [
+        ViewService,
+        PropertyService,
+        PreferenceService,
+        MockBackend,
+        BaseRequestOptions,
+        HttpErrorHandler,
+        MDMNotificationService,
+        {
+          provide: Http,
+          useFactory: (backend, options) => new Http(backend, options),
+          deps: [MockBackend, BaseRequestOptions]
+        }]
+    });
+  });
+
+  describe('getViews()', () => {
+    it('should return view from preference', async(inject([ViewService, MockBackend], (tableviewService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+        const mockResponse = {
+          preferences: [
+          {
+            id: 22,
+            key: 'tableview.view.Test',
+            scope: Scope.USER,
+            source: null,
+            user: 'sa',
+            value: '{"columns":[{"type":"Test","name":"Name"},{"type":"TestStep","name":"Name"}],"name":"Test"}'
+          }
+        ]};
+        conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+      });
+
+      tableviewService.getViews().subscribe(prefViews => {
+        expect(prefViews.length).toBe(1);
+        expect(prefViews[0].scope).toBe(Scope.USER);
+        expect(prefViews[0].view.columns.length).toBe(2);
+      });
+    })));
+
+    it('should return default view, if no view preferences are available',
+        async(inject([ViewService, MockBackend], (tableviewService, mockBackend) => {
+
+      mockBackend.connections.subscribe(conn => {
+        const mockResponse = { preferences: [] };
+        conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
+      });
+
+      tableviewService.getViews().subscribe(prefViews => {
+        expect(prefViews.length).toBe(1);
+        expect(prefViews[0].scope).toBe(Scope.SYSTEM);
+        expect(prefViews[0].view.columns.length).toBe(1);
+      });
+    })));
+  });
+});
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.service.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.service.ts
new file mode 100644
index 0000000..247b78d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/tableview.service.ts
@@ -0,0 +1,135 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Injectable, EventEmitter } from '@angular/core';
+
+import { defaultIfEmpty, filter, map} from 'rxjs/operators';
+import { TranslateService } from '@ngx-translate/core';
+import { Type, serialize, deserialize } from 'class-transformer';
+
+import { PreferenceService, Preference, Scope } from '../core/preference.service';
+import { MDMNotificationService } from '../core/mdm-notification.service';
+
+export class ViewColumn {
+  type: string;
+  name: string;
+  hidden = false;
+  sortOrder: number;
+  width: number;
+
+  constructor(type: string, name: string, width?: number, sortOrder?: number) {
+    this.type = type;
+    this.name = name;
+    this.width = width;
+    this.sortOrder = sortOrder;
+  }
+
+  equals(vc: ViewColumn) {
+    return this.type === vc.type && this.name === vc.name;
+  }
+}
+
+export class View {
+  name: string;
+  @Type(() => ViewColumn)
+  columns: ViewColumn[] = [];
+  sortOrder: number;
+  sortField: string;
+
+  constructor(name?: string, cols?: ViewColumn[]) {
+    this.name = name || ''; // TODO TRANSLATION: find a way to name a new view "New view" in current language
+    this.columns = cols || [];
+  }
+
+  setSortOrder(type: string, name: string, order: any) {
+    this.columns.forEach(c => {
+    if (c.type === type && c.name === name ) {
+      c.sortOrder = order;
+    } else {
+      c.sortOrder = null;
+    }
+  });
+  }
+
+  getSortOrder() {
+    let col = this.columns.find(c => c.sortOrder !== null);
+    if (col) {
+      return col.sortOrder;
+    }
+  }
+
+  getSortField() {
+    let col = this.columns.find(c => c.sortOrder !== null);
+    if (col) {
+      return col.type + '.' + col.name;
+    }
+  }
+}
+
+export class PreferenceView {
+  scope: string;
+  @Type(() => View)
+  view: View;
+
+  constructor(scope: string, view?: View) {
+    this.scope = scope;
+    this.view = view || new View();
+  }
+}
+
+export class Style {
+  [field: string]: string
+}
+
+
+
+@Injectable()
+export class ViewService {
+  public viewSaved$ = new EventEmitter<View>();
+  public viewDeleted$ = new EventEmitter();
+
+  readonly preferencePrefix = 'tableview.view.';
+  private views: View[] = [];
+
+  defaultPrefViews =  [ new PreferenceView(Scope.SYSTEM, new View('Standard', [new ViewColumn('Test', 'Name')])) ];
+
+  constructor(private prefService: PreferenceService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+  }
+
+  getViews() {
+    return this.prefService.getPreference(this.preferencePrefix).pipe(
+        map(preferences => preferences.map(p => new PreferenceView(p.scope, deserialize(View, p.value)))),
+        filter(prefViews => !(prefViews == undefined || prefViews.length === 0)),
+        defaultIfEmpty(this.defaultPrefViews));
+  }
+
+  saveView(view: View) {
+    const pref = new Preference();
+    pref.value = serialize(view);
+    pref.key = this.preferencePrefix + view.name;
+    pref.scope = Scope.USER;
+    this.prefService.savePreference(pref).subscribe(
+      saved => this.viewSaved$.emit(view),
+      error => this.notificationService.notifyError(this.translateService.instant('tableview.tableview.err-cannot-save-view'), error)
+    );
+  }
+
+  deleteView(name: string) {
+    return this.prefService.deletePreferenceByScopeAndKey(Scope.USER, 'tableview.view.' + name);
+  }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/view.component.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/view.component.html
new file mode 100644
index 0000000..273f81b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/view.component.html
@@ -0,0 +1,103 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<style>
+   :host /deep/ .dropdown {
+    width: 200px;
+  }
+
+   :host /deep/ .dropdown-toggle {
+    overflow: hidden;
+    padding-right: 24px/* Optional for caret */
+    ;
+    text-align: left;
+    text-overflow: ellipsis;
+    width: 100%;
+  }
+  /* Optional for caret */
+
+   :host /deep/ .dropdown-toggle .caret {
+    position: absolute;
+    right: 12px;
+    top: calc(50% - 2px);
+  }
+</style>
+
+<div class="btn-group" dropdown>
+  <button id="view" title="{{ 'tableview.view.tooltip-select-view' | translate }}" dropdownToggle type="button" class="btn btn-mdm dropdown-toggle" aria-haspopup="true" aria-expanded="false">
+    {{selectedView?.name}} <span class="caret"></span>
+  </button>
+  <ul class="dropdown-menu scrollable-menu" style="height: auto; max-height: 200px; overflow-x: hidden;" *dropdownMenu>
+    <div *ngFor="let groupedView of groupedViews" class="container-fluid">
+      <li class="dropdown-header" style="padding-left: 0pt;"> {{groupedView.label}} </li>
+      <li *ngFor="let view of groupedView.view">
+        <a class="dropdown-item" style="color:black; cursor: pointer;" (click)="selectView(view)">{{view.name}}</a>
+      </li>
+    </div>
+  </ul>
+</div>
+<button type="button" class="btn btn-mdm" (click)="newView($event)" title="{{ 'tableview.view.tooltip-create-new-view' | translate }}"><span class="fa fa-plus"></span></button>
+<button type="button" class="btn btn-mdm" (click)="editSelectedView($event)" title="{{ 'tableview.view.tooltip-edit-view' | translate }}"><span class="fa fa-pencil-square-o"></span></button>
+<button type="button" class="btn btn-mdm" (click)="showSaveModal($event)" title="{{ 'tableview.view.tooltip-save-view' | translate }}"><span class="fa fa-floppy-o"></span></button>
+<button type="button" class="btn btn-mdm" (click)="deleteView($event)" title="{{ 'tableview.view.tooltip-delete-view' | translate }}"><span class="fa fa-times"></span></button>
+
+<edit-view></edit-view>
+<overwrite-dialog></overwrite-dialog>
+
+<div bsModal #lgSaveModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="SelectSearchComponents" aria-hidden="true">
+  <div class="modal-dialog modal-md">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" (click)="childSaveModal.hide()" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+        <h4 class="modal-title">{{ 'tableview.view.title-save-view-as' | translate }}:</h4>
+      </div>
+      <div class="modal-body">
+        <div class="container-fluid">
+          <div class="row" *ngIf="userViewNames?.length > 0">
+            <p-dataTable
+              [value]="userViewNames"
+              resizableColumns="false"
+              [reorderableColumns]="false"
+              [rows]="10"
+              [paginator]="true"
+              [pageLinks]="3"
+              [rowsPerPageOptions]="[10,20,50]"
+              [(selection)]="selectedRow"
+              (onRowClick)="onRowSelect($event)"
+              (onRowSelect)="onRowSelect($event)">
+              <p-column [style]="{'width':'30px'}" selectionMode="single"></p-column>
+              <p-column header="{{ 'tableview.view.existing-view-names' | translate }}">
+                <ng-template pTemplate="body" let-col let-row="rowData" >
+                  {{row}}
+                </ng-template>
+              </p-column>
+            </p-dataTable>
+          </div>
+          <div class="row" style="margin-top: 15px;">
+            <div class="col-md-10" style="padding-left: 0;">
+              <input type="text" class="form-control" placeholder="Ansicht-Name" [value]="viewName" (input)="viewName = $event.target.value" (keyup.enter)="saveView($event)" required>
+            </div>
+            <div class="col-md-2" style="padding: 0;">
+                <button type="button" class="btn btn-default pull-right" (click)="saveView($event)" [disabled]="!viewName" title="{{ getSaveBtnTitle() | translate }}">
+                  <span class="fa fa-floppy-o"></span> {{ 'tableview.view.btn-save' | translate }}
+                </button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/view.component.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/view.component.ts
new file mode 100644
index 0000000..e5da9f4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/tableview/view.component.ts
@@ -0,0 +1,213 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { Component, ViewChild, OnInit, EventEmitter} from '@angular/core';
+
+import { PreferenceView, View, ViewService} from './tableview.service';
+import { EditViewComponent } from './editview.component';
+
+import {classToClass} from 'class-transformer';
+import { ModalDirective } from 'ngx-bootstrap';
+
+import { OverwriteDialogComponent } from '../core/overwrite-dialog.component';
+import { MDMNotificationService } from '../core/mdm-notification.service';
+import { Scope } from '../core/preference.service';
+
+import { TranslateService } from '@ngx-translate/core';
+import { TRANSLATE } from '../core/mdm-core.module';
+
+@Component({
+  selector: 'mdm-view',
+  templateUrl: 'view.component.html'
+})
+export class ViewComponent implements OnInit {
+
+  public selectedView: View;
+  public groupedViews: { scope: string, view: View[], label: string }[] = [];
+  public viewChanged$ = new EventEmitter();
+  public viewName = '';
+  public userViewNames: string[];
+  public selectedRow: string;
+  public lazySelectedRow: string;
+
+  @ViewChild(EditViewComponent)
+  editViewComponent: EditViewComponent;
+
+  @ViewChild('lgSaveModal')
+  childSaveModal: ModalDirective;
+
+  @ViewChild(OverwriteDialogComponent)
+  overwriteDialogComponent: OverwriteDialogComponent;
+
+  constructor(private viewService: ViewService,
+              private notificationService: MDMNotificationService,
+              private translateService: TranslateService) {
+  }
+
+  ngOnInit() {
+    this.viewService.getViews().subscribe(
+                views => this.setViews(views),
+                error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-load-views'), error)
+    );
+    this.viewService.viewSaved$.subscribe(
+                view => this.onViewSaved(view),
+                error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-saving-view'), error)
+    );
+    this.viewService.viewDeleted$.subscribe(
+                () => this.onDeleteView(),
+                error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-deleting-view'), error)
+    );
+  }
+
+  selectView(view: View) {
+    this.selectedView = view;
+    this.viewChanged$.emit();
+  }
+
+  public editSelectedView(e: Event) {
+    e.stopPropagation();
+    this.editViewComponent.showDialog(this.selectedView).subscribe(
+      v => this.selectedView = v,
+      error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-select-view'), error)
+    );
+  }
+
+  public newView(e: Event) {
+    e.stopPropagation();
+    this.editViewComponent.showDialog(new View()).subscribe(
+      v => this.selectedView = v,
+      error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-display-view-editor'), error)
+    );
+  }
+
+  private onDeleteView() {
+    this.viewService.getViews().subscribe(
+      prefViews => {
+        this.getGroupedView(prefViews);
+        if (prefViews.find(pv => pv.view.name === this.selectedView.name) == undefined
+            && this.viewService.defaultPrefViews.find(pv => pv.view.name === this.selectedView.name) == undefined) {
+          this.selectView(prefViews[0].view);
+        }
+      },
+      error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-update-views'), error)
+    );
+  }
+
+ private onViewSaved(view: View) {
+   this.viewService.getViews().subscribe(
+     prefViews => this.getGroupedView(prefViews),
+     error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-update-views'), error)
+   );
+  }
+
+  private setViews(prefViews: PreferenceView[]) {
+    this.getGroupedView(prefViews);
+    this.selectView(prefViews[0].view);
+  }
+
+  private getGroupedView(prefViews: PreferenceView[]) {
+    this.groupedViews = [];
+    for (let i = 0; i < prefViews.length; i++) {
+      let pushed = false;
+      for (let j = 0; j < this.groupedViews.length; j++) {
+        if (prefViews[i].scope === this.groupedViews[j].scope) {
+          this.groupedViews[j].view.push(prefViews[i].view);
+          pushed = true;
+        }
+      }
+      if (pushed === false) { this.groupedViews.push({
+        scope: prefViews[i].scope,
+        view: [prefViews[i].view],
+        label: Scope.toLabel(prefViews[i].scope)
+      }); }
+    }
+    this.updateUserViewNames();
+  }
+
+  private updateUserViewNames() {
+    this.viewService.getViews().subscribe(
+      prefViews => this.userViewNames = prefViews.filter(pv => pv.scope === Scope.USER)
+                                                 .map(pv => pv.view.name),
+      error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-update-views'), error)
+    );
+  }
+
+  saveView(e: Event) {
+    e.stopPropagation();
+    if (this.groupedViews.find(gv => gv.view.find(v => v.name === this.viewName) != undefined)) {
+      this.childSaveModal.hide();
+      this.overwriteDialogComponent.showOverwriteModal(this.translateService.instant('tableview.view.a-view')).subscribe(
+        needSave => this.saveView2(needSave),
+        error => {
+          this.saveView2(false);
+          this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-save-view'), error);
+        }
+      );
+    } else {
+      this.saveView2(true);
+    }
+  }
+
+  saveView2(save: boolean) {
+    if (save) {
+      let view = classToClass(this.selectedView);
+      view.name = this.viewName;
+      this.viewService.saveView(view);
+      this.childSaveModal.hide();
+      this.selectView(classToClass(view));
+    } else {
+      this.childSaveModal.show();
+    }
+  }
+
+  showSaveModal(e: Event) {
+    e.stopPropagation();
+    this.viewName = this.selectedView.name === this.translateService.instant('tableview.view.new-view') ? '' : this.selectedView.name;
+    this.childSaveModal.show();
+  }
+
+  deleteView(e: Event) {
+    e.stopPropagation();
+    let userGroup = this.groupedViews.find(gv => gv.scope === Scope.USER);
+    if (userGroup && userGroup.view.length > 0) {
+      this.viewService.deleteView(this.selectedView.name).subscribe(() =>
+        this.viewService.getViews().subscribe(
+          views => {
+            this.setViews(views);
+            this.viewService.viewDeleted$.emit();
+          },
+          error => this.notificationService.notifyError(this.translateService.instant('tableview.view.err-cannot-delete-view'), error))
+      );
+    } else {
+      this.notificationService.notifyError('Forbidden.',
+      this.translateService.instant('tableview.view.err-cannot-modify-system-settings'));
+    }
+  }
+
+  getSaveBtnTitle() {
+    return this.viewName ? TRANSLATE('tableview.view.tooltip-save-view') : TRANSLATE('tableview.view.tooltip-no-name-set');
+  }
+
+  onRowSelect(e: any) {
+    if (this.lazySelectedRow !== e.data) {
+      this.selectedRow = e.data;
+      this.viewName = e.data;
+    } else {
+      this.selectedRow = undefined;
+      this.viewName = '';
+    }
+    this.lazySelectedRow = this.selectedRow;
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/.gitkeep b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/.gitkeep
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/brick.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/brick.png
new file mode 100644
index 0000000..7851cf3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/brick.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/brick_add.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/brick_add.png
new file mode 100644
index 0000000..fac186b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/brick_add.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/calendar.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/calendar.png
new file mode 100644
index 0000000..6589138
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/calendar.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/chart_curve.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/chart_curve.png
new file mode 100644
index 0000000..01e933a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/chart_curve.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/chart_curve_go.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/chart_curve_go.png
new file mode 100644
index 0000000..ac9eda5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/chart_curve_go.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/cog.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/cog.png
new file mode 100644
index 0000000..67de2c6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/cog.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/cog_go.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/cog_go.png
new file mode 100644
index 0000000..3262767
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/cog_go.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/computer.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/computer.png
new file mode 100644
index 0000000..9bc37dc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/computer.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/database.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/database.png
new file mode 100644
index 0000000..3d09261
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/database.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/folder.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/folder.png
new file mode 100644
index 0000000..784e8fa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/folder.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/house.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/house.png
new file mode 100644
index 0000000..fed6221
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/house.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/monitor.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/monitor.png
new file mode 100644
index 0000000..d040bd0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/monitor.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/page_white_stack.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/page_white_stack.png
new file mode 100644
index 0000000..44084ad
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/page_white_stack.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/page_white_text.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/page_white_text.png
new file mode 100644
index 0000000..813f712
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/page_white_text.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/paste_plain.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/paste_plain.png
new file mode 100644
index 0000000..c0490eb
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/paste_plain.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/readme.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/readme.html
new file mode 100644
index 0000000..3852c6d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/readme.html
@@ -0,0 +1,1495 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

+

+	<!-- Document HEAD -->

+	<head>

+	

+		<title>famfamfam.com: Silk Icons</title>

+

+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

+

+		<meta name="mssmarttagspreventparsing" content="true" />

+		<meta name="robots" content="all" />		

+		<meta http-equiv="imagetoolbar" content="no" />

+

+		<meta name="author" content="Mark James" />

+		<meta name="copyright" content="Mark James" />

+		<meta name="revisit-after" content="7 days" />		

+		

+	    <style type="text/css">

+<!--

+body {

+	font-family: Verdana, Arial, Helvetica, sans-serif;

+	font-size: 85%;

+}

+

+h1,h2,h3 {

+padding: 10px;

+background-color: #F0F0F0;

+border-bottom: 1px solid #DDD;

+}

+

+table td {

+padding: 5px;

+}

+

+td em {

+display: none;

+}

+-->

+        </style>

+	</head>

+

+	<!-- Document BODY -->

+	<body>

+

+		<div id="container-outer">

+			<div id="container-inner">

+					<div id="content-inner">				

+

+						<h2>Silk Icons</h2>

+						<p><a href="http://www.famfamfam.com/lab/icons/silk/">http://www.famfamfam.com/lab/icons/silk/</a></p>

+					  <p>

+							&#8220;Silk&#8221; is a smooth icon set, containing 1000 16-by-16 pixel icons in

+							strokably-soft PNG format. Containing a large variety of icons, you're sure to find something

+							that tickles your fancy. And all for a low low price of $0.00. You can't say fairer than that.

+							

+							<br />

+							<br/>

+

+						  <!--

+							<a class="download-link" href="famfamfam_mini_icons.zip">Download</a><br />

+							-->

+							

+						  Current version: <strong>1.3</strong></p>

+						

+						<h3>License</h3>

+						<p>

+						<!-- Creative Commons License -->

+						I also love to hear of my work being used, feel encouraged to send an email

+						with a link or screenshot of the icons in their new home to

+						mjames&nbsp;<span class="email">at</span>&nbsp;gmail&nbsp;<span class="email">dot</span>&nbsp;com.

+						This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/2.5/">Creative Commons Attribution 2.5 License</a>.

+						This means you may use it for any purpose, and make any changes you like.

+						All I ask is that you include a link back to <a href="http://www.famfamfam.com/lab/icons/silk/">http://www.famfamfam.com/lab/icons/silk/</a> in your credits (contact me to discuss licencing further).

+						<!-- /Creative Commons License -->

+

+						

+						<!--

+						

+						<rdf:RDF xmlns="http://web.resource.org/cc/"

+							xmlns:dc="http://purl.org/dc/elements/1.1/"

+							xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

+						<Work rdf:about="">

+						   <dc:title>Silk icons</dc:title>

+						   <dc:date>2005</dc:date>

+						   <dc:description>'Silk' icon set.</dc:description>

+						   <dc:creator><Agent>

+							  <dc:title>Mark James</dc:title>

+						   </Agent></dc:creator>

+						   <dc:rights><Agent>

+							  <dc:title>Mark James</dc:title>

+						   </Agent></dc:rights>

+						   <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />

+						   <dc:source rdf:resource="http://www.famfamfam.com/lab/icons/silk/"/>

+						   <license rdf:resource="http://creativecommons.org/licenses/by/2.5/" />

+						</Work>

+						

+						<License rdf:about="http://creativecommons.org/licenses/by/2.5/">

+						   <permits rdf:resource="http://web.resource.org/cc/Reproduction" />

+						   <permits rdf:resource="http://web.resource.org/cc/Distribution" />

+						   <requires rdf:resource="http://web.resource.org/cc/Notice" />

+						   <requires rdf:resource="http://web.resource.org/cc/Attribution" />

+						   <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />

+						</License>

+						

+						</rdf:RDF>

+						

+						-->

+						</p>

+						

+						<h3>Sightings</h3>

+						

+						<p>

+						Do you use this set? <a href="http://www.famfamfam.com/about/?contact=Silk%20icons%20in%20the%20wild">Contact me!</a>.

+						</p>

+						

+						

+						<h3>Icons</h3>

+

+						

+						<p><table>

+	<tr>

+		<td><img src="icons/accept.png" title="accept.png" alt="accept "/><em>accept.png</em></td>

+		<td><img src="icons/add.png" title="add.png" alt="add "/><em>add.png</em></td>

+

+		<td><img src="icons/anchor.png" title="anchor.png" alt="anchor "/><em>anchor.png</em></td>

+		<td><img src="icons/application.png" title="application.png" alt="application "/><em>application.png</em></td>

+		<td><img src="icons/application_add.png" title="application_add.png" alt="application add "/><em>application_add.png</em></td>

+		<td><img src="icons/application_cascade.png" title="application_cascade.png" alt="application cascade "/><em>application_cascade.png</em></td>

+		<td><img src="icons/application_delete.png" title="application_delete.png" alt="application delete "/><em>application_delete.png</em></td>

+		<td><img src="icons/application_double.png" title="application_double.png" alt="application double "/><em>application_double.png</em></td>

+

+		<td><img src="icons/application_edit.png" title="application_edit.png" alt="application edit "/><em>application_edit.png</em></td>

+		<td><img src="icons/application_error.png" title="application_error.png" alt="application error "/><em>application_error.png</em></td>

+		<td><img src="icons/application_form.png" title="application_form.png" alt="application form "/><em>application_form.png</em></td>

+		<td><img src="icons/application_form_add.png" title="application_form_add.png" alt="application form add "/><em>application_form_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/application_form_delete.png" title="application_form_delete.png" alt="application form delete "/><em>application_form_delete.png</em></td>

+

+		<td><img src="icons/application_form_edit.png" title="application_form_edit.png" alt="application form edit "/><em>application_form_edit.png</em></td>

+		<td><img src="icons/application_form_magnify.png" title="application_form_magnify.png" alt="application form magnify "/><em>application_form_magnify.png</em></td>

+		<td><img src="icons/application_get.png" title="application_get.png" alt="application get "/><em>application_get.png</em></td>

+		<td><img src="icons/application_go.png" title="application_go.png" alt="application go "/><em>application_go.png</em></td>

+		<td><img src="icons/application_home.png" title="application_home.png" alt="application home "/><em>application_home.png</em></td>

+		<td><img src="icons/application_key.png" title="application_key.png" alt="application key "/><em>application_key.png</em></td>

+

+		<td><img src="icons/application_lightning.png" title="application_lightning.png" alt="application lightning "/><em>application_lightning.png</em></td>

+		<td><img src="icons/application_link.png" title="application_link.png" alt="application link "/><em>application_link.png</em></td>

+		<td><img src="icons/application_osx.png" title="application_osx.png" alt="application osx "/><em>application_osx.png</em></td>

+		<td><img src="icons/application_osx_terminal.png" title="application_osx_terminal.png" alt="application osx terminal "/><em>application_osx_terminal.png</em></td>

+		<td><img src="icons/application_put.png" title="application_put.png" alt="application put "/><em>application_put.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/application_side_boxes.png" title="application_side_boxes.png" alt="application side boxes "/><em>application_side_boxes.png</em></td>

+		<td><img src="icons/application_side_contract.png" title="application_side_contract.png" alt="application side contract "/><em>application_side_contract.png</em></td>

+		<td><img src="icons/application_side_expand.png" title="application_side_expand.png" alt="application side expand "/><em>application_side_expand.png</em></td>

+		<td><img src="icons/application_side_list.png" title="application_side_list.png" alt="application side list "/><em>application_side_list.png</em></td>

+		<td><img src="icons/application_side_tree.png" title="application_side_tree.png" alt="application side tree "/><em>application_side_tree.png</em></td>

+

+		<td><img src="icons/application_split.png" title="application_split.png" alt="application split "/><em>application_split.png</em></td>

+		<td><img src="icons/application_tile_horizontal.png" title="application_tile_horizontal.png" alt="application tile horizontal "/><em>application_tile_horizontal.png</em></td>

+		<td><img src="icons/application_tile_vertical.png" title="application_tile_vertical.png" alt="application tile vertical "/><em>application_tile_vertical.png</em></td>

+		<td><img src="icons/application_view_columns.png" title="application_view_columns.png" alt="application view columns "/><em>application_view_columns.png</em></td>

+		<td><img src="icons/application_view_detail.png" title="application_view_detail.png" alt="application view detail "/><em>application_view_detail.png</em></td>

+		<td><img src="icons/application_view_gallery.png" title="application_view_gallery.png" alt="application view gallery "/><em>application_view_gallery.png</em></td>

+

+		<td><img src="icons/application_view_icons.png" title="application_view_icons.png" alt="application view icons "/><em>application_view_icons.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/application_view_list.png" title="application_view_list.png" alt="application view list "/><em>application_view_list.png</em></td>

+		<td><img src="icons/application_view_tile.png" title="application_view_tile.png" alt="application view tile "/><em>application_view_tile.png</em></td>

+		<td><img src="icons/application_xp.png" title="application_xp.png" alt="application xp "/><em>application_xp.png</em></td>

+		<td><img src="icons/application_xp_terminal.png" title="application_xp_terminal.png" alt="application xp terminal "/><em>application_xp_terminal.png</em></td>

+

+		<td><img src="icons/arrow_branch.png" title="arrow_branch.png" alt="arrow branch "/><em>arrow_branch.png</em></td>

+		<td><img src="icons/arrow_divide.png" title="arrow_divide.png" alt="arrow divide "/><em>arrow_divide.png</em></td>

+		<td><img src="icons/arrow_down.png" title="arrow_down.png" alt="arrow down "/><em>arrow_down.png</em></td>

+		<td><img src="icons/arrow_in.png" title="arrow_in.png" alt="arrow in "/><em>arrow_in.png</em></td>

+		<td><img src="icons/arrow_inout.png" title="arrow_inout.png" alt="arrow inout "/><em>arrow_inout.png</em></td>

+		<td><img src="icons/arrow_join.png" title="arrow_join.png" alt="arrow join "/><em>arrow_join.png</em></td>

+

+		<td><img src="icons/arrow_left.png" title="arrow_left.png" alt="arrow left "/><em>arrow_left.png</em></td>

+		<td><img src="icons/arrow_merge.png" title="arrow_merge.png" alt="arrow merge "/><em>arrow_merge.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/arrow_out.png" title="arrow_out.png" alt="arrow out "/><em>arrow_out.png</em></td>

+		<td><img src="icons/arrow_redo.png" title="arrow_redo.png" alt="arrow redo "/><em>arrow_redo.png</em></td>

+		<td><img src="icons/arrow_refresh.png" title="arrow_refresh.png" alt="arrow refresh "/><em>arrow_refresh.png</em></td>

+

+		<td><img src="icons/arrow_refresh_small.png" title="arrow_refresh_small.png" alt="arrow refresh small "/><em>arrow_refresh_small.png</em></td>

+		<td><img src="icons/arrow_right.png" title="arrow_right.png" alt="arrow right "/><em>arrow_right.png</em></td>

+		<td><img src="icons/arrow_rotate_anticlockwise.png" title="arrow_rotate_anticlockwise.png" alt="arrow rotate anticlockwise "/><em>arrow_rotate_anticlockwise.png</em></td>

+		<td><img src="icons/arrow_rotate_clockwise.png" title="arrow_rotate_clockwise.png" alt="arrow rotate clockwise "/><em>arrow_rotate_clockwise.png</em></td>

+		<td><img src="icons/arrow_switch.png" title="arrow_switch.png" alt="arrow switch "/><em>arrow_switch.png</em></td>

+		<td><img src="icons/arrow_turn_left.png" title="arrow_turn_left.png" alt="arrow turn left "/><em>arrow_turn_left.png</em></td>

+

+		<td><img src="icons/arrow_turn_right.png" title="arrow_turn_right.png" alt="arrow turn right "/><em>arrow_turn_right.png</em></td>

+		<td><img src="icons/arrow_undo.png" title="arrow_undo.png" alt="arrow undo "/><em>arrow_undo.png</em></td>

+		<td><img src="icons/arrow_up.png" title="arrow_up.png" alt="arrow up "/><em>arrow_up.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/asterisk_orange.png" title="asterisk_orange.png" alt="asterisk orange "/><em>asterisk_orange.png</em></td>

+		<td><img src="icons/asterisk_yellow.png" title="asterisk_yellow.png" alt="asterisk yellow "/><em>asterisk_yellow.png</em></td>

+

+		<td><img src="icons/attach.png" title="attach.png" alt="attach "/><em>attach.png</em></td>

+		<td><img src="icons/award_star_add.png" title="award_star_add.png" alt="award star add "/><em>award_star_add.png</em></td>

+		<td><img src="icons/award_star_bronze_1.png" title="award_star_bronze_1.png" alt="award star bronze 1 "/><em>award_star_bronze_1.png</em></td>

+		<td><img src="icons/award_star_bronze_2.png" title="award_star_bronze_2.png" alt="award star bronze 2 "/><em>award_star_bronze_2.png</em></td>

+		<td><img src="icons/award_star_bronze_3.png" title="award_star_bronze_3.png" alt="award star bronze 3 "/><em>award_star_bronze_3.png</em></td>

+		<td><img src="icons/award_star_delete.png" title="award_star_delete.png" alt="award star delete "/><em>award_star_delete.png</em></td>

+

+		<td><img src="icons/award_star_gold_1.png" title="award_star_gold_1.png" alt="award star gold 1 "/><em>award_star_gold_1.png</em></td>

+		<td><img src="icons/award_star_gold_2.png" title="award_star_gold_2.png" alt="award star gold 2 "/><em>award_star_gold_2.png</em></td>

+		<td><img src="icons/award_star_gold_3.png" title="award_star_gold_3.png" alt="award star gold 3 "/><em>award_star_gold_3.png</em></td>

+		<td><img src="icons/award_star_silver_1.png" title="award_star_silver_1.png" alt="award star silver 1 "/><em>award_star_silver_1.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/award_star_silver_2.png" title="award_star_silver_2.png" alt="award star silver 2 "/><em>award_star_silver_2.png</em></td>

+

+		<td><img src="icons/award_star_silver_3.png" title="award_star_silver_3.png" alt="award star silver 3 "/><em>award_star_silver_3.png</em></td>

+		<td><img src="icons/basket.png" title="basket.png" alt="basket "/><em>basket.png</em></td>

+		<td><img src="icons/basket_add.png" title="basket_add.png" alt="basket add "/><em>basket_add.png</em></td>

+		<td><img src="icons/basket_delete.png" title="basket_delete.png" alt="basket delete "/><em>basket_delete.png</em></td>

+		<td><img src="icons/basket_edit.png" title="basket_edit.png" alt="basket edit "/><em>basket_edit.png</em></td>

+		<td><img src="icons/basket_error.png" title="basket_error.png" alt="basket error "/><em>basket_error.png</em></td>

+

+		<td><img src="icons/basket_go.png" title="basket_go.png" alt="basket go "/><em>basket_go.png</em></td>

+		<td><img src="icons/basket_put.png" title="basket_put.png" alt="basket put "/><em>basket_put.png</em></td>

+		<td><img src="icons/basket_remove.png" title="basket_remove.png" alt="basket remove "/><em>basket_remove.png</em></td>

+		<td><img src="icons/bell.png" title="bell.png" alt="bell "/><em>bell.png</em></td>

+		<td><img src="icons/bell_add.png" title="bell_add.png" alt="bell add "/><em>bell_add.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/bell_delete.png" title="bell_delete.png" alt="bell delete "/><em>bell_delete.png</em></td>

+		<td><img src="icons/bell_error.png" title="bell_error.png" alt="bell error "/><em>bell_error.png</em></td>

+		<td><img src="icons/bell_go.png" title="bell_go.png" alt="bell go "/><em>bell_go.png</em></td>

+		<td><img src="icons/bell_link.png" title="bell_link.png" alt="bell link "/><em>bell_link.png</em></td>

+		<td><img src="icons/bin.png" title="bin.png" alt="bin "/><em>bin.png</em></td>

+

+		<td><img src="icons/bin_closed.png" title="bin_closed.png" alt="bin closed "/><em>bin_closed.png</em></td>

+		<td><img src="icons/bin_empty.png" title="bin_empty.png" alt="bin empty "/><em>bin_empty.png</em></td>

+		<td><img src="icons/bomb.png" title="bomb.png" alt="bomb "/><em>bomb.png</em></td>

+		<td><img src="icons/book.png" title="book.png" alt="book "/><em>book.png</em></td>

+		<td><img src="icons/book_add.png" title="book_add.png" alt="book add "/><em>book_add.png</em></td>

+		<td><img src="icons/book_addresses.png" title="book_addresses.png" alt="book addresses "/><em>book_addresses.png</em></td>

+

+		<td><img src="icons/book_delete.png" title="book_delete.png" alt="book delete "/><em>book_delete.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/book_edit.png" title="book_edit.png" alt="book edit "/><em>book_edit.png</em></td>

+		<td><img src="icons/book_error.png" title="book_error.png" alt="book error "/><em>book_error.png</em></td>

+		<td><img src="icons/book_go.png" title="book_go.png" alt="book go "/><em>book_go.png</em></td>

+		<td><img src="icons/book_key.png" title="book_key.png" alt="book key "/><em>book_key.png</em></td>

+

+		<td><img src="icons/book_link.png" title="book_link.png" alt="book link "/><em>book_link.png</em></td>

+		<td><img src="icons/book_next.png" title="book_next.png" alt="book next "/><em>book_next.png</em></td>

+		<td><img src="icons/book_open.png" title="book_open.png" alt="book open "/><em>book_open.png</em></td>

+		<td><img src="icons/book_previous.png" title="book_previous.png" alt="book previous "/><em>book_previous.png</em></td>

+		<td><img src="icons/box.png" title="box.png" alt="box "/><em>box.png</em></td>

+		<td><img src="icons/brick.png" title="brick.png" alt="brick "/><em>brick.png</em></td>

+

+		<td><img src="icons/brick_add.png" title="brick_add.png" alt="brick add "/><em>brick_add.png</em></td>

+		<td><img src="icons/brick_delete.png" title="brick_delete.png" alt="brick delete "/><em>brick_delete.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/brick_edit.png" title="brick_edit.png" alt="brick edit "/><em>brick_edit.png</em></td>

+		<td><img src="icons/brick_error.png" title="brick_error.png" alt="brick error "/><em>brick_error.png</em></td>

+		<td><img src="icons/brick_go.png" title="brick_go.png" alt="brick go "/><em>brick_go.png</em></td>

+

+		<td><img src="icons/brick_link.png" title="brick_link.png" alt="brick link "/><em>brick_link.png</em></td>

+		<td><img src="icons/bricks.png" title="bricks.png" alt="bricks "/><em>bricks.png</em></td>

+		<td><img src="icons/briefcase.png" title="briefcase.png" alt="briefcase "/><em>briefcase.png</em></td>

+		<td><img src="icons/bug.png" title="bug.png" alt="bug "/><em>bug.png</em></td>

+		<td><img src="icons/bug_add.png" title="bug_add.png" alt="bug add "/><em>bug_add.png</em></td>

+		<td><img src="icons/bug_delete.png" title="bug_delete.png" alt="bug delete "/><em>bug_delete.png</em></td>

+

+		<td><img src="icons/bug_edit.png" title="bug_edit.png" alt="bug edit "/><em>bug_edit.png</em></td>

+		<td><img src="icons/bug_error.png" title="bug_error.png" alt="bug error "/><em>bug_error.png</em></td>

+		<td><img src="icons/bug_go.png" title="bug_go.png" alt="bug go "/><em>bug_go.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/bug_link.png" title="bug_link.png" alt="bug link "/><em>bug_link.png</em></td>

+		<td><img src="icons/building.png" title="building.png" alt="building "/><em>building.png</em></td>

+

+		<td><img src="icons/building_add.png" title="building_add.png" alt="building add "/><em>building_add.png</em></td>

+		<td><img src="icons/building_delete.png" title="building_delete.png" alt="building delete "/><em>building_delete.png</em></td>

+		<td><img src="icons/building_edit.png" title="building_edit.png" alt="building edit "/><em>building_edit.png</em></td>

+		<td><img src="icons/building_error.png" title="building_error.png" alt="building error "/><em>building_error.png</em></td>

+		<td><img src="icons/building_go.png" title="building_go.png" alt="building go "/><em>building_go.png</em></td>

+		<td><img src="icons/building_key.png" title="building_key.png" alt="building key "/><em>building_key.png</em></td>

+

+		<td><img src="icons/building_link.png" title="building_link.png" alt="building link "/><em>building_link.png</em></td>

+		<td><img src="icons/bullet_add.png" title="bullet_add.png" alt="bullet add "/><em>bullet_add.png</em></td>

+		<td><img src="icons/bullet_arrow_bottom.png" title="bullet_arrow_bottom.png" alt="bullet arrow bottom "/><em>bullet_arrow_bottom.png</em></td>

+		<td><img src="icons/bullet_arrow_down.png" title="bullet_arrow_down.png" alt="bullet arrow down "/><em>bullet_arrow_down.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/bullet_arrow_top.png" title="bullet_arrow_top.png" alt="bullet arrow top "/><em>bullet_arrow_top.png</em></td>

+

+		<td><img src="icons/bullet_arrow_up.png" title="bullet_arrow_up.png" alt="bullet arrow up "/><em>bullet_arrow_up.png</em></td>

+		<td><img src="icons/bullet_black.png" title="bullet_black.png" alt="bullet black "/><em>bullet_black.png</em></td>

+		<td><img src="icons/bullet_blue.png" title="bullet_blue.png" alt="bullet blue "/><em>bullet_blue.png</em></td>

+		<td><img src="icons/bullet_delete.png" title="bullet_delete.png" alt="bullet delete "/><em>bullet_delete.png</em></td>

+		<td><img src="icons/bullet_disk.png" title="bullet_disk.png" alt="bullet disk "/><em>bullet_disk.png</em></td>

+		<td><img src="icons/bullet_error.png" title="bullet_error.png" alt="bullet error "/><em>bullet_error.png</em></td>

+

+		<td><img src="icons/bullet_feed.png" title="bullet_feed.png" alt="bullet feed "/><em>bullet_feed.png</em></td>

+		<td><img src="icons/bullet_go.png" title="bullet_go.png" alt="bullet go "/><em>bullet_go.png</em></td>

+		<td><img src="icons/bullet_green.png" title="bullet_green.png" alt="bullet green "/><em>bullet_green.png</em></td>

+		<td><img src="icons/bullet_key.png" title="bullet_key.png" alt="bullet key "/><em>bullet_key.png</em></td>

+		<td><img src="icons/bullet_orange.png" title="bullet_orange.png" alt="bullet orange "/><em>bullet_orange.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/bullet_picture.png" title="bullet_picture.png" alt="bullet picture "/><em>bullet_picture.png</em></td>

+		<td><img src="icons/bullet_pink.png" title="bullet_pink.png" alt="bullet pink "/><em>bullet_pink.png</em></td>

+		<td><img src="icons/bullet_purple.png" title="bullet_purple.png" alt="bullet purple "/><em>bullet_purple.png</em></td>

+		<td><img src="icons/bullet_red.png" title="bullet_red.png" alt="bullet red "/><em>bullet_red.png</em></td>

+		<td><img src="icons/bullet_star.png" title="bullet_star.png" alt="bullet star "/><em>bullet_star.png</em></td>

+

+		<td><img src="icons/bullet_toggle_minus.png" title="bullet_toggle_minus.png" alt="bullet toggle minus "/><em>bullet_toggle_minus.png</em></td>

+		<td><img src="icons/bullet_toggle_plus.png" title="bullet_toggle_plus.png" alt="bullet toggle plus "/><em>bullet_toggle_plus.png</em></td>

+		<td><img src="icons/bullet_white.png" title="bullet_white.png" alt="bullet white "/><em>bullet_white.png</em></td>

+		<td><img src="icons/bullet_wrench.png" title="bullet_wrench.png" alt="bullet wrench "/><em>bullet_wrench.png</em></td>

+		<td><img src="icons/bullet_yellow.png" title="bullet_yellow.png" alt="bullet yellow "/><em>bullet_yellow.png</em></td>

+		<td><img src="icons/cake.png" title="cake.png" alt="cake "/><em>cake.png</em></td>

+

+		<td><img src="icons/calculator.png" title="calculator.png" alt="calculator "/><em>calculator.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/calculator_add.png" title="calculator_add.png" alt="calculator add "/><em>calculator_add.png</em></td>

+		<td><img src="icons/calculator_delete.png" title="calculator_delete.png" alt="calculator delete "/><em>calculator_delete.png</em></td>

+		<td><img src="icons/calculator_edit.png" title="calculator_edit.png" alt="calculator edit "/><em>calculator_edit.png</em></td>

+		<td><img src="icons/calculator_error.png" title="calculator_error.png" alt="calculator error "/><em>calculator_error.png</em></td>

+

+		<td><img src="icons/calculator_link.png" title="calculator_link.png" alt="calculator link "/><em>calculator_link.png</em></td>

+		<td><img src="icons/calendar.png" title="calendar.png" alt="calendar "/><em>calendar.png</em></td>

+		<td><img src="icons/calendar_add.png" title="calendar_add.png" alt="calendar add "/><em>calendar_add.png</em></td>

+		<td><img src="icons/calendar_delete.png" title="calendar_delete.png" alt="calendar delete "/><em>calendar_delete.png</em></td>

+		<td><img src="icons/calendar_edit.png" title="calendar_edit.png" alt="calendar edit "/><em>calendar_edit.png</em></td>

+		<td><img src="icons/calendar_link.png" title="calendar_link.png" alt="calendar link "/><em>calendar_link.png</em></td>

+

+		<td><img src="icons/calendar_view_day.png" title="calendar_view_day.png" alt="calendar view day "/><em>calendar_view_day.png</em></td>

+		<td><img src="icons/calendar_view_month.png" title="calendar_view_month.png" alt="calendar view month "/><em>calendar_view_month.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/calendar_view_week.png" title="calendar_view_week.png" alt="calendar view week "/><em>calendar_view_week.png</em></td>

+		<td><img src="icons/camera.png" title="camera.png" alt="camera "/><em>camera.png</em></td>

+		<td><img src="icons/camera_add.png" title="camera_add.png" alt="camera add "/><em>camera_add.png</em></td>

+

+		<td><img src="icons/camera_delete.png" title="camera_delete.png" alt="camera delete "/><em>camera_delete.png</em></td>

+		<td><img src="icons/camera_edit.png" title="camera_edit.png" alt="camera edit "/><em>camera_edit.png</em></td>

+		<td><img src="icons/camera_error.png" title="camera_error.png" alt="camera error "/><em>camera_error.png</em></td>

+		<td><img src="icons/camera_go.png" title="camera_go.png" alt="camera go "/><em>camera_go.png</em></td>

+		<td><img src="icons/camera_link.png" title="camera_link.png" alt="camera link "/><em>camera_link.png</em></td>

+		<td><img src="icons/camera_small.png" title="camera_small.png" alt="camera small "/><em>camera_small.png</em></td>

+

+		<td><img src="icons/cancel.png" title="cancel.png" alt="cancel "/><em>cancel.png</em></td>

+		<td><img src="icons/car.png" title="car.png" alt="car "/><em>car.png</em></td>

+		<td><img src="icons/car_add.png" title="car_add.png" alt="car add "/><em>car_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/car_delete.png" title="car_delete.png" alt="car delete "/><em>car_delete.png</em></td>

+		<td><img src="icons/cart.png" title="cart.png" alt="cart "/><em>cart.png</em></td>

+

+		<td><img src="icons/cart_add.png" title="cart_add.png" alt="cart add "/><em>cart_add.png</em></td>

+		<td><img src="icons/cart_delete.png" title="cart_delete.png" alt="cart delete "/><em>cart_delete.png</em></td>

+		<td><img src="icons/cart_edit.png" title="cart_edit.png" alt="cart edit "/><em>cart_edit.png</em></td>

+		<td><img src="icons/cart_error.png" title="cart_error.png" alt="cart error "/><em>cart_error.png</em></td>

+		<td><img src="icons/cart_go.png" title="cart_go.png" alt="cart go "/><em>cart_go.png</em></td>

+		<td><img src="icons/cart_put.png" title="cart_put.png" alt="cart put "/><em>cart_put.png</em></td>

+

+		<td><img src="icons/cart_remove.png" title="cart_remove.png" alt="cart remove "/><em>cart_remove.png</em></td>

+		<td><img src="icons/cd.png" title="cd.png" alt="cd "/><em>cd.png</em></td>

+		<td><img src="icons/cd_add.png" title="cd_add.png" alt="cd add "/><em>cd_add.png</em></td>

+		<td><img src="icons/cd_burn.png" title="cd_burn.png" alt="cd burn "/><em>cd_burn.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/cd_delete.png" title="cd_delete.png" alt="cd delete "/><em>cd_delete.png</em></td>

+

+		<td><img src="icons/cd_edit.png" title="cd_edit.png" alt="cd edit "/><em>cd_edit.png</em></td>

+		<td><img src="icons/cd_eject.png" title="cd_eject.png" alt="cd eject "/><em>cd_eject.png</em></td>

+		<td><img src="icons/cd_go.png" title="cd_go.png" alt="cd go "/><em>cd_go.png</em></td>

+		<td><img src="icons/chart_bar.png" title="chart_bar.png" alt="chart bar "/><em>chart_bar.png</em></td>

+		<td><img src="icons/chart_bar_add.png" title="chart_bar_add.png" alt="chart bar add "/><em>chart_bar_add.png</em></td>

+		<td><img src="icons/chart_bar_delete.png" title="chart_bar_delete.png" alt="chart bar delete "/><em>chart_bar_delete.png</em></td>

+

+		<td><img src="icons/chart_bar_edit.png" title="chart_bar_edit.png" alt="chart bar edit "/><em>chart_bar_edit.png</em></td>

+		<td><img src="icons/chart_bar_error.png" title="chart_bar_error.png" alt="chart bar error "/><em>chart_bar_error.png</em></td>

+		<td><img src="icons/chart_bar_link.png" title="chart_bar_link.png" alt="chart bar link "/><em>chart_bar_link.png</em></td>

+		<td><img src="icons/chart_curve.png" title="chart_curve.png" alt="chart curve "/><em>chart_curve.png</em></td>

+		<td><img src="icons/chart_curve_add.png" title="chart_curve_add.png" alt="chart curve add "/><em>chart_curve_add.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/chart_curve_delete.png" title="chart_curve_delete.png" alt="chart curve delete "/><em>chart_curve_delete.png</em></td>

+		<td><img src="icons/chart_curve_edit.png" title="chart_curve_edit.png" alt="chart curve edit "/><em>chart_curve_edit.png</em></td>

+		<td><img src="icons/chart_curve_error.png" title="chart_curve_error.png" alt="chart curve error "/><em>chart_curve_error.png</em></td>

+		<td><img src="icons/chart_curve_go.png" title="chart_curve_go.png" alt="chart curve go "/><em>chart_curve_go.png</em></td>

+		<td><img src="icons/chart_curve_link.png" title="chart_curve_link.png" alt="chart curve link "/><em>chart_curve_link.png</em></td>

+

+		<td><img src="icons/chart_line.png" title="chart_line.png" alt="chart line "/><em>chart_line.png</em></td>

+		<td><img src="icons/chart_line_add.png" title="chart_line_add.png" alt="chart line add "/><em>chart_line_add.png</em></td>

+		<td><img src="icons/chart_line_delete.png" title="chart_line_delete.png" alt="chart line delete "/><em>chart_line_delete.png</em></td>

+		<td><img src="icons/chart_line_edit.png" title="chart_line_edit.png" alt="chart line edit "/><em>chart_line_edit.png</em></td>

+		<td><img src="icons/chart_line_error.png" title="chart_line_error.png" alt="chart line error "/><em>chart_line_error.png</em></td>

+		<td><img src="icons/chart_line_link.png" title="chart_line_link.png" alt="chart line link "/><em>chart_line_link.png</em></td>

+

+		<td><img src="icons/chart_organisation.png" title="chart_organisation.png" alt="chart organisation "/><em>chart_organisation.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/chart_organisation_add.png" title="chart_organisation_add.png" alt="chart organisation add "/><em>chart_organisation_add.png</em></td>

+		<td><img src="icons/chart_organisation_delete.png" title="chart_organisation_delete.png" alt="chart organisation delete "/><em>chart_organisation_delete.png</em></td>

+		<td><img src="icons/chart_pie.png" title="chart_pie.png" alt="chart pie "/><em>chart_pie.png</em></td>

+		<td><img src="icons/chart_pie_add.png" title="chart_pie_add.png" alt="chart pie add "/><em>chart_pie_add.png</em></td>

+

+		<td><img src="icons/chart_pie_delete.png" title="chart_pie_delete.png" alt="chart pie delete "/><em>chart_pie_delete.png</em></td>

+		<td><img src="icons/chart_pie_edit.png" title="chart_pie_edit.png" alt="chart pie edit "/><em>chart_pie_edit.png</em></td>

+		<td><img src="icons/chart_pie_error.png" title="chart_pie_error.png" alt="chart pie error "/><em>chart_pie_error.png</em></td>

+		<td><img src="icons/chart_pie_link.png" title="chart_pie_link.png" alt="chart pie link "/><em>chart_pie_link.png</em></td>

+		<td><img src="icons/clock.png" title="clock.png" alt="clock "/><em>clock.png</em></td>

+		<td><img src="icons/clock_add.png" title="clock_add.png" alt="clock add "/><em>clock_add.png</em></td>

+

+		<td><img src="icons/clock_delete.png" title="clock_delete.png" alt="clock delete "/><em>clock_delete.png</em></td>

+		<td><img src="icons/clock_edit.png" title="clock_edit.png" alt="clock edit "/><em>clock_edit.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/clock_error.png" title="clock_error.png" alt="clock error "/><em>clock_error.png</em></td>

+		<td><img src="icons/clock_go.png" title="clock_go.png" alt="clock go "/><em>clock_go.png</em></td>

+		<td><img src="icons/clock_link.png" title="clock_link.png" alt="clock link "/><em>clock_link.png</em></td>

+

+		<td><img src="icons/clock_pause.png" title="clock_pause.png" alt="clock pause "/><em>clock_pause.png</em></td>

+		<td><img src="icons/clock_play.png" title="clock_play.png" alt="clock play "/><em>clock_play.png</em></td>

+		<td><img src="icons/clock_red.png" title="clock_red.png" alt="clock red "/><em>clock_red.png</em></td>

+		<td><img src="icons/clock_stop.png" title="clock_stop.png" alt="clock stop "/><em>clock_stop.png</em></td>

+		<td><img src="icons/cog.png" title="cog.png" alt="cog "/><em>cog.png</em></td>

+		<td><img src="icons/cog_add.png" title="cog_add.png" alt="cog add "/><em>cog_add.png</em></td>

+

+		<td><img src="icons/cog_delete.png" title="cog_delete.png" alt="cog delete "/><em>cog_delete.png</em></td>

+		<td><img src="icons/cog_edit.png" title="cog_edit.png" alt="cog edit "/><em>cog_edit.png</em></td>

+		<td><img src="icons/cog_error.png" title="cog_error.png" alt="cog error "/><em>cog_error.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/cog_go.png" title="cog_go.png" alt="cog go "/><em>cog_go.png</em></td>

+		<td><img src="icons/coins.png" title="coins.png" alt="coins "/><em>coins.png</em></td>

+

+		<td><img src="icons/coins_add.png" title="coins_add.png" alt="coins add "/><em>coins_add.png</em></td>

+		<td><img src="icons/coins_delete.png" title="coins_delete.png" alt="coins delete "/><em>coins_delete.png</em></td>

+		<td><img src="icons/color_swatch.png" title="color_swatch.png" alt="color swatch "/><em>color_swatch.png</em></td>

+		<td><img src="icons/color_wheel.png" title="color_wheel.png" alt="color wheel "/><em>color_wheel.png</em></td>

+		<td><img src="icons/comment.png" title="comment.png" alt="comment "/><em>comment.png</em></td>

+		<td><img src="icons/comment_add.png" title="comment_add.png" alt="comment add "/><em>comment_add.png</em></td>

+

+		<td><img src="icons/comment_delete.png" title="comment_delete.png" alt="comment delete "/><em>comment_delete.png</em></td>

+		<td><img src="icons/comment_edit.png" title="comment_edit.png" alt="comment edit "/><em>comment_edit.png</em></td>

+		<td><img src="icons/comments.png" title="comments.png" alt="comments "/><em>comments.png</em></td>

+		<td><img src="icons/comments_add.png" title="comments_add.png" alt="comments add "/><em>comments_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/comments_delete.png" title="comments_delete.png" alt="comments delete "/><em>comments_delete.png</em></td>

+

+		<td><img src="icons/compress.png" title="compress.png" alt="compress "/><em>compress.png</em></td>

+		<td><img src="icons/computer.png" title="computer.png" alt="computer "/><em>computer.png</em></td>

+		<td><img src="icons/computer_add.png" title="computer_add.png" alt="computer add "/><em>computer_add.png</em></td>

+		<td><img src="icons/computer_delete.png" title="computer_delete.png" alt="computer delete "/><em>computer_delete.png</em></td>

+		<td><img src="icons/computer_edit.png" title="computer_edit.png" alt="computer edit "/><em>computer_edit.png</em></td>

+		<td><img src="icons/computer_error.png" title="computer_error.png" alt="computer error "/><em>computer_error.png</em></td>

+

+		<td><img src="icons/computer_go.png" title="computer_go.png" alt="computer go "/><em>computer_go.png</em></td>

+		<td><img src="icons/computer_key.png" title="computer_key.png" alt="computer key "/><em>computer_key.png</em></td>

+		<td><img src="icons/computer_link.png" title="computer_link.png" alt="computer link "/><em>computer_link.png</em></td>

+		<td><img src="icons/connect.png" title="connect.png" alt="connect "/><em>connect.png</em></td>

+		<td><img src="icons/contrast.png" title="contrast.png" alt="contrast "/><em>contrast.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/contrast_decrease.png" title="contrast_decrease.png" alt="contrast decrease "/><em>contrast_decrease.png</em></td>

+		<td><img src="icons/contrast_high.png" title="contrast_high.png" alt="contrast high "/><em>contrast_high.png</em></td>

+		<td><img src="icons/contrast_increase.png" title="contrast_increase.png" alt="contrast increase "/><em>contrast_increase.png</em></td>

+		<td><img src="icons/contrast_low.png" title="contrast_low.png" alt="contrast low "/><em>contrast_low.png</em></td>

+		<td><img src="icons/control_eject.png" title="control_eject.png" alt="control eject "/><em>control_eject.png</em></td>

+

+		<td><img src="icons/control_eject_blue.png" title="control_eject_blue.png" alt="control eject blue "/><em>control_eject_blue.png</em></td>

+		<td><img src="icons/control_end.png" title="control_end.png" alt="control end "/><em>control_end.png</em></td>

+		<td><img src="icons/control_end_blue.png" title="control_end_blue.png" alt="control end blue "/><em>control_end_blue.png</em></td>

+		<td><img src="icons/control_equalizer.png" title="control_equalizer.png" alt="control equalizer "/><em>control_equalizer.png</em></td>

+		<td><img src="icons/control_equalizer_blue.png" title="control_equalizer_blue.png" alt="control equalizer blue "/><em>control_equalizer_blue.png</em></td>

+		<td><img src="icons/control_fastforward.png" title="control_fastforward.png" alt="control fastforward "/><em>control_fastforward.png</em></td>

+

+		<td><img src="icons/control_fastforward_blue.png" title="control_fastforward_blue.png" alt="control fastforward blue "/><em>control_fastforward_blue.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/control_pause.png" title="control_pause.png" alt="control pause "/><em>control_pause.png</em></td>

+		<td><img src="icons/control_pause_blue.png" title="control_pause_blue.png" alt="control pause blue "/><em>control_pause_blue.png</em></td>

+		<td><img src="icons/control_play.png" title="control_play.png" alt="control play "/><em>control_play.png</em></td>

+		<td><img src="icons/control_play_blue.png" title="control_play_blue.png" alt="control play blue "/><em>control_play_blue.png</em></td>

+

+		<td><img src="icons/control_repeat.png" title="control_repeat.png" alt="control repeat "/><em>control_repeat.png</em></td>

+		<td><img src="icons/control_repeat_blue.png" title="control_repeat_blue.png" alt="control repeat blue "/><em>control_repeat_blue.png</em></td>

+		<td><img src="icons/control_rewind.png" title="control_rewind.png" alt="control rewind "/><em>control_rewind.png</em></td>

+		<td><img src="icons/control_rewind_blue.png" title="control_rewind_blue.png" alt="control rewind blue "/><em>control_rewind_blue.png</em></td>

+		<td><img src="icons/control_start.png" title="control_start.png" alt="control start "/><em>control_start.png</em></td>

+		<td><img src="icons/control_start_blue.png" title="control_start_blue.png" alt="control start blue "/><em>control_start_blue.png</em></td>

+

+		<td><img src="icons/control_stop.png" title="control_stop.png" alt="control stop "/><em>control_stop.png</em></td>

+		<td><img src="icons/control_stop_blue.png" title="control_stop_blue.png" alt="control stop blue "/><em>control_stop_blue.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/controller.png" title="controller.png" alt="controller "/><em>controller.png</em></td>

+		<td><img src="icons/controller_add.png" title="controller_add.png" alt="controller add "/><em>controller_add.png</em></td>

+		<td><img src="icons/controller_delete.png" title="controller_delete.png" alt="controller delete "/><em>controller_delete.png</em></td>

+

+		<td><img src="icons/controller_error.png" title="controller_error.png" alt="controller error "/><em>controller_error.png</em></td>

+		<td><img src="icons/creditcards.png" title="creditcards.png" alt="creditcards "/><em>creditcards.png</em></td>

+		<td><img src="icons/cross.png" title="cross.png" alt="cross "/><em>cross.png</em></td>

+		<td><img src="icons/css.png" title="css.png" alt="css "/><em>css.png</em></td>

+		<td><img src="icons/css_add.png" title="css_add.png" alt="css add "/><em>css_add.png</em></td>

+		<td><img src="icons/css_delete.png" title="css_delete.png" alt="css delete "/><em>css_delete.png</em></td>

+

+		<td><img src="icons/css_go.png" title="css_go.png" alt="css go "/><em>css_go.png</em></td>

+		<td><img src="icons/css_valid.png" title="css_valid.png" alt="css valid "/><em>css_valid.png</em></td>

+		<td><img src="icons/cup.png" title="cup.png" alt="cup "/><em>cup.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/cup_add.png" title="cup_add.png" alt="cup add "/><em>cup_add.png</em></td>

+		<td><img src="icons/cup_delete.png" title="cup_delete.png" alt="cup delete "/><em>cup_delete.png</em></td>

+

+		<td><img src="icons/cup_edit.png" title="cup_edit.png" alt="cup edit "/><em>cup_edit.png</em></td>

+		<td><img src="icons/cup_error.png" title="cup_error.png" alt="cup error "/><em>cup_error.png</em></td>

+		<td><img src="icons/cup_go.png" title="cup_go.png" alt="cup go "/><em>cup_go.png</em></td>

+		<td><img src="icons/cup_key.png" title="cup_key.png" alt="cup key "/><em>cup_key.png</em></td>

+		<td><img src="icons/cup_link.png" title="cup_link.png" alt="cup link "/><em>cup_link.png</em></td>

+		<td><img src="icons/cursor.png" title="cursor.png" alt="cursor "/><em>cursor.png</em></td>

+

+		<td><img src="icons/cut.png" title="cut.png" alt="cut "/><em>cut.png</em></td>

+		<td><img src="icons/cut_red.png" title="cut_red.png" alt="cut red "/><em>cut_red.png</em></td>

+		<td><img src="icons/database.png" title="database.png" alt="database "/><em>database.png</em></td>

+		<td><img src="icons/database_add.png" title="database_add.png" alt="database add "/><em>database_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/database_connect.png" title="database_connect.png" alt="database connect "/><em>database_connect.png</em></td>

+

+		<td><img src="icons/database_delete.png" title="database_delete.png" alt="database delete "/><em>database_delete.png</em></td>

+		<td><img src="icons/database_edit.png" title="database_edit.png" alt="database edit "/><em>database_edit.png</em></td>

+		<td><img src="icons/database_error.png" title="database_error.png" alt="database error "/><em>database_error.png</em></td>

+		<td><img src="icons/database_gear.png" title="database_gear.png" alt="database gear "/><em>database_gear.png</em></td>

+		<td><img src="icons/database_go.png" title="database_go.png" alt="database go "/><em>database_go.png</em></td>

+		<td><img src="icons/database_key.png" title="database_key.png" alt="database key "/><em>database_key.png</em></td>

+

+		<td><img src="icons/database_lightning.png" title="database_lightning.png" alt="database lightning "/><em>database_lightning.png</em></td>

+		<td><img src="icons/database_link.png" title="database_link.png" alt="database link "/><em>database_link.png</em></td>

+		<td><img src="icons/database_refresh.png" title="database_refresh.png" alt="database refresh "/><em>database_refresh.png</em></td>

+		<td><img src="icons/database_save.png" title="database_save.png" alt="database save "/><em>database_save.png</em></td>

+		<td><img src="icons/database_table.png" title="database_table.png" alt="database table "/><em>database_table.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/date.png" title="date.png" alt="date "/><em>date.png</em></td>

+		<td><img src="icons/date_add.png" title="date_add.png" alt="date add "/><em>date_add.png</em></td>

+		<td><img src="icons/date_delete.png" title="date_delete.png" alt="date delete "/><em>date_delete.png</em></td>

+		<td><img src="icons/date_edit.png" title="date_edit.png" alt="date edit "/><em>date_edit.png</em></td>

+		<td><img src="icons/date_error.png" title="date_error.png" alt="date error "/><em>date_error.png</em></td>

+

+		<td><img src="icons/date_go.png" title="date_go.png" alt="date go "/><em>date_go.png</em></td>

+		<td><img src="icons/date_link.png" title="date_link.png" alt="date link "/><em>date_link.png</em></td>

+		<td><img src="icons/date_magnify.png" title="date_magnify.png" alt="date magnify "/><em>date_magnify.png</em></td>

+		<td><img src="icons/date_next.png" title="date_next.png" alt="date next "/><em>date_next.png</em></td>

+		<td><img src="icons/date_previous.png" title="date_previous.png" alt="date previous "/><em>date_previous.png</em></td>

+		<td><img src="icons/delete.png" title="delete.png" alt="delete "/><em>delete.png</em></td>

+

+		<td><img src="icons/disconnect.png" title="disconnect.png" alt="disconnect "/><em>disconnect.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/disk.png" title="disk.png" alt="disk "/><em>disk.png</em></td>

+		<td><img src="icons/disk_multiple.png" title="disk_multiple.png" alt="disk multiple "/><em>disk_multiple.png</em></td>

+		<td><img src="icons/door.png" title="door.png" alt="door "/><em>door.png</em></td>

+		<td><img src="icons/door_in.png" title="door_in.png" alt="door in "/><em>door_in.png</em></td>

+

+		<td><img src="icons/door_open.png" title="door_open.png" alt="door open "/><em>door_open.png</em></td>

+		<td><img src="icons/door_out.png" title="door_out.png" alt="door out "/><em>door_out.png</em></td>

+		<td><img src="icons/drink.png" title="drink.png" alt="drink "/><em>drink.png</em></td>

+		<td><img src="icons/drink_empty.png" title="drink_empty.png" alt="drink empty "/><em>drink_empty.png</em></td>

+		<td><img src="icons/drive.png" title="drive.png" alt="drive "/><em>drive.png</em></td>

+		<td><img src="icons/drive_add.png" title="drive_add.png" alt="drive add "/><em>drive_add.png</em></td>

+

+		<td><img src="icons/drive_burn.png" title="drive_burn.png" alt="drive burn "/><em>drive_burn.png</em></td>

+		<td><img src="icons/drive_cd.png" title="drive_cd.png" alt="drive cd "/><em>drive_cd.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/drive_cd_empty.png" title="drive_cd_empty.png" alt="drive cd empty "/><em>drive_cd_empty.png</em></td>

+		<td><img src="icons/drive_delete.png" title="drive_delete.png" alt="drive delete "/><em>drive_delete.png</em></td>

+		<td><img src="icons/drive_disk.png" title="drive_disk.png" alt="drive disk "/><em>drive_disk.png</em></td>

+

+		<td><img src="icons/drive_edit.png" title="drive_edit.png" alt="drive edit "/><em>drive_edit.png</em></td>

+		<td><img src="icons/drive_error.png" title="drive_error.png" alt="drive error "/><em>drive_error.png</em></td>

+		<td><img src="icons/drive_go.png" title="drive_go.png" alt="drive go "/><em>drive_go.png</em></td>

+		<td><img src="icons/drive_key.png" title="drive_key.png" alt="drive key "/><em>drive_key.png</em></td>

+		<td><img src="icons/drive_link.png" title="drive_link.png" alt="drive link "/><em>drive_link.png</em></td>

+		<td><img src="icons/drive_magnify.png" title="drive_magnify.png" alt="drive magnify "/><em>drive_magnify.png</em></td>

+

+		<td><img src="icons/drive_network.png" title="drive_network.png" alt="drive network "/><em>drive_network.png</em></td>

+		<td><img src="icons/drive_rename.png" title="drive_rename.png" alt="drive rename "/><em>drive_rename.png</em></td>

+		<td><img src="icons/drive_user.png" title="drive_user.png" alt="drive user "/><em>drive_user.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/drive_web.png" title="drive_web.png" alt="drive web "/><em>drive_web.png</em></td>

+		<td><img src="icons/dvd.png" title="dvd.png" alt="dvd "/><em>dvd.png</em></td>

+

+		<td><img src="icons/dvd_add.png" title="dvd_add.png" alt="dvd add "/><em>dvd_add.png</em></td>

+		<td><img src="icons/dvd_delete.png" title="dvd_delete.png" alt="dvd delete "/><em>dvd_delete.png</em></td>

+		<td><img src="icons/dvd_edit.png" title="dvd_edit.png" alt="dvd edit "/><em>dvd_edit.png</em></td>

+		<td><img src="icons/dvd_error.png" title="dvd_error.png" alt="dvd error "/><em>dvd_error.png</em></td>

+		<td><img src="icons/dvd_go.png" title="dvd_go.png" alt="dvd go "/><em>dvd_go.png</em></td>

+		<td><img src="icons/dvd_key.png" title="dvd_key.png" alt="dvd key "/><em>dvd_key.png</em></td>

+

+		<td><img src="icons/dvd_link.png" title="dvd_link.png" alt="dvd link "/><em>dvd_link.png</em></td>

+		<td><img src="icons/email.png" title="email.png" alt="email "/><em>email.png</em></td>

+		<td><img src="icons/email_add.png" title="email_add.png" alt="email add "/><em>email_add.png</em></td>

+		<td><img src="icons/email_attach.png" title="email_attach.png" alt="email attach "/><em>email_attach.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/email_delete.png" title="email_delete.png" alt="email delete "/><em>email_delete.png</em></td>

+

+		<td><img src="icons/email_edit.png" title="email_edit.png" alt="email edit "/><em>email_edit.png</em></td>

+		<td><img src="icons/email_error.png" title="email_error.png" alt="email error "/><em>email_error.png</em></td>

+		<td><img src="icons/email_go.png" title="email_go.png" alt="email go "/><em>email_go.png</em></td>

+		<td><img src="icons/email_link.png" title="email_link.png" alt="email link "/><em>email_link.png</em></td>

+		<td><img src="icons/email_open.png" title="email_open.png" alt="email open "/><em>email_open.png</em></td>

+		<td><img src="icons/email_open_image.png" title="email_open_image.png" alt="email open image "/><em>email_open_image.png</em></td>

+

+		<td><img src="icons/emoticon_evilgrin.png" title="emoticon_evilgrin.png" alt="emoticon evilgrin "/><em>emoticon_evilgrin.png</em></td>

+		<td><img src="icons/emoticon_grin.png" title="emoticon_grin.png" alt="emoticon grin "/><em>emoticon_grin.png</em></td>

+		<td><img src="icons/emoticon_happy.png" title="emoticon_happy.png" alt="emoticon happy "/><em>emoticon_happy.png</em></td>

+		<td><img src="icons/emoticon_smile.png" title="emoticon_smile.png" alt="emoticon smile "/><em>emoticon_smile.png</em></td>

+		<td><img src="icons/emoticon_surprised.png" title="emoticon_surprised.png" alt="emoticon surprised "/><em>emoticon_surprised.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/emoticon_tongue.png" title="emoticon_tongue.png" alt="emoticon tongue "/><em>emoticon_tongue.png</em></td>

+		<td><img src="icons/emoticon_unhappy.png" title="emoticon_unhappy.png" alt="emoticon unhappy "/><em>emoticon_unhappy.png</em></td>

+		<td><img src="icons/emoticon_waii.png" title="emoticon_waii.png" alt="emoticon waii "/><em>emoticon_waii.png</em></td>

+		<td><img src="icons/emoticon_wink.png" title="emoticon_wink.png" alt="emoticon wink "/><em>emoticon_wink.png</em></td>

+		<td><img src="icons/error.png" title="error.png" alt="error "/><em>error.png</em></td>

+

+		<td><img src="icons/error_add.png" title="error_add.png" alt="error add "/><em>error_add.png</em></td>

+		<td><img src="icons/error_delete.png" title="error_delete.png" alt="error delete "/><em>error_delete.png</em></td>

+		<td><img src="icons/error_go.png" title="error_go.png" alt="error go "/><em>error_go.png</em></td>

+		<td><img src="icons/exclamation.png" title="exclamation.png" alt="exclamation "/><em>exclamation.png</em></td>

+		<td><img src="icons/eye.png" title="eye.png" alt="eye "/><em>eye.png</em></td>

+		<td><img src="icons/feed.png" title="feed.png" alt="feed "/><em>feed.png</em></td>

+

+		<td><img src="icons/feed_add.png" title="feed_add.png" alt="feed add "/><em>feed_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/feed_delete.png" title="feed_delete.png" alt="feed delete "/><em>feed_delete.png</em></td>

+		<td><img src="icons/feed_disk.png" title="feed_disk.png" alt="feed disk "/><em>feed_disk.png</em></td>

+		<td><img src="icons/feed_edit.png" title="feed_edit.png" alt="feed edit "/><em>feed_edit.png</em></td>

+		<td><img src="icons/feed_error.png" title="feed_error.png" alt="feed error "/><em>feed_error.png</em></td>

+

+		<td><img src="icons/feed_go.png" title="feed_go.png" alt="feed go "/><em>feed_go.png</em></td>

+		<td><img src="icons/feed_key.png" title="feed_key.png" alt="feed key "/><em>feed_key.png</em></td>

+		<td><img src="icons/feed_link.png" title="feed_link.png" alt="feed link "/><em>feed_link.png</em></td>

+		<td><img src="icons/feed_magnify.png" title="feed_magnify.png" alt="feed magnify "/><em>feed_magnify.png</em></td>

+		<td><img src="icons/female.png" title="female.png" alt="female "/><em>female.png</em></td>

+		<td><img src="icons/film.png" title="film.png" alt="film "/><em>film.png</em></td>

+

+		<td><img src="icons/film_add.png" title="film_add.png" alt="film add "/><em>film_add.png</em></td>

+		<td><img src="icons/film_delete.png" title="film_delete.png" alt="film delete "/><em>film_delete.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/film_edit.png" title="film_edit.png" alt="film edit "/><em>film_edit.png</em></td>

+		<td><img src="icons/film_error.png" title="film_error.png" alt="film error "/><em>film_error.png</em></td>

+		<td><img src="icons/film_go.png" title="film_go.png" alt="film go "/><em>film_go.png</em></td>

+

+		<td><img src="icons/film_key.png" title="film_key.png" alt="film key "/><em>film_key.png</em></td>

+		<td><img src="icons/film_link.png" title="film_link.png" alt="film link "/><em>film_link.png</em></td>

+		<td><img src="icons/film_save.png" title="film_save.png" alt="film save "/><em>film_save.png</em></td>

+		<td><img src="icons/find.png" title="find.png" alt="find "/><em>find.png</em></td>

+		<td><img src="icons/flag_blue.png" title="flag_blue.png" alt="flag blue "/><em>flag_blue.png</em></td>

+		<td><img src="icons/flag_green.png" title="flag_green.png" alt="flag green "/><em>flag_green.png</em></td>

+

+		<td><img src="icons/flag_orange.png" title="flag_orange.png" alt="flag orange "/><em>flag_orange.png</em></td>

+		<td><img src="icons/flag_pink.png" title="flag_pink.png" alt="flag pink "/><em>flag_pink.png</em></td>

+		<td><img src="icons/flag_purple.png" title="flag_purple.png" alt="flag purple "/><em>flag_purple.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/flag_red.png" title="flag_red.png" alt="flag red "/><em>flag_red.png</em></td>

+		<td><img src="icons/flag_yellow.png" title="flag_yellow.png" alt="flag yellow "/><em>flag_yellow.png</em></td>

+

+		<td><img src="icons/folder.png" title="folder.png" alt="folder "/><em>folder.png</em></td>

+		<td><img src="icons/folder_add.png" title="folder_add.png" alt="folder add "/><em>folder_add.png</em></td>

+		<td><img src="icons/folder_bell.png" title="folder_bell.png" alt="folder bell "/><em>folder_bell.png</em></td>

+		<td><img src="icons/folder_brick.png" title="folder_brick.png" alt="folder brick "/><em>folder_brick.png</em></td>

+		<td><img src="icons/folder_bug.png" title="folder_bug.png" alt="folder bug "/><em>folder_bug.png</em></td>

+		<td><img src="icons/folder_camera.png" title="folder_camera.png" alt="folder camera "/><em>folder_camera.png</em></td>

+

+		<td><img src="icons/folder_database.png" title="folder_database.png" alt="folder database "/><em>folder_database.png</em></td>

+		<td><img src="icons/folder_delete.png" title="folder_delete.png" alt="folder delete "/><em>folder_delete.png</em></td>

+		<td><img src="icons/folder_edit.png" title="folder_edit.png" alt="folder edit "/><em>folder_edit.png</em></td>

+		<td><img src="icons/folder_error.png" title="folder_error.png" alt="folder error "/><em>folder_error.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/folder_explore.png" title="folder_explore.png" alt="folder explore "/><em>folder_explore.png</em></td>

+

+		<td><img src="icons/folder_feed.png" title="folder_feed.png" alt="folder feed "/><em>folder_feed.png</em></td>

+		<td><img src="icons/folder_find.png" title="folder_find.png" alt="folder find "/><em>folder_find.png</em></td>

+		<td><img src="icons/folder_go.png" title="folder_go.png" alt="folder go "/><em>folder_go.png</em></td>

+		<td><img src="icons/folder_heart.png" title="folder_heart.png" alt="folder heart "/><em>folder_heart.png</em></td>

+		<td><img src="icons/folder_image.png" title="folder_image.png" alt="folder image "/><em>folder_image.png</em></td>

+		<td><img src="icons/folder_key.png" title="folder_key.png" alt="folder key "/><em>folder_key.png</em></td>

+

+		<td><img src="icons/folder_lightbulb.png" title="folder_lightbulb.png" alt="folder lightbulb "/><em>folder_lightbulb.png</em></td>

+		<td><img src="icons/folder_link.png" title="folder_link.png" alt="folder link "/><em>folder_link.png</em></td>

+		<td><img src="icons/folder_magnify.png" title="folder_magnify.png" alt="folder magnify "/><em>folder_magnify.png</em></td>

+		<td><img src="icons/folder_page.png" title="folder_page.png" alt="folder page "/><em>folder_page.png</em></td>

+		<td><img src="icons/folder_page_white.png" title="folder_page_white.png" alt="folder page white "/><em>folder_page_white.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/folder_palette.png" title="folder_palette.png" alt="folder palette "/><em>folder_palette.png</em></td>

+		<td><img src="icons/folder_picture.png" title="folder_picture.png" alt="folder picture "/><em>folder_picture.png</em></td>

+		<td><img src="icons/folder_star.png" title="folder_star.png" alt="folder star "/><em>folder_star.png</em></td>

+		<td><img src="icons/folder_table.png" title="folder_table.png" alt="folder table "/><em>folder_table.png</em></td>

+		<td><img src="icons/folder_user.png" title="folder_user.png" alt="folder user "/><em>folder_user.png</em></td>

+

+		<td><img src="icons/folder_wrench.png" title="folder_wrench.png" alt="folder wrench "/><em>folder_wrench.png</em></td>

+		<td><img src="icons/font.png" title="font.png" alt="font "/><em>font.png</em></td>

+		<td><img src="icons/font_add.png" title="font_add.png" alt="font add "/><em>font_add.png</em></td>

+		<td><img src="icons/font_delete.png" title="font_delete.png" alt="font delete "/><em>font_delete.png</em></td>

+		<td><img src="icons/font_go.png" title="font_go.png" alt="font go "/><em>font_go.png</em></td>

+		<td><img src="icons/group.png" title="group.png" alt="group "/><em>group.png</em></td>

+

+		<td><img src="icons/group_add.png" title="group_add.png" alt="group add "/><em>group_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/group_delete.png" title="group_delete.png" alt="group delete "/><em>group_delete.png</em></td>

+		<td><img src="icons/group_edit.png" title="group_edit.png" alt="group edit "/><em>group_edit.png</em></td>

+		<td><img src="icons/group_error.png" title="group_error.png" alt="group error "/><em>group_error.png</em></td>

+		<td><img src="icons/group_gear.png" title="group_gear.png" alt="group gear "/><em>group_gear.png</em></td>

+

+		<td><img src="icons/group_go.png" title="group_go.png" alt="group go "/><em>group_go.png</em></td>

+		<td><img src="icons/group_key.png" title="group_key.png" alt="group key "/><em>group_key.png</em></td>

+		<td><img src="icons/group_link.png" title="group_link.png" alt="group link "/><em>group_link.png</em></td>

+		<td><img src="icons/heart.png" title="heart.png" alt="heart "/><em>heart.png</em></td>

+		<td><img src="icons/heart_add.png" title="heart_add.png" alt="heart add "/><em>heart_add.png</em></td>

+		<td><img src="icons/heart_delete.png" title="heart_delete.png" alt="heart delete "/><em>heart_delete.png</em></td>

+

+		<td><img src="icons/help.png" title="help.png" alt="help "/><em>help.png</em></td>

+		<td><img src="icons/hourglass.png" title="hourglass.png" alt="hourglass "/><em>hourglass.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/hourglass_add.png" title="hourglass_add.png" alt="hourglass add "/><em>hourglass_add.png</em></td>

+		<td><img src="icons/hourglass_delete.png" title="hourglass_delete.png" alt="hourglass delete "/><em>hourglass_delete.png</em></td>

+		<td><img src="icons/hourglass_go.png" title="hourglass_go.png" alt="hourglass go "/><em>hourglass_go.png</em></td>

+

+		<td><img src="icons/hourglass_link.png" title="hourglass_link.png" alt="hourglass link "/><em>hourglass_link.png</em></td>

+		<td><img src="icons/house.png" title="house.png" alt="house "/><em>house.png</em></td>

+		<td><img src="icons/house_go.png" title="house_go.png" alt="house go "/><em>house_go.png</em></td>

+		<td><img src="icons/house_link.png" title="house_link.png" alt="house link "/><em>house_link.png</em></td>

+		<td><img src="icons/html.png" title="html.png" alt="html "/><em>html.png</em></td>

+		<td><img src="icons/html_add.png" title="html_add.png" alt="html add "/><em>html_add.png</em></td>

+

+		<td><img src="icons/html_delete.png" title="html_delete.png" alt="html delete "/><em>html_delete.png</em></td>

+		<td><img src="icons/html_go.png" title="html_go.png" alt="html go "/><em>html_go.png</em></td>

+		<td><img src="icons/html_valid.png" title="html_valid.png" alt="html valid "/><em>html_valid.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/image.png" title="image.png" alt="image "/><em>image.png</em></td>

+		<td><img src="icons/image_add.png" title="image_add.png" alt="image add "/><em>image_add.png</em></td>

+

+		<td><img src="icons/image_delete.png" title="image_delete.png" alt="image delete "/><em>image_delete.png</em></td>

+		<td><img src="icons/image_edit.png" title="image_edit.png" alt="image edit "/><em>image_edit.png</em></td>

+		<td><img src="icons/image_link.png" title="image_link.png" alt="image link "/><em>image_link.png</em></td>

+		<td><img src="icons/images.png" title="images.png" alt="images "/><em>images.png</em></td>

+		<td><img src="icons/information.png" title="information.png" alt="information "/><em>information.png</em></td>

+		<td><img src="icons/ipod.png" title="ipod.png" alt="ipod "/><em>ipod.png</em></td>

+

+		<td><img src="icons/ipod_cast.png" title="ipod_cast.png" alt="ipod cast "/><em>ipod_cast.png</em></td>

+		<td><img src="icons/ipod_cast_add.png" title="ipod_cast_add.png" alt="ipod cast add "/><em>ipod_cast_add.png</em></td>

+		<td><img src="icons/ipod_cast_delete.png" title="ipod_cast_delete.png" alt="ipod cast delete "/><em>ipod_cast_delete.png</em></td>

+		<td><img src="icons/ipod_sound.png" title="ipod_sound.png" alt="ipod sound "/><em>ipod_sound.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/joystick.png" title="joystick.png" alt="joystick "/><em>joystick.png</em></td>

+

+		<td><img src="icons/joystick_add.png" title="joystick_add.png" alt="joystick add "/><em>joystick_add.png</em></td>

+		<td><img src="icons/joystick_delete.png" title="joystick_delete.png" alt="joystick delete "/><em>joystick_delete.png</em></td>

+		<td><img src="icons/joystick_error.png" title="joystick_error.png" alt="joystick error "/><em>joystick_error.png</em></td>

+		<td><img src="icons/key.png" title="key.png" alt="key "/><em>key.png</em></td>

+		<td><img src="icons/key_add.png" title="key_add.png" alt="key add "/><em>key_add.png</em></td>

+		<td><img src="icons/key_delete.png" title="key_delete.png" alt="key delete "/><em>key_delete.png</em></td>

+

+		<td><img src="icons/key_go.png" title="key_go.png" alt="key go "/><em>key_go.png</em></td>

+		<td><img src="icons/keyboard.png" title="keyboard.png" alt="keyboard "/><em>keyboard.png</em></td>

+		<td><img src="icons/keyboard_add.png" title="keyboard_add.png" alt="keyboard add "/><em>keyboard_add.png</em></td>

+		<td><img src="icons/keyboard_delete.png" title="keyboard_delete.png" alt="keyboard delete "/><em>keyboard_delete.png</em></td>

+		<td><img src="icons/keyboard_magnify.png" title="keyboard_magnify.png" alt="keyboard magnify "/><em>keyboard_magnify.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/layers.png" title="layers.png" alt="layers "/><em>layers.png</em></td>

+		<td><img src="icons/layout.png" title="layout.png" alt="layout "/><em>layout.png</em></td>

+		<td><img src="icons/layout_add.png" title="layout_add.png" alt="layout add "/><em>layout_add.png</em></td>

+		<td><img src="icons/layout_content.png" title="layout_content.png" alt="layout content "/><em>layout_content.png</em></td>

+		<td><img src="icons/layout_delete.png" title="layout_delete.png" alt="layout delete "/><em>layout_delete.png</em></td>

+

+		<td><img src="icons/layout_edit.png" title="layout_edit.png" alt="layout edit "/><em>layout_edit.png</em></td>

+		<td><img src="icons/layout_error.png" title="layout_error.png" alt="layout error "/><em>layout_error.png</em></td>

+		<td><img src="icons/layout_header.png" title="layout_header.png" alt="layout header "/><em>layout_header.png</em></td>

+		<td><img src="icons/layout_link.png" title="layout_link.png" alt="layout link "/><em>layout_link.png</em></td>

+		<td><img src="icons/layout_sidebar.png" title="layout_sidebar.png" alt="layout sidebar "/><em>layout_sidebar.png</em></td>

+		<td><img src="icons/lightbulb.png" title="lightbulb.png" alt="lightbulb "/><em>lightbulb.png</em></td>

+

+		<td><img src="icons/lightbulb_add.png" title="lightbulb_add.png" alt="lightbulb add "/><em>lightbulb_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/lightbulb_delete.png" title="lightbulb_delete.png" alt="lightbulb delete "/><em>lightbulb_delete.png</em></td>

+		<td><img src="icons/lightbulb_off.png" title="lightbulb_off.png" alt="lightbulb off "/><em>lightbulb_off.png</em></td>

+		<td><img src="icons/lightning.png" title="lightning.png" alt="lightning "/><em>lightning.png</em></td>

+		<td><img src="icons/lightning_add.png" title="lightning_add.png" alt="lightning add "/><em>lightning_add.png</em></td>

+

+		<td><img src="icons/lightning_delete.png" title="lightning_delete.png" alt="lightning delete "/><em>lightning_delete.png</em></td>

+		<td><img src="icons/lightning_go.png" title="lightning_go.png" alt="lightning go "/><em>lightning_go.png</em></td>

+		<td><img src="icons/link.png" title="link.png" alt="link "/><em>link.png</em></td>

+		<td><img src="icons/link_add.png" title="link_add.png" alt="link add "/><em>link_add.png</em></td>

+		<td><img src="icons/link_break.png" title="link_break.png" alt="link break "/><em>link_break.png</em></td>

+		<td><img src="icons/link_delete.png" title="link_delete.png" alt="link delete "/><em>link_delete.png</em></td>

+

+		<td><img src="icons/link_edit.png" title="link_edit.png" alt="link edit "/><em>link_edit.png</em></td>

+		<td><img src="icons/link_error.png" title="link_error.png" alt="link error "/><em>link_error.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/link_go.png" title="link_go.png" alt="link go "/><em>link_go.png</em></td>

+		<td><img src="icons/lock.png" title="lock.png" alt="lock "/><em>lock.png</em></td>

+		<td><img src="icons/lock_add.png" title="lock_add.png" alt="lock add "/><em>lock_add.png</em></td>

+

+		<td><img src="icons/lock_break.png" title="lock_break.png" alt="lock break "/><em>lock_break.png</em></td>

+		<td><img src="icons/lock_delete.png" title="lock_delete.png" alt="lock delete "/><em>lock_delete.png</em></td>

+		<td><img src="icons/lock_edit.png" title="lock_edit.png" alt="lock edit "/><em>lock_edit.png</em></td>

+		<td><img src="icons/lock_go.png" title="lock_go.png" alt="lock go "/><em>lock_go.png</em></td>

+		<td><img src="icons/lock_open.png" title="lock_open.png" alt="lock open "/><em>lock_open.png</em></td>

+		<td><img src="icons/lorry.png" title="lorry.png" alt="lorry "/><em>lorry.png</em></td>

+

+		<td><img src="icons/lorry_add.png" title="lorry_add.png" alt="lorry add "/><em>lorry_add.png</em></td>

+		<td><img src="icons/lorry_delete.png" title="lorry_delete.png" alt="lorry delete "/><em>lorry_delete.png</em></td>

+		<td><img src="icons/lorry_error.png" title="lorry_error.png" alt="lorry error "/><em>lorry_error.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/lorry_flatbed.png" title="lorry_flatbed.png" alt="lorry flatbed "/><em>lorry_flatbed.png</em></td>

+		<td><img src="icons/lorry_go.png" title="lorry_go.png" alt="lorry go "/><em>lorry_go.png</em></td>

+

+		<td><img src="icons/lorry_link.png" title="lorry_link.png" alt="lorry link "/><em>lorry_link.png</em></td>

+		<td><img src="icons/magifier_zoom_out.png" title="magifier_zoom_out.png" alt="magifier zoom out "/><em>magifier_zoom_out.png</em></td>

+		<td><img src="icons/magnifier.png" title="magnifier.png" alt="magnifier "/><em>magnifier.png</em></td>

+		<td><img src="icons/magnifier_zoom_in.png" title="magnifier_zoom_in.png" alt="magnifier zoom in "/><em>magnifier_zoom_in.png</em></td>

+		<td><img src="icons/male.png" title="male.png" alt="male "/><em>male.png</em></td>

+		<td><img src="icons/map.png" title="map.png" alt="map "/><em>map.png</em></td>

+

+		<td><img src="icons/map_add.png" title="map_add.png" alt="map add "/><em>map_add.png</em></td>

+		<td><img src="icons/map_delete.png" title="map_delete.png" alt="map delete "/><em>map_delete.png</em></td>

+		<td><img src="icons/map_edit.png" title="map_edit.png" alt="map edit "/><em>map_edit.png</em></td>

+		<td><img src="icons/map_go.png" title="map_go.png" alt="map go "/><em>map_go.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/map_magnify.png" title="map_magnify.png" alt="map magnify "/><em>map_magnify.png</em></td>

+

+		<td><img src="icons/medal_bronze_1.png" title="medal_bronze_1.png" alt="medal bronze 1 "/><em>medal_bronze_1.png</em></td>

+		<td><img src="icons/medal_bronze_2.png" title="medal_bronze_2.png" alt="medal bronze 2 "/><em>medal_bronze_2.png</em></td>

+		<td><img src="icons/medal_bronze_3.png" title="medal_bronze_3.png" alt="medal bronze 3 "/><em>medal_bronze_3.png</em></td>

+		<td><img src="icons/medal_bronze_add.png" title="medal_bronze_add.png" alt="medal bronze add "/><em>medal_bronze_add.png</em></td>

+		<td><img src="icons/medal_bronze_delete.png" title="medal_bronze_delete.png" alt="medal bronze delete "/><em>medal_bronze_delete.png</em></td>

+		<td><img src="icons/medal_gold_1.png" title="medal_gold_1.png" alt="medal gold 1 "/><em>medal_gold_1.png</em></td>

+

+		<td><img src="icons/medal_gold_2.png" title="medal_gold_2.png" alt="medal gold 2 "/><em>medal_gold_2.png</em></td>

+		<td><img src="icons/medal_gold_3.png" title="medal_gold_3.png" alt="medal gold 3 "/><em>medal_gold_3.png</em></td>

+		<td><img src="icons/medal_gold_add.png" title="medal_gold_add.png" alt="medal gold add "/><em>medal_gold_add.png</em></td>

+		<td><img src="icons/medal_gold_delete.png" title="medal_gold_delete.png" alt="medal gold delete "/><em>medal_gold_delete.png</em></td>

+		<td><img src="icons/medal_silver_1.png" title="medal_silver_1.png" alt="medal silver 1 "/><em>medal_silver_1.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/medal_silver_2.png" title="medal_silver_2.png" alt="medal silver 2 "/><em>medal_silver_2.png</em></td>

+		<td><img src="icons/medal_silver_3.png" title="medal_silver_3.png" alt="medal silver 3 "/><em>medal_silver_3.png</em></td>

+		<td><img src="icons/medal_silver_add.png" title="medal_silver_add.png" alt="medal silver add "/><em>medal_silver_add.png</em></td>

+		<td><img src="icons/medal_silver_delete.png" title="medal_silver_delete.png" alt="medal silver delete "/><em>medal_silver_delete.png</em></td>

+		<td><img src="icons/money.png" title="money.png" alt="money "/><em>money.png</em></td>

+

+		<td><img src="icons/money_add.png" title="money_add.png" alt="money add "/><em>money_add.png</em></td>

+		<td><img src="icons/money_delete.png" title="money_delete.png" alt="money delete "/><em>money_delete.png</em></td>

+		<td><img src="icons/money_dollar.png" title="money_dollar.png" alt="money dollar "/><em>money_dollar.png</em></td>

+		<td><img src="icons/money_euro.png" title="money_euro.png" alt="money euro "/><em>money_euro.png</em></td>

+		<td><img src="icons/money_pound.png" title="money_pound.png" alt="money pound "/><em>money_pound.png</em></td>

+		<td><img src="icons/money_yen.png" title="money_yen.png" alt="money yen "/><em>money_yen.png</em></td>

+

+		<td><img src="icons/monitor.png" title="monitor.png" alt="monitor "/><em>monitor.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/monitor_add.png" title="monitor_add.png" alt="monitor add "/><em>monitor_add.png</em></td>

+		<td><img src="icons/monitor_delete.png" title="monitor_delete.png" alt="monitor delete "/><em>monitor_delete.png</em></td>

+		<td><img src="icons/monitor_edit.png" title="monitor_edit.png" alt="monitor edit "/><em>monitor_edit.png</em></td>

+		<td><img src="icons/monitor_error.png" title="monitor_error.png" alt="monitor error "/><em>monitor_error.png</em></td>

+

+		<td><img src="icons/monitor_go.png" title="monitor_go.png" alt="monitor go "/><em>monitor_go.png</em></td>

+		<td><img src="icons/monitor_lightning.png" title="monitor_lightning.png" alt="monitor lightning "/><em>monitor_lightning.png</em></td>

+		<td><img src="icons/monitor_link.png" title="monitor_link.png" alt="monitor link "/><em>monitor_link.png</em></td>

+		<td><img src="icons/mouse.png" title="mouse.png" alt="mouse "/><em>mouse.png</em></td>

+		<td><img src="icons/mouse_add.png" title="mouse_add.png" alt="mouse add "/><em>mouse_add.png</em></td>

+		<td><img src="icons/mouse_delete.png" title="mouse_delete.png" alt="mouse delete "/><em>mouse_delete.png</em></td>

+

+		<td><img src="icons/mouse_error.png" title="mouse_error.png" alt="mouse error "/><em>mouse_error.png</em></td>

+		<td><img src="icons/music.png" title="music.png" alt="music "/><em>music.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/new.png" title="new.png" alt="new "/><em>new.png</em></td>

+		<td><img src="icons/newspaper.png" title="newspaper.png" alt="newspaper "/><em>newspaper.png</em></td>

+		<td><img src="icons/newspaper_add.png" title="newspaper_add.png" alt="newspaper add "/><em>newspaper_add.png</em></td>

+

+		<td><img src="icons/newspaper_delete.png" title="newspaper_delete.png" alt="newspaper delete "/><em>newspaper_delete.png</em></td>

+		<td><img src="icons/newspaper_go.png" title="newspaper_go.png" alt="newspaper go "/><em>newspaper_go.png</em></td>

+		<td><img src="icons/newspaper_link.png" title="newspaper_link.png" alt="newspaper link "/><em>newspaper_link.png</em></td>

+		<td><img src="icons/note.png" title="note.png" alt="note "/><em>note.png</em></td>

+		<td><img src="icons/note_add.png" title="note_add.png" alt="note add "/><em>note_add.png</em></td>

+		<td><img src="icons/note_delete.png" title="note_delete.png" alt="note delete "/><em>note_delete.png</em></td>

+

+		<td><img src="icons/note_edit.png" title="note_edit.png" alt="note edit "/><em>note_edit.png</em></td>

+		<td><img src="icons/note_error.png" title="note_error.png" alt="note error "/><em>note_error.png</em></td>

+		<td><img src="icons/note_go.png" title="note_go.png" alt="note go "/><em>note_go.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/overlays.png" title="overlays.png" alt="overlays "/><em>overlays.png</em></td>

+		<td><img src="icons/package.png" title="package.png" alt="package "/><em>package.png</em></td>

+

+		<td><img src="icons/package_add.png" title="package_add.png" alt="package add "/><em>package_add.png</em></td>

+		<td><img src="icons/package_delete.png" title="package_delete.png" alt="package delete "/><em>package_delete.png</em></td>

+		<td><img src="icons/package_go.png" title="package_go.png" alt="package go "/><em>package_go.png</em></td>

+		<td><img src="icons/package_green.png" title="package_green.png" alt="package green "/><em>package_green.png</em></td>

+		<td><img src="icons/package_link.png" title="package_link.png" alt="package link "/><em>package_link.png</em></td>

+		<td><img src="icons/page.png" title="page.png" alt="page "/><em>page.png</em></td>

+

+		<td><img src="icons/page_add.png" title="page_add.png" alt="page add "/><em>page_add.png</em></td>

+		<td><img src="icons/page_attach.png" title="page_attach.png" alt="page attach "/><em>page_attach.png</em></td>

+		<td><img src="icons/page_code.png" title="page_code.png" alt="page code "/><em>page_code.png</em></td>

+		<td><img src="icons/page_copy.png" title="page_copy.png" alt="page copy "/><em>page_copy.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/page_delete.png" title="page_delete.png" alt="page delete "/><em>page_delete.png</em></td>

+

+		<td><img src="icons/page_edit.png" title="page_edit.png" alt="page edit "/><em>page_edit.png</em></td>

+		<td><img src="icons/page_error.png" title="page_error.png" alt="page error "/><em>page_error.png</em></td>

+		<td><img src="icons/page_excel.png" title="page_excel.png" alt="page excel "/><em>page_excel.png</em></td>

+		<td><img src="icons/page_find.png" title="page_find.png" alt="page find "/><em>page_find.png</em></td>

+		<td><img src="icons/page_gear.png" title="page_gear.png" alt="page gear "/><em>page_gear.png</em></td>

+		<td><img src="icons/page_go.png" title="page_go.png" alt="page go "/><em>page_go.png</em></td>

+

+		<td><img src="icons/page_green.png" title="page_green.png" alt="page green "/><em>page_green.png</em></td>

+		<td><img src="icons/page_key.png" title="page_key.png" alt="page key "/><em>page_key.png</em></td>

+		<td><img src="icons/page_lightning.png" title="page_lightning.png" alt="page lightning "/><em>page_lightning.png</em></td>

+		<td><img src="icons/page_link.png" title="page_link.png" alt="page link "/><em>page_link.png</em></td>

+		<td><img src="icons/page_paintbrush.png" title="page_paintbrush.png" alt="page paintbrush "/><em>page_paintbrush.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/page_paste.png" title="page_paste.png" alt="page paste "/><em>page_paste.png</em></td>

+		<td><img src="icons/page_red.png" title="page_red.png" alt="page red "/><em>page_red.png</em></td>

+		<td><img src="icons/page_refresh.png" title="page_refresh.png" alt="page refresh "/><em>page_refresh.png</em></td>

+		<td><img src="icons/page_save.png" title="page_save.png" alt="page save "/><em>page_save.png</em></td>

+		<td><img src="icons/page_white.png" title="page_white.png" alt="page white "/><em>page_white.png</em></td>

+

+		<td><img src="icons/page_white_acrobat.png" title="page_white_acrobat.png" alt="page white acrobat "/><em>page_white_acrobat.png</em></td>

+		<td><img src="icons/page_white_actionscript.png" title="page_white_actionscript.png" alt="page white actionscript "/><em>page_white_actionscript.png</em></td>

+		<td><img src="icons/page_white_add.png" title="page_white_add.png" alt="page white add "/><em>page_white_add.png</em></td>

+		<td><img src="icons/page_white_c.png" title="page_white_c.png" alt="page white c "/><em>page_white_c.png</em></td>

+		<td><img src="icons/page_white_camera.png" title="page_white_camera.png" alt="page white camera "/><em>page_white_camera.png</em></td>

+		<td><img src="icons/page_white_cd.png" title="page_white_cd.png" alt="page white cd "/><em>page_white_cd.png</em></td>

+

+		<td><img src="icons/page_white_code.png" title="page_white_code.png" alt="page white code "/><em>page_white_code.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/page_white_code_red.png" title="page_white_code_red.png" alt="page white code red "/><em>page_white_code_red.png</em></td>

+		<td><img src="icons/page_white_coldfusion.png" title="page_white_coldfusion.png" alt="page white coldfusion "/><em>page_white_coldfusion.png</em></td>

+		<td><img src="icons/page_white_compressed.png" title="page_white_compressed.png" alt="page white compressed "/><em>page_white_compressed.png</em></td>

+		<td><img src="icons/page_white_copy.png" title="page_white_copy.png" alt="page white copy "/><em>page_white_copy.png</em></td>

+

+		<td><img src="icons/page_white_cplusplus.png" title="page_white_cplusplus.png" alt="page white cplusplus "/><em>page_white_cplusplus.png</em></td>

+		<td><img src="icons/page_white_csharp.png" title="page_white_csharp.png" alt="page white csharp "/><em>page_white_csharp.png</em></td>

+		<td><img src="icons/page_white_cup.png" title="page_white_cup.png" alt="page white cup "/><em>page_white_cup.png</em></td>

+		<td><img src="icons/page_white_database.png" title="page_white_database.png" alt="page white database "/><em>page_white_database.png</em></td>

+		<td><img src="icons/page_white_delete.png" title="page_white_delete.png" alt="page white delete "/><em>page_white_delete.png</em></td>

+		<td><img src="icons/page_white_dvd.png" title="page_white_dvd.png" alt="page white dvd "/><em>page_white_dvd.png</em></td>

+

+		<td><img src="icons/page_white_edit.png" title="page_white_edit.png" alt="page white edit "/><em>page_white_edit.png</em></td>

+		<td><img src="icons/page_white_error.png" title="page_white_error.png" alt="page white error "/><em>page_white_error.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/page_white_excel.png" title="page_white_excel.png" alt="page white excel "/><em>page_white_excel.png</em></td>

+		<td><img src="icons/page_white_find.png" title="page_white_find.png" alt="page white find "/><em>page_white_find.png</em></td>

+		<td><img src="icons/page_white_flash.png" title="page_white_flash.png" alt="page white flash "/><em>page_white_flash.png</em></td>

+

+		<td><img src="icons/page_white_freehand.png" title="page_white_freehand.png" alt="page white freehand "/><em>page_white_freehand.png</em></td>

+		<td><img src="icons/page_white_gear.png" title="page_white_gear.png" alt="page white gear "/><em>page_white_gear.png</em></td>

+		<td><img src="icons/page_white_get.png" title="page_white_get.png" alt="page white get "/><em>page_white_get.png</em></td>

+		<td><img src="icons/page_white_go.png" title="page_white_go.png" alt="page white go "/><em>page_white_go.png</em></td>

+		<td><img src="icons/page_white_h.png" title="page_white_h.png" alt="page white h "/><em>page_white_h.png</em></td>

+		<td><img src="icons/page_white_horizontal.png" title="page_white_horizontal.png" alt="page white horizontal "/><em>page_white_horizontal.png</em></td>

+

+		<td><img src="icons/page_white_key.png" title="page_white_key.png" alt="page white key "/><em>page_white_key.png</em></td>

+		<td><img src="icons/page_white_lightning.png" title="page_white_lightning.png" alt="page white lightning "/><em>page_white_lightning.png</em></td>

+		<td><img src="icons/page_white_link.png" title="page_white_link.png" alt="page white link "/><em>page_white_link.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/page_white_magnify.png" title="page_white_magnify.png" alt="page white magnify "/><em>page_white_magnify.png</em></td>

+		<td><img src="icons/page_white_medal.png" title="page_white_medal.png" alt="page white medal "/><em>page_white_medal.png</em></td>

+

+		<td><img src="icons/page_white_office.png" title="page_white_office.png" alt="page white office "/><em>page_white_office.png</em></td>

+		<td><img src="icons/page_white_paint.png" title="page_white_paint.png" alt="page white paint "/><em>page_white_paint.png</em></td>

+		<td><img src="icons/page_white_paintbrush.png" title="page_white_paintbrush.png" alt="page white paintbrush "/><em>page_white_paintbrush.png</em></td>

+		<td><img src="icons/page_white_paste.png" title="page_white_paste.png" alt="page white paste "/><em>page_white_paste.png</em></td>

+		<td><img src="icons/page_white_php.png" title="page_white_php.png" alt="page white php "/><em>page_white_php.png</em></td>

+		<td><img src="icons/page_white_picture.png" title="page_white_picture.png" alt="page white picture "/><em>page_white_picture.png</em></td>

+

+		<td><img src="icons/page_white_powerpoint.png" title="page_white_powerpoint.png" alt="page white powerpoint "/><em>page_white_powerpoint.png</em></td>

+		<td><img src="icons/page_white_put.png" title="page_white_put.png" alt="page white put "/><em>page_white_put.png</em></td>

+		<td><img src="icons/page_white_ruby.png" title="page_white_ruby.png" alt="page white ruby "/><em>page_white_ruby.png</em></td>

+		<td><img src="icons/page_white_stack.png" title="page_white_stack.png" alt="page white stack "/><em>page_white_stack.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/page_white_star.png" title="page_white_star.png" alt="page white star "/><em>page_white_star.png</em></td>

+

+		<td><img src="icons/page_white_swoosh.png" title="page_white_swoosh.png" alt="page white swoosh "/><em>page_white_swoosh.png</em></td>

+		<td><img src="icons/page_white_text.png" title="page_white_text.png" alt="page white text "/><em>page_white_text.png</em></td>

+		<td><img src="icons/page_white_text_width.png" title="page_white_text_width.png" alt="page white text width "/><em>page_white_text_width.png</em></td>

+		<td><img src="icons/page_white_tux.png" title="page_white_tux.png" alt="page white tux "/><em>page_white_tux.png</em></td>

+		<td><img src="icons/page_white_vector.png" title="page_white_vector.png" alt="page white vector "/><em>page_white_vector.png</em></td>

+		<td><img src="icons/page_white_visualstudio.png" title="page_white_visualstudio.png" alt="page white visualstudio "/><em>page_white_visualstudio.png</em></td>

+

+		<td><img src="icons/page_white_width.png" title="page_white_width.png" alt="page white width "/><em>page_white_width.png</em></td>

+		<td><img src="icons/page_white_word.png" title="page_white_word.png" alt="page white word "/><em>page_white_word.png</em></td>

+		<td><img src="icons/page_white_world.png" title="page_white_world.png" alt="page white world "/><em>page_white_world.png</em></td>

+		<td><img src="icons/page_white_wrench.png" title="page_white_wrench.png" alt="page white wrench "/><em>page_white_wrench.png</em></td>

+		<td><img src="icons/page_white_zip.png" title="page_white_zip.png" alt="page white zip "/><em>page_white_zip.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/page_word.png" title="page_word.png" alt="page word "/><em>page_word.png</em></td>

+		<td><img src="icons/page_world.png" title="page_world.png" alt="page world "/><em>page_world.png</em></td>

+		<td><img src="icons/paintbrush.png" title="paintbrush.png" alt="paintbrush "/><em>paintbrush.png</em></td>

+		<td><img src="icons/paintcan.png" title="paintcan.png" alt="paintcan "/><em>paintcan.png</em></td>

+		<td><img src="icons/palette.png" title="palette.png" alt="palette "/><em>palette.png</em></td>

+

+		<td><img src="icons/paste_plain.png" title="paste_plain.png" alt="paste plain "/><em>paste_plain.png</em></td>

+		<td><img src="icons/paste_word.png" title="paste_word.png" alt="paste word "/><em>paste_word.png</em></td>

+		<td><img src="icons/pencil.png" title="pencil.png" alt="pencil "/><em>pencil.png</em></td>

+		<td><img src="icons/pencil_add.png" title="pencil_add.png" alt="pencil add "/><em>pencil_add.png</em></td>

+		<td><img src="icons/pencil_delete.png" title="pencil_delete.png" alt="pencil delete "/><em>pencil_delete.png</em></td>

+		<td><img src="icons/pencil_go.png" title="pencil_go.png" alt="pencil go "/><em>pencil_go.png</em></td>

+

+		<td><img src="icons/phone.png" title="phone.png" alt="phone "/><em>phone.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/phone_add.png" title="phone_add.png" alt="phone add "/><em>phone_add.png</em></td>

+		<td><img src="icons/phone_delete.png" title="phone_delete.png" alt="phone delete "/><em>phone_delete.png</em></td>

+		<td><img src="icons/phone_sound.png" title="phone_sound.png" alt="phone sound "/><em>phone_sound.png</em></td>

+		<td><img src="icons/photo.png" title="photo.png" alt="photo "/><em>photo.png</em></td>

+

+		<td><img src="icons/photo_add.png" title="photo_add.png" alt="photo add "/><em>photo_add.png</em></td>

+		<td><img src="icons/photo_delete.png" title="photo_delete.png" alt="photo delete "/><em>photo_delete.png</em></td>

+		<td><img src="icons/photo_link.png" title="photo_link.png" alt="photo link "/><em>photo_link.png</em></td>

+		<td><img src="icons/photos.png" title="photos.png" alt="photos "/><em>photos.png</em></td>

+		<td><img src="icons/picture.png" title="picture.png" alt="picture "/><em>picture.png</em></td>

+		<td><img src="icons/picture_add.png" title="picture_add.png" alt="picture add "/><em>picture_add.png</em></td>

+

+		<td><img src="icons/picture_delete.png" title="picture_delete.png" alt="picture delete "/><em>picture_delete.png</em></td>

+		<td><img src="icons/picture_edit.png" title="picture_edit.png" alt="picture edit "/><em>picture_edit.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/picture_empty.png" title="picture_empty.png" alt="picture empty "/><em>picture_empty.png</em></td>

+		<td><img src="icons/picture_error.png" title="picture_error.png" alt="picture error "/><em>picture_error.png</em></td>

+		<td><img src="icons/picture_go.png" title="picture_go.png" alt="picture go "/><em>picture_go.png</em></td>

+

+		<td><img src="icons/picture_key.png" title="picture_key.png" alt="picture key "/><em>picture_key.png</em></td>

+		<td><img src="icons/picture_link.png" title="picture_link.png" alt="picture link "/><em>picture_link.png</em></td>

+		<td><img src="icons/picture_save.png" title="picture_save.png" alt="picture save "/><em>picture_save.png</em></td>

+		<td><img src="icons/pictures.png" title="pictures.png" alt="pictures "/><em>pictures.png</em></td>

+		<td><img src="icons/pilcrow.png" title="pilcrow.png" alt="pilcrow "/><em>pilcrow.png</em></td>

+		<td><img src="icons/pill.png" title="pill.png" alt="pill "/><em>pill.png</em></td>

+

+		<td><img src="icons/pill_add.png" title="pill_add.png" alt="pill add "/><em>pill_add.png</em></td>

+		<td><img src="icons/pill_delete.png" title="pill_delete.png" alt="pill delete "/><em>pill_delete.png</em></td>

+		<td><img src="icons/pill_go.png" title="pill_go.png" alt="pill go "/><em>pill_go.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/plugin.png" title="plugin.png" alt="plugin "/><em>plugin.png</em></td>

+		<td><img src="icons/plugin_add.png" title="plugin_add.png" alt="plugin add "/><em>plugin_add.png</em></td>

+

+		<td><img src="icons/plugin_delete.png" title="plugin_delete.png" alt="plugin delete "/><em>plugin_delete.png</em></td>

+		<td><img src="icons/plugin_disabled.png" title="plugin_disabled.png" alt="plugin disabled "/><em>plugin_disabled.png</em></td>

+		<td><img src="icons/plugin_edit.png" title="plugin_edit.png" alt="plugin edit "/><em>plugin_edit.png</em></td>

+		<td><img src="icons/plugin_error.png" title="plugin_error.png" alt="plugin error "/><em>plugin_error.png</em></td>

+		<td><img src="icons/plugin_go.png" title="plugin_go.png" alt="plugin go "/><em>plugin_go.png</em></td>

+		<td><img src="icons/plugin_link.png" title="plugin_link.png" alt="plugin link "/><em>plugin_link.png</em></td>

+

+		<td><img src="icons/printer.png" title="printer.png" alt="printer "/><em>printer.png</em></td>

+		<td><img src="icons/printer_add.png" title="printer_add.png" alt="printer add "/><em>printer_add.png</em></td>

+		<td><img src="icons/printer_delete.png" title="printer_delete.png" alt="printer delete "/><em>printer_delete.png</em></td>

+		<td><img src="icons/printer_empty.png" title="printer_empty.png" alt="printer empty "/><em>printer_empty.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/printer_error.png" title="printer_error.png" alt="printer error "/><em>printer_error.png</em></td>

+

+		<td><img src="icons/rainbow.png" title="rainbow.png" alt="rainbow "/><em>rainbow.png</em></td>

+		<td><img src="icons/report.png" title="report.png" alt="report "/><em>report.png</em></td>

+		<td><img src="icons/report_add.png" title="report_add.png" alt="report add "/><em>report_add.png</em></td>

+		<td><img src="icons/report_delete.png" title="report_delete.png" alt="report delete "/><em>report_delete.png</em></td>

+		<td><img src="icons/report_disk.png" title="report_disk.png" alt="report disk "/><em>report_disk.png</em></td>

+		<td><img src="icons/report_edit.png" title="report_edit.png" alt="report edit "/><em>report_edit.png</em></td>

+

+		<td><img src="icons/report_go.png" title="report_go.png" alt="report go "/><em>report_go.png</em></td>

+		<td><img src="icons/report_key.png" title="report_key.png" alt="report key "/><em>report_key.png</em></td>

+		<td><img src="icons/report_link.png" title="report_link.png" alt="report link "/><em>report_link.png</em></td>

+		<td><img src="icons/report_magnify.png" title="report_magnify.png" alt="report magnify "/><em>report_magnify.png</em></td>

+		<td><img src="icons/report_picture.png" title="report_picture.png" alt="report picture "/><em>report_picture.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/report_user.png" title="report_user.png" alt="report user "/><em>report_user.png</em></td>

+		<td><img src="icons/report_word.png" title="report_word.png" alt="report word "/><em>report_word.png</em></td>

+		<td><img src="icons/resultset_first.png" title="resultset_first.png" alt="resultset first "/><em>resultset_first.png</em></td>

+		<td><img src="icons/resultset_last.png" title="resultset_last.png" alt="resultset last "/><em>resultset_last.png</em></td>

+		<td><img src="icons/resultset_next.png" title="resultset_next.png" alt="resultset next "/><em>resultset_next.png</em></td>

+

+		<td><img src="icons/resultset_previous.png" title="resultset_previous.png" alt="resultset previous "/><em>resultset_previous.png</em></td>

+		<td><img src="icons/rosette.png" title="rosette.png" alt="rosette "/><em>rosette.png</em></td>

+		<td><img src="icons/rss.png" title="rss.png" alt="rss "/><em>rss.png</em></td>

+		<td><img src="icons/rss_add.png" title="rss_add.png" alt="rss add "/><em>rss_add.png</em></td>

+		<td><img src="icons/rss_delete.png" title="rss_delete.png" alt="rss delete "/><em>rss_delete.png</em></td>

+		<td><img src="icons/rss_go.png" title="rss_go.png" alt="rss go "/><em>rss_go.png</em></td>

+

+		<td><img src="icons/rss_valid.png" title="rss_valid.png" alt="rss valid "/><em>rss_valid.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/ruby.png" title="ruby.png" alt="ruby "/><em>ruby.png</em></td>

+		<td><img src="icons/ruby_add.png" title="ruby_add.png" alt="ruby add "/><em>ruby_add.png</em></td>

+		<td><img src="icons/ruby_delete.png" title="ruby_delete.png" alt="ruby delete "/><em>ruby_delete.png</em></td>

+		<td><img src="icons/ruby_gear.png" title="ruby_gear.png" alt="ruby gear "/><em>ruby_gear.png</em></td>

+

+		<td><img src="icons/ruby_get.png" title="ruby_get.png" alt="ruby get "/><em>ruby_get.png</em></td>

+		<td><img src="icons/ruby_go.png" title="ruby_go.png" alt="ruby go "/><em>ruby_go.png</em></td>

+		<td><img src="icons/ruby_key.png" title="ruby_key.png" alt="ruby key "/><em>ruby_key.png</em></td>

+		<td><img src="icons/ruby_link.png" title="ruby_link.png" alt="ruby link "/><em>ruby_link.png</em></td>

+		<td><img src="icons/ruby_put.png" title="ruby_put.png" alt="ruby put "/><em>ruby_put.png</em></td>

+		<td><img src="icons/script.png" title="script.png" alt="script "/><em>script.png</em></td>

+

+		<td><img src="icons/script_add.png" title="script_add.png" alt="script add "/><em>script_add.png</em></td>

+		<td><img src="icons/script_code.png" title="script_code.png" alt="script code "/><em>script_code.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/script_code_red.png" title="script_code_red.png" alt="script code red "/><em>script_code_red.png</em></td>

+		<td><img src="icons/script_delete.png" title="script_delete.png" alt="script delete "/><em>script_delete.png</em></td>

+		<td><img src="icons/script_edit.png" title="script_edit.png" alt="script edit "/><em>script_edit.png</em></td>

+

+		<td><img src="icons/script_error.png" title="script_error.png" alt="script error "/><em>script_error.png</em></td>

+		<td><img src="icons/script_gear.png" title="script_gear.png" alt="script gear "/><em>script_gear.png</em></td>

+		<td><img src="icons/script_go.png" title="script_go.png" alt="script go "/><em>script_go.png</em></td>

+		<td><img src="icons/script_key.png" title="script_key.png" alt="script key "/><em>script_key.png</em></td>

+		<td><img src="icons/script_lightning.png" title="script_lightning.png" alt="script lightning "/><em>script_lightning.png</em></td>

+		<td><img src="icons/script_link.png" title="script_link.png" alt="script link "/><em>script_link.png</em></td>

+

+		<td><img src="icons/script_palette.png" title="script_palette.png" alt="script palette "/><em>script_palette.png</em></td>

+		<td><img src="icons/script_save.png" title="script_save.png" alt="script save "/><em>script_save.png</em></td>

+		<td><img src="icons/server.png" title="server.png" alt="server "/><em>server.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/server_add.png" title="server_add.png" alt="server add "/><em>server_add.png</em></td>

+		<td><img src="icons/server_chart.png" title="server_chart.png" alt="server chart "/><em>server_chart.png</em></td>

+

+		<td><img src="icons/server_compressed.png" title="server_compressed.png" alt="server compressed "/><em>server_compressed.png</em></td>

+		<td><img src="icons/server_connect.png" title="server_connect.png" alt="server connect "/><em>server_connect.png</em></td>

+		<td><img src="icons/server_database.png" title="server_database.png" alt="server database "/><em>server_database.png</em></td>

+		<td><img src="icons/server_delete.png" title="server_delete.png" alt="server delete "/><em>server_delete.png</em></td>

+		<td><img src="icons/server_edit.png" title="server_edit.png" alt="server edit "/><em>server_edit.png</em></td>

+		<td><img src="icons/server_error.png" title="server_error.png" alt="server error "/><em>server_error.png</em></td>

+

+		<td><img src="icons/server_go.png" title="server_go.png" alt="server go "/><em>server_go.png</em></td>

+		<td><img src="icons/server_key.png" title="server_key.png" alt="server key "/><em>server_key.png</em></td>

+		<td><img src="icons/server_lightning.png" title="server_lightning.png" alt="server lightning "/><em>server_lightning.png</em></td>

+		<td><img src="icons/server_link.png" title="server_link.png" alt="server link "/><em>server_link.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/server_uncompressed.png" title="server_uncompressed.png" alt="server uncompressed "/><em>server_uncompressed.png</em></td>

+

+		<td><img src="icons/shading.png" title="shading.png" alt="shading "/><em>shading.png</em></td>

+		<td><img src="icons/shape_align_bottom.png" title="shape_align_bottom.png" alt="shape align bottom "/><em>shape_align_bottom.png</em></td>

+		<td><img src="icons/shape_align_center.png" title="shape_align_center.png" alt="shape align center "/><em>shape_align_center.png</em></td>

+		<td><img src="icons/shape_align_left.png" title="shape_align_left.png" alt="shape align left "/><em>shape_align_left.png</em></td>

+		<td><img src="icons/shape_align_middle.png" title="shape_align_middle.png" alt="shape align middle "/><em>shape_align_middle.png</em></td>

+		<td><img src="icons/shape_align_right.png" title="shape_align_right.png" alt="shape align right "/><em>shape_align_right.png</em></td>

+

+		<td><img src="icons/shape_align_top.png" title="shape_align_top.png" alt="shape align top "/><em>shape_align_top.png</em></td>

+		<td><img src="icons/shape_flip_horizontal.png" title="shape_flip_horizontal.png" alt="shape flip horizontal "/><em>shape_flip_horizontal.png</em></td>

+		<td><img src="icons/shape_flip_vertical.png" title="shape_flip_vertical.png" alt="shape flip vertical "/><em>shape_flip_vertical.png</em></td>

+		<td><img src="icons/shape_group.png" title="shape_group.png" alt="shape group "/><em>shape_group.png</em></td>

+		<td><img src="icons/shape_handles.png" title="shape_handles.png" alt="shape handles "/><em>shape_handles.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/shape_move_back.png" title="shape_move_back.png" alt="shape move back "/><em>shape_move_back.png</em></td>

+		<td><img src="icons/shape_move_backwards.png" title="shape_move_backwards.png" alt="shape move backwards "/><em>shape_move_backwards.png</em></td>

+		<td><img src="icons/shape_move_forwards.png" title="shape_move_forwards.png" alt="shape move forwards "/><em>shape_move_forwards.png</em></td>

+		<td><img src="icons/shape_move_front.png" title="shape_move_front.png" alt="shape move front "/><em>shape_move_front.png</em></td>

+		<td><img src="icons/shape_rotate_anticlockwise.png" title="shape_rotate_anticlockwise.png" alt="shape rotate anticlockwise "/><em>shape_rotate_anticlockwise.png</em></td>

+

+		<td><img src="icons/shape_rotate_clockwise.png" title="shape_rotate_clockwise.png" alt="shape rotate clockwise "/><em>shape_rotate_clockwise.png</em></td>

+		<td><img src="icons/shape_square.png" title="shape_square.png" alt="shape square "/><em>shape_square.png</em></td>

+		<td><img src="icons/shape_square_add.png" title="shape_square_add.png" alt="shape square add "/><em>shape_square_add.png</em></td>

+		<td><img src="icons/shape_square_delete.png" title="shape_square_delete.png" alt="shape square delete "/><em>shape_square_delete.png</em></td>

+		<td><img src="icons/shape_square_edit.png" title="shape_square_edit.png" alt="shape square edit "/><em>shape_square_edit.png</em></td>

+		<td><img src="icons/shape_square_error.png" title="shape_square_error.png" alt="shape square error "/><em>shape_square_error.png</em></td>

+

+		<td><img src="icons/shape_square_go.png" title="shape_square_go.png" alt="shape square go "/><em>shape_square_go.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/shape_square_key.png" title="shape_square_key.png" alt="shape square key "/><em>shape_square_key.png</em></td>

+		<td><img src="icons/shape_square_link.png" title="shape_square_link.png" alt="shape square link "/><em>shape_square_link.png</em></td>

+		<td><img src="icons/shape_ungroup.png" title="shape_ungroup.png" alt="shape ungroup "/><em>shape_ungroup.png</em></td>

+		<td><img src="icons/shield.png" title="shield.png" alt="shield "/><em>shield.png</em></td>

+

+		<td><img src="icons/shield_add.png" title="shield_add.png" alt="shield add "/><em>shield_add.png</em></td>

+		<td><img src="icons/shield_delete.png" title="shield_delete.png" alt="shield delete "/><em>shield_delete.png</em></td>

+		<td><img src="icons/shield_go.png" title="shield_go.png" alt="shield go "/><em>shield_go.png</em></td>

+		<td><img src="icons/sitemap.png" title="sitemap.png" alt="sitemap "/><em>sitemap.png</em></td>

+		<td><img src="icons/sitemap_color.png" title="sitemap_color.png" alt="sitemap color "/><em>sitemap_color.png</em></td>

+		<td><img src="icons/sound.png" title="sound.png" alt="sound "/><em>sound.png</em></td>

+

+		<td><img src="icons/sound_add.png" title="sound_add.png" alt="sound add "/><em>sound_add.png</em></td>

+		<td><img src="icons/sound_delete.png" title="sound_delete.png" alt="sound delete "/><em>sound_delete.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/sound_low.png" title="sound_low.png" alt="sound low "/><em>sound_low.png</em></td>

+		<td><img src="icons/sound_mute.png" title="sound_mute.png" alt="sound mute "/><em>sound_mute.png</em></td>

+		<td><img src="icons/sound_none.png" title="sound_none.png" alt="sound none "/><em>sound_none.png</em></td>

+

+		<td><img src="icons/spellcheck.png" title="spellcheck.png" alt="spellcheck "/><em>spellcheck.png</em></td>

+		<td><img src="icons/sport_8ball.png" title="sport_8ball.png" alt="sport 8ball "/><em>sport_8ball.png</em></td>

+		<td><img src="icons/sport_basketball.png" title="sport_basketball.png" alt="sport basketball "/><em>sport_basketball.png</em></td>

+		<td><img src="icons/sport_football.png" title="sport_football.png" alt="sport football "/><em>sport_football.png</em></td>

+		<td><img src="icons/sport_golf.png" title="sport_golf.png" alt="sport golf "/><em>sport_golf.png</em></td>

+		<td><img src="icons/sport_raquet.png" title="sport_raquet.png" alt="sport raquet "/><em>sport_raquet.png</em></td>

+

+		<td><img src="icons/sport_shuttlecock.png" title="sport_shuttlecock.png" alt="sport shuttlecock "/><em>sport_shuttlecock.png</em></td>

+		<td><img src="icons/sport_soccer.png" title="sport_soccer.png" alt="sport soccer "/><em>sport_soccer.png</em></td>

+		<td><img src="icons/sport_tennis.png" title="sport_tennis.png" alt="sport tennis "/><em>sport_tennis.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/star.png" title="star.png" alt="star "/><em>star.png</em></td>

+		<td><img src="icons/status_away.png" title="status_away.png" alt="status away "/><em>status_away.png</em></td>

+

+		<td><img src="icons/status_busy.png" title="status_busy.png" alt="status busy "/><em>status_busy.png</em></td>

+		<td><img src="icons/status_offline.png" title="status_offline.png" alt="status offline "/><em>status_offline.png</em></td>

+		<td><img src="icons/status_online.png" title="status_online.png" alt="status online "/><em>status_online.png</em></td>

+		<td><img src="icons/stop.png" title="stop.png" alt="stop "/><em>stop.png</em></td>

+		<td><img src="icons/style.png" title="style.png" alt="style "/><em>style.png</em></td>

+		<td><img src="icons/style_add.png" title="style_add.png" alt="style add "/><em>style_add.png</em></td>

+

+		<td><img src="icons/style_delete.png" title="style_delete.png" alt="style delete "/><em>style_delete.png</em></td>

+		<td><img src="icons/style_edit.png" title="style_edit.png" alt="style edit "/><em>style_edit.png</em></td>

+		<td><img src="icons/style_go.png" title="style_go.png" alt="style go "/><em>style_go.png</em></td>

+		<td><img src="icons/sum.png" title="sum.png" alt="sum "/><em>sum.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/tab.png" title="tab.png" alt="tab "/><em>tab.png</em></td>

+

+		<td><img src="icons/tab_add.png" title="tab_add.png" alt="tab add "/><em>tab_add.png</em></td>

+		<td><img src="icons/tab_delete.png" title="tab_delete.png" alt="tab delete "/><em>tab_delete.png</em></td>

+		<td><img src="icons/tab_edit.png" title="tab_edit.png" alt="tab edit "/><em>tab_edit.png</em></td>

+		<td><img src="icons/tab_go.png" title="tab_go.png" alt="tab go "/><em>tab_go.png</em></td>

+		<td><img src="icons/table.png" title="table.png" alt="table "/><em>table.png</em></td>

+		<td><img src="icons/table_add.png" title="table_add.png" alt="table add "/><em>table_add.png</em></td>

+

+		<td><img src="icons/table_delete.png" title="table_delete.png" alt="table delete "/><em>table_delete.png</em></td>

+		<td><img src="icons/table_edit.png" title="table_edit.png" alt="table edit "/><em>table_edit.png</em></td>

+		<td><img src="icons/table_error.png" title="table_error.png" alt="table error "/><em>table_error.png</em></td>

+		<td><img src="icons/table_gear.png" title="table_gear.png" alt="table gear "/><em>table_gear.png</em></td>

+		<td><img src="icons/table_go.png" title="table_go.png" alt="table go "/><em>table_go.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/table_key.png" title="table_key.png" alt="table key "/><em>table_key.png</em></td>

+		<td><img src="icons/table_lightning.png" title="table_lightning.png" alt="table lightning "/><em>table_lightning.png</em></td>

+		<td><img src="icons/table_link.png" title="table_link.png" alt="table link "/><em>table_link.png</em></td>

+		<td><img src="icons/table_multiple.png" title="table_multiple.png" alt="table multiple "/><em>table_multiple.png</em></td>

+		<td><img src="icons/table_refresh.png" title="table_refresh.png" alt="table refresh "/><em>table_refresh.png</em></td>

+

+		<td><img src="icons/table_relationship.png" title="table_relationship.png" alt="table relationship "/><em>table_relationship.png</em></td>

+		<td><img src="icons/table_row_delete.png" title="table_row_delete.png" alt="table row delete "/><em>table_row_delete.png</em></td>

+		<td><img src="icons/table_row_insert.png" title="table_row_insert.png" alt="table row insert "/><em>table_row_insert.png</em></td>

+		<td><img src="icons/table_save.png" title="table_save.png" alt="table save "/><em>table_save.png</em></td>

+		<td><img src="icons/table_sort.png" title="table_sort.png" alt="table sort "/><em>table_sort.png</em></td>

+		<td><img src="icons/tag.png" title="tag.png" alt="tag "/><em>tag.png</em></td>

+

+		<td><img src="icons/tag_blue.png" title="tag_blue.png" alt="tag blue "/><em>tag_blue.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/tag_blue_add.png" title="tag_blue_add.png" alt="tag blue add "/><em>tag_blue_add.png</em></td>

+		<td><img src="icons/tag_blue_delete.png" title="tag_blue_delete.png" alt="tag blue delete "/><em>tag_blue_delete.png</em></td>

+		<td><img src="icons/tag_blue_edit.png" title="tag_blue_edit.png" alt="tag blue edit "/><em>tag_blue_edit.png</em></td>

+		<td><img src="icons/tag_green.png" title="tag_green.png" alt="tag green "/><em>tag_green.png</em></td>

+

+		<td><img src="icons/tag_orange.png" title="tag_orange.png" alt="tag orange "/><em>tag_orange.png</em></td>

+		<td><img src="icons/tag_pink.png" title="tag_pink.png" alt="tag pink "/><em>tag_pink.png</em></td>

+		<td><img src="icons/tag_purple.png" title="tag_purple.png" alt="tag purple "/><em>tag_purple.png</em></td>

+		<td><img src="icons/tag_red.png" title="tag_red.png" alt="tag red "/><em>tag_red.png</em></td>

+		<td><img src="icons/tag_yellow.png" title="tag_yellow.png" alt="tag yellow "/><em>tag_yellow.png</em></td>

+		<td><img src="icons/telephone.png" title="telephone.png" alt="telephone "/><em>telephone.png</em></td>

+

+		<td><img src="icons/telephone_add.png" title="telephone_add.png" alt="telephone add "/><em>telephone_add.png</em></td>

+		<td><img src="icons/telephone_delete.png" title="telephone_delete.png" alt="telephone delete "/><em>telephone_delete.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/telephone_edit.png" title="telephone_edit.png" alt="telephone edit "/><em>telephone_edit.png</em></td>

+		<td><img src="icons/telephone_error.png" title="telephone_error.png" alt="telephone error "/><em>telephone_error.png</em></td>

+		<td><img src="icons/telephone_go.png" title="telephone_go.png" alt="telephone go "/><em>telephone_go.png</em></td>

+

+		<td><img src="icons/telephone_key.png" title="telephone_key.png" alt="telephone key "/><em>telephone_key.png</em></td>

+		<td><img src="icons/telephone_link.png" title="telephone_link.png" alt="telephone link "/><em>telephone_link.png</em></td>

+		<td><img src="icons/television.png" title="television.png" alt="television "/><em>television.png</em></td>

+		<td><img src="icons/television_add.png" title="television_add.png" alt="television add "/><em>television_add.png</em></td>

+		<td><img src="icons/television_delete.png" title="television_delete.png" alt="television delete "/><em>television_delete.png</em></td>

+		<td><img src="icons/text_align_center.png" title="text_align_center.png" alt="text align center "/><em>text_align_center.png</em></td>

+

+		<td><img src="icons/text_align_justify.png" title="text_align_justify.png" alt="text align justify "/><em>text_align_justify.png</em></td>

+		<td><img src="icons/text_align_left.png" title="text_align_left.png" alt="text align left "/><em>text_align_left.png</em></td>

+		<td><img src="icons/text_align_right.png" title="text_align_right.png" alt="text align right "/><em>text_align_right.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/text_allcaps.png" title="text_allcaps.png" alt="text allcaps "/><em>text_allcaps.png</em></td>

+		<td><img src="icons/text_bold.png" title="text_bold.png" alt="text bold "/><em>text_bold.png</em></td>

+

+		<td><img src="icons/text_columns.png" title="text_columns.png" alt="text columns "/><em>text_columns.png</em></td>

+		<td><img src="icons/text_dropcaps.png" title="text_dropcaps.png" alt="text dropcaps "/><em>text_dropcaps.png</em></td>

+		<td><img src="icons/text_heading_1.png" title="text_heading_1.png" alt="text heading 1 "/><em>text_heading_1.png</em></td>

+		<td><img src="icons/text_heading_2.png" title="text_heading_2.png" alt="text heading 2 "/><em>text_heading_2.png</em></td>

+		<td><img src="icons/text_heading_3.png" title="text_heading_3.png" alt="text heading 3 "/><em>text_heading_3.png</em></td>

+		<td><img src="icons/text_heading_4.png" title="text_heading_4.png" alt="text heading 4 "/><em>text_heading_4.png</em></td>

+

+		<td><img src="icons/text_heading_5.png" title="text_heading_5.png" alt="text heading 5 "/><em>text_heading_5.png</em></td>

+		<td><img src="icons/text_heading_6.png" title="text_heading_6.png" alt="text heading 6 "/><em>text_heading_6.png</em></td>

+		<td><img src="icons/text_horizontalrule.png" title="text_horizontalrule.png" alt="text horizontalrule "/><em>text_horizontalrule.png</em></td>

+		<td><img src="icons/text_indent.png" title="text_indent.png" alt="text indent "/><em>text_indent.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/text_indent_remove.png" title="text_indent_remove.png" alt="text indent remove "/><em>text_indent_remove.png</em></td>

+

+		<td><img src="icons/text_italic.png" title="text_italic.png" alt="text italic "/><em>text_italic.png</em></td>

+		<td><img src="icons/text_kerning.png" title="text_kerning.png" alt="text kerning "/><em>text_kerning.png</em></td>

+		<td><img src="icons/text_letter_omega.png" title="text_letter_omega.png" alt="text letter omega "/><em>text_letter_omega.png</em></td>

+		<td><img src="icons/text_letterspacing.png" title="text_letterspacing.png" alt="text letterspacing "/><em>text_letterspacing.png</em></td>

+		<td><img src="icons/text_linespacing.png" title="text_linespacing.png" alt="text linespacing "/><em>text_linespacing.png</em></td>

+		<td><img src="icons/text_list_bullets.png" title="text_list_bullets.png" alt="text list bullets "/><em>text_list_bullets.png</em></td>

+

+		<td><img src="icons/text_list_numbers.png" title="text_list_numbers.png" alt="text list numbers "/><em>text_list_numbers.png</em></td>

+		<td><img src="icons/text_lowercase.png" title="text_lowercase.png" alt="text lowercase "/><em>text_lowercase.png</em></td>

+		<td><img src="icons/text_padding_bottom.png" title="text_padding_bottom.png" alt="text padding bottom "/><em>text_padding_bottom.png</em></td>

+		<td><img src="icons/text_padding_left.png" title="text_padding_left.png" alt="text padding left "/><em>text_padding_left.png</em></td>

+		<td><img src="icons/text_padding_right.png" title="text_padding_right.png" alt="text padding right "/><em>text_padding_right.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/text_padding_top.png" title="text_padding_top.png" alt="text padding top "/><em>text_padding_top.png</em></td>

+		<td><img src="icons/text_replace.png" title="text_replace.png" alt="text replace "/><em>text_replace.png</em></td>

+		<td><img src="icons/text_signature.png" title="text_signature.png" alt="text signature "/><em>text_signature.png</em></td>

+		<td><img src="icons/text_smallcaps.png" title="text_smallcaps.png" alt="text smallcaps "/><em>text_smallcaps.png</em></td>

+		<td><img src="icons/text_strikethrough.png" title="text_strikethrough.png" alt="text strikethrough "/><em>text_strikethrough.png</em></td>

+

+		<td><img src="icons/text_subscript.png" title="text_subscript.png" alt="text subscript "/><em>text_subscript.png</em></td>

+		<td><img src="icons/text_superscript.png" title="text_superscript.png" alt="text superscript "/><em>text_superscript.png</em></td>

+		<td><img src="icons/text_underline.png" title="text_underline.png" alt="text underline "/><em>text_underline.png</em></td>

+		<td><img src="icons/text_uppercase.png" title="text_uppercase.png" alt="text uppercase "/><em>text_uppercase.png</em></td>

+		<td><img src="icons/textfield.png" title="textfield.png" alt="textfield "/><em>textfield.png</em></td>

+		<td><img src="icons/textfield_add.png" title="textfield_add.png" alt="textfield add "/><em>textfield_add.png</em></td>

+

+		<td><img src="icons/textfield_delete.png" title="textfield_delete.png" alt="textfield delete "/><em>textfield_delete.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/textfield_key.png" title="textfield_key.png" alt="textfield key "/><em>textfield_key.png</em></td>

+		<td><img src="icons/textfield_rename.png" title="textfield_rename.png" alt="textfield rename "/><em>textfield_rename.png</em></td>

+		<td><img src="icons/thumb_down.png" title="thumb_down.png" alt="thumb down "/><em>thumb_down.png</em></td>

+		<td><img src="icons/thumb_up.png" title="thumb_up.png" alt="thumb up "/><em>thumb_up.png</em></td>

+

+		<td><img src="icons/tick.png" title="tick.png" alt="tick "/><em>tick.png</em></td>

+		<td><img src="icons/time.png" title="time.png" alt="time "/><em>time.png</em></td>

+		<td><img src="icons/time_add.png" title="time_add.png" alt="time add "/><em>time_add.png</em></td>

+		<td><img src="icons/time_delete.png" title="time_delete.png" alt="time delete "/><em>time_delete.png</em></td>

+		<td><img src="icons/time_go.png" title="time_go.png" alt="time go "/><em>time_go.png</em></td>

+		<td><img src="icons/timeline_marker.png" title="timeline_marker.png" alt="timeline marker "/><em>timeline_marker.png</em></td>

+

+		<td><img src="icons/transmit.png" title="transmit.png" alt="transmit "/><em>transmit.png</em></td>

+		<td><img src="icons/transmit_add.png" title="transmit_add.png" alt="transmit add "/><em>transmit_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/transmit_blue.png" title="transmit_blue.png" alt="transmit blue "/><em>transmit_blue.png</em></td>

+		<td><img src="icons/transmit_delete.png" title="transmit_delete.png" alt="transmit delete "/><em>transmit_delete.png</em></td>

+		<td><img src="icons/transmit_edit.png" title="transmit_edit.png" alt="transmit edit "/><em>transmit_edit.png</em></td>

+

+		<td><img src="icons/transmit_error.png" title="transmit_error.png" alt="transmit error "/><em>transmit_error.png</em></td>

+		<td><img src="icons/transmit_go.png" title="transmit_go.png" alt="transmit go "/><em>transmit_go.png</em></td>

+		<td><img src="icons/tux.png" title="tux.png" alt="tux "/><em>tux.png</em></td>

+		<td><img src="icons/user.png" title="user.png" alt="user "/><em>user.png</em></td>

+		<td><img src="icons/user_add.png" title="user_add.png" alt="user add "/><em>user_add.png</em></td>

+		<td><img src="icons/user_comment.png" title="user_comment.png" alt="user comment "/><em>user_comment.png</em></td>

+

+		<td><img src="icons/user_delete.png" title="user_delete.png" alt="user delete "/><em>user_delete.png</em></td>

+		<td><img src="icons/user_edit.png" title="user_edit.png" alt="user edit "/><em>user_edit.png</em></td>

+		<td><img src="icons/user_female.png" title="user_female.png" alt="user female "/><em>user_female.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/user_go.png" title="user_go.png" alt="user go "/><em>user_go.png</em></td>

+		<td><img src="icons/user_gray.png" title="user_gray.png" alt="user gray "/><em>user_gray.png</em></td>

+

+		<td><img src="icons/user_green.png" title="user_green.png" alt="user green "/><em>user_green.png</em></td>

+		<td><img src="icons/user_orange.png" title="user_orange.png" alt="user orange "/><em>user_orange.png</em></td>

+		<td><img src="icons/user_red.png" title="user_red.png" alt="user red "/><em>user_red.png</em></td>

+		<td><img src="icons/user_suit.png" title="user_suit.png" alt="user suit "/><em>user_suit.png</em></td>

+		<td><img src="icons/vcard.png" title="vcard.png" alt="vcard "/><em>vcard.png</em></td>

+		<td><img src="icons/vcard_add.png" title="vcard_add.png" alt="vcard add "/><em>vcard_add.png</em></td>

+

+		<td><img src="icons/vcard_delete.png" title="vcard_delete.png" alt="vcard delete "/><em>vcard_delete.png</em></td>

+		<td><img src="icons/vcard_edit.png" title="vcard_edit.png" alt="vcard edit "/><em>vcard_edit.png</em></td>

+		<td><img src="icons/vector.png" title="vector.png" alt="vector "/><em>vector.png</em></td>

+		<td><img src="icons/vector_add.png" title="vector_add.png" alt="vector add "/><em>vector_add.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/vector_delete.png" title="vector_delete.png" alt="vector delete "/><em>vector_delete.png</em></td>

+

+		<td><img src="icons/wand.png" title="wand.png" alt="wand "/><em>wand.png</em></td>

+		<td><img src="icons/weather_clouds.png" title="weather_clouds.png" alt="weather clouds "/><em>weather_clouds.png</em></td>

+		<td><img src="icons/weather_cloudy.png" title="weather_cloudy.png" alt="weather cloudy "/><em>weather_cloudy.png</em></td>

+		<td><img src="icons/weather_lightning.png" title="weather_lightning.png" alt="weather lightning "/><em>weather_lightning.png</em></td>

+		<td><img src="icons/weather_rain.png" title="weather_rain.png" alt="weather rain "/><em>weather_rain.png</em></td>

+		<td><img src="icons/weather_snow.png" title="weather_snow.png" alt="weather snow "/><em>weather_snow.png</em></td>

+

+		<td><img src="icons/weather_sun.png" title="weather_sun.png" alt="weather sun "/><em>weather_sun.png</em></td>

+		<td><img src="icons/webcam.png" title="webcam.png" alt="webcam "/><em>webcam.png</em></td>

+		<td><img src="icons/webcam_add.png" title="webcam_add.png" alt="webcam add "/><em>webcam_add.png</em></td>

+		<td><img src="icons/webcam_delete.png" title="webcam_delete.png" alt="webcam delete "/><em>webcam_delete.png</em></td>

+		<td><img src="icons/webcam_error.png" title="webcam_error.png" alt="webcam error "/><em>webcam_error.png</em></td>

+	</tr>

+

+	<tr>

+		<td><img src="icons/world.png" title="world.png" alt="world "/><em>world.png</em></td>

+		<td><img src="icons/world_add.png" title="world_add.png" alt="world add "/><em>world_add.png</em></td>

+		<td><img src="icons/world_delete.png" title="world_delete.png" alt="world delete "/><em>world_delete.png</em></td>

+		<td><img src="icons/world_edit.png" title="world_edit.png" alt="world edit "/><em>world_edit.png</em></td>

+		<td><img src="icons/world_go.png" title="world_go.png" alt="world go "/><em>world_go.png</em></td>

+

+		<td><img src="icons/world_link.png" title="world_link.png" alt="world link "/><em>world_link.png</em></td>

+		<td><img src="icons/wrench.png" title="wrench.png" alt="wrench "/><em>wrench.png</em></td>

+		<td><img src="icons/wrench_orange.png" title="wrench_orange.png" alt="wrench orange "/><em>wrench_orange.png</em></td>

+		<td><img src="icons/xhtml.png" title="xhtml.png" alt="xhtml "/><em>xhtml.png</em></td>

+		<td><img src="icons/xhtml_add.png" title="xhtml_add.png" alt="xhtml add "/><em>xhtml_add.png</em></td>

+		<td><img src="icons/xhtml_delete.png" title="xhtml_delete.png" alt="xhtml delete "/><em>xhtml_delete.png</em></td>

+

+		<td><img src="icons/xhtml_go.png" title="xhtml_go.png" alt="xhtml go "/><em>xhtml_go.png</em></td>

+	</tr>

+	<tr>

+		<td><img src="icons/xhtml_valid.png" title="xhtml_valid.png" alt="xhtml valid "/><em>xhtml_valid.png</em></td>

+		<td><img src="icons/zoom.png" title="zoom.png" alt="zoom "/><em>zoom.png</em></td>

+		<td><img src="icons/zoom_in.png" title="zoom_in.png" alt="zoom in "/><em>zoom_in.png</em></td>

+		<td><img src="icons/zoom_out.png" title="zoom_out.png" alt="zoom out "/><em>zoom_out.png</em></td>

+

+		<td>&nbsp;</td>

+		<td>&nbsp;</td>

+		<td>&nbsp;</td>

+		<td>&nbsp;</td>

+		<td>&nbsp;</td>

+		<td>&nbsp;</td>

+		<td>&nbsp;</td>

+		<td>&nbsp;</td>

+	</tr></table>

+						</p>

+							

+					</div><!-- /content_inner -->

+					<!-- A break! -->

+					<br class="clear" />

+	 

+			</div><!-- /content_outer -->

+		

+		</div><!-- /container_inner -->

+	</div><!-- /container_outer -->

+

+	

+	</body>

+</html>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/readme.txt b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/readme.txt
new file mode 100644
index 0000000..400a64d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/readme.txt
@@ -0,0 +1,22 @@
+Silk icon set 1.3

+

+_________________________________________

+Mark James

+http://www.famfamfam.com/lab/icons/silk/

+_________________________________________

+

+This work is licensed under a

+Creative Commons Attribution 2.5 License.

+[ http://creativecommons.org/licenses/by/2.5/ ]

+

+This means you may use it for any purpose,

+and make any changes you like.

+All I ask is that you include a link back

+to this page in your credits.

+

+Are you using this icon set? Send me an email

+(including a link or picture if available) to

+mjames@gmail.com

+

+Any other questions about this icon set please

+contact mjames@gmail.com
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_move_forwards.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_move_forwards.png
new file mode 100644
index 0000000..cfe4493
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_move_forwards.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_move_front.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_move_front.png
new file mode 100644
index 0000000..b4a4e3b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_move_front.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_square.png b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_square.png
new file mode 100644
index 0000000..33af046
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/famfamfam_icons/shape_square.png
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/i18n/de.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/i18n/de.json
new file mode 100644
index 0000000..52b4e18
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/i18n/de.json
@@ -0,0 +1,490 @@
+{
+  "administration": {
+    "admin-modules": {
+      "scope": "Geltungsbereich",
+      "modules": "Module",
+      "source": "Quelle",
+      "system": "System",
+      "user": "Benutzer",
+      "extsystems": "Externe Systeme",
+      "preferences": "Präferenzen"
+    },
+    "edit-preference": {
+      "btn-cancel": "Abbrechen",
+      "btn-save": "Speichern",
+      "err-cannot-load-data-source": "Datenquelle kann nicht geladen werden.",
+      "err-cannot-load-scope": "Geltungsbereich kann nicht geladen werden.",
+      "lbl-key": "Schlüssel",
+      "lbl-scope": "Geltungsbereich",
+      "lbl-source": "Quelle",
+      "lbl-value": "Wert",
+      "title-preferences-editor": "Einstellungseditor",
+      "tooltip-close": "Schließen"
+    },
+    "preference": {
+      "btn-add-preference": "Einstellung hinzufügen",
+      "btn-tooltip-delete-preference": "Entfernen",
+      "btn-tooltip-edit-preference": "Bearbeiten",
+      "err-cannot-save-preference": "Einstellung kann nicht gespeichert werden.",
+      "err-cannot-update-preference": "Einstellung kann nicht aktualisiert werden."
+    },
+    "extsystem": {
+      "loading": "Lade Daten...",
+      "loading-short": "Lade",
+      "dropdown-please-select": "Bitte auswählen",
+      "select-system": "Datenquelle auswählen",
+      "selected-system": "Gewählte Datenquelle",
+      "name": "Name",
+      "description": "Beschreibung",
+      "ext-system-attributes": "Externes System Attribute",
+      "mdm-attributes": "MDM Attribute",
+      "btn-add": "Neu hinzufügen",
+      "btn-edit": "Bearbeiten",
+      "btn-del": "Entfernen",
+      "btn-save": "Speichern",
+      "btn-cancel": "Abbrechen",
+      "btn-back": "Zurück",
+      "component-type": "Komponenten-Typ",
+      "component-name": "Komponenten-Name",
+      "attribute-name": "Attribut-Name",
+      "dialog-ext-system-title": "Externes System",
+      "dialog-ext-system-attr-title": "Externes System Attribute",
+      "dialog-ext-system-mdm-attr-title": "MDM Attribute",
+      "dialog-ext-system-delete-title": "Externes System löschen",
+      "dialog-ext-system-delete-text": "Bitte bestätigen Sie das Löschen des Externen Systems",
+      "err-cannot-update-ext-system": "Externes System kann nicht gespeichert werden",
+      "err-cannot-save-ext-system": "Externes System kann nicht aktualisiert werden",
+      "err-cannot-save-ext-system-attr": "Externes System Attribut kann nicht gespeichert werden",
+      "err-cannot-save-ext-mdm-attr": "MDM Attribut kann nicht gespeichert werden",
+      "err-cannot-load-comp-types": "Komponententypen konnten nicht geladen werden",
+      "loading-attributes": "Lade Attribute...",
+      "sensor": "Sensor",
+      "test-equipment": "Messgerät",
+      "test-sequence": "Testablauf",
+      "unit-under-test": "Prüfling"
+    }
+  },
+	"app": {
+		"about": "Über",
+		"language": "Sprache",
+		"logout": "Logout",
+    "roles": "Rollen"
+	},
+	"basket": {
+		"mdm-basket": {
+			"btn-load": "Laden",
+			"btn-shopping-basket": "Warenkorb",
+			"close": "Schließen",
+			"err-cannot-add-items-to-shopping-basket": "Items können nicht zum Warenkorb hinzugefügt werden.",
+			"err-cannot-add-selection": "Auswahl kann nicht hinzugefügt werden.",
+			"err-cannot-load-shopping-basket": "Warenkorb kann nicht geladen werden.",
+			"err-cannot-load-sources": "Quellen können nicht geladen werden",
+			"err-cannot-remove-selection": "Auswahl kann nicht entfernt werden.",
+			"err-cannot-select-view": "Ansicht kann nicht ausgewählt werden.",
+			"err-save-shopping-basket": "Ein Fehler ist aufgetreten. Der Warenkorb wurde nicht gespeichert.",
+			"existing-shopping-baskets": "Vorhandene Warenkörbe",
+			"item-save-shopping-basket": "ein Warenkorb",
+			"load-shopping-basket": "Warenkorb laden",
+			"no-saved-shopping-baskets-available": "Keine gespeicherten Warenkörbe vorhanden.",
+			"remove-selection": "Selektion entfernen",
+			"save-basket-as": "Warenkorb speichern als",
+			"shopping-basket": "Warenkorb",
+			"shopping-basket-name": "Warenkorb-Name",
+			"tooltip-clear-shopping-basket": "Warenkorb leeren",
+			"tooltip-close": "Schließen",
+			"tooltip-download-shopping-basket": "Warenkorb herunterladen",
+			"tooltip-no-name-set": "Kein Name ausgewählt",
+			"tooltip-open-shopping-basket": "Warenkorb öffnen",
+			"tooltip-save-shopping-basket": "Warenkorb speichern",
+			"tooltip-upload-shopping-basket": "Warenkorb hochladen",
+			"msg-atfx-only-supports-types": "Der ATFX Export unterstützt nur Elemente vom Typ: {{types}}.",
+			"msg-only-not-exportable-types-selected": "Aktuell sind nur Elemente vom Typ {{types}} selektiert!",
+			"msg-not-exportable-types-continue": "Einige Elemente sind vom Typ {{types}} und werden nicht exportiert. Sollen die übrigen Elemente exportiert werden?"
+		}
+	},
+	"core": {
+		"mdm-error-handler": {
+			"strings-error-message": "Applikationsfehler$Es ist ein Applikationsfehler aufgetreten. Für eine detailierte Fehlermeldung öffnen Sie bitte die Entwicklerkonsole Ihres Browsers."
+		},
+		"overwrite-dialog": {
+			"btn-cancel": "Abbrechen",
+			"btn-overwrite": "Überschreiben",
+			"label-with-this-name-already-exists": "Es existiert bereits {{label}} mit diesem Namen!"
+		}
+	},
+	"details": {
+		"detail-view": {
+			"err-cannot-load-preference-for-attributes-to-ignore": "Einstellung für zu ignorierende Attribute kann nicht geladen werden.",
+			"err-faulty-preference-for-attributes-to-ignore": "Einstellung für die zu ignorierenden Attribute ist fehlerhaft."
+		},
+		"mdm-detail-descriptive-data": {
+			"err-cannot-load-context": "Kontext kann nicht geladen werden.",
+			"err-cannot-load-data": "Daten können nicht geladen werden.",
+			"err-cannot-load-scope": "Bereich kann nicht geladen werden.",
+			"status-loading": "Lädt...",
+      "status-saving": "Speichert...",
+			"status-no-descriptive-data-available": "Keine beschriebenden Daten verfügbar.",
+			"status-no-nodes-available": "Keine Knoten verfügbar.",
+			"tblhdr-measured": "Gemessen",
+			"tblhdr-name": "Name",
+      "tblhdr-ordered": "Beauftragt",
+      "btn-edit": "Bearbeiten",
+      "btn-cancel": "Abbrechen",
+      "btn-save": "Speichern",
+      "input-dateformat": "dd.mm.yy",
+      "transform-dateformat": "dd.MM.yyyy HH:mm"
+		},
+		"mdm-detail-view": {
+			"cannot-update-node": "Knoten kann nicht aktualisiert werden."
+		},
+		"mdm-detail-panel": {
+			"btn-into-shopping-basket": "In den Warenkorb",
+			"cannot-update-node": "Knoten kann nicht aktualisiert werden.",
+			"tblhdr-attribute": "Attribut",
+			"tblhdr-unit": "Einheit",
+			"tblhdr-value": "Wert"
+		},
+		"mdm-detail": {
+			"general": "General",
+			"sensors": "Sensoren",
+			"test-equipment": "Messgerät",
+			"test-sequence": "Testablauf",
+			"unit-under-test": "Prüfling"
+		},
+		"sensor": {
+			"err-cannot-load-data": "Daten können nicht geladen werden.",
+			"err-cannot-load-descriptive-data": "Beschreibende Daten können nicht geladen werden.",
+			"err-cannot-load-scope": "Bereich kann nicht geladen werden.",
+			"status-loading": "Lädt...",
+			"status-no-descriptive-data-available": "Keine beschreibenden Daten verfügbar.",
+			"status-no-nodes-available": "Keine Knoten verfügbar.",
+			"tblhdr-measured": "Gemessen",
+			"tblhdr-name": "Name",
+			"tblhdr-ordered": "Beauftragt"
+		},
+    "attribute-editor": {
+      "cal-sunday": "Sonntag",
+      "cal-monday": "Montag",
+      "cal-tuesday": "Dienstag",
+      "cal-wednesday": "Mittwoch",
+      "cal-thursday": "Donnerstag",
+      "cal-friday": "Freitag",
+      "cal-saturday": "Samstag",
+      "cal-sun": "Son",
+      "cal-mon": "Mon",
+      "cal-tue": "Die",
+      "cal-wed": "Mit",
+      "cal-thu": "Don",
+      "cal-fri": "Fre",
+      "cal-sat": "Sam",
+      "cal-su": "So",
+      "cal-mo": "Mo",
+      "cal-tu": "Di",
+      "cal-we": "Mi",
+      "cal-th": "Do",
+      "cal-fr": "Fr",
+      "cal-sa": "Sa",
+      "cal-today": "Heute",
+      "cal-clear": "Löschen",
+      "cal-week": "Wo",
+      "cal-january": "Januar",
+      "cal-february": "Februar",
+      "cal-march": "März",
+      "cal-april": "April",
+      "cal-may": "Mai",
+      "cal-june": "Juni",
+      "cal-july": "Juli",
+      "cal-august": "August",
+      "cal-september": "September",
+      "cal-october": "Oktober",
+      "cal-november": "November",
+      "cal-december": "Dezember",
+      "cal-jan": "Jan",
+      "cal-feb": "Feb",
+      "cal-mar": "Mär",
+      "cal-apr": "Apr",
+      "cal-jun": "Jun",
+      "cal-jul": "Jul",
+      "cal-aug": "Aug",
+      "cal-sep": "Sep",
+      "cal-oct": "Okt",
+      "cal-nov": "Nov",
+      "cal-dec": "Dez",
+      "cal-format": "dd.mm.yy"
+    }
+	},
+	"filerelease": {
+		"filerelease": {
+			"format-pak2atfx": "ATFX",
+			"format-pak2raw": "Original-Daten",
+			"state-release-approved": "genehmigt",
+			"state-release-declined": "abgelehnt",
+			"state-release-expired": "abgelaufen",
+			"state-release-in-process": "in Bearbeitung",
+			"state-release-ordered": "beauftragt",
+			"state-release-processing-error": "Systemfehler",
+			"state-release-released": "freigegeben"
+		},
+		"mdm-filerelease-create": {
+			"btn-release-request": "Freigabeanfrage",
+			"btn-send": "Senden",
+			"err-cannot-create-release": "Release kann nicht erzeugt werden.",
+			"lbl-format": "Format",
+			"lbl-reason": "Begründung",
+			"lbl-validity-days": "Gültigkeit (Tage)",
+			"title-release": "Freigabe"
+		},
+		"mdm-filerelease-display": {
+			"lbl-error-message": "Fehlerbericht",
+			"lbl-expires-on": "Freigegeben bis",
+			"lbl-reason-for-declining": "Begründung für Ablehnung",
+			"lbl-reason-for-release": "Begründung für Freigabe",
+			"lbl-requested-by": "Antragsteller",
+			"lbl-state": "Status",
+			"lbl-test-name": "Versuchsname",
+			"lbl-test-responsible-person": "Messungsverantwortlicher",
+			"lbl-validity": "Freigabedauer",
+			"tlbl-format": "Format"
+		},
+		"mdm-filerelease": {
+			"btn-approve": "Genehmigen",
+			"btn-cancel": "Abbrechen",
+			"btn-cancel-request": "Anfrage zurückziehen/entfernen",
+			"btn-decline": "Ablehnen",
+			"days": "Tage",
+			"err-cannot-read-outgoing-release": "Ausgehendes Release kann nicht gelesen werden.",
+			"err-error-approving-release": "Fehler beim Bestätigen des Releases.",
+			"err-error-declining-release": "Fehler beim Zurückweisen des Releases.",
+			"incoming-release-requests": "Freigabeantragseingang",
+			"outgoing-release-requests": "Freigabeantragsausgang",
+			"reason": "Begründung",
+			"release": "Freigabe",
+			"tblhdr-download": "Download",
+			"tblhdr-format": "Format",
+			"tblhdr-release-expires-on": "Freigegeben bis",
+			"tblhdr-release-validity": "Freigabedauer",
+			"tblhdr-request-submitted-by": "Antragsteller",
+			"tblhdr-status": "Status",
+			"tblhdr-test-name": "Versuchsname",
+			"tblhdr-test-responsible-person": "Messungsverantwortlicher"
+		}
+	},
+	"modules": {
+		"mdm-modules": {
+			"details": "Details",
+			"mdm-search": "MDM Suche",
+			"file-explorer": "Dokumente"
+		}
+	},
+	"navigator-view": {
+		"mdm-navigator-view": {
+			"err-cannot-update-node-provider": "Nodeprovider kann nicht aktualisiert werden.",
+			"navigator": "Navigator",
+			"select-node-provider": "Baumdarstellung auswählen",
+			"tooltip-scroll-up": "Zum Seitenanfang"
+		}
+	},
+	"navigator": {
+		"mdm-navigator": {
+			"add-to-shopping-basket": "In Warenkorb legen",
+			"err-cannot-load-nodes": "Knoten können nicht geladen werden.",
+			"err-cannot-open-node": "Knoten kann nicht geöffnet werden.",
+			"err-cannot-open-node-in-navigation-tree": "Knoten kann nicht im Navigationsbaum geöffnet werden.",
+			"err-cannot-update-navigation-tree": "Navigationsbaum kann nicht aktualisiert werden.",
+			"loading-subordinate-items": "Unterpunkte werden geladen...",
+			"msg-item-type-not-supported": "'Dieser Knotentyp wird von der aktuellen Ansicht nicht angezeigt!"
+		},
+		"navigator": {
+			"err-cannot-set-item": "Item konnte nicht gesetzt werden."
+		},
+		"nodeprovider": {
+			"err-cannot-load-node-provider-from-settings": "Nodeprovider kann nicht aus den Einstellungen geladen werden.",
+			"err-unsupported-type": "Typ {{ type }} wird nicht unterstützt! Es sollte Typ {{ typeToUse }} verwendet werden."
+		},
+		"attribute-value": {
+			"msg-no-files-attached": "Keine Dateien angehangen",
+			"msg-one-file-attached": "1 Datei angehangen",
+			"msg-x-files-attached": "{{numberOfFiles}} Dateien angehangen"
+		}
+	},
+	"search": {
+		"edit-searchfields": {
+			"btn-apply-changes": "Änderungen übernehmen",
+			"enter-search-text": "Suchtext eingeben",
+			"err-cannot-update-selected-node": "Ausgewählter Knoten kann nicht aktualisiert werden.",
+			"lbl-selected-search-attributes": "Ausgewählte Suchattribute",
+			"no-search-attributes-selected": "Keine Suchattribute ausgewählt.",
+			"remove": "Entfernen",
+			"search-field-already-selected": "Das Suchfeld wurde bereits ausgewählt!",
+			"title-search-field-editor": "Suchfeld Editor",
+			"tooltip-close": "Schließen"
+		},
+		"filter": {
+			"new-filter": "Neuer Filter",
+			"no-filter-selected": "Kein Filter ausgewählt"
+		},
+		"mdm-search": {
+			"a-filter": "ein Filter",
+			"add-to-shopping-basket": "In Warenkorb legen",
+			"btn-save": "Speichern",
+			"btn-search": "Suche",
+			"enter-search-text": "Suchtext eingeben",
+			"err-cannot-delete-search-filter": "Filter kann nicht gelöscht werden",
+			"err-cannot-delete-search-filter-none-selected": "Der Vorgang konnte nicht durchgeführt werden, da kein gespeicherter Filter zum Löschen ausgewählt wurde.",
+			"err-cannot-display-search-field-editor": "Suchfeldeditor kann nicht angezeigt werden.",
+			"err-cannot-load-data-sources": "Datenquellen können nicht geladen werden.",
+			"err-cannot-load-search-filter": "Suchfilter kann nicht geladen werden.",
+			"err-cannot-process-search-query": "Suchanfrage kann nicht bearbeitet werden.",
+			"err-cannot-save-search-filter": "Suchfilter kann nicht gespeichert werden",
+			"err-cannot-update-view": "Ansicht kann nicht aktualisiert werden.",
+			"err-too-many-search-results": "Es werden die ersten {{ numresults }} Suchergebnisse aus {{ source }} angezeigt. Bitte schränken Sie die Suchanfrage weiter ein.",
+			"errheading-cannot-delete-search-filter-none-selected": "Kein Filter ausgewählt.",
+			"errheading-too-many-search-results": "Zu viele Suchergebnisse",
+			"global-search-attributes": "Globale Suchattribute",
+			"lbl-advanced-search": "Erweiterte Suche",
+			"lbl-result-type": "Ergebnistyp",
+			"lbl-search-filter": "Suchfilter",
+			"lbl-source": "Quelle",
+			"no-search-attributes-selected": "Keine Suchattribute ausgewählt.",
+			"results": "Ergebnisse",
+			"search-attributes-from": "Suchattribute aus",
+			"search-filter-name": "Filtername",
+			"select-search-filter": "Suchfilter auswählen",
+			"title-save-search-filter-as": "Suchfilter speichern unter",
+			"tooltip-add-selection-to-shopping-basket": "Auswahl zum Warenkorb hinzufügen",
+			"tooltip-clear-search-results": "Suchergebnisliste leeren",
+			"tooltip-create-new-search-filter": "Neuen Suchfilter anlegen",
+			"tooltip-delete-search-filter": "Suchfilter löschen",
+			"tooltip-disable-advanced-search": "Erweiterte Suche deaktivieren",
+			"tooltip-edit-search-filter": "Suchfilter bearbeiten",
+			"tooltip-enable-advanced-search": "Erweiterte Suche aktivieren",
+			"tooltip-global-search-attributes": "Globale Suchattribute sind Attribute, die in allen ausgewählten Datenquellen vorhanden sind. Global Suchattribute werden nur einmal dargestellt und die definierte Bedingung wird in allen Datenquellen angewendet.",
+			"tooltip-no-name-set": "Name nicht gesetzt!",
+			"tooltip-reset-search-conditions": "Suchkriterien zurücksetzen",
+			"tooltip-save-search-filter": "Suchfilter speichern",
+			"tooltip-search-text": "Mögliche Operatoren:\n+ steht für einen UND Operator\n| steht für einen ODER Operator\n- negiert einen einzelnen Term\n\" fasst einen Menge von Termen zu einer Phrase zusammen\n* am Ende eines Suchterms beschreibt eine Präfixsuche\n( und ) beschreibt die Operatorpräferenz\n~N nach einem Wort beschreibt den Editierabstand (Unschärfe)\n~N nach einer Phrase beschreibt den Wortabstand\nWenn nach einem der Spezialsymbole gesucht werden soll, müssen diese mit \\ escaped werden.",
+			"tooltip-select-sources": "Quellen auswählen"
+		},
+		"search-condition": {
+			"err-cannot-initialize-autocompletion": "Autotvervollständigung kann nicht initialisiert werden.",
+			"tooltip-select-search-operator": "Suchoperator auswählen"
+		},
+		"search-datepicker": {
+			"placeholder-dateformat": "TT.MM.JJJJ HH:MM",
+			"tooltip-select-date": "Datum auswählen"
+		},
+		"search": {
+			"err-cannot-load-preference-for-attributes-to-ignore": "Einstellung für zu ignorierende Attribute kann nicht geladen werden.",
+			"err-faulty-preference-for-attributes-to-ignore": "Einstellung für zu ignorierende Attribute ist fehlerhaft."
+		}
+	},
+	"tableview": {
+		"editview": {
+			"attribute-already-selected": "Das Attribut wurde bereits ausgewählt!",
+			"btn-apply-changes": "Änderungen anwenden",
+			"enter-search-text": "Suchtext eingeben",
+			"err-cannot-load-nodes": "Knoten können nicht geladen werden.",
+			"err-cannot-load-search-attributes": "Suchattribute können nicht geladen werden.",
+			"err-cannot-select-node": "Knoten kann nicht ausgewählt werden.",
+			"lbl-selected-attributes": "Ausgewählte Attribute",
+			"no-attributes-selected": "Keine Attribute ausgewählt.",
+			"title-view-editor": "Ansichtseditor"
+		},
+		"tableview": {
+			"err-cannot-calculate-node": "Knoten konnte nicht berechnet werden.",
+			"err-cannot-save-view": "Ansicht konnte nicht gespeichert werden.",
+			"loading-search-results": "Suchergebnisse werden geladen...",
+			"no-records-found": "Keine Datensätze gefunden.",
+			"reset-selection": "Selektion zurücksetzen",
+			"show-in-tree": "Im Baum zeigen",
+			"tooltip-add-to-shopping-basket": "Zum Warenkorb hinzufügen",
+			"tooltip-open-in": "Öffnen in",
+			"tooltip-remove-from-shopping-basket": "Aus dem Warenkorb entfernen"
+		},
+		"view": {
+			"a-view": "eine Ansicht",
+			"btn-save": "Speichern",
+			"err-cannot-delete-view": "Die Ansicht kann nicht gelöscht werden.",
+			"err-cannot-display-view-editor": "Ansichtseditor kann nicht angezeigt werden.",
+			"err-cannot-load-views": "Ansichten können nicht geladen werden.",
+			"err-cannot-modify-system-settings": "Systemeinstellungen können nicht aus der Anwendung geändert werden. Sollten sie entsprechende Zugriffsrechte besitzen, können Sie diese Einstellungen über den Administrationsbereich bearbeiten.",
+			"err-cannot-save-view": "Ansicht konnte nicht gespeichert werden.",
+			"err-cannot-select-view": "Ansicht kann nicht ausgewählt werden.",
+			"err-cannot-update-views": "Ansichten konnten nicht aktualisiert werden.",
+			"err-deleting-view": "Es ist ein Fehler beim Löschen der Ansicht aufgetreten.",
+			"err-saving-view": "'Es ist ein Fehler beim Speichern der Ansicht aufgetreten.",
+			"existing-view-names": "Vorhandene Ansichtsnamen",
+			"new-view": "Neue Ansicht",
+			"title-save-view-as": "Ansicht speichern unter",
+			"tooltip-create-new-view": "Neue Ansicht erstellen",
+			"tooltip-delete-view": "Ansicht löschen",
+			"tooltip-edit-view": "Ansicht bearbeiten",
+			"tooltip-no-name-set": "Name nicht gesetzt!",
+			"tooltip-save-view": "Ansicht speichern",
+			"tooltip-select-view": "Ansicht auswählen"
+		}
+	},
+	"chartviewer": {
+		"request-options": {},
+		"xy-chart-data-selection-panel": {
+			"select-channel-placeholder": "Kanal wählen",
+			"no-x-channel-dialog-header": "Information",
+			"no-x-channel-dialog-message": "Die aktuelle Kanalgruppe hat keine Kanäle die als X-Achse bzw. XY-Achse definiert sind. Wenn Sie auch als Y-Achse definierte Kanäle zulassen möchten, deaktivieren Sie bitte den Filter in der Werkzeugleiste."
+		},
+		"xy-chart-viewer": {},
+		"xy-chart-viewer-nav-card": {
+			"no-node-selected": "Kein Knoten ausgewählt"
+		},
+		"xy-chart-viewer-toolbar": {
+			"hide-data-selection-panel": "Datenauswahlpanel verbergen",
+			"show-data-selection-panel": "Datenauswahlpanel anzeigen",
+			"activate-xy-mode": "Kanal Auswahloptionen nach Achsentyp filtern",
+			"deactivate-xy-mode": "Alle Kanäle als Auswahloptionen anzeigen",
+			"hide-chart-legend": "Legende des Diagramms verbergen",
+			"show-chart-legend": "Legende des Diagramms anzeigen",
+			"line-width": "Linienstärke",
+			"show-lines": "Verbindungslinien anzeigen",
+			"hide-lines": "Verbindungslinien verbergen",
+			"fill-area": "Fläche unter dem Graph füllen",
+			"clear-area": "Fläche unter dem Graph leeren",
+			"show-datapoints": "Datenpunkte markieren",
+			"hide-datapoints": "Datenpunkte verbergen",
+			"tension": "Tension: 0 = Linear, 0.4 = Bezierkurve"
+		}
+	},
+	"file-explorer": {
+		"file-explorer": {
+			"btn-add-files": "Dateien hinzufügen",
+			"btn-delete-file": "Datei löschen",
+			"btn-download-file": "Datei herunterladen",
+			"btn-preview-file": "Vorschau",
+			"btn-refresh": "Aktualisieren",
+			"btn-remove-all-files-from-selection": "Dateiauswahl leeren",
+			"btn-remove-file-from-selection": "Datei aus Auswahl entfernen",
+			"btn-upload-file-selection": "Ausgewählte Dateien hochladen",
+			"btn-upload-file": "Datei hochladen",
+			"btn-upload-files": "Dateien hochladen",
+
+			"hdr-description": "Beschreibung",
+			"hdr-filename": "Dateiname",
+			"hdr-size": "Größe",
+			"hdr-type": "Typ",
+			"hdr-file-upload-wizzard": "File upload wizzard for ",
+
+			"msg-no-files-attached": "Keine Dateien angehangen.",
+			"msg-confirm-delete-file-from-db": "Sind Sie sicher, dass Sie die ausgewählte Datei von der Datenbank löschen möchten?",
+
+			"ttl-attached-to": "Dateien angehangen an: ",
+			"ttl-confirmation": "Bestätigung"
+		},
+		"file-explorer-nav-card": {
+			"status-node-is-no-files-attachable": "An {{type}}s können keine Dateien angehangen werden.",
+			"status-no-node-selected": "Kein Knoten ausgewählt."
+		},
+		"file-link-editor-dialog": {
+			"btn-cancel": "Abbrechen",
+			"btn-save-changes": "Speichern",
+			"btn-change-file": "Datei ändern"
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/i18n/en.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/i18n/en.json
new file mode 100644
index 0000000..1b1f927
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/i18n/en.json
@@ -0,0 +1,489 @@
+{
+	"administration": {
+    "admin-modules": {
+      "scope": "Scope",
+      "modules": "Module",
+      "source": "Source",
+      "system": "System",
+      "user": "User",
+      "extsystems": "External Systems",
+      "preferences": "Preferences"
+    },
+		"edit-preference": {
+			"btn-cancel": "Cancel",
+			"btn-save": "Save",
+			"err-cannot-load-data-source": "Cannot load data source.",
+			"err-cannot-load-scope": "Cannot load scope.",
+			"lbl-key": "Key",
+			"lbl-scope": "Scope",
+			"lbl-source": "Source",
+			"lbl-value": "Value",
+			"title-preferences-editor": "Preferences Editor",
+			"tooltip-close": "Close"
+		},
+    "preference": {
+      "btn-add-preference": "Add preference",
+      "btn-tooltip-delete-preference": "Delete",
+      "btn-tooltip-edit-preference": "Edit",
+      "err-cannot-save-preference": "Cannot save preference.",
+      "err-cannot-update-preference": "Cannot update preference."
+    },
+    "extsystem": {
+      "loading": "Loading data...",
+      "loading-short": "Loading",
+      "dropdown-please-select": "Please select...",
+      "select-system": "Select environment",
+      "selected-system": "Selected environment",
+      "name": "Name",
+      "description": "Description",
+      "ext-system-attributes": "Ext. system attributes",
+      "mdm-attributes": "MDM attributes",
+      "btn-add": "Add new",
+      "btn-edit": "Edit",
+      "btn-del": "Remove",
+      "btn-save": "Save",
+      "btn-cancel": "Cancel",
+      "btn-back": "Back",
+      "component-type": "Component type",
+      "component-name": "Component name",
+      "attribute-name": "Attribute name",
+      "dialog-ext-system-title": "External system",
+      "dialog-ext-system-attr-title": "External system attribute",
+      "dialog-ext-system-mdm-attr-title": "MDM attribute",
+      "dialog-ext-system-delete-title": "External system deletion",
+      "dialog-ext-system-delete-text": "Please confirm the deletion of the external system",
+      "err-cannot-update-ext-system": "External system cannot be saved",
+      "err-cannot-save-ext-system": "External system cannot be refreshed",
+      "err-cannot-save-ext-system-attr": "External system attribute cannot be saved",
+      "err-cannot-save-ext-mdm-attr": "MDM attribute cannot be saved",
+      "err-cannot-load-comp-types": "Cannot load component types",
+      "loading-attributes": "Loading attributes...",
+      "sensor": "Sensor",
+      "test-equipment": "Test equipment",
+      "test-sequence": "Test sequence",
+      "unit-under-test": "Unit under test"
+    }
+	},
+	"app": {
+		"about": "About",
+		"language": "Language",
+		"logout": "Logout",
+    "roles": "Roles"
+	},
+	"basket": {
+		"mdm-basket": {
+			"btn-load": "Load",
+			"btn-shopping-basket": "Shopping basket",
+			"close": "Close",
+			"err-cannot-add-items-to-shopping-basket": "Cannot add items to shopping basket.",
+			"err-cannot-add-selection": "Cannot add selection.",
+			"err-cannot-load-shopping-basket": "Cannot load shopping basket.",
+			"err-cannot-load-sources": "Cannot load sources.",
+			"err-cannot-remove-selection": "Cannot remove selection.",
+			"err-cannot-select-view": "Cannot select view.",
+			"err-save-shopping-basket": "An error has occurred. The shopping basket has not been saved.",
+			"existing-shopping-baskets": "Existing shopping baskets",
+			"item-save-shopping-basket": "a shopping basket",
+			"load-shopping-basket": "Load shopping basket",
+			"no-saved-shopping-baskets-available": "No saved shopping baskets available",
+			"save-basket-as": "Save shopping basket as",
+			"shopping-basket": "Shopping basket",
+			"shopping-basket-name": "Shopping basket name",
+			"remove-selection": "Remove selection",
+			"tooltip-clear-shopping-basket": "Clear shopping basket",
+			"tooltip-close": "Close",
+			"tooltip-download-shopping-basket": "Download shopping basket",
+			"tooltip-no-name-set": "No name set",
+			"tooltip-open-shopping-basket": "Open shopping basket",
+			"tooltip-save-shopping-basket": "Save shopping basket",
+			"tooltip-upload-shopping-basket": "Upload shopping basket",
+			"msg-atfx-only-supports-types": "ATFX export only supports export of types: {{types}}.",
+			"msg-only-not-exportable-types-selected": "Currently only items of type {{types}} are selected!",
+			"msg-not-exportable-types-continue": "Some items are of type {{types}} and will not be exported. Continue exporting supported types?"
+		}
+	},
+	"core": {
+		"mdm-error-handler": {
+			"strings-error-message": "Application Error$An application error has occurred. For a detailed error message please open your browser's developer console."
+		},
+		"overwrite-dialog": {
+			"btn-cancel": "Cancel",
+			"btn-overwrite": "Overwrite",
+			"label-with-this-name-already-exists": "{{label}} with this name already exists!"
+		}
+	},
+	"details": {
+		"detail-view": {
+			"err-cannot-load-preference-for-attributes-to-ignore": "Cannot load preference for attributes to ignore.",
+			"err-faulty-preference-for-attributes-to-ignore": "Faulty preference for attributes to ignore."
+		},
+    "mdm-detail-descriptive-data": {
+      "err-cannot-load-context": "Cannot load context.",
+      "err-cannot-load-data": "Cannot load data.",
+      "err-cannot-load-scope": "Cannot load scope.",
+      "status-loading": "Loading...",
+      "status-saving": "Saving...",
+      "status-no-descriptive-data-available": "No descriptive data available.",
+      "status-no-nodes-available": "No nodes available.",
+      "tblhdr-measured": "Measured",
+      "tblhdr-name": "Name",
+      "tblhdr-ordered": "Ordered",
+      "btn-edit": "Edit",
+      "btn-cancel": "Cancel",
+      "btn-save": "Save",
+      "input-dateformat": "mm/dd/yy",
+      "transform-dateformat": "MM/dd/yyyy HH:mm"
+    },
+		"mdm-detail-view": {
+			"cannot-update-node": "Cannot update node."
+		},
+		"mdm-detail-panel": {
+			"btn-into-shopping-basket": "Into shopping basket",
+			"cannot-update-node": "Cannot update node.",
+			"tblhdr-attribute": "Attribute",
+			"tblhdr-unit": "Unit",
+			"tblhdr-value": "Value"
+		},
+		"mdm-detail": {
+			"general": "General",
+			"sensors": "Sensors",
+			"test-equipment": "Test equipment",
+			"test-sequence": "Test sequence",
+			"unit-under-test": "Unit under test"
+		},
+		"sensor": {
+			"err-cannot-load-data": "Cannot load data.",
+			"err-cannot-load-descriptive-data": "Cannot load descriptive data.",
+			"err-cannot-load-scope": "Cannot load scope.",
+			"status-loading": "Loading...",
+			"status-no-descriptive-data-available": "No descriptive data available.",
+			"status-no-nodes-available": "No nodes available.",
+			"tblhdr-measured": "Measured",
+			"tblhdr-name": "Name",
+			"tblhdr-ordered": "Ordered"
+		},
+    "attribute-editor": {
+      "cal-sunday": "Sunday",
+      "cal-monday": "Monday",
+      "cal-tuesday": "Tuesday",
+      "cal-wednesday": "Wednesday",
+      "cal-thursday": "Thursday",
+      "cal-friday": "Friday",
+      "cal-saturday": "Saturday",
+      "cal-sun": "Sun",
+      "cal-mon": "Mon",
+      "cal-tue": "Tue",
+      "cal-wed": "Wed",
+      "cal-thu": "Thu",
+      "cal-fri": "Fri",
+      "cal-sat": "Sat",
+      "cal-su": "Su",
+      "cal-mo": "Mo",
+      "cal-tu": "Tu",
+      "cal-we": "We",
+      "cal-th": "Th",
+      "cal-fr": "Fr",
+      "cal-sa": "Sa",
+      "cal-today": "Today",
+      "cal-clear": "Clear",
+      "cal-week": "We",
+      "cal-january": "January",
+      "cal-february": "February",
+      "cal-march": "March",
+      "cal-april": "April",
+      "cal-may": "May",
+      "cal-june": "June",
+      "cal-july": "July",
+      "cal-august": "August",
+      "cal-september": "September",
+      "cal-october": "October",
+      "cal-november": "November",
+      "cal-december": "December",
+      "cal-jan": "Jan",
+      "cal-feb": "Feb",
+      "cal-mar": "Mar",
+      "cal-apr": "Apr",
+      "cal-jun": "Jun",
+      "cal-jul": "Jul",
+      "cal-aug": "Aug",
+      "cal-sep": "Sep",
+      "cal-oct": "Oct",
+      "cal-nov": "Nov",
+      "cal-dec": "Dec",
+      "cal-format": "mm-dd-yy"
+    }
+	},
+	"filerelease": {
+		"filerelease": {
+			"format-pak2atfx": "ATFX",
+			"format-pak2raw": "Original data",
+			"state-release-approved": "approved",
+			"state-release-declined": "declined",
+			"state-release-expired": "expired",
+			"state-release-in-process": "in process",
+			"state-release-ordered": "ordered",
+			"state-release-processing-error": "processing error",
+			"state-release-released": "released"
+		},
+		"mdm-filerelease-create": {
+			"btn-release-request": "Release request",
+			"btn-send": "Send",
+			"err-cannot-create-release": "Cannot create release.",
+			"lbl-format": "Format",
+			"lbl-reason": "Reason",
+			"lbl-validity-days": "Validity (days)",
+			"title-release": "Release"
+		},
+		"mdm-filerelease-display": {
+			"lbl-error-message": "Error message",
+			"lbl-expires-on": "Expires on",
+			"lbl-reason-for-declining": "Reson for declining",
+			"lbl-reason-for-release": "Reason for release",
+			"lbl-requested-by": "Requested by",
+			"lbl-state": "Status",
+			"lbl-test-name": "Test name",
+			"lbl-test-responsible-person": "Responsible person for test",
+			"lbl-validity": "Validity",
+			"tlbl-format": "Format"
+		},
+		"mdm-filerelease": {
+			"btn-approve": "Approve",
+			"btn-cancel": "Cancel",
+			"btn-cancel-request": "Cancel request",
+			"btn-decline": "Decline",
+			"days": "days",
+			"err-cannot-read-outgoing-release": "Cannot read outgoing release.",
+			"err-error-approving-release": "Error approving release.",
+			"err-error-declining-release": "Error declining release.",
+			"incoming-release-requests": "Incoming release requests",
+			"outgoing-release-requests": "Outgoing release requests",
+			"reason": "Reason",
+			"release": "Release",
+			"tblhdr-download": "Download",
+			"tblhdr-format": "Format",
+			"tblhdr-release-expires-on": "Expires on",
+			"tblhdr-release-validity": "Validity",
+			"tblhdr-request-submitted-by": "Submitted by",
+			"tblhdr-status": "Status",
+			"tblhdr-test-name": "Test name",
+			"tblhdr-test-responsible-person": "Responsible person for test"
+		}
+	},
+	"modules": {
+		"mdm-modules": {
+			"details": "Details",
+			"mdm-search": "MDM Search",
+			"file-explorer": "Files"
+		}
+	},
+	"navigator-view": {
+		"mdm-navigator-view": {
+			"err-cannot-update-node-provider": "Cannot update node provider.",
+			"navigator": "Navigator",
+			"select-node-provider": "Select tree view",
+			"tooltip-scroll-up": "Top of page"
+		}
+	},
+	"navigator": {
+		"mdm-navigator": {
+			"add-to-shopping-basket": "Add to shopping basket",
+			"err-cannot-load-nodes": "Cannot load nodes.",
+			"err-cannot-open-node": "Cannot open node.",
+			"err-cannot-open-node-in-navigation-tree": "Cannot open node in navigation tree.",
+			"err-cannot-update-navigation-tree": "Cannot update navigation tree.",
+			"loading-subordinate-items": "Loading subordinate items...",
+			"msg-item-type-not-supported": "This node type is not supported by the current view!"
+		},
+		"navigator": {
+			"err-cannot-set-item": "Cannot set item."
+		},
+		"nodeprovider": {
+			"err-cannot-load-node-provider-from-settings": "Cannot load node provider from settings",
+			"err-unsupported-type": "Type {{ type }} is not supported. Type {{ typeToUse }} should be used instead."
+		},
+		"attribute-value": {
+			"msg-no-files-attached": "No files attached",
+			"msg-one-file-attached": "1 file attached",
+			"msg-x-files-attached": "{{numberOfFiles}} files attached"
+		}
+	},
+	"search": {
+		"edit-searchfields": {
+			"btn-apply-changes": "Apply changes",
+			"enter-search-text": "Enter search text",
+			"err-cannot-update-selected-node": "Cannot update the selected node.",
+			"lbl-selected-search-attributes": "Selected search attributes",
+			"no-search-attributes-selected": "No search attributes selected.",
+			"remove": "Remove",
+			"search-field-already-selected": "The search field has already been selected!",
+			"title-search-field-editor": "Search field editor",
+			"tooltip-close": "Close"
+		},
+		"filter": {
+			"new-filter": "New filter",
+			"no-filter-selected": "No filter selected"
+		},
+		"mdm-search": {
+			"a-filter": "a filter",
+			"add-to-shopping-basket": "Add to shopping basket",
+			"btn-save": "Save",
+			"btn-search": "Search",
+			"enter-search-text": "Enter search text",
+			"err-cannot-delete-search-filter": "Cannot delete search filter.",
+			"err-cannot-delete-search-filter-none-selected": "Action could not be executed as no saved filter was selected for deletion.",
+			"err-cannot-display-search-field-editor": "Cannot display search filed editor.",
+			"err-cannot-load-data-sources": "Cannot load data sources.",
+			"err-cannot-load-search-filter": "Cannot load search filter.",
+			"err-cannot-process-search-query": "Cannot process search query.",
+			"err-cannot-save-search-filter": "Cannot save search filter.",
+			"err-cannot-update-view": "Cannot update view.",
+			"err-too-many-search-results": "The first {{ numresults }} search results from {{ source }} are shown. Please qualify the search query further.",
+			"errheading-cannot-delete-search-filter-none-selected": "No filter selected",
+			"errheading-too-many-search-results": "Too many search results",
+			"global-search-attributes": "Global search attributes",
+			"lbl-advanced-search": "Advanced search",
+			"lbl-result-type": "Result type",
+			"lbl-search-filter": "Search filter",
+			"lbl-source": "Source",
+			"no-search-attributes-selected": "No search attributes selected.",
+			"results": "Results",
+			"search-attributes-from": "Search attributes from",
+			"search-filter-name": "Filter name",
+			"title-save-search-filter-as": "Save search filter as",
+			"select-search-filter": "Select search filter",
+			"tooltip-add-selection-to-shopping-basket": "Add selection to shopping basket",
+			"tooltip-clear-search-results": "Clear search results",
+			"tooltip-create-new-search-filter": "Create new search filter",
+			"tooltip-delete-search-filter": "Delete search filter",
+			"tooltip-disable-advanced-search": "Disable advanced search",
+			"tooltip-edit-search-filter": "Edit search filter",
+			"tooltip-enable-advanced-search": "Enable advanced search",
+			"tooltip-global-search-attributes": "Global search attributes are attributes present in all data sources selected. Global search attributes are displayed only once and the condition defined in them is applied to all data sources.",
+			"tooltip-no-name-set": "No name set!",
+			"tooltip-reset-search-conditions": "Reset search conditions",
+			"tooltip-save-search-filter": "Save search filter",
+			"tooltip-search-text": "Operators available:\n+ represents an AND operator\n| represents an OR operator\n- negates a single term\n\" combines a set of terms into a phrase\n* at the end of a search term describes a prefix search\n( and ) describe the operator preference\n~N after a word describes the edit distance (fuzziness)\n~N after a phrase describes the word distance\nIf one of the special symbols is to be included in a search, they must be escaped with \\.",
+			"tooltip-select-sources": "Select sources"
+		},
+		"search-condition": {
+			"err-cannot-initialize-autocompletion": "Cannot initialize autocompletion.",
+			"tooltip-select-search-operator": "Select search operator"
+		},
+		"search-datepicker": {
+			"placeholder-dateformat": "DD.MM.YYYY HH:MM",
+			"tooltip-select-date": "Select date"
+		},
+		"search": {
+			"err-cannot-load-preference-for-attributes-to-ignore": "Cannot load preference for attributes to ignore.",
+			"err-faulty-preference-for-attributes-to-ignore": "Faulty preference for attributes to ignore."
+		}
+	},
+	"tableview": {
+		"editview": {
+			"attribute-already-selected": "The attribute has already been selected!",
+			"btn-apply-changes": "Apply changes",
+			"enter-search-text": "Enter search text",
+			"err-cannot-load-nodes": "Cannot load nodes.",
+			"err-cannot-load-search-attributes": "Cannot load search attributes.",
+			"err-cannot-select-node": "Cannot select node.",
+			"lbl-selected-attributes": "Selected attributes",
+			"no-attributes-selected": "No attributes selected.",
+			"title-view-editor": "View editor"
+		},
+		"tableview": {
+			"err-cannot-calculate-node": "Cannot calculate node.",
+			"err-cannot-save-view": "Cannot save view.",
+			"loading-search-results": "Loading search results...",
+			"no-records-found": "No records found.",
+			"reset-selection": "Reset selection",
+			"show-in-tree": "Show in tree",
+			"tooltip-add-to-shopping-basket": "Add to shopping basket",
+			"tooltip-open-in": "Open in",
+			"tooltip-remove-from-shopping-basket": "Remove from shopping basket"
+		},
+		"view": {
+			"a-view": "a view",
+			"btn-save": "Save",
+			"err-cannot-delete-view": "Cannot delete view.",
+			"err-cannot-display-view-editor": "Cannot display view editor.",
+			"err-cannot-load-views": "Cannot load views.",
+			"err-cannot-modify-system-settings": "System settings cannot be modified from inside the application. Should you have appropriate access rights, you can modify these settings in the administration section.",
+			"err-cannot-save-view": "Cannot save view.",
+			"err-cannot-select-view": "Cannot select view.",
+			"err-cannot-update-views": "Cannot update views.",
+			"err-deleting-view": "An error has occurred when deleting the view.",
+			"err-saving-view": "An error has occurred when saving the view.",
+			"existing-view-names": "Existing view names",
+			"new-view": "New view",
+			"title-save-view-as": "Save view as",
+			"tooltip-create-new-view": "Create new view",
+			"tooltip-delete-view": "Delete view",
+			"tooltip-edit-view": "Edit view",
+			"tooltip-no-name-set": "No name set!",
+			"tooltip-save-view": "Save view",
+			"tooltip-select-view": "Select view"
+		}
+	},
+	"chartviewer": {
+		"request-options": {},
+		"xy-chart-data-selection-panel": {
+			"select-channel-placeholder": "Select Channel",
+			"no-x-channel-dialog-header": "Information",
+			"no-x-channel-dialog-message": "The current ChannelGroup has no Channels defined as X-axis or XY-axis. If you want to also allow Channels marked as Y-axis, toggle the corresponding filter in the toolbar."
+		},
+		"xy-chart-viewer": {},
+		"xy-chart-viewer-nav-card": {
+			"no-node-selected": "No node selected"
+		},
+		"xy-chart-viewer-toolbar": {
+			"hide-data-selection-panel": "Hide data selection panel",
+			"show-data-selection-panel": "Show data selection panel",
+			"activate-xy-mode": "Filter channel options by axis-type",
+			"deactivate-xy-mode": "Provide all channel options",
+			"hide-chart-legend": "Hide chart legend",
+			"show-chart-legend": "Show chart legend",
+			"line-width": "Line width",
+			"show-lines": "Draw lines",
+			"hide-lines": "Hide lines",
+			"fill-area": "Fill area underneath the graph",
+			"clear-area": "Clear area underneath the graph",
+			"show-datapoints": "Mark datapoints",
+			"hide-datapoints": "Hide datapoints",
+			"tension": "Line tension: 0 = linear, 0.4 = Bezier curve"
+		}
+	},
+	"file-explorer": {
+		"file-explorer": {
+			"btn-add-files": "Add files",
+			"btn-delete-file": "Delete file",
+			"btn-download-file": "Download file",
+			"btn-preview-file": "Preview",
+			"btn-refresh": "Update",
+			"btn-remove-all-files-from-selection": "Clean file selection",
+			"btn-remove-file-from-selection": "Remove file from selection",
+			"btn-upload-file-selection": "Upload selected files",
+			"btn-upload-file": "Upload file",
+			"btn-upload-files": "Upload files",
+
+			"hdr-description": "Description",
+			"hdr-filename": "Filename",
+			"hdr-size": "Size",
+			"hdr-type": "Type",
+			"hdr-file-upload-wizzard": "File upload wizzard for ",
+			"msg-no-files-attached": "No files attached.",
+			"msg-confirm-delete-file-from-db": "Are you sure you want to delete the selected file from database?",
+
+			"ttl-attached-to": "Files attached to: ",
+			"ttl-confirmation": "Confirmation"
+		},
+		"file-explorer-nav-card": {
+			"status-node-is-no-files-attachable": "It is not possible to attach files to {{type}}s.",
+			"status-no-node-selected": "No node selected."
+		},
+		"file-link-editor-dialog": {
+			"btn-cancel": "Cancel",
+			"btn-save-changes": "Save",
+			"btn-change-file": "Change file"
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/environments/environment.prod.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/environments/environment.prod.ts
new file mode 100644
index 0000000..e6c59ef
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/environments/environment.prod.ts
@@ -0,0 +1,22 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+export const environment = {
+  production: true,
+  /* Set the api URL to the base of the Angular app.
+   * If the Java backend and the Angular frontend are deployed at different
+   * location, replace apiUrl with the URL of your backend
+   */
+  apiUrl: document.getElementsByTagName('base')[0].href
+};
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/environments/environment.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/environments/environment.ts
new file mode 100644
index 0000000..fc0432b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/environments/environment.ts
@@ -0,0 +1,24 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `angular-cli.json`.
+
+export const environment = {
+  production: false,
+  apiUrl: '/org.eclipse.mdm.nucleus/'
+};
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/error.jsp b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/error.jsp
new file mode 100644
index 0000000..f6058f2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/error.jsp
@@ -0,0 +1,50 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="">
+<meta name="author" content="">
+
+<title>Login failed</title>
+
+
+<link rel='stylesheet' href='http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css'>
+<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/login.css">
+
+</head>
+
+<body>
+	<div class="bform">
+		<div class="bform2">
+			<div class="container">
+
+				<h2 class="form-signin-heading">Login Error</h2>
+				<h2>Invalid user name or password.</h2>
+
+				<p>
+					Please enter a user name or password that is authorized to access
+					this application. Click here to <a href="${pageContext.request.contextPath}/index.html">Try Again</a>.
+				</p>
+
+			</div>
+		</div>
+	</div>
+
+</body>
+</html>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/favicon.ico b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/favicon.ico
new file mode 100644
index 0000000..8081c7c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/favicon.ico
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/index.html b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/index.html
new file mode 100644
index 0000000..e4a1238
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/index.html
@@ -0,0 +1,28 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+<!DOCTYPE html>
+<html>
+  <head>
+    <base href="/" />
+    <title>openMDM5 Web</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta charset="utf-8">
+    <link rel="shortcut icon" href="/favicon.ico" />
+  </head>
+  <body>
+    <app-root>Loading...</app-root>
+  </body>
+</html>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/karma.conf.js b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/karma.conf.js
new file mode 100644
index 0000000..ed96e34
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/karma.conf.js
@@ -0,0 +1,59 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/0.13/config/configuration-file.html
+
+module.exports = function (config) {
+  config.set({
+    basePath: '',
+    frameworks: ['jasmine', '@angular-devkit/build-angular'],
+    plugins: [
+      require('karma-jasmine'),
+      require('karma-chrome-launcher'),
+      require('karma-phantomjs-launcher'),
+      require('karma-jasmine-html-reporter'),
+      require('karma-coverage-istanbul-reporter'),
+      require('karma-mocha-reporter'),
+      require('@angular-devkit/build-angular/plugins/karma')
+    ],
+    client:{
+      clearContext: false // leave Jasmine Spec Runner output visible in browser
+    },
+    files: [
+      
+    ],
+    preprocessors: {
+      
+    },
+    mime: {
+      'text/x-typescript': ['ts','tsx']
+    },
+    coverageIstanbulReporter: {
+      dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
+      fixWebpackSourcePaths: true
+    },
+    
+    reporters: config.angularCli && config.angularCli.codeCoverage
+              ? ['progress', 'coverage-istanbul']
+              : ['progress', 'kjhtml'],
+    port: 9876,
+    colors: true,
+    logLevel: config.LOG_INFO,
+    autoWatch: true,
+    browsers: ['Chrome', 'PhantomJS'],
+    singleRun: false
+  });
+};
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/login.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/login.css
new file mode 100644
index 0000000..f245c4b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/login.css
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+body {
+  padding-top: 40px;
+  padding-bottom: 40px;
+  background-color: #eee;
+}
+
+.form-signin {
+  max-width: 330px;
+  padding: 15px;
+  margin: 0 auto;
+}
+
+.form-signin .form-signin-heading, .form-signin .checkbox {
+  margin-bottom: 10px;
+}
+
+.form-signin .checkbox {
+  font-weight: normal;
+}
+
+.form-signin .form-control {
+  position: relative;
+  height: auto;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  padding: 10px;
+  font-size: 16px;
+}
+
+.form-signin .form-control:focus {
+  z-index: 2;
+}
+
+.form-signin input[type="email"] {
+  margin-bottom: -1px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.form-signin input[type="password"] {
+  margin-bottom: 10px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/login.jsp b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/login.jsp
new file mode 100644
index 0000000..e862bf9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/login.jsp
@@ -0,0 +1,53 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="description" content="">
+<meta name="author" content="">
+
+<title>MDM Web Login</title>
+
+<link rel='stylesheet' href='http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css'>
+<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/login.css">
+
+
+</head>
+
+<body>
+	<div class="bform">
+		<div class="bform2">
+			<div class="container">
+
+				<form class="form-signin" method=post action="j_security_check">
+					<h2 class="form-signin-heading">MDM Web Login</h2>
+					<input type="text" class="form-control" name="j_username"
+						placeholder="Username" required autofocus> <input
+						type="password" class="form-control" name="j_password"
+						placeholder="Password" required>
+
+					<button class="btn btn-lg btn-primary btn-block" type="submit">Login</button>
+				</form>
+
+			</div>
+		</div>
+	</div>
+
+</body>
+</html>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/main.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/main.ts
new file mode 100644
index 0000000..7f55a51
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/main.ts
@@ -0,0 +1,26 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { enableProdMode } from '@angular/core';
+import { environment } from './environments/environment';
+import { AppModule } from './app/app.module';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule)
+  .catch(err => console.log(err));
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/polyfills.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/polyfills.ts
new file mode 100644
index 0000000..903a24c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/polyfills.ts
@@ -0,0 +1,55 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+// This file includes polyfills needed by Angular and is loaded before the app.
+// You can add your own extra polyfills to this file.
+import 'reflect-metadata';
+
+import 'core-js/es6/symbol';
+import 'core-js/es6/object';
+import 'core-js/es6/function';
+import 'core-js/es6/parse-int';
+import 'core-js/es6/parse-float';
+import 'core-js/es6/number';
+import 'core-js/es6/math';
+import 'core-js/es6/string';
+import 'core-js/es6/date';
+import 'core-js/es6/array';
+import 'core-js/es6/regexp';
+import 'core-js/es6/map';
+import 'core-js/es6/set';
+import 'core-js/es6/reflect';
+
+
+import 'zone.js/dist/zone';
+import 'rxjs/Rx';
+// If you need to support the browsers/features below, uncomment the import
+// and run `npm install import-name-here';
+// Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+
+// Needed for: IE9
+// import 'classlist.js';
+
+// Animations
+// Needed for: All but Chrome and Firefox, Not supported in IE9
+// import 'web-animations-js';
+
+// Date, currency, decimal and percent pipes
+// Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+// import 'intl';
+
+// NgClass on SVG elements
+// Needed for: IE10, IE11
+// import 'classlist.js';
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/styles.css b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/styles.css
new file mode 100644
index 0000000..d95fce8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/styles.css
@@ -0,0 +1,230 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+/* You can add global styles to this file, and also import other style files */
+
+body {
+  margin: 3em 1em 0 1em;
+}
+
+.card-header {
+  padding: .6rem .1rem;
+}
+
+.navbar {
+  font-size: 1em;
+  margin-bottom: 0.5em;
+  padding: 0rem 1rem;
+}
+
+.navbar-brand {
+  font-size: 1em;
+}
+
+.table > thead > tr > th, .table > tbody > tr > td {
+  padding: 2px 4px;
+}
+
+body .mdmtree .ui-tree {
+  display: inline-block;
+  width: 100%;
+  height: 100%;
+}
+body .mdmtree .ui-treenode {
+  padding: 0 !important;
+}
+body .mdmtree .ui-treenode .ui-treenode-content {
+  height: 1.5em;
+  outline: none;
+}
+body .mdmtree .ui-treenode .ui-treenode-content .ui-treenode-label {
+  padding: 0 !important;
+}
+body .mdmtree .ui-treenode .ui-treenode-content .ui-treenode-icon {
+  margin: .2em 0; width: 15px;
+}
+body .mdmtree .ui-treenode .ui-treenode-content .ui-tree-toggler {
+  width: 1em;
+  font-size: 1em;
+}
+
+.icon {
+  background-repeat: no-repeat;
+  background-position: left center;
+  padding-left: 18px;
+  height: 1em;
+  margin: 0;
+}
+.environment {
+  background-image: url("assets/famfamfam_icons/database.png");
+}
+.project {
+  background-image: url("assets/famfamfam_icons/house.png");
+}
+.pool {
+  background-image: url("assets/famfamfam_icons/paste_plain.png");
+}
+.test {
+  background-image: url("assets/famfamfam_icons/brick_add.png");
+}
+.teststep {
+  background-image: url("assets/famfamfam_icons/brick.png");
+}
+.measurement {
+  background-image: url("assets/famfamfam_icons/chart_curve.png");
+}
+.channelgroup {
+  background-image: url("assets/famfamfam_icons/calendar.png");
+}
+.channel {
+  background-image: url("assets/famfamfam_icons/chart_curve_go.png");
+}
+.quantity {
+  background-image: url("assets/famfamfam_icons/chart_curve_go.png");
+}
+.unit {
+  background-image: url("assets/famfamfam_icons/chart_curve_go.png");
+}
+
+.ui-datatable .ui-datatable-data > tr > td {
+  padding: .25em .5em !important;
+}
+
+.ui-datatable .ui-datatable-thead > tr > th {
+  padding: .50em .5em !important;
+}
+
+.greyed * {
+  color: #ccc !important;
+  border-color: #e3e3e3 !important;
+}
+
+div .thinheader {
+  margin-top: -5px;
+  margin-bottom: -5px;
+}
+
+.btn-mdm {
+  font-size: 14px;
+  margin: 0 3px;
+  color: #6c757d;
+  background-color: transparent;
+  background-image: none;
+  border-color: #6c757d;
+}
+
+.btn-mdm-no-margin {
+  font-size: 14px;
+  color: #6c757d;
+  background-color: transparent;
+  background-image: none;
+  border-color: #6c757d;
+}
+
+.btn-mdm:hover {
+  color: #fff;
+  background-color: #6c757d;
+  border-color: #6c757d;
+}
+
+label {
+    display: inline-block;
+    max-width: 100%;
+    margin-bottom: 0px;
+    margin-left: 3px;
+    margin-right: 3px;
+    font-weight: bold;
+}
+
+mdm-tableview {
+	width:100%;
+}
+
+.mdm-link-list > li.active > a {
+  background-color: #e7e7e7;
+  color: #333;
+}
+
+.mdm-link-list > li > a:hover {
+  cursor: pointer;
+  color: black;
+}
+
+.mdm-link-list > li > a {
+  cursor: pointer;
+  color: #888;
+}
+
+/**
+  Define style sheets for the MDM detail component viewer
+  All units in EM as they are scalable
+*/
+.mdm-details-attributes .ui-treetable-table thead > tr > th {
+  position: relative;
+}
+.mdm-details-attributes .ui-treetable-table thead > tr > th .inlinebuttons {
+  position: absolute;
+  right: 0.25em;
+  top: 0.25em;
+}
+.mdm-details-attributes .ui-treetable-table thead > tr > th .inlinebuttons button {
+  margin-left: 0.1em;
+}
+.mdm-details-attributes .ui-treetable-table tbody > tr > td {
+  position: relative;
+}
+.mdm-details-attributes .ui-treetable-table tbody > tr > td .inlinecontent {
+  position: absolute;
+  right: 0.25em;
+  top: 0.25em;
+}
+.mdm-details-attributes .ui-treetable-table tbody td {
+  line-height: 1;
+  padding: 0.15em 0.15em !important;
+}
+.mdm-details-attributes .ui-treetable-table tbody .mdm-component-row {
+  background-color: #e3e3e3;
+}
+
+.mainnavigation {
+  display: block;
+  position: relative;
+}
+.mainnavigation #leftsidenav .navbar {
+  margin-bottom: 0.5em !important;
+}
+.mainnavigation .split {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  overflow-y: auto;
+  overflow-x: hidden;
+  height: 100%;
+}
+.mainnavigation .gutter {
+  background-color: #eee;
+  background-repeat: no-repeat;
+  background-position: 50%;
+  margin-left: 2px;
+  width: 8px !important;
+}
+.mainnavigation .gutter.gutter-horizontal {
+  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
+}
+.mainnavigation .split,
+.mainnavigation .gutter.gutter-horizontal {
+  display: inline-block;
+  vertical-align: top;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/test.ts b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/test.ts
new file mode 100644
index 0000000..a3f71d5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/test.ts
@@ -0,0 +1,48 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import 'rxjs/Rx';
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
+declare var __karma__: any;
+declare var require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/tsconfig.app.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/tsconfig.app.json
new file mode 100644
index 0000000..190fd30
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/tsconfig.app.json
@@ -0,0 +1,11 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/app",
+    "types": []
+  },
+  "exclude": [
+    "test.ts",
+    "**/*.spec.ts"
+  ]
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/tsconfig.spec.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/tsconfig.spec.json
new file mode 100644
index 0000000..de77336
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/tsconfig.spec.json
@@ -0,0 +1,18 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/spec",
+    "types": [
+      "jasmine",
+      "node"
+    ]
+  },
+  "files": [
+    "test.ts",
+    "polyfills.ts"
+  ],
+  "include": [
+    "**/*.spec.ts",
+    "**/*.d.ts"
+  ]
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/tsconfig.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/tsconfig.json
new file mode 100644
index 0000000..d8a9675
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/tsconfig.json
@@ -0,0 +1,30 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "baseUrl": "./",
+    "outDir": "./dist/out-tsc",
+    "sourceMap": true,
+    "declaration": false,
+    "module": "es2015",
+    "moduleResolution": "node",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "importHelpers": true,
+    "paths": {
+      "@file-explorer/*": ["src/app/file-explorer/*"],
+      "@core/*": ["src/app/core/*"],
+      "@details/*": ["src/app/details/*"],
+      "@navigator/*": ["src/app/navigator/*"],
+      "@basket/*": ["src/app/basket/*"],
+      "@localization/*": ["src/app/localization/*"]
+    },
+    "target": "es5",
+    "typeRoots": [
+      "node_modules/@types"
+    ],
+    "lib": [
+      "es2018",
+      "dom"
+    ]
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/tslint.json b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/tslint.json
new file mode 100644
index 0000000..086e897
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/tslint.json
@@ -0,0 +1,121 @@
+{
+  "rulesDirectory": [
+    "node_modules/codelyzer"
+  ],
+  "rules": {
+    "callable-types": true,
+    "class-name": true,
+    "comment-format": [
+      true,
+      "check-space"
+    ],
+    "curly": true,
+    "eofline": true,
+    "forin": true,
+    "import-blacklist": [true],
+    "import-spacing": true,
+    "indent": [
+      true,
+      "spaces",
+      2
+    ],
+    "interface-over-type-literal": true,
+    "label-position": true,
+    "max-line-length": [
+      true,
+      140
+    ],
+    "member-access": false,
+    "member-ordering": [
+      true,
+      {
+        "order": [
+          "static-field",
+          "instance-field",
+          "static-method",
+          "instance-method"
+        ]
+      }
+    ],
+    "no-arg": true,
+    "no-bitwise": true,
+    "no-console": [
+      true,
+      "debug",
+      "info",
+      "time",
+      "timeEnd",
+      "trace"
+    ],
+    "no-construct": true,
+    "no-debugger": true,
+    "no-duplicate-variable": true,
+    "no-empty": false,
+    "no-empty-interface": true,
+    "no-eval": true,
+    "no-inferrable-types": true,
+    "no-shadowed-variable": true,
+    "no-string-literal": false,
+    "no-string-throw": true,
+    "no-switch-case-fall-through": true,
+    "no-trailing-whitespace": true,
+    "no-unused-expression": true,
+    "no-use-before-declare": true,
+    "no-var-keyword": true,
+    "object-literal-sort-keys": false,
+    "one-line": [
+      true,
+      "check-open-brace",
+      "check-catch",
+      "check-else",
+      "check-whitespace"
+    ],
+    "prefer-const": false,
+    "quotemark": [
+      true,
+      "single"
+    ],
+    "radix": true,
+    "semicolon": [
+      true,
+      "always"
+    ],
+    "triple-equals": [
+      true,
+      "allow-null-check",
+      "allow-undefined-check"
+    ],
+    "typedef-whitespace": [
+      true,
+      {
+        "call-signature": "nospace",
+        "index-signature": "nospace",
+        "parameter": "nospace",
+        "property-declaration": "nospace",
+        "variable-declaration": "nospace"
+      }
+    ],
+    "unified-signatures": true,
+    "variable-name": false,
+    "whitespace": [
+      true,
+      "check-branch",
+      "check-decl",
+      "check-operator",
+      "check-separator",
+      "check-type"
+    ],
+
+    "directive-selector": [false, "attribute", "app", "camelCase"],
+    "component-selector": [false, "element", "app", "kebab-case"],
+    "use-input-property-decorator": true,
+    "use-output-property-decorator": true,
+    "use-host-property-decorator": true,
+    "no-input-rename": true,
+    "no-output-rename": true,
+    "use-life-cycle-interface": true,
+    "use-pipe-transform-interface": true,
+    "component-class-suffix": true,
+    "directive-class-suffix": true
+  }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webconfig/glassfish-web.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webconfig/glassfish-web.xml
new file mode 100644
index 0000000..764fd88
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webconfig/glassfish-web.xml
@@ -0,0 +1,36 @@
+<!--********************************************************************************

+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************-->
+
+
+<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD
+GlassFish Application Server 3.1 Servlet 3.0//EN"
+"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
+<glassfish-web-app>
+    <context-root>/org.eclipse.mdm.nucleus</context-root>

+
+    <security-role-mapping>
+        <role-name>Admin</role-name>
+        <group-name>Admin</group-name>
+    </security-role-mapping>
+

+    <security-role-mapping>

+        <role-name>DescriptiveDataAuthor</role-name>

+        <group-name>DescriptiveDataAuthor</group-name>

+    </security-role-mapping>

+

+    <security-role-mapping>

+        <role-name>Guest</role-name>

+        <group-name>Guest</group-name>

+    </security-role-mapping>
+</glassfish-web-app>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webconfig/web.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webconfig/web.xml
new file mode 100644
index 0000000..1f9d321
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webconfig/web.xml
@@ -0,0 +1,79 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">
+
+	<security-constraint>
+		<web-resource-collection>
+			<web-resource-name>MDM WEB (protected)</web-resource-name>
+			<url-pattern>/*</url-pattern>
+		</web-resource-collection>
+		<auth-constraint>
+			<role-name>Admin</role-name>
+			<role-name>DescriptiveDataAuthor</role-name>
+			<role-name>Guest</role-name>
+		</auth-constraint>
+	</security-constraint>
+
+
+	<security-constraint>
+		<web-resource-collection>
+			<web-resource-name>MDM WEB (unprotected)</web-resource-name>
+			<url-pattern>/login.css</url-pattern>
+			<url-pattern>/favicon.ico</url-pattern>
+		</web-resource-collection>
+	</security-constraint>
+
+	<filter>
+		<filter-name>MDMRequestFilter</filter-name>
+		<filter-class>org.eclipse.mdm.application.MDMRequestFilter
+		</filter-class>
+		<init-param>
+			<param-name>passThroughPrefixes</param-name>
+			<param-value>/mdm</param-value>
+		</init-param>
+	</filter>
+
+	<filter-mapping>
+		<filter-name>MDMRequestFilter</filter-name>
+		<url-pattern>/*</url-pattern>
+		<dispatcher>REQUEST</dispatcher>
+	</filter-mapping>
+
+	<security-role>
+		<role-name>Admin</role-name>
+	</security-role>
+
+	<security-role>
+		<role-name>User</role-name>
+	</security-role>
+	
+	<security-role>
+		<role-name>Guest</role-name>
+	</security-role>
+
+	<login-config>
+		<auth-method>FORM</auth-method>
+		<realm-name>MDMRealm</realm-name>
+		<form-login-config>
+			<form-login-page>/login.jsp</form-login-page>
+			<form-error-page>/error.jsp</form-error-page>
+		</form-login-config>
+	</login-config>
+
+	<session-config>
+		<session-timeout>20</session-timeout>
+	</session-config>
+
+</web-app>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/build.gradle
new file mode 100644
index 0000000..f4de9e0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/build.gradle
@@ -0,0 +1,69 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+plugins {
+  id "com.google.protobuf" version "0.8.8"
+}
+
+description = 'business object service'
+
+apply plugin: 'antlr'
+
+dependencies {
+	compile project(':org.eclipse.mdm.connector')
+	compile 'com.fasterxml.jackson.core:jackson-databind:2.5.1'
+	compile 'io.vavr:vavr:0.9.1'
+	compile 'org.glassfish.jersey.media:jersey-media-multipart:2.23.2'
+	
+	compile 'com.google.protobuf:protobuf-java:3.2.0'
+	compile 'com.google.protobuf:protobuf-java-util:3.2.0'
+
+	testCompile 'org.assertj:assertj-core:3.6.2'
+	testCompile 'io.rest-assured:rest-assured:3.0.5'
+	testCompile 'org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2:2.23.2'
+	testCompile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.23.2'
+
+	testImplementation "org.eclipse.mdm:org.eclipse.mdm.api.odsadapter:${version}"
+	testImplementation "com.google.code.gson:gson:2.7"
+
+	antlr "org.antlr:antlr4:4.5.3"
+}
+
+generateGrammarSource { arguments += ["-visitor"] }
+
+test {
+	exclude 'org/eclipse/mdm/businessobjects/boundary/integrationtest/*'
+}
+
+compileJava.dependsOn(generateGrammarSource)
+
+jar {
+	metaInf { from '../NOTICE.txt' }
+	metaInf { from '../LICENSE.txt' }
+}
+
+protobuf {
+	protoc {
+		artifact = 'com.google.protobuf:protoc:3.0.0'
+	}
+}
+
+sourceSets {
+	main {
+		java {
+			srcDirs 'build/generated/source/proto/main/java'
+		}
+	}
+}
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/antlr/org/eclipse/mdm/businessobjects/filter/FilterGrammar.g4 b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/antlr/org/eclipse/mdm/businessobjects/filter/FilterGrammar.g4
new file mode 100644
index 0000000..017ef69
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/antlr/org/eclipse/mdm/businessobjects/filter/FilterGrammar.g4
@@ -0,0 +1,159 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+
+
+grammar FilterGrammar;
+
+@header {
+package org.eclipse.mdm.businessobjects.filter;
+}
+
+parse
+ : expression EOF
+ ;
+
+expression
+ : LPAREN expression RPAREN                       #parenExpression
+ | NOT expression                                 #notExpression
+ | left=attribute op=unary_comparator             #unaryComparatorExpression
+ | left=attribute op=comparator right=value       #comparatorExpression
+ | left=attribute op=list_comparator right=values #listComparatorExpression
+ | left=expression op=and right=expression        #andExpression
+ | left=expression op=or right=expression         #orExpression
+ ;
+
+attribute
+ : ATTRIBUTE_IDENTIFIER
+;
+value
+ : STRINGLITERAL 
+ | DECIMAL
+ | LONG
+ | BOOL
+;
+
+values
+ : LPAREN value ( ',' value ) * RPAREN
+;
+
+comparator
+ : EQUAL 
+ | NOT_EQUAL 
+ | LESS_THAN 
+ | LESS_THAN_OR_EQUAL 
+ | GREATER_THAN 
+ | GREATER_THAN_OR_EQUAL 
+ | LIKE
+ | NOT_LIKE
+ | CASE_INSENSITIVE_EQUAL
+ | CASE_INSENSITIVE_NOT_EQUAL
+ | CASE_INSENSITIVE_LESS_THAN
+ | CASE_INSENSITIVE_LESS_THAN_OR_EQUAL
+ | CASE_INSENSITIVE_GREATER_THAN
+ | CASE_INSENSITIVE_GREATER_THAN_OR_EQUAL
+ | CASE_INSENSITIVE_LIKE
+ | CASE_INSENSITIVE_NOT_LIKE
+ ;
+ 
+list_comparator
+ : IN_SET
+ | NOT_IN_SET
+ | CASE_INSENSITIVE_IN_SET
+ | CASE_INSENSITIVE_NOT_IN_SET
+ | BETWEEN
+ ;
+ 
+unary_comparator
+ : IS_NULL
+ | IS_NOT_NULL
+ ;
+  
+and: AND ;
+
+or: OR ;
+
+binary: AND | OR ;
+
+AND                  : A N D ;
+OR                   : O R ;
+NOT                  : N O T ;
+
+EQUAL                                  : E Q ;
+NOT_EQUAL                              : N E ;
+LESS_THAN                              : L T ;
+LESS_THAN_OR_EQUAL                     : L E ;
+GREATER_THAN                           : G T ;
+GREATER_THAN_OR_EQUAL                  : G E ;
+IN_SET                                 : I N ; 
+NOT_IN_SET                             : N O T '_' I N;
+LIKE                                   : L K ;
+NOT_LIKE                               : N O T '_' L K;
+CASE_INSENSITIVE_EQUAL                 : C I '_' E Q;
+CASE_INSENSITIVE_NOT_EQUAL             : C I '_' N E;
+CASE_INSENSITIVE_LESS_THAN             : C I '_' L T;
+CASE_INSENSITIVE_LESS_THAN_OR_EQUAL    : C I '_' L E;
+CASE_INSENSITIVE_GREATER_THAN          : C I '_' G T;
+CASE_INSENSITIVE_GREATER_THAN_OR_EQUAL : C I '_' G E;
+CASE_INSENSITIVE_IN_SET                : C I '_' I N;
+CASE_INSENSITIVE_NOT_IN_SET            : C I '_' N O T '_' I N ;
+CASE_INSENSITIVE_LIKE                  : C I '_' L K;
+CASE_INSENSITIVE_NOT_LIKE              : C I '_' N O T '_' L K ;
+IS_NULL                                : I S '_' N U L L ;
+IS_NOT_NULL                            : I S '_' N O T '_' N U L L;
+BETWEEN                                : B W ;
+
+LPAREN               : '(' ;
+RPAREN               : ')' ;
+DECIMAL              : '-'? DIGIT+ '.' DIGIT+ ;
+LONG                 : '-'? DIGIT+ ;
+BOOL                 : T R U E | F A L S E ;
+IDENTIFIER           : [a-zA-Z_] [a-zA-Z_0-9]* ;
+ATTRIBUTE_IDENTIFIER : IDENTIFIER '.' IDENTIFIER ;
+STRINGLITERAL        : SINGLE_QUOTE ( ~'\'' | ESCAPED_SINGLE_QUOTE )* SINGLE_QUOTE 

+                     | DOUBLE_QUOTE ( ~'\"' | ESCAPED_DOUBLE_QUOTE )* DOUBLE_QUOTE ;

+WS                   : [ \r\t\u000C\n]+ -> skip ;
+
+fragment DIGIT : [0-9] ;
+fragment ESCAPED_SINGLE_QUOTE : '\\\'' ;
+fragment ESCAPED_DOUBLE_QUOTE : '\\\"' ;

+fragment SINGLE_QUOTE         : '\'' ;
+fragment DOUBLE_QUOTE         : '\"' ;

+
+/* case insensitive lexer matching */
+fragment A          : ('a'|'A');
+fragment B          : ('b'|'B');
+fragment C          : ('c'|'C');
+fragment D          : ('d'|'D');
+fragment E          : ('e'|'E');
+fragment F          : ('f'|'F');
+fragment G          : ('g'|'G');
+fragment H          : ('h'|'H');
+fragment I          : ('i'|'I');
+fragment J          : ('j'|'J');
+fragment K          : ('k'|'K');
+fragment L          : ('l'|'L');
+fragment M          : ('m'|'M');
+fragment N          : ('n'|'N');
+fragment O          : ('o'|'O');
+fragment P          : ('p'|'P');
+fragment Q          : ('q'|'Q');
+fragment R          : ('r'|'R');
+fragment S          : ('s'|'S');
+fragment T          : ('t'|'T');
+fragment U          : ('u'|'U');
+fragment V          : ('v'|'V');
+fragment W          : ('w'|'W');
+fragment X          : ('x'|'X');
+fragment Y          : ('y'|'Y');
+fragment Z          : ('z'|'Z');
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
new file mode 100644
index 0000000..6a3063a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
@@ -0,0 +1,221 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_DATATYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link CatalogAttribute} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Catalog")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/catcomps/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_ID
+		+ "}/catattrs")
+public class CatalogAttributeResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link CatalogAttribute}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link CatalogAttribute} to
+	 *                    load
+	 * @param id          id of the {@link CatalogAttribute}
+	 * @return the found {@link CatalogAttribute} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String catCompId,
+			@PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.find(V(sourceName), CatalogAttribute.class, V(id),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(catCompId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link CatalogAttribute}s.
+	 * 
+	 * @param sourceName       name of the source (MDM {@link Environment} name)
+	 * @param contextTypeParam {@link ContextType} of the {@link CatalogAttribute}
+	 *                         to load
+	 * @param filter           filter string to filter the {@link CatalogAttribute}
+	 *                         result
+	 * @return the (filtered) {@link CatalogAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String catCompId,
+			@QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), CatalogComponent.class, V(catCompId),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam))
+				.map(catComp -> List.ofAll(catComp.getCatalogAttributes()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link CatalogAttributeValue}.
+	 * 
+	 * @param sourceName       name of the source (MDM {@link Environment} name)
+	 * @param contextTypeParam {@link ContextType} of the {@link CatalogAttribute}
+	 *                         to load
+	 * @param catCompId        the identifier of the {@link CatalogComponent} to
+	 *                         create an attribute for.
+	 * @param body             the body of the request containing the attributes to
+	 *                         update The {@link CatalogAttribute} to create.
+	 * @return the created {@link CatalogAttribute} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String catCompId,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), CatalogAttribute.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.getEnumerationValueSupplier(
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_DATATYPE)),
+								entityService.find(V(sourceName), CatalogComponent.class, V(catCompId),
+										ServiceUtils.getContextTypeSupplier(contextTypeParam))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link CatalogAttribute} with all parameters set in the given
+	 * JSON body of the request
+	 * 
+	 * @param sourceName       name of the source (MDM {@link Environment} name)
+	 * @param contextTypeParam {@link ContextType} of the {@link CatalogAttribute}
+	 *                         to load
+	 * @param id               the identifier of the {@link CatalogAttribute} to
+	 *                         update.
+	 * @param catCompId        the identifier of the parent
+	 *                         {@link CatalogComponent}.
+	 * @param body             the body of the request containing the attributes to
+	 *                         update
+	 * @return the updated {@link CatalogAttribute}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID2) String id,
+			@PathParam(REQUESTPARAM_ID) String catCompId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), CatalogAttribute.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(catCompId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link CatalogAttribute}.
+	 * 
+	 * @param id The identifier of the {@link CatalogAttribute} to delete.
+	 * @return the deleted {@link CatalogAttribute }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String catCompId,
+			@PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), CatalogAttribute.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(catCompId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link CatalogAttribute} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), CatalogAttribute.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), CatalogAttribute.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogComponentResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogComponentResource.java
new file mode 100644
index 0000000..e166554
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogComponentResource.java
@@ -0,0 +1,195 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link CatalogComponent} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Catalog")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/catcomps/{" + REQUESTPARAM_CONTEXTTYPE + "}")
+public class CatalogComponentResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link CatalogComponent}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link CatalogComponent} to
+	 *                    load
+	 * @param id          id of the {@link CatalogComponent}
+	 * @return the found {@link CatalogComponent} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService
+				.find(V(sourceName), CatalogComponent.class, V(id),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link CatalogComponent}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link CatalogComponent} to
+	 *                    load
+	 * @param filter      filter string to filter the {@link CatalogComponent}
+	 *                    result
+	 * @return the (filtered) {@link CatalogComponent}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @QueryParam("filter") String filter) {
+		return entityService
+				.findAll(V(sourceName), CatalogComponent.class, filter,
+						ServiceUtils.getContextTypeSupplier(contextTypeParam))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link CatalogComponentValue}.
+	 * 
+	 * @param body The {@link CatalogComponent} to create.
+	 * @return the created {@link CatalogComponent} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), CatalogComponent.class,
+						L(ServiceUtils.getContextTypeSupplier(contextTypeParam),
+								requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link CatalogComponent} with all parameters set in the given
+	 * JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link CatalogComponent} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link CatalogComponent}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), CatalogComponent.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link CatalogComponent}.
+	 * 
+	 * @param id The identifier of the {@link CatalogComponent} to delete.
+	 * @return the deleted {@link CatalogComponent }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), CatalogComponent.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link CatalogComponent} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), CatalogComponent.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), CatalogComponent.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogSensorAttributeResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogSensorAttributeResource.java
new file mode 100644
index 0000000..414b80b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogSensorAttributeResource.java
@@ -0,0 +1,214 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_DATATYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID3;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link CatalogAttribute} resource handling REST requests
+ * 
+ * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Catalog")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/catcomps/testequipment/{" + REQUESTPARAM_ID + "}/catsensors/{"
+		+ REQUESTPARAM_ID2 + "}/catsensorattrs")
+public class CatalogSensorAttributeResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link CatalogAttribute}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param sensorId   id of the {@link CatalogSensor}
+	 * @param id         id of the {@link CatalogAttribute}
+	 * @return the found {@link CatalogAttribute} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String sensorId,
+			@PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.find(V(sourceName), CatalogAttribute.class, V(id), V(ContextType.TESTEQUIPMENT),
+						SL(catCompId, sensorId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link CatalogAttribute}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param sensorId   id of the {@link CatalogSensor}
+	 * @param filter     filter string to filter the {@link CatalogAttribute} result
+	 * @return the (filtered) {@link CatalogAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String sensorId,
+			@QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), CatalogSensor.class, V(sensorId), V(ContextType.TESTEQUIPMENT), SL(catCompId))
+				.map(catSensor -> List.ofAll(catSensor.getCatalogAttributes()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link CatalogAttributeValue}.
+	 * 
+	 * @param catCompId id of the {@link CatalogComponent}
+	 * @param sensorId  id of the {@link CatalogSensor}
+	 * @param body      The {@link CatalogAttribute} to create.
+	 * @return the created {@link CatalogAttribute} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String sensorId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), CatalogAttribute.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.getEnumerationValueSupplier(
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_DATATYPE)),
+								entityService.find(V(sourceName), CatalogSensor.class, V(sensorId),
+										V(ContextType.TESTEQUIPMENT), SL(catCompId))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link CatalogAttribute} with all parameters set in the given
+	 * JSON body of the request
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param sensorId   id of the {@link CatalogSensor}
+	 * @param id         the identifier of the {@link CatalogAttribute} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link CatalogAttribute}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String sensorId,
+			@PathParam(REQUESTPARAM_ID3) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), CatalogAttribute.class, V(id), V(ContextType.TESTEQUIPMENT),
+								SL(catCompId, sensorId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link CatalogAttribute}.
+	 * 
+	 * @param catCompId id of the {@link CatalogComponent}
+	 * @param sensorId  id of the {@link CatalogSensor}
+	 * @param id        The identifier of the {@link CatalogAttribute} to delete.
+	 * @return the deleted {@link CatalogAttribute }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String sensorId,
+			@PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), CatalogAttribute.class, V(id), V(ContextType.TESTEQUIPMENT),
+								SL(catCompId, sensorId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link CatalogAttribute} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), CatalogAttribute.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), CatalogAttribute.class, entityService);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogSensorResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogSensorResource.java
new file mode 100644
index 0000000..b1e10f2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogSensorResource.java
@@ -0,0 +1,200 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link CatalogSensor} resource handling REST requests
+ * 
+ * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Catalog")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/catcomps/testequipment/{" + REQUESTPARAM_ID + "}/catsensors")
+public class CatalogSensorResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link CatalogSensor}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param id         id of the {@link CatalogSensor}
+	 * @return the found {@link CatalogSensor} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.find(V(sourceName), CatalogSensor.class, V(id), V(ContextType.TESTEQUIPMENT), SL(catCompId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link CatalogSensor}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param filter     filter string to filter the {@link CatalogSensor} result
+	 * @return the (filtered) {@link CatalogSensor}s as {@link Response}
+	 */
+	// FIXME anehmer on 2017-11-17: returns all CatalogSensors and not only the ones
+	// in the superordinate CatalogComponent
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @QueryParam("filter") String filter) {
+		return entityService.find(V(sourceName), CatalogComponent.class, V(catCompId), V(ContextType.TESTEQUIPMENT))
+				.map(catComp -> List.ofAll(catComp.getCatalogSensors()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link CatalogSensor}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param body       The {@link CatalogSensor} to create.
+	 * @return the created {@link CatalogSensor} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), CatalogSensor.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), CatalogComponent.class, V(catCompId),
+										V(ContextType.TESTEQUIPMENT))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link CatalogSensor} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param id         the identifier of the {@link CatalogSensor} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link CatalogSensor}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), CatalogSensor.class, V(id), V(ContextType.TESTEQUIPMENT),
+								SL(catCompId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link CatalogSensor}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param catCompId  id of the {@link CatalogComponent}
+	 * @param id         The identifier of the {@link CatalogSensor} to delete.
+	 * @return the deleted {@link CatalogSensor }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String catCompId, @PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), CatalogSensor.class, V(id), V(ContextType.TESTEQUIPMENT),
+								SL(catCompId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link CatalogSensor} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), CatalogSensor.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), CatalogSensor.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelGroupResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelGroupResource.java
new file mode 100644
index 0000000..4527875
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelGroupResource.java
@@ -0,0 +1,199 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.vavr.collection.List;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link ChannelGroup} resource
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Tag(name = "ChannelGroup")
+@Path("/environments/{SOURCENAME}/channelgroups")
+public class ChannelGroupResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(ChannelGroupResource.class);
+
+	@EJB
+	private ChannelGroupService channelGroupService;
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * delegates the request to the {@link ChannelGroupService}
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link ChannelGroup} result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getChannelGroups(@PathParam("SOURCENAME") String sourceName, @QueryParam("filter") String filter) {
+
+		try {
+			java.util.List<ChannelGroup> channelGroups = this.channelGroupService.getChannelGroups(sourceName, filter);
+			return ServiceUtils.toResponse(new MDMEntityResponse(ChannelGroup.class, channelGroups), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * returns a {@link ChannelGroup} identified by the given id.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param channelId  id of the {@link ChannelGroup}
+	 * @return the matching {@link ChannelGroup}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{CHANNELGROUP_ID}")
+	public Response getChannelGroup(@PathParam("SOURCENAME") String sourceName,
+			@PathParam("CHANNELGROUP_ID") String channelGroupId) {
+
+		try {
+			ChannelGroup channelGroup = this.channelGroupService.getChannelGroup(sourceName, channelGroupId);
+			return ServiceUtils.toResponse(new MDMEntityResponse(ChannelGroup.class, channelGroup), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link ChannelGroupService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam("SOURCENAME") String sourceName) {
+
+		try {
+			Map<Attribute, String> localizedAttributeMap = this.channelGroupService.localizeAttributes(sourceName);
+			Map<EntityType, String> localizedEntityTypeMap = this.channelGroupService.localizeType(sourceName);
+			return ServiceUtils.toResponse(new I18NResponse(localizedEntityTypeMap, localizedAttributeMap), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * Returns the created {@link ChannelGroup}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link ChannelGroup} to create.
+	 * @return the created {@link ChannelGroup} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+
+		return entityService
+				.create(V(sourceName), ChannelGroup.class,
+						entityService.extractRequestBody(body, sourceName, List.of(Measurement.class)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link ChannelGroup} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link ChannelGroup} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link ChannelGroup}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), ChannelGroup.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link ChannelGroup}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link ChannelGroup} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), ChannelGroup.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelGroupService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelGroupService.java
new file mode 100644
index 0000000..4b0e0b6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelGroupService.java
@@ -0,0 +1,126 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * ChannelGroupService Bean implementation with available {@link ChannelGroup}
+ * operations
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class ChannelGroupService {
+
+	@Inject
+	private ConnectorService connectorService;
+
+	@EJB
+	private I18NActivity I18NActivity;
+	@EJB
+	private NavigationActivity navigationActivity;
+	@EJB
+	private SearchActivity searchActivity;
+
+	/**
+	 * returns the matching {@link ChannelGroup}s using the given filter or all
+	 * {@link ChannelGroup}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the ChannelGroup result
+	 * @return the found {@link ChannelGroup}s
+	 */
+	public List<ChannelGroup> getChannelGroups(String sourceName, String filter) {
+		try {
+
+			ApplicationContext context = this.connectorService.getContextByName(sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			if (filter == null || filter.trim().length() <= 0) {
+				return em.loadAll(ChannelGroup.class);
+			}
+
+			if (ServiceUtils.isParentFilter(context, filter, ChannelGroup.PARENT_TYPE_MEASUREMENT)) {
+				String id = ServiceUtils.extactIdFromParentFilter(context, filter,
+						ChannelGroup.PARENT_TYPE_MEASUREMENT);
+				return this.navigationActivity.getChannelGroups(sourceName, id);
+			}
+
+			return this.searchActivity.search(context, ChannelGroup.class, filter);
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns a {@link ChannelGroup identified by the given id
+	 * 
+	 * @param sourceName     name of the source (MDM {@link Environment} name)
+	 * @param channelGroupId id of the {@link ChannelGroup}
+	 * @return the matching {@link ChannelGroup}
+	 */
+	public ChannelGroup getChannelGroup(String sourceName, String channelGroupId) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.load(ChannelGroup.class, channelGroupId);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns localized {@link ChannelGroup} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link ChannelGroup} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.I18NActivity.localizeAttributes(sourceName, ChannelGroup.class);
+	}
+
+	/**
+	 * returns the localized {@link ChannelGroup} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link ChannelGroup} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.I18NActivity.localizeType(sourceName, ChannelGroup.class);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelResource.java
new file mode 100644
index 0000000..bfb0c9a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelResource.java
@@ -0,0 +1,220 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.vavr.collection.List;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link Channel} resource
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Tag(name = "Channel")
+@Path("/environments/{SOURCENAME}/channels")
+public class ChannelResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(ChannelResource.class);
+
+	@EJB
+	private ChannelService channelService;
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * delegates the request to the {@link ChannelService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Channel} result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find Channels by filter", description = "Get list of users", responses = {
+			@ApiResponse(description = "The user", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getChannels(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam("SOURCENAME") String sourceName,
+			@Parameter(description = "Filter expression", required = false) @QueryParam("filter") String filter) {
+
+		try {
+			java.util.List<Channel> channels = this.channelService.getChannels(sourceName, filter);
+			return ServiceUtils.toResponse(new MDMEntityResponse(Channel.class, channels), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link ChannelService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testId     id of the {@link Test}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{CHANNEL_ID}")
+	@Operation(summary = "Find a Channel by ID", description = "Returns Channels based on ID", responses = {
+			@ApiResponse(description = "The channel", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	public Response getChannel(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam("SOURCENAME") String sourceName,
+			@Parameter(description = "ID of the Channel", required = true) @PathParam("CHANNEL_ID") String channelId) {
+
+		try {
+			Channel channel = this.channelService.getChannel(sourceName, channelId);
+			return ServiceUtils.toResponse(new MDMEntityResponse(Channel.class, channel), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link ChannelService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Channel localizations", description = "Returns Channel localizations", responses = {
+			@ApiResponse(description = "The project localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam("SOURCENAME") String sourceName) {
+
+		try {
+			Map<Attribute, String> localizedAttributeMap = this.channelService.localizeAttributes(sourceName);
+			Map<EntityType, String> localizedEntityTypeMap = this.channelService.localizeType(sourceName);
+			return ServiceUtils.toResponse(new I18NResponse(localizedEntityTypeMap, localizedAttributeMap), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+	
+	/**
+	 * Returns the created {@link Channel}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link Channel} to create.
+	 * @return the created {@link Channel} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+
+		return entityService
+				.create(V(sourceName), Channel.class,
+						entityService.extractRequestBody(body, sourceName, List.of(Measurement.class, Quantity.class)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link Channel} with all parameters set in the given JSON body
+	 * of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link Channel} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link Channel}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), Channel.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link Channel}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link Channel} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), Channel.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelService.java
new file mode 100644
index 0000000..9ad3dcc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ChannelService.java
@@ -0,0 +1,122 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * ChannelService Bean implementation with available {@link Channel} operations
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class ChannelService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private I18NActivity i18nActivity;
+	@EJB
+	private NavigationActivity navigationActivity;
+	@EJB
+	private SearchActivity searchActivity;
+
+	/**
+	 * returns the matching {@link Channel}s using the given filter or all
+	 * {@link Channel}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the Channel result
+	 * @return the found {@link Channel}s
+	 */
+	public List<Channel> getChannels(String sourceName, String filter) {
+		try {
+			ApplicationContext context = this.connectorService.getContextByName(sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			if (filter == null || filter.trim().length() <= 0) {
+				return em.loadAll(Channel.class);
+			}
+
+			if (ServiceUtils.isParentFilter(context, filter, Channel.PARENT_TYPE_CHANNELGROUP)) {
+				String id = ServiceUtils.extactIdFromParentFilter(context, filter, Channel.PARENT_TYPE_CHANNELGROUP);
+				return this.navigationActivity.getChannels(sourceName, id);
+			}
+
+			return this.searchActivity.search(context, Channel.class, filter);
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns a {@link Channel} identified by the given id.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param channelId  id of the {@link Channel}
+	 * @return the matching {@link Channel}
+	 */
+	public Channel getChannel(String sourceName, String channelId) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.load(Channel.class, channelId);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns localized {@link Channel} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Channel} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.i18nActivity.localizeAttributes(sourceName, Channel.class);
+	}
+
+	/**
+	 * returns the localized {@link Channel} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Channel} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.i18nActivity.localizeType(sourceName, Channel.class);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ClassificationResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ClassificationResource.java
new file mode 100644
index 0000000..ed3bc01
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ClassificationResource.java
@@ -0,0 +1,139 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+package org.eclipse.mdm.businessobjects.boundary;

+

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;

+import static org.eclipse.mdm.businessobjects.service.EntityService.V;

+

+import javax.ejb.EJB;

+import javax.ws.rs.Consumes;

+import javax.ws.rs.GET;

+import javax.ws.rs.POST;

+import javax.ws.rs.Path;

+import javax.ws.rs.PathParam;

+import javax.ws.rs.Produces;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.Response;

+import javax.ws.rs.core.Response.Status;

+

+import org.eclipse.mdm.api.base.model.TestStep;

+import org.eclipse.mdm.api.dflt.model.Classification;

+import org.eclipse.mdm.api.dflt.model.Domain;

+import org.eclipse.mdm.api.dflt.model.ProjectDomain;

+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;

+import org.eclipse.mdm.businessobjects.service.EntityService;

+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;

+

+import io.swagger.v3.oas.annotations.Operation;

+import io.swagger.v3.oas.annotations.Parameter;

+import io.swagger.v3.oas.annotations.media.Content;

+import io.swagger.v3.oas.annotations.media.Schema;

+import io.swagger.v3.oas.annotations.responses.ApiResponse;

+import io.swagger.v3.oas.annotations.tags.Tag;

+import io.vavr.Value;

+import io.vavr.collection.List;

+import io.vavr.collection.Seq;

+

+/**

+ * @author Alexander Knoblauch

+ *

+ */

+@Tag(name = "Status")

+@Produces(MediaType.APPLICATION_JSON)

+@Consumes(MediaType.APPLICATION_JSON)

+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/classifications")

+public class ClassificationResource {

+

+	@EJB

+	private EntityService entityService;

+

+	@EJB

+	private ClassificationService classificationService;

+

+	@Parameter(description = "Name of the MDM datasource", required = true)

+	@PathParam(REQUESTPARAM_SOURCENAME)

+	private String sourceName;

+

+	/**

+	 * delegates the request to the {@link EntityService}

+	 * 

+	 * @param id id of the {@link Classification}

+	 * @return the result of the delegated request as {@link Response}

+	 */

+	@GET

+	@Operation(summary = "Find a Classification by ID", responses = {

+			@ApiResponse(description = "The Classification", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),

+			@ApiResponse(responseCode = "500", description = "Error") })

+	@Path("/{" + REQUESTPARAM_ID + "}")

+	public Response findClassification(

+			@Parameter(description = "ID of the Classification", required = true) @PathParam(REQUESTPARAM_ID) String id) {

+		return entityService.find(V(sourceName), Classification.class, V(id))

+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)

+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	/**

+	 * Returns the created/existing {@link Classification}.

+	 * 

+	 * @param body The {@link Classification} to create.

+	 * @return the created {@link TestStep} as {@link Response}.

+	 */

+	@POST

+	@Operation(summary = "Create a new Classification or return a existing Classification which references the same Status, ProjectDomain and Domain.", responses = {

+			@ApiResponse(description = "The created Classification", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),

+			@ApiResponse(responseCode = "500", description = "Error") })

+	public Response createOrFind(String body) {

+

+		Seq<Value<?>> extractRequestBody = entityService.extractRequestBody(body, sourceName, io.vavr.collection.List

+				.of(org.eclipse.mdm.api.dflt.model.Status.class, ProjectDomain.class, Domain.class));

+

+		java.util.List<Value<?>> asJavaMutable = extractRequestBody.asJavaMutable();

+

+		org.eclipse.mdm.api.dflt.model.Status status = null;

+		ProjectDomain projectDomain = null;

+		Domain domain = null;

+

+		for (Value<?> v : asJavaMutable) {

+			if (v.get() instanceof org.eclipse.mdm.api.dflt.model.Status) {

+				status = (org.eclipse.mdm.api.dflt.model.Status) v.get();

+			} else if (v.get() instanceof ProjectDomain) {

+				projectDomain = (ProjectDomain) v.get();

+			} else if (v.get() instanceof Domain) {

+				domain = (Domain) v.get();

+			}

+		}

+

+		Classification classification = classificationService.getClassification(sourceName, status, projectDomain,

+				domain);

+

+		Response response = null;

+

+		if (classification == null) {

+			response = entityService

+					.create(V(sourceName), Classification.class,

+							entityService.extractRequestBody(body, sourceName,

+									List.of(Domain.class, ProjectDomain.class,

+											org.eclipse.mdm.api.dflt.model.Status.class)))

+					.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))

+					.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+		} else {

+			response = ServiceUtils.buildEntityResponse(classification, Status.OK);

+		}

+

+		return response;

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ClassificationService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ClassificationService.java
new file mode 100644
index 0000000..b26cd3c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ClassificationService.java
@@ -0,0 +1,79 @@
+/*******************************************************************************

+ * Copyright (c) 2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+

+package org.eclipse.mdm.businessobjects.boundary;

+

+import java.util.Optional;

+import java.util.stream.Collectors;

+

+import javax.ejb.Stateless;

+import javax.inject.Inject;

+

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

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

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

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

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

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

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

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

+import org.eclipse.mdm.api.dflt.EntityManager;

+import org.eclipse.mdm.api.dflt.model.Classification;

+import org.eclipse.mdm.api.dflt.model.Domain;

+import org.eclipse.mdm.api.dflt.model.ProjectDomain;

+import org.eclipse.mdm.api.dflt.model.Status;

+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;

+import org.eclipse.mdm.connector.boundary.ConnectorService;

+

+/**

+ * @author akn

+ *

+ */

+@Stateless

+public class ClassificationService {

+

+	@Inject

+	private ConnectorService connectorService;

+

+	public Classification getClassification(String sourceName, Status status, ProjectDomain projectDomain,

+			Domain domain) {

+		Optional<QueryService> queryService = connectorService.getContextByName(sourceName).getQueryService();

+		Optional<ModelManager> modelManager = connectorService.getContextByName(sourceName).getModelManager();

+

+		EntityType entityType = modelManager.get().getEntityType(Classification.class);

+		Condition c1 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("ProjectDomain"),

+				projectDomain.getID());

+		Condition c2 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("Domain"),

+				domain.getID());

+		Condition c3 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("Status"),

+				status.getID());

+

+		java.util.List<Result> fetch = queryService.get().createQuery().selectID(entityType)

+				.fetch(Filter.and().addAll(c1, c2, c3));

+

+		java.util.List<String> collect = fetch.stream().map(r -> r.getRecord(entityType)).map(Record::getID)

+				.collect(Collectors.toList());

+

+		EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()

+				.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));

+

+		Classification classification = null;

+		if (!collect.isEmpty()) {

+

+			classification = em.load(Classification.class, collect.get(0));

+		}

+

+		return classification;

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ContextFilesSubresource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ContextFilesSubresource.java
new file mode 100644
index 0000000..c38dd3a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ContextFilesSubresource.java
@@ -0,0 +1,191 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+package org.eclipse.mdm.businessobjects.boundary;

+

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ATTRIBUTENAME;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTCOMPONENTNAME;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_REMOTEPATH;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;

+import static org.eclipse.mdm.businessobjects.service.EntityService.V;

+

+import java.io.InputStream;

+

+import javax.ejb.EJB;

+import javax.ws.rs.Consumes;

+import javax.ws.rs.DELETE;

+import javax.ws.rs.GET;

+import javax.ws.rs.POST;

+import javax.ws.rs.Path;

+import javax.ws.rs.PathParam;

+import javax.ws.rs.Produces;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.Response;

+import javax.ws.rs.core.Response.Status;

+

+import org.eclipse.mdm.api.base.model.ContextDescribable;

+import org.eclipse.mdm.api.base.model.ContextType;

+import org.eclipse.mdm.api.base.model.Environment;

+import org.eclipse.mdm.api.base.model.FileLink;

+import org.eclipse.mdm.api.base.model.MimeType;

+import org.eclipse.mdm.api.base.model.TestStep;

+import org.eclipse.mdm.businessobjects.control.FileLinkActivity;

+import org.eclipse.mdm.businessobjects.entity.FileSize;

+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;

+import org.eclipse.mdm.businessobjects.entity.MDMFileLink;

+import org.eclipse.mdm.businessobjects.service.EntityService;

+import org.eclipse.mdm.businessobjects.utils.Serializer;

+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;

+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;

+import org.glassfish.jersey.media.multipart.FormDataParam;

+

+import io.swagger.v3.oas.annotations.Operation;

+import io.swagger.v3.oas.annotations.Parameter;

+import io.swagger.v3.oas.annotations.media.Content;

+import io.swagger.v3.oas.annotations.media.Schema;

+import io.swagger.v3.oas.annotations.responses.ApiResponse;

+import io.vavr.Tuple;

+

+/**

+ * context files subresource

+ * 

+ * @author Johannes Stamm, peak-Solution GmbH

+ *

+ */

+public class ContextFilesSubresource {

+

+	@EJB

+	private FileLinkActivity fileLinkActivity;

+

+	@EJB

+	private EntityService entityService;

+

+	private Class<? extends ContextDescribable> contextDescribableClass;

+

+	/**

+	 * Set the Entity class of the parent resource. This method has to be called

+	 * right after the resource was initialized by the container. The entity class

+	 * is used to distinguish the type of the parent resource.

+	 * 

+	 * This method is package-private to workaround an issue in WELD complaining

+	 * about: Parameter 1 of type ... is not resolvable to a concrete type.

+	 * 

+	 * @param contextDescribableClass the Entity class of the parent resource

+	 */

+	void setEntityClass(Class<? extends ContextDescribable> contextDescribableClass) {

+		this.contextDescribableClass = contextDescribableClass;

+	}

+

+	/**

+	 * Creates new {@link FileLink} for {@link TestStep}.

+	 * 

+	 * @param sourceName name of the source (MDM {@link Environment} name)

+	 * @param body       The {@link FileLink} to create.

+	 * @return

+	 */

+	@POST

+	@Operation(summary = "Creates a new file on a context attribute.", responses = {

+			@ApiResponse(description = "The stored file link.", content = @Content(schema = @Schema(implementation = MDMFileLink.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	@Produces(MediaType.APPLICATION_JSON)

+	@Consumes(MediaType.MULTIPART_FORM_DATA)

+	public Response createFile(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the parent ContextDescribable", required = true) @PathParam(REQUESTPARAM_ID) String contextDescribableId,

+			@Parameter(description = "ContextType of the Component holding the attribute with the FileLink", required = true) @PathParam(REQUESTPARAM_CONTEXTTYPE) ContextType contextType,

+			@Parameter(description = "Name of the ContextComponent holding the attribute with the FileLink", required = true) @PathParam(REQUESTPARAM_CONTEXTCOMPONENTNAME) String contextComponentName,

+			@Parameter(description = "Name of the Attribute holding the FileLink", required = true) @PathParam(REQUESTPARAM_ATTRIBUTENAME) String attributeName,

+			@Parameter(description = "InputStream containing file data", required = true) @FormDataParam("file") InputStream fileInputStream,

+			@Parameter(description = "Meta data describing file", required = true) @FormDataParam("file") FormDataContentDisposition cdh,

+			@Parameter(description = "File description", required = true) @FormDataParam("description") String description,

+			@Parameter(description = "Mimetype of the file", required = true) @FormDataParam("mimeType") MimeType mimeType) {

+

+		return entityService.find(V(sourceName), contextDescribableClass, V(contextDescribableId))

+				.map(contextDescribable -> fileLinkActivity.createFile(sourceName, contextDescribable,

+						cdh.getFileName(), fileInputStream, description, mimeType, contextType, contextComponentName,

+						attributeName))

+				.map(fileLink -> ServiceUtils.toResponse(Serializer.serializeFileLink(fileLink), Status.OK))

+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	@GET

+	@Operation(summary = "Stream the contents of a file link", responses = {

+			@ApiResponse(description = "The content of the file link as a stream. MimeType is set to that of the file link.", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),

+			@ApiResponse(responseCode = "400", description = "Invalid ID or remote path supplied") })

+	@Path("/{" + REQUESTPARAM_REMOTEPATH + "}")

+	public Response streamFileLink(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the parent ContextDescribable", required = true) @PathParam(REQUESTPARAM_ID) String contextDescribableId,

+			@Parameter(description = "ContextType of the Component holding the attribute with the FileLink", required = true) @PathParam(REQUESTPARAM_CONTEXTTYPE) ContextType contextType,

+			@Parameter(description = "Name of the ContextComponent holding the attribute with the FileLink", required = true) @PathParam(REQUESTPARAM_CONTEXTCOMPONENTNAME) String contextComponentName,

+			@Parameter(description = "Name of the Attribute holding the FileLink", required = true) @PathParam(REQUESTPARAM_ATTRIBUTENAME) String attributeName,

+			@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam(REQUESTPARAM_REMOTEPATH) String remotePath) {

+		return entityService.find(V(sourceName), contextDescribableClass, V(contextDescribableId))

+				.map(contextDescribable -> Tuple.of(contextDescribable,

+						fileLinkActivity.findFileLinkInContext(remotePath, sourceName, contextDescribable, contextType,

+								contextComponentName, attributeName)))

+				.map(tuple -> Tuple.of(fileLinkActivity.toStreamingOutput(sourceName, tuple._1, tuple._2),

+						tuple._2.getMimeType().toString()))

+				.map(tuple -> Response.ok(tuple._1, tuple._2).build()).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)

+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	@GET

+	@Operation(summary = "Returns the size of a file in bytes.", responses = {

+			@ApiResponse(description = "The file size of the requested remote path.", content = @Content(schema = @Schema(implementation = FileSize.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	@Produces(MediaType.APPLICATION_JSON)

+	@Path("/size/{" + REQUESTPARAM_REMOTEPATH + "}")

+	public Response loadFileSize(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the parent ContextDescribable", required = true) @PathParam(REQUESTPARAM_ID) String contextDescribableId,

+			@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam(REQUESTPARAM_REMOTEPATH) String remotePath) {

+

+		return entityService.find(V(sourceName), contextDescribableClass, V(contextDescribableId))

+				.map(contextDescribabale -> fileLinkActivity.loadFileSize(sourceName, contextDescribabale,

+						FileLink.newRemote(remotePath, null, null)))

+				.map(fileSize -> Response.ok(fileSize).build()).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)

+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	/**

+	 * Deletes attached file from {@link ContextDescirbable}.

+	 * 

+	 * @param sourceName name of the source (MDM {@link Environment} name)

+	 * @param id         The identifier of the {@link ContextDescirbable} which

+	 *                   contains the {@link FileLink}

+	 * @param remotePath The remote path of the {@link FileLink} to delete.

+	 * @return

+	 */

+	@DELETE

+	@Operation(summary = "Deletes an attached file from a context attribute.", responses = {

+			@ApiResponse(description = "The deleted file link", content = @Content(schema = @Schema(implementation = MDMFileLink.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	@Produces(MediaType.APPLICATION_JSON)

+	@Path("/{" + REQUESTPARAM_REMOTEPATH + "}")

+	public Response deleteFile(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the parent ContextDescribable", required = true) @PathParam(REQUESTPARAM_ID) String contextDescribableId,

+			@Parameter(description = "ContextType of the Component holding the attribute with the FileLink", required = true) @PathParam(REQUESTPARAM_CONTEXTTYPE) ContextType contextType,

+			@Parameter(description = "Name of the ContextComponent holding the attribute with the FileLink", required = true) @PathParam(REQUESTPARAM_CONTEXTCOMPONENTNAME) String contextComponentName,

+			@Parameter(description = "Name of the Attribute holding the FileLink", required = true) @PathParam(REQUESTPARAM_ATTRIBUTENAME) String attributeName,

+			@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam(REQUESTPARAM_REMOTEPATH) String remotePath) {

+

+		return entityService.find(V(sourceName), contextDescribableClass, V(contextDescribableId))

+				.map(contextDescribable -> fileLinkActivity.deleteFileLink(sourceName, contextDescribable, contextType,

+						contextComponentName, attributeName, remotePath))

+				.map(fileLink -> ServiceUtils.toResponse(Serializer.serializeFileLink(fileLink), Status.OK))

+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/EnvironmentResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/EnvironmentResource.java
new file mode 100644
index 0000000..370e7b1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/EnvironmentResource.java
@@ -0,0 +1,193 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.control.Try;
+
+/**
+ * {@link Environment} resource
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Tag(name = "Environment")
+@Path("/environments")
+public class EnvironmentResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(EnvironmentResource.class);
+
+	@EJB
+	private EnvironmentService environmentService;
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * delegates the request to the {@link EnvironmentService}
+	 *
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Environments", description = "Returns a list of the Environments", responses = {
+			@ApiResponse(description = "The environments", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getEnvironments() {
+		try {
+			List<Environment> environments = this.environmentService.getEnvironments();
+			return ServiceUtils.toResponse(new MDMEntityResponse(Environment.class, environments), Status.OK);
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link EnvironmentService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get an Environment by name", description = "Returns Environment ", responses = {
+			@ApiResponse(description = "The project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_SOURCENAME + "}")
+	public Response getEnvironment(
+			@Parameter(description = "Name of the MDM environment", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		try {
+			Environment environment = this.environmentService.getEnvironment(sourceName);
+			return ServiceUtils.toResponse(new MDMEntityResponse(Environment.class, environment), Status.OK);
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * Updates the {@link Environment} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link Environment}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing Environment", description = "Updates the Environment with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The Environment", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_SOURCENAME + "}")
+	public Response update(
+			@Parameter(description = "Name of the MDM environment", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, 
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), Try.of(() -> this.environmentService.getEnvironment(sourceName)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link EnvironmentService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Environment localizations", description = "Returns Environment localizations", responses = {
+			@ApiResponse(description = "The Environment localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_SOURCENAME + "}/localizations")
+	public Response localize(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, 
+			@Parameter(description = "Get all localized attributes?", required = true) @QueryParam("all") boolean all) {
+
+		try {
+
+			if (all) {
+				Map<Attribute, String> localizedAttributeMap = this.environmentService
+						.localizeAllAttributes(sourceName);
+				Map<EntityType, String> localizedEntityTypeMap = this.environmentService.localizeAllTypes(sourceName);
+				return ServiceUtils.toResponse(new I18NResponse(localizedEntityTypeMap, localizedAttributeMap),
+						Status.OK);
+			}
+
+			Map<Attribute, String> localizedAttributeMap = this.environmentService.localizeAttributes(sourceName);
+			Map<EntityType, String> localizedEntityTypeMap = this.environmentService.localizeType(sourceName);
+			return ServiceUtils.toResponse(new I18NResponse(localizedEntityTypeMap, localizedAttributeMap), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	@GET
+	@Operation(summary = "Execute a search query", description = "Returns a list of entities matching the search query.", responses = {
+			@ApiResponse(description = "The Environment localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_SOURCENAME + "}/search")
+	public Response search(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, 
+			@Parameter(description = "Query string", required = true) @QueryParam("q") String query) {
+		List<Entity> searchResults = environmentService.search(sourceName, query);
+		return ServiceUtils.toResponse(new MDMEntityResponse(Environment.class, searchResults), Status.OK);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/EnvironmentService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/EnvironmentService.java
new file mode 100644
index 0000000..42d9538
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/EnvironmentService.java
@@ -0,0 +1,133 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * {@link Environment} Bean implementation with available {@link Environment}
+ * operations
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class EnvironmentService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private I18NActivity i18nActivity;
+	@EJB
+	private SearchActivity searchActivity;
+
+	/**
+	 * returns all {@link Environment}s of the connected {@link EntityManager}s
+	 * 
+	 * @return the connected {@link Environment}s
+	 */
+	public List<Environment> getEnvironments() {
+		try {
+			return this.connectorService.getContexts().stream().map(ApplicationContext::getEntityManager)
+					.filter(Optional::isPresent).map(Optional::get).map(em -> em.loadEnvironment())
+					.collect(Collectors.toList());
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+
+	}
+
+	/**
+	 * returns the {@link Environment} identified by the given name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link Environment} with the given name
+	 */
+	public Environment getEnvironment(String sourceName) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.loadEnvironment();
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns localized {@link Environment} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Environment} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.i18nActivity.localizeAttributes(sourceName, Environment.class);
+	}
+
+	/**
+	 * returns the localized {@link Environment} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Environment} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.i18nActivity.localizeType(sourceName, Environment.class);
+	}
+
+	/**
+	 * returns all localized attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized attributes from the given source
+	 */
+	public Map<Attribute, String> localizeAllAttributes(String sourceName) {
+		return this.i18nActivity.localizeAllAttributes(sourceName);
+	}
+
+	/**
+	 * returns all localized types
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized types from the given source
+	 */
+	public Map<EntityType, String> localizeAllTypes(String sourceName) {
+		return this.i18nActivity.localizeAllTypes(sourceName);
+	}
+
+	public List<Entity> search(String sourceName, String query) {
+		ApplicationContext context = this.connectorService.getContextByName(sourceName);
+
+		return this.searchActivity.search(context, query);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ExtSystemResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ExtSystemResource.java
new file mode 100644
index 0000000..09f518f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ExtSystemResource.java
@@ -0,0 +1,359 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+import io.vavr.control.Try;
+import org.eclipse.mdm.api.base.model.*;
+import org.eclipse.mdm.api.dflt.model.ExtSystem;
+import org.eclipse.mdm.api.dflt.model.ExtSystemAttribute;
+import org.eclipse.mdm.api.dflt.model.MDMAttribute;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.control.FileLinkActivity;
+import org.eclipse.mdm.businessobjects.entity.*;
+import org.eclipse.mdm.businessobjects.service.ContextService;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import javax.ejb.EJB;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+/**
+ * {@link MDMEntity} REST interface for external systems
+ * 
+ * @author Juergen Kleck, Peak Solution GmbH
+ *
+ */
+@Tag(name = "ExtSystem")
+@Path("/administration/{" + REQUESTPARAM_SOURCENAME + "}/externalsystems")
+public class ExtSystemResource {
+
+	@EJB
+	private ExtSystemService extSystemService;
+
+	@EJB
+	private EntityService entityService;
+
+	@EJB
+	private ContextService contextService;
+
+	@EJB
+	private FileLinkActivity fileLinkActivity;
+
+
+	/**
+	 * delegates the request to the {@link ExtSystemService}
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the ExtSystem result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find ExtSystems by filter", description = "Get list of ExtSystems", responses = {
+			@ApiResponse(description = "The ExtSystems", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getExtSystems(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try.of(() -> extSystemService.getExtSystems(sourceName)).map(List::ofAll).map(e -> ServiceUtils.buildEntityResponse(e, Status.OK, ExtSystem.class))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link ExtSystemService}
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the ExtSystem result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find ExtSystems by filter", description = "Get list of ExtSystems", responses = {
+			@ApiResponse(description = "The ExtSystems", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/attributes/{" + REQUESTPARAM_ID + "}")
+	public Response getExtSystemAttributes(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+
+		java.util.List all = new java.util.ArrayList<>();
+		java.util.List extSystems = extSystemService.getExtSystemAttributes(sourceName, id);
+		// the ext. system attributes
+		all.addAll(extSystems);
+		// the mdm attributes
+		extSystems.stream().forEach(e -> all.addAll(((ExtSystemAttribute) e).getAttributes()));
+
+		return ServiceUtils.buildEntityResponse(List.ofAll(all), Status.OK, ExtSystemAttribute.class);
+	}
+
+	/**
+	 * delegates the request to the {@link ExtSystemService}
+	 *
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param id id of the {@link MDMEntity}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find a ExtSystem by ID", description = "Returns ExtSystem based on ID", responses = {
+			@ApiResponse(description = "The Project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response findExtSystem(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), ExtSystem.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link MDMEntity}.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link MDMEntity} to create.
+	 * @return the created {@link MDMEntity} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new ExtSystem",  responses = {
+			@ApiResponse(description = "The created ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response createExtSystem(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+
+		return entityService
+				.create(V(sourceName), ExtSystem.class,
+						entityService.extractRequestBody(body, sourceName, List.of(ExtSystem.class)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link MDMEntity}.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link MDMEntity} to create.
+	 * @return the created {@link MDMEntity} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new ExtSystem",  responses = {
+			@ApiResponse(description = "The created ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/attribute")
+	public Response createExtSystemAttribute(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+
+		return entityService
+				.create(V(sourceName), ExtSystemAttribute.class,
+						entityService.extractRequestBody(body, sourceName, List.of(ExtSystem.class, ExtSystemAttribute.class)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link MDMEntity}.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link MDMEntity} to create.
+	 * @return the created {@link MDMEntity} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new ExtSystem",  responses = {
+			@ApiResponse(description = "The created ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/mdmattribute")
+	public Response createMDMAttribute(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+
+		return entityService
+				.create(V(sourceName), MDMAttribute.class,
+						entityService.extractRequestBody(body, sourceName, List.of(ExtSystemAttribute.class, MDMAttribute.class)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link MDMEntity} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MDMEntity} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link MDMEntity}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing ExtSystem", description = "Updates the ExtSystem with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response updateExtSystem(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, 
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), ExtSystem.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link MDMEntity} with all parameters set in the given JSON
+	 * body of the request.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MDMEntity} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link MDMEntity}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing ExtSystem", description = "Updates the ExtSystem with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/attribute/{" + REQUESTPARAM_ID + "}")
+	public Response updateExtSystemAttribute(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), ExtSystemAttribute.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link MDMEntity} with all parameters set in the given JSON
+	 * body of the request.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MDMEntity} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link MDMEntity}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing ExtSystem", description = "Updates the ExtSystem with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/mdmattribute/{" + REQUESTPARAM_ID + "}")
+	public Response updateMDMAttribute(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), MDMAttribute.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link MDMEntity}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link MDMEntity} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing ExtSystem", responses = {
+			@ApiResponse(description = "The deleted ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response deleteExtSystem(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), ExtSystem.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link MDMEntity}.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link MDMEntity} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing ExtSystem", responses = {
+			@ApiResponse(description = "The deleted ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/attribute/{" + REQUESTPARAM_ID + "}")
+	public Response deleteExtSystemAttribute(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), ExtSystemAttribute.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link MDMEntity}.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link MDMEntity} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing ExtSystem", responses = {
+			@ApiResponse(description = "The deleted ExtSystem", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/mdmattribute/{" + REQUESTPARAM_ID + "}")
+	public Response deleteMDMAttribute(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the ExtSystem", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), MDMAttribute.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ExtSystemService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ExtSystemService.java
new file mode 100644
index 0000000..9049ac9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ExtSystemService.java
@@ -0,0 +1,105 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import org.eclipse.mdm.api.base.model.*;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.ExtSystem;
+import org.eclipse.mdm.api.dflt.model.ExtSystemAttribute;
+import org.eclipse.mdm.businessobjects.control.*;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import java.util.*;
+
+/**
+ * ExtSystemService Bean implementation with available
+ * operations
+ * 
+ * @author Juergen Kleck, Peak Solution GmbH
+ *
+ */
+@Stateless
+public class ExtSystemService {
+
+	@Inject
+	private ConnectorService connectorService;
+
+	/**
+	 * returns the matching {@link ExtSystem}s using the given filter or all
+	 * {@link ExtSystem}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the found {@link ExtSystem}s
+	 */
+	public List<ExtSystem> getExtSystems(String sourceName) {
+		List<ExtSystem> list = new ArrayList<>();
+		try {
+			Optional<List<ExtSystem>> values = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.map(em -> em.loadAll(ExtSystem.class));
+
+			if(values.isPresent()) {
+				list = values.get();
+			}
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+		return list;
+	}
+
+	/**
+	 * returns a {@link ExtSystem} identified by the given id.
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param extSystemId id of the {@link ExtSystem}
+	 * @return the matching {@link ExtSystem}
+	 */
+	public ExtSystem getExtSystem(String sourceName, String extSystemId) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.load(ExtSystem.class, extSystemId);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns the matching {@link ExtSystemAttribute}s using the given filter or all
+	 * {@link ExtSystemAttribute}s if no filter is available
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the id of the external system
+	 * @return the found {@link ExtSystemAttribute}s
+	 */
+	public List<ExtSystemAttribute> getExtSystemAttributes(String sourceName, String id) {
+		List<ExtSystemAttribute> list = new ArrayList<>();
+		try {
+
+			Optional<List<ExtSystemAttribute>> values = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.map(em -> em.loadChildren(em.load(ExtSystem.class, id), ExtSystemAttribute.class));
+
+			if(values.isPresent()) {
+				list = values.get();
+			}
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+		return list;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/FilesAttachableSubresource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/FilesAttachableSubresource.java
new file mode 100644
index 0000000..5049624
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/FilesAttachableSubresource.java
@@ -0,0 +1,225 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+package org.eclipse.mdm.businessobjects.boundary;

+

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_REMOTEPATH;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;

+import static org.eclipse.mdm.businessobjects.service.EntityService.V;

+

+import java.io.InputStream;

+

+import javax.ejb.EJB;

+import javax.ws.rs.Consumes;

+import javax.ws.rs.DELETE;

+import javax.ws.rs.GET;

+import javax.ws.rs.POST;

+import javax.ws.rs.Path;

+import javax.ws.rs.PathParam;

+import javax.ws.rs.Produces;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.Response;

+import javax.ws.rs.core.Response.Status;

+

+import org.eclipse.mdm.api.base.model.Environment;

+import org.eclipse.mdm.api.base.model.FileLink;

+import org.eclipse.mdm.api.base.model.FilesAttachable;

+import org.eclipse.mdm.api.base.model.MimeType;

+import org.eclipse.mdm.businessobjects.control.FileLinkActivity;

+import org.eclipse.mdm.businessobjects.entity.FileSize;

+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;

+import org.eclipse.mdm.businessobjects.entity.MDMFileLink;

+import org.eclipse.mdm.businessobjects.service.EntityService;

+import org.eclipse.mdm.businessobjects.utils.Serializer;

+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;

+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;

+import org.glassfish.jersey.media.multipart.FormDataParam;

+

+import io.swagger.v3.oas.annotations.Operation;

+import io.swagger.v3.oas.annotations.Parameter;

+import io.swagger.v3.oas.annotations.media.ArraySchema;

+import io.swagger.v3.oas.annotations.media.Content;

+import io.swagger.v3.oas.annotations.media.Schema;

+import io.swagger.v3.oas.annotations.responses.ApiResponse;

+import io.vavr.Tuple;

+

+/**

+ * Subresource for {@link FilesAttachable}s.

+ * 

+ * @author Johannes Stamm, peak-Solution GmbH

+ *

+ */

+public class FilesAttachableSubresource {

+

+	@EJB

+	private EntityService entityService;

+

+	@EJB

+	private FileLinkActivity fileLinkActivity;

+

+	private Class<? extends FilesAttachable> fileAttachableClass;

+

+	/**

+	 * Set the Entity class of the parent resource. This method has to be called

+	 * right after the resource was initialized by the container. The entity class

+	 * is used to distinguish the type of the parent resource.

+	 * 

+	 * This method is package-private to workaround an issue in WELD complaining

+	 * about: Parameter 1 of type ... is not resolvable to a concrete type.

+	 * 

+	 * @param fileAttachableClass the Entity class of the parent resource

+	 */

+	void setEntityClass(Class<? extends FilesAttachable> fileAttachableClass) {

+		this.fileAttachableClass = fileAttachableClass;

+	}

+

+	/**

+	 * Stream the contents of a file link.

+	 * 

+	 * @param sourceName name of the source (MDM {@link Environment} name)

+	 * @param id         The identifier of the {@link FilesAttachable} which

+	 *                   contains the {@link FileLink}

+	 * @param remotePath The remote path of the {@link FileLink} to identify, which

+	 *                   {@link FileLink}'s content is requests.

+	 * @return The content of the file as {@link javax.ws.rs.core.StreamingOutput}.

+	 *         The response also has the MimeType set according to

+	 *         {@link FileLink#getMimeType()}.

+	 */

+	@GET

+	@Operation(summary = "Stream the contents of a file link", responses = {

+			@ApiResponse(description = "The content of the file link as a stream. MimeType is set to that of the file link.", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),

+			@ApiResponse(responseCode = "400", description = "Invalid ID or remote path supplied") })

+	@Path("/{" + REQUESTPARAM_REMOTEPATH + "}")

+	public Response streamFileLink(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the Test containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,

+			@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam(REQUESTPARAM_REMOTEPATH) String remotePath) {

+

+		return entityService.find(V(sourceName), fileAttachableClass, V(id))

+				.map(filesAttachable -> Tuple.of(filesAttachable,

+						fileLinkActivity.findFileLinkAtFileAttachable(remotePath, filesAttachable)))

+				.map(tuple -> Tuple.of(fileLinkActivity.toStreamingOutput(sourceName, tuple._1, tuple._2),

+						tuple._2.getMimeType().toString()))

+				.map(tuple -> Response.ok(tuple._1, tuple._2).build()).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)

+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	/**

+	 * Deletes attached file from {@link FilesAttachable}.

+	 * 

+	 * @param sourceName name of the source (MDM {@link Environment} name)

+	 * @param id         The identifier of the {@link FilesAttachable} which

+	 *                   contains the {@link FileLink}

+	 * @param remotePath The remote path of the {@link FileLink} to delete.

+	 * @return

+	 */

+	@DELETE

+	@Operation(summary = "Deletes an attached file.", responses = {

+			@ApiResponse(description = "The deleted file link", content = @Content(schema = @Schema(implementation = MDMFileLink.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	@Produces(MediaType.APPLICATION_JSON)

+	@Path("/{" + REQUESTPARAM_REMOTEPATH + "}")

+	public Response deleteFile(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the FilesAttachable containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,

+			@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam(REQUESTPARAM_REMOTEPATH) String remotePath) {

+

+		return entityService.find(V(sourceName), fileAttachableClass, V(id))

+				.map(fileAttachable -> fileLinkActivity.deleteFileLink(sourceName, fileAttachable, remotePath))

+				.map(fileLink -> ServiceUtils.toResponse(Serializer.serializeFileLink(fileLink), Status.OK))

+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	/**

+	 * Creates new {@link FileLink} for {@link FilesAttachable}.

+	 * 

+	 * @param sourceName name of the source (MDM {@link Environment} name)

+	 * @param body       The {@link FileLink} to create.

+	 * @return

+	 */

+	@POST

+	@Operation(summary = "Attaches a new file.", responses = {

+			@ApiResponse(description = "The stored file link.", content = @Content(schema = @Schema(implementation = MDMFileLink.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	@Produces(MediaType.APPLICATION_JSON)

+	@Consumes(MediaType.MULTIPART_FORM_DATA)

+	public Response createFile(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the FilesAttachable containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,

+			@Parameter(description = "InputStream containing file data", required = true) @FormDataParam("file") InputStream fileInputStream,

+			@Parameter(description = "Meta data describing file", required = true) @FormDataParam("file") FormDataContentDisposition cdh,

+			@Parameter(description = "File description", required = true) @FormDataParam("description") String description,

+			@Parameter(description = "Mimetype of the file", required = true) @FormDataParam("mimeType") MimeType mimeType) {

+

+		return entityService.find(V(sourceName), fileAttachableClass, V(id))

+				.map(fileAttachable -> fileLinkActivity.createFile(sourceName, fileAttachable, cdh.getFileName(),

+						fileInputStream, description, mimeType))

+				.map(fileLink -> ServiceUtils.toResponse(Serializer.serializeFileLink(fileLink), Status.OK))

+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	/**

+	 * Load the file size of a file link.

+	 * 

+	 * @param sourceName name of the source (MDM {@link Environment} name)

+	 * @param id         The identifier of the {@link FilesAttachable} which

+	 *                   contains the {@link FileLink}

+	 * @param remotePath The remote path of the {@link FileLink} to identify, which

+	 *                   {@link FileLink}'s content is requests.

+	 * @return The serialized {@link FileLink} with the size.

+	 */

+	@GET

+	@Operation(summary = "Returns the file size of file link.", responses = {

+			@ApiResponse(description = "The file size of the requested file link.", content = @Content(schema = @Schema(implementation = FileSize.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	@Produces(MediaType.APPLICATION_JSON)

+	@Path("/size/{" + REQUESTPARAM_REMOTEPATH + "}")

+	public Response loadFileSize(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "The identifier of the FilesAttachable containing the file links", required = true) @PathParam(REQUESTPARAM_ID) String id,

+			@Parameter(description = "The remote path of the file link whose size is to be retrieved", required = true) @PathParam(REQUESTPARAM_REMOTEPATH) String remotePath) {

+

+		return entityService.find(V(sourceName), fileAttachableClass, V(id))

+				.map(filesAttachable -> Tuple.of(filesAttachable,

+						fileLinkActivity.findFileLinkAtFileAttachable(remotePath, filesAttachable)))

+				.map(tuple -> fileLinkActivity.loadFileSize(sourceName, tuple._1, tuple._2))

+				.map(fileSize -> ServiceUtils.toResponse(fileSize, Status.OK))

+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+

+	/**

+	 * Load the file sizes for all {@link FileLink}s of the {@link FilesAttachable}.

+	 * 

+	 * @param sourceName name of the source (MDM {@link Environment} name)

+	 * @param id         The identifier of the {@link FilesAttachable} which

+	 *                   contains the {@link FileLink}

+	 * @param remotePath The remote path of the {@link FileLink} to identify, which

+	 *                   {@link FileLink}'s content is requests.

+	 * @return The serialized {@link FileLink} with the size.

+	 */

+	@GET

+	@Operation(summary = "Returns the sizes of all file links attached to a FilesAttachable.", responses = {

+			@ApiResponse(description = "The file size of the requested file link.", content = @Content(array = @ArraySchema(schema = @Schema(implementation = FileSize.class)))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	@Produces(MediaType.APPLICATION_JSON)

+	@Path("/sizes")

+	public Response loadFileSizes(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@Parameter(description = "ID of the FilesAttachable containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id) {

+

+		return entityService.find(V(sourceName), fileAttachableClass, V(id))

+				.map(filesAttachable -> fileLinkActivity.loadFileSizes(sourceName, filesAttachable))

+				.map(fileSizes -> ServiceUtils.toResponse(fileSizes, Status.OK))

+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
new file mode 100644
index 0000000..a29e890
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
@@ -0,0 +1,467 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ATTRIBUTENAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTCOMPONENTNAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.container.ResourceContext;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.control.FileLinkActivity;
+import org.eclipse.mdm.businessobjects.entity.ContextResponse;
+import org.eclipse.mdm.businessobjects.entity.ContextSensorResponse;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
+import org.eclipse.mdm.businessobjects.service.ContextService;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.Value;
+import io.vavr.collection.List;
+import io.vavr.collection.Seq;
+import io.vavr.control.Try;
+
+/**
+ * {@link Measurement} resource
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Tag(name = "Measurement")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/measurements")
+public class MeasurementResource {
+
+	@EJB
+	private MeasurementService measurementService;
+
+	@EJB
+	private EntityService entityService;
+
+	@EJB
+	private ContextService contextService;
+
+	@EJB
+	private FileLinkActivity fileLinkActivity;
+
+	@Context
+	private ResourceContext resourceContext;
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the search attributes", description = "Get a list of search attributes", responses = {
+			@ApiResponse(description = "The search attributes", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try.of(() -> measurementService.getSearchAttributes(sourceName))
+				.map(attrs -> ServiceUtils.toResponse(new SearchAttributeResponse(attrs), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the Measurement result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find Measurements by filter", description = "Get list of Measurements", responses = {
+			@ApiResponse(description = "The Measurements", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getMeasurements(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "Filter expression", required = false) @QueryParam("filter") String filter) {
+
+		return Try.of(() -> measurementService.getMeasurements(sourceName, filter)).map(List::ofAll)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK, Measurement.class))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param MeasurementId id of the {@link Measurement}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find a Measurement by ID", description = "Returns Measurement based on ID", responses = {
+			@ApiResponse(description = "The Project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response findMeasurement(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Measurement", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), Measurement.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param MeasurementId id of the {@link Measurement}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the complete context data for a Mesurement", description = "Returns the complete context", responses = {
+			@ApiResponse(responseCode = "200", description = "The Measurement context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
+	public Response findContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return contextService.getMeasurementContext(V(sourceName), V(id)).map(ServiceUtils::contextMapToJava)
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link Measurement} with all parameters set in the
+	 * given JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MeasurementValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of the updated {@link Measurement}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
+	public Response updateContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), Measurement.class, V(id))
+				.map(measurement -> contextService.updateContext(body, measurement)).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param MeasurementId id of the {@link Measurement}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the UnitUnderTest context data for a Measurment", description = "Returns the complete context", responses = {
+			@ApiResponse(responseCode = "200", description = "The UnitUnderTest context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
+	public Response findContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return contextService.getMeasurementContext(V(sourceName), V(id), ContextType.UNITUNDERTEST)
+				.map(ServiceUtils::contextMapToJava).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link ContextType} UNITUNDERTEST of
+	 * {@link Measurement} with all parameters set in the given JSON body of the
+	 * request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MeasurementValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of {@link ContextType} UNITUNDERTEST of the updated
+	 *         {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
+	public Response updateContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), Measurement.class, V(id))
+				.map(measurement -> contextService.updateContext(body, measurement, ContextType.UNITUNDERTEST))
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param MeasurementId id of the {@link Measurement}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the TestSequence context data for a Measurement", description = "Returns the TestSequence context data", responses = {
+			@ApiResponse(responseCode = "200", description = "The TestSequence context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
+	public Response findContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return contextService.getMeasurementContext(V(sourceName), V(id), ContextType.TESTSEQUENCE)
+				.map(ServiceUtils::contextMapToJava).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link ContextType} TESTSEQUENCE of
+	 * {@link Measurement} with all parameters set in the given JSON body of the
+	 * request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MeasurementValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of {@link ContextType} TESTSEQUENCE of the updated
+	 *         {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
+	public Response updateContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), Measurement.class, V(id))
+				.map(measurement -> contextService.updateContext(body, measurement, ContextType.TESTSEQUENCE))
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param MeasurementId id of the {@link Measurement}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the TestEquipment context data for a Measurement", description = "Returns the TestEquipment context data", responses = {
+			@ApiResponse(responseCode = "200", description = "The TestEquipment context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
+	public Response findContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return contextService.getMeasurementContext(V(sourceName), V(id), ContextType.TESTEQUIPMENT)
+				.map(ServiceUtils::contextMapToJava).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link ContextType} TESTEQUIPMENT of
+	 * {@link Measurement} with all parameters set in the given JSON body of the
+	 * request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MeasurementValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of {@link ContextType} TESTEQUIPMENT of the updated
+	 *         {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
+	public Response updateContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), Measurement.class, V(id))
+				.map(measurement -> contextService.updateContext(body, measurement, ContextType.TESTEQUIPMENT))
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param MeasurementId id of the {@link Measurement}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Sensor context data", description = "Returns the Sensor context data of TestEquipments", responses = {
+			@ApiResponse(responseCode = "200", description = "The Sensor context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment/sensors")
+	public Response getContextTEQSensors(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return Try.of(() -> measurementService.getSensors(sourceName, id))
+				.map(sensorMap -> ServiceUtils.toResponse(new ContextSensorResponse(sensorMap), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link MeasurementService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Measurement localizations", description = "Returns Measurement localizations", responses = {
+			@ApiResponse(description = "The Measurement localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try
+				.of(() -> new I18NResponse(measurementService.localizeType(sourceName),
+						measurementService.localizeAttributes(sourceName)))
+				.map(resp -> ServiceUtils.toResponse(resp, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link Measurement}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link Measurement} to create.
+	 * @return the created {@link Measurement} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new Measurement", responses = {
+			@ApiResponse(description = "The created Measurement", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			String body) {
+		Seq<Value<?>> args = entityService
+				.extractRequestBody(body, sourceName, io.vavr.collection.List.of(TestStep.class))
+				.append(V(new ContextRoot[] {}));
+		return entityService.create(V(sourceName), Measurement.class, args)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link Measurement} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link MeasurementValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link Measurement}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing Measurement", description = "Updates the Measurement with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated Measurement", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Measurement", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), Measurement.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link Measurement}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link Measurement} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing Measurement", responses = {
+			@ApiResponse(description = "The deleted Measurement", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Measurement", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), Measurement.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_CONTEXTCOMPONENTNAME
+			+ "}/{" + REQUESTPARAM_ATTRIBUTENAME + "}/files")
+	public ContextFilesSubresource getContextFilesSubresource() {
+		ContextFilesSubresource resource = resourceContext.getResource(ContextFilesSubresource.class);
+		resource.setEntityClass(Measurement.class);
+		return resource;
+	}
+
+	@Path("/{" + REQUESTPARAM_ID + "}/files/")
+	public FilesAttachableSubresource getFilesAttachableSubresource() {
+		FilesAttachableSubresource resource = resourceContext.getResource(FilesAttachableSubresource.class);
+		resource.setEntityClass(Measurement.class);
+		return resource;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementService.java
new file mode 100644
index 0000000..8829755
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementService.java
@@ -0,0 +1,202 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextSensor;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.control.ContextActivity;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * MeasurementService Bean implementation with available {@link Measurement}
+ * operations
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class MeasurementService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private I18NActivity i18nActivity;
+	@EJB
+	private NavigationActivity navigationActivity;
+	@EJB
+	private ContextActivity contextActivity;
+	@EJB
+	private SearchActivity searchActivity;
+
+	/**
+	 * returns the matching {@link Measurement}s using the given filter or all
+	 * {@link Measurement}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Measurement} result
+	 * @return the found {@link Measurement}s
+	 */
+	public List<Measurement> getMeasurements(String sourceName, String filter) {
+		try {
+			ApplicationContext context = this.connectorService.getContextByName(sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			if (filter == null || filter.trim().length() <= 0) {
+				return em.loadAll(Measurement.class);
+			}
+
+			if (ServiceUtils.isParentFilter(context, filter, Measurement.PARENT_TYPE_TESTSTEP)) {
+				String id = ServiceUtils.extactIdFromParentFilter(context, filter, Measurement.PARENT_TYPE_TESTSTEP);
+				return this.navigationActivity.getMeasurements(sourceName, id);
+			}
+
+			return this.searchActivity.search(context, Measurement.class, filter);
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns the {@link SearchAttribute} for the entity type Measurement in the
+	 * given data source.
+	 * 
+	 * @param sourceName The name of the data source.
+	 * @return the found {@link SearchAttribute}s
+	 */
+	public List<SearchAttribute> getSearchAttributes(String sourceName) {
+		return this.searchActivity.listAvailableAttributes(this.connectorService.getContextByName(sourceName),
+				Measurement.class);
+	}
+
+	/**
+	 * returns a {@link Measurement} identified by the given id.
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param measurementId id of the {@link Measurement}
+	 * @return the matching {@link Measurement}
+	 */
+	public Measurement getMeasurement(String sourceName, String measurementId) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.load(Measurement.class, measurementId);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns the complete context data (ordered and measured) for a
+	 * {@link Measurement}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param measurementId id of the {@link Measurement}
+	 * @return a map with the complete context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContext(String sourceName, String measurementId) {
+		return this.contextActivity.getMeasurementContext(sourceName, measurementId);
+	}
+
+	/**
+	 * returns the UnitUnderTest context data (ordered and measured) for a
+	 * {@link Measurement}
+	 * 
+	 * @param sourceName      name of the source (MDM {@link Environment} name)
+	 * @param measurementIdId id of the {@link Measurement}
+	 * @return a map with the UnitUnderTest context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContextUUT(String sourceName, String measurementId) {
+		return this.contextActivity.getMeasurementContext(sourceName, measurementId, ContextType.UNITUNDERTEST);
+	}
+
+	/**
+	 * returns the TestSequence context data (ordered and measured) for a
+	 * {@link Measurement}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param measurementId id of the {@link Measurement}
+	 * @return a map with the TestSequence context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContextTSQ(String sourceName, String measurementId) {
+		return this.contextActivity.getMeasurementContext(sourceName, measurementId, ContextType.TESTSEQUENCE);
+	}
+
+	/**
+	 * returns the TestEquipment context data (ordered and measured) for a
+	 * {@link Measurement}
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param measurementId id of the {@link Measurement}
+	 * @return a map with the TestEquipment context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContextTEQ(String sourceName, String measurementId) {
+		return this.contextActivity.getMeasurementContext(sourceName, measurementId, ContextType.TESTEQUIPMENT);
+	}
+
+	/**
+	 * returns all sensor context data of TestEquipment sensor configuration
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param measurementId id of the {@link Measurement}
+	 * @return a map with the TestEquipment sensor context data (ordered and
+	 *         measured)
+	 */
+	public Map<String, List<ContextSensor>> getSensors(String sourceName, String measurementId) {
+		return this.contextActivity.getMeasurementSensorContext(sourceName, measurementId);
+	}
+
+	/**
+	 * returns localized {@link Measurement} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Measurement} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.i18nActivity.localizeAttributes(sourceName, Measurement.class);
+	}
+
+	/**
+	 * returns the localized {@link Measurement} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Measurement} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.i18nActivity.localizeType(sourceName, Measurement.class);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/NestedTemplateAttributeResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/NestedTemplateAttributeResource.java
new file mode 100644
index 0000000..24b7765
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/NestedTemplateAttributeResource.java
@@ -0,0 +1,218 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID3;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID4;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link NestedTemplateAttribute} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_ID
+		+ "}/tplcomps/{" + REQUESTPARAM_ID2 + "}/tplcomps/{" + REQUESTPARAM_ID3 + "}/tplattrs")
+public class NestedTemplateAttributeResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found nested {@link TemplateAttribute}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the nested
+	 *                    {@link TemplateAttribute} to load
+	 * @param id          id of the nested {@link TemplateAttribute}
+	 * @return the found nested {@link TemplateAttribute} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID4 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String tplCompId,
+			@PathParam(REQUESTPARAM_ID4) String id) {
+		return entityService.find(V(sourceName), TemplateAttribute.class, V(id),
+				ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, parentTplCompId, tplCompId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) nested {@link TemplateAttribute}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the nested
+	 *                    {@link TemplateAttribute} to load
+	 * @param filter      filter string to filter the nested
+	 *                    {@link TemplateAttribute} result
+	 * @return the (filtered) nested {@link TemplateAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String tplCompId,
+			@QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), TemplateComponent.class, V(tplCompId),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, parentTplCompId))
+				.map(tplComp -> List.ofAll(tplComp.getTemplateAttributes()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created nested {@link TemplateAttribute}.
+	 * 
+	 * @param body The nested {@link TemplateAttribute} to create.
+	 * @return The created nested {@link TemplateAttribute} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String tplCompId,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateAttribute.class, L(
+						requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+						entityService.find(V(sourceName), TemplateComponent.class, V(tplCompId),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, parentTplCompId))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateAttribute} with all parameters set in the given
+	 * JSON body of the request
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the nested {@link TemplateAttribute} to
+	 *                   delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated nested {@link TemplateAttribute}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID4 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String tplCompId,
+			@PathParam(REQUESTPARAM_ID4) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateAttribute.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam),
+								SL(tplRootId, parentTplCompId, tplCompId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link NestedTemplateAttribute}.
+	 * 
+	 * 
+	 * @param id The identifier of the {@link NestedTemplateAttribute} to delete.
+	 * @return the deleted {@link NestedTemplateAttribute }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID4 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String tplCompId,
+			@PathParam(REQUESTPARAM_ID4) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), TemplateAttribute.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam),
+								SL(tplRootId, parentTplCompId, tplCompId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateAttribute} type.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateAttribute.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateAttribute.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/NestedTemplateComponentResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/NestedTemplateComponentResource.java
new file mode 100644
index 0000000..d115562
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/NestedTemplateComponentResource.java
@@ -0,0 +1,214 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID3;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link TemplateComponent} resource handling REST requests for nested
+ * {@link TemplateComponent}s
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_ID
+		+ "}/tplcomps/{" + REQUESTPARAM_ID2 + "}/tplcomps")
+public class NestedTemplateComponentResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found nested {@link TemplateComponent}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateComponent} to
+	 *                    load
+	 * @param id          id of the {@link TemplateComponent}
+	 * @return the found {@link TemplateComponent} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.find(V(sourceName), TemplateComponent.class, V(id),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, parentTplCompId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) nested {@link TemplateComponent}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateComponent} to
+	 *                    load
+	 * @param filter      filter string to filter the {@link TemplateComponent}
+	 *                    result
+	 * @return the (filtered) {@link TemplateComponent}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), TemplateComponent.class, V(parentTplCompId),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId))
+				.map(tplComp -> List.ofAll(tplComp.getTemplateComponents()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateComponentValue}.
+	 * 
+	 * 
+	 * @param body The {@link TemplateComponent} to create.
+	 * @param id   the identifier of the parent {@link TemplateComponent}.
+	 * @return the created {@link TemplateComponent} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateComponent.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), TemplateComponent.class, V(parentTplCompId),
+										ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId)),
+								entityService.find(V(sourceName), CatalogComponent.class,
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_CATALOGCOMPONENT_ID),
+										ServiceUtils.getContextTypeSupplier(contextTypeParam))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the nested {@link TemplateComponent} with all parameters set in the
+	 * given JSON body of the request
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateComponent} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateComponent}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateComponent.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, parentTplCompId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted nested {@link TemplateComponent}.
+	 * 
+	 * @param id The identifier of the {@link TemplateComponent} to delete.
+	 * @return the deleted {@link TemplateComponent }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String parentTplCompId, @PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), TemplateComponent.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, parentTplCompId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the nested {@link TemplateComponent} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateComponent.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateComponent.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PhysicalDimensionResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PhysicalDimensionResource.java
new file mode 100755
index 0000000..9a97909
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PhysicalDimensionResource.java
@@ -0,0 +1,177 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.PhysicalDimension;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link PhysicalDimension} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "PhysicalDimension")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/physicaldimensions")
+public class PhysicalDimensionResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link PhysicalDimension}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link PhysicalDimension}
+	 * @return the found {@link PhysicalDimension} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), PhysicalDimension.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link PhysicalDimension}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link PhysicalDimension}
+	 *                   result
+	 * @return the (filtered) {@link PhysicalDimension}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@QueryParam("filter") String filter) {
+		return entityService.findAll(V(sourceName), PhysicalDimension.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link PhysicalDimension}.
+	 * 
+	 * @param body The {@link PhysicalDimension} to create.
+	 * @return the created {@link PhysicalDimension} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), PhysicalDimension.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link PhysicalDimension} with all parameters set in the given
+	 * JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link PhysicalDimension} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link PhysicalDimension}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), PhysicalDimension.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link PhysicalDimension}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link PhysicalDimension} to delete.
+	 * @return the deleted {@link PhysicalDimension }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), PhysicalDimension.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link PhysicalDimension} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), PhysicalDimension.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), PhysicalDimension.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
new file mode 100644
index 0000000..cce56ac
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
@@ -0,0 +1,241 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+import io.vavr.control.Try;
+
+/**
+ * {@link Pool} resource
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@Tag(name = "Pool")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/pools")
+public class PoolResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(PoolResource.class);
+
+	@EJB
+	private PoolService poolService;
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * delegates the request to the {@link PoolService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Pool} result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+
+	@GET
+	@Operation(summary = "Find Pools by filter", description = "Get list of pools", responses = {
+			@ApiResponse(description = "The pools", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getPools(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "Filter expression", required = false) @QueryParam("filter") String filter) {
+
+		return Try.of(() -> poolService.getPools(sourceName, filter)).map(List::ofAll)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK, Pool.class))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link PoolService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the search attributes", description = "Get list of search attributes", responses = {
+			@ApiResponse(description = "The search attributes", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try.of(() -> poolService.getSearchAttributes(sourceName))
+				.map(attrs -> ServiceUtils.toResponse(new SearchAttributeResponse(attrs), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link PoolService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link Pool}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find a Pool by ID", description = "Returns Pool based on ID", responses = {
+			@ApiResponse(description = "The project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response findPool(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Pool", required = true)  @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), Pool.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link PoolService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Pool localizations", description = "Returns Pool localizations", responses = {
+			@ApiResponse(description = "The project localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		try {
+			Map<Attribute, String> localizedAttributeMap = this.poolService.localizeAttributes(sourceName);
+			Map<EntityType, String> localizedEntityTypeMap = this.poolService.localizeType(sourceName);
+			return ServiceUtils.toResponse(new I18NResponse(localizedEntityTypeMap, localizedAttributeMap), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error("Cannot load localizations!", e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * Returns the created {@link Pool}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link Pool} to create.
+	 * @return the created {@link Pool} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new Pool",  responses = {
+			@ApiResponse(description = "The created Pool", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, 
+			String body) {
+
+		return entityService
+				.create(V(sourceName), Pool.class,
+						entityService.extractRequestBody(body, sourceName, io.vavr.collection.List.of(Project.class)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link Pool} with all parameters set in the given JSON body of
+	 * the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link PoolValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link Pool}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing Pool", description = "Updates the Pool with all parameters set in the given body of the request.", responses = {
+			@ApiResponse(description = "The updated Pool", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, 
+			@Parameter(description = "ID of the Pool", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), Pool.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link Pool}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link Pool} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing Pool", responses = {
+			@ApiResponse(description = "The deleted Pool", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(
+			@Parameter(description = "Name of the MDM datasource", required = true)  @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Pool", required = true)  @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), Pool.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolService.java
new file mode 100644
index 0000000..5ffe9a8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolService.java
@@ -0,0 +1,159 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * PoolService Bean implementation with available {@link Pool} operations
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@Stateless
+public class PoolService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private I18NActivity i18nActivity;
+	@EJB
+	private SearchActivity searchActivity;
+	@EJB
+	private NavigationActivity navigationActivity;
+
+	/**
+	 * Default no-arg constructor for EJB
+	 */
+	public PoolService() {
+		// Default no-arg constructor for EJB
+	}
+
+	/**
+	 * Contructor for unit testing
+	 * 
+	 * @param connectorService   {@link ConnectorService} to use
+	 * @param searchActivity     {@link SearchActivity} to use
+	 * @param navigationActivity {@link NavigationActivity} to use
+	 * @param i18nActivity       {@link I18NActivity} to use
+	 */
+	PoolService(ConnectorService connectorService, SearchActivity searchActivity, NavigationActivity navigationActivity,
+			I18NActivity i18nActivity) {
+		this.connectorService = connectorService;
+		this.searchActivity = searchActivity;
+		this.navigationActivity = navigationActivity;
+		this.i18nActivity = i18nActivity;
+	}
+
+	/**
+	 * returns the matching {@link Pool}s using the given filter or all
+	 * {@link Pool}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Pool} result
+	 * @return the found {@link Pool}s
+	 */
+	public List<Pool> getPools(String sourceName, String filter) {
+
+		try {
+			ApplicationContext context = this.connectorService.getContextByName(sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			if (filter == null || filter.trim().length() <= 0) {
+				return em.loadAll(Pool.class);
+			}
+
+			if (ServiceUtils.isParentFilter(context, filter, Pool.PARENT_TYPE_PROJECT)) {
+				String id = ServiceUtils.extactIdFromParentFilter(context, filter, Pool.PARENT_TYPE_PROJECT);
+				return this.navigationActivity.getPools(sourceName, id);
+			}
+
+			return this.searchActivity.search(context, Pool.class, filter);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns the {@link SearchAttribute} for the entity type {@link Pool} in the
+	 * given data source.
+	 * 
+	 * @param sourceName The name of the data source.
+	 * @return the found {@link SearchAttribute}s
+	 */
+	public List<SearchAttribute> getSearchAttributes(String sourceName) {
+		return this.searchActivity.listAvailableAttributes(this.connectorService.getContextByName(sourceName),
+				Pool.class);
+	}
+
+	/**
+	 * returns a {@link Pool} identified by the given id.
+	 * 
+	 * @param poolId     id of the {@link Pool}
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link Pool}
+	 * @return the matching {@link Pool}
+	 */
+	public Pool getPool(String sourceName, String poolId) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.load(Pool.class, poolId);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns localized {@link Pool} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Pool} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.i18nActivity.localizeAttributes(sourceName, Pool.class);
+	}
+
+	/**
+	 * returns the localized {@link Pool} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Pool} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.i18nActivity.localizeType(sourceName, Pool.class);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectDomainResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectDomainResource.java
new file mode 100644
index 0000000..415fdaf
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectDomainResource.java
@@ -0,0 +1,163 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.dflt.model.ProjectDomain;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link ProjectDomain} resource handling REST requests
+ * 
+ * @author Alexander Knoblauch, Peak Solution GmbH
+ *
+ */
+@Tag(name = "Status")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/projectdomains")
+public class ProjectDomainResource {
+
+	@EJB
+	private EntityService entityService;
+
+	@Parameter(description = "Name of the MDM datasource", required = true)
+	@PathParam(REQUESTPARAM_SOURCENAME)
+	private String sourceName;
+
+	/**
+	 * Returns the found {@link ProjectDomain}.
+	 * 
+	 * @param id id of the {@link ProjectDomain}
+	 * @return the found {@link ProjectDomain} as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find a ProjectDomain by ID", description = "Returns ProjectDomain based on ID", responses = {
+			@ApiResponse(description = "The ProjectDomain", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(
+			@Parameter(description = "ID of the ProjectDomain", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), ProjectDomain.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link ProjectDomain}s.
+	 * 
+	 * @param filter filter string to filter the {@link ProjectDomain} result
+	 * @return the (filtered) {@link ValueList}s as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find ProjectDomain by filter", description = "Get list of ProjectDomains", responses = {
+			@ApiResponse(description = "The ProjectDomains", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	public Response findAll(@Parameter(description = "Filter expression", required = false) String filter) {
+		return entityService.findAll(V(sourceName), ProjectDomain.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link ProjectDomain}.
+	 * 
+	 * @param body The {@link ProjectDomain} to create.
+	 * @return the created {@link ProjectDomain} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new ProjectDomain", responses = {
+			@ApiResponse(description = "The created ProjectDomain", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	public Response create(String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), ProjectDomain.class, L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link ProjectDomain} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param id   the identifier of the {@link ProjectDomain} to update.
+	 * @param body the body of the request containing the attributes to update
+	 * @return the updated {@link ProjectDomain}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing ProjectDomain", description = "Updates the ProjectDomain with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated ProjectDomain", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(
+			@Parameter(description = "ID of the ProjectDomain", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), ProjectDomain.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link ProjectDomain}.
+	 * 
+	 * @param id The identifier of the {@link ProjectDomain} to delete.
+	 * @return the deleted {@link ProjectDomain }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing ProjectDomain", responses = {
+			@ApiResponse(description = "The deleted ProjectDomain", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(
+			@Parameter(description = "ID of the ProjectDomain", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), ProjectDomain.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectResource.java
new file mode 100644
index 0000000..abc18a4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectResource.java
@@ -0,0 +1,240 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+import io.vavr.control.Try;
+
+// TODO: Use entityService (and vavr) in all Methods
+
+/**
+ * {@link Project} resource
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@Tag(name = "Project")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/projects")
+public class ProjectResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(ProjectResource.class);
+
+	@EJB
+	private ProjectService projectService;
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * delegates the request to the {@link ProjectService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Project} result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find Projects by filter", description = "Get list of Projects", responses = {
+			@ApiResponse(description = "The projects", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getProjects(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "Filter expression", required = false) @QueryParam("filter") String filter) {
+
+		return Try.of(() -> projectService.getProjects(sourceName, filter)).map(List::ofAll)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK, Project.class))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link ProjectService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the search attributes", description = "Get a list of search attributes", responses = {
+			@ApiResponse(description = "The search attributes", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try.of(() -> projectService.getSearchAttributes(sourceName))
+				.map(attrs -> ServiceUtils.toResponse(new SearchAttributeResponse(attrs), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link ProjectService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param projectId  id of the {@link Project}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	@Operation(summary = "Find a Project by ID", description = "Returns Project based on ID", responses = {
+			@ApiResponse(description = "The Project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	public Response findProject(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Project", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), Project.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link ProjectService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Project localizations", description = "Returns Project localizations", responses = {
+			@ApiResponse(description = "The Project localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		
+		try {
+			Map<Attribute, String> localizedAttributeMap = this.projectService.localizeAttributes(sourceName);
+			Map<EntityType, String> localizedEntityTypeMap = this.projectService.localizeType(sourceName);
+			return ServiceUtils.toResponse(new I18NResponse(localizedEntityTypeMap, localizedAttributeMap), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error("Cannot load localizations!", e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * Returns the created {@link Project}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link Project} to create.
+	 * @return the created {@link Project} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new Project",  responses = {
+			@ApiResponse(description = "The created Project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			String body) {
+
+		return entityService.create(V(sourceName), Project.class, entityService.extractRequestBody(body, sourceName))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link Project} with all parameters set in the given JSON body of
+	 * the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link ProjectValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link Project}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing Project", description = "Updates the Project with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated Project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Project", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), Project.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link Project}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link Project} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing Project", responses = {
+			@ApiResponse(description = "The deleted Project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Project", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), Project.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectService.java
new file mode 100644
index 0000000..c437014
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ProjectService.java
@@ -0,0 +1,147 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * ProjectService Bean implementation with available {@link Project} operations
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@Stateless
+public class ProjectService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private I18NActivity i18nActivity;
+	@EJB
+	private SearchActivity searchActivity;
+
+	/**
+	 * Default no-arg constructor for EJB
+	 */
+	public ProjectService() {
+		// Default no-arg constructor for EJB
+	}
+
+	/**
+	 * Contructor for unit testing
+	 * 
+	 * @param connectorService {@link ConnectorService} to use
+	 * @param searchActivity   {@link SearchActivity} to use
+	 * @param i18nActivity     {@link I18NActivity} to use
+	 */
+	ProjectService(ConnectorService connectorService, SearchActivity searchActivity, I18NActivity i18nActivity) {
+		this.connectorService = connectorService;
+		this.searchActivity = searchActivity;
+		this.i18nActivity = i18nActivity;
+	}
+
+	/**
+	 * returns the matching {@link Project}s using the given filter or all
+	 * {@link Project}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Project} result
+	 * @return the found {@link Project}s
+	 */
+	public List<Project> getProjects(String sourceName, String filter) {
+
+		try {
+			ApplicationContext context = this.connectorService.getContextByName(sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			if (filter == null || filter.trim().length() <= 0) {
+				return em.loadAll(Project.class);
+			}
+
+			return this.searchActivity.search(context, Project.class, filter);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns the {@link SearchAttribute} for the entity type {@link Project} in
+	 * the given data source.
+	 * 
+	 * @param sourceName The name of the data source.
+	 * @return the found {@link SearchAttribute}s
+	 */
+	public List<SearchAttribute> getSearchAttributes(String sourceName) {
+		return this.searchActivity.listAvailableAttributes(this.connectorService.getContextByName(sourceName),
+				Project.class);
+	}
+
+	/**
+	 * returns a {@link Project} identified by the given id.
+	 * 
+	 * @param projectId  id of the {@link Project}
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link Project}
+	 * @return the matching {@link Project}
+	 */
+	public Project getProject(String sourceName, String projectId) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.load(Project.class, projectId);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns localized {@link Project} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Project} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.i18nActivity.localizeAttributes(sourceName, Project.class);
+	}
+
+	/**
+	 * returns the localized {@link Project} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Project} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.i18nActivity.localizeType(sourceName, Project.class);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/QuantityResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/QuantityResource.java
new file mode 100644
index 0000000..07f0bb0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/QuantityResource.java
@@ -0,0 +1,184 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_UNIT_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.dflt.model.ValueListValue;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link Quantity} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Quantity")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/quantities")
+public class QuantityResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link Quantity}. {@link WebApplicationException} on error.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link Quantity}
+	 * @return the found {@link Quantity} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), Quantity.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link Quantity}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Quantity} result
+	 * @return the (filtered) {@link Quantity}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@QueryParam("filter") String filter) {
+		return entityService.findAll(V(sourceName), Quantity.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link Unit}.
+	 * 
+	 * @param body The {@link Unit} to create.
+	 * @return the created {@link Unit} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), Quantity.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), Unit.class,
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_UNIT_ID))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link Quantity} with all parameters set in the given JSON body
+	 * of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link Quantity} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link ValueListValue}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), Quantity.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link Quantity}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link Quantity} to delete.
+	 * @return the deleted {@link Quantity }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), Quantity.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link Quantity} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), Quantity.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), Quantity.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java
new file mode 100644
index 0000000..2aee5ba
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java
@@ -0,0 +1,179 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;
+
+/**
+ * Class defining constants used by the specific Jersey resource classes.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+public final class ResourceConstants {
+	public static final String MEDIATYPE_APPLICATION_PROTOBUF = "application/protobuf";
+
+	/**
+	 * Parameter name holding the {@link Environment}, i.e. the source name
+	 */
+	public static final String REQUESTPARAM_SOURCENAME = "SOURCENAME";
+
+	/**
+	 * Parameter holding the {@link Entity}s id in the URI path
+	 */
+	public static final String REQUESTPARAM_ID = "ID";
+
+	/**
+	 * Parameter holding an additional {@link Entity}s id in the URI path, e.g. for
+	 * a {@link TemplateComponent} when {@link REQUESTPARAM_ID} holds the id of the
+	 * {@link TemplateRoot}.
+	 */
+	public static final String REQUESTPARAM_ID2 = "ID2";
+
+	/**
+	 * Parameter holding an additional {@link Entity}s id in the URI path, e.g. for
+	 * a {@link TemplateAttribute} when {@link REQUESTPARAM_ID} holds the id of the
+	 * {@link TemplateRoot} and {@link REQUESTPARAM_ID2} holds the id of the
+	 * {@link TemplateComponent}.
+	 */
+	public static final String REQUESTPARAM_ID3 = "ID3";
+
+	/**
+	 * Parameter holding an additional {@link Entity}s id in the URI path, e.g. for
+	 * a {@link TemplateAttribute} when {@link REQUESTPARAM_ID} holds the id of the
+	 * {@link TemplateRoot}, {@link REQUESTPARAM_ID2} holds the id of the parent
+	 * {@link TemplateComponent} and {@link REQUESTPARAM_ID3} holds the id of the
+	 * nested {@link TemplateComponent}.
+	 */
+	public static final String REQUESTPARAM_ID4 = "ID4";
+
+	/**
+	 * Parameter holding the name of the context attribute in the URI path
+	 */
+	public static final String REQUESTPARAM_ATTRIBUTENAME = "ATTRIBUTENAME";
+
+	/**
+	 * Parameter holding the name of the context attribute in the URI path
+	 */
+	public static final String REQUESTPARAM_CONTEXTCOMPONENTNAME = "CONTEXTCOMPONENTNAME";
+
+	/**
+	 * Parameter holding the {@link ContextType} of the {@link Entity} in the URI
+	 * path
+	 */
+	public static final String REQUESTPARAM_CONTEXTTYPE = "CONTEXTTYPE";
+
+	/**
+	 * Parameter holding the {@code remotePath} of the {@link FileLink} in the URI
+	 * path
+	 */
+	public static final String REQUESTPARAM_REMOTEPATH = "REMOTEPATH";
+
+	/**
+	 * Parameter holding the {@code mimeType} of the {@link FileLink} in the URI
+	 * path
+	 */
+	public static final String REQUESTPARAM_MIMETYPE = "MIMETYPE";
+
+	/**
+	 * Parameter holding the {@code size} of the {@code file} in the URI path
+	 */
+	public static final String REQUESTPARAM_SIZE = "SIZE";
+
+	/**
+	 * Parameter holding the {@code size} of the {@code file} in the URI path
+	 */
+	public static final String REQUESTPARAM_SOURCETYPE = "SOURCETYPE";
+
+	/**
+	 * Parameter holding the {@code description} of the {@link FileLink} in the URI
+	 * path
+	 */
+	public static final String REQUESTPARAM_DESCRIPTION = "DESCRIPTION";
+
+	/**
+	 * Parameter holding the name of the {@link Entity} in the request body
+	 */
+	public static final String ENTITYATTRIBUTE_NAME = "Name";
+
+	/**
+	 * Parameter holding the number of values of the {@link ChannelGroup} in the
+	 * request body
+	 */
+	public static final String ENTITYATTRIBUTE_NUMBER_OF_VALUES = "NumberOfValues";
+
+	/**
+	 * Parameter holding the {@link ValueType} of the {@link Entity} in the request
+	 * body
+	 */
+	public static final String ENTITYATTRIBUTE_DATATYPE = "DataType";
+
+	/**
+	 * Parameter holding the id of the {@link CatalogComponent} of e.g. the
+	 * {@link TemplateComponent} in the request body
+	 */
+	public static final String ENTITYATTRIBUTE_CATALOGCOMPONENT_ID = "CatalogComponent";
+
+	/**
+	 * Parameter holding the id of the {@link CatalogSensor} of e.g. the
+	 * {@link TemplateSensor} in the request body
+	 */
+	public static final String ENTITYATTRIBUTE_CATALOGSENSOR_ID = "CatalogSensor";
+
+	/**
+	 * Parameter holding the id of the {@link Quantity} of e.g. the {@link Unit} in
+	 * the request body
+	 */
+	public static final String ENTITYATTRIBUTE_QUANTITY_ID = "Quantity";
+
+	/**
+	 * Parameter holding the id of the {@link Unit} of e.g. the {@link Quantity} in
+	 * the request body
+	 */
+	public static final String ENTITYATTRIBUTE_UNIT_ID = "Unit";
+
+	/**
+	 * Parameter holding the id of the {@link Unit} of e.g. the {@link Quantity} in
+	 * the request body
+	 */
+	public static final String ENTITYATTRIBUTE_PHYSICALDIMENSION_ID = "PhysicalDimension";
+
+	/**
+	 * Parameter holding the id of the {@link TemplateTestStep} of e.g. the
+	 * {@link TemplateTestStepUsage} in the request body
+	 */
+	public static final String ENTITYATTRIBUTE_TEMPLATETESTSTEP_ID = "TemplateTestStep";
+
+	/**
+	 * Just hide the default constructor
+	 */
+	private ResourceConstants() {
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/StatusResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/StatusResource.java
new file mode 100644
index 0000000..3d940b4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/StatusResource.java
@@ -0,0 +1,175 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link org.eclipse.mdm.api.dflt.model.Status} resource handling REST requests
+ * 
+ * @author Alexander Knoblauch, Peak Solution GmbH
+ *
+ */
+@Tag(name = "Status")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/status")
+public class StatusResource {
+
+	@EJB
+	private EntityService entityService;
+
+	@Parameter(description = "Name of the MDM datasource", required = true)
+	@PathParam(REQUESTPARAM_SOURCENAME)
+	private String sourceName;
+
+	/**
+	 * Returns the found {@link org.eclipse.mdm.api.dflt.model.Status}.
+	 * 
+	 * @param id id of the {@link org.eclipse.mdm.api.dflt.model.Status}
+	 * @return the found {@link org.eclipse.mdm.api.dflt.model.Status} as
+	 *         {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find a Status by ID", description = "Returns Status based on ID", responses = {
+			@ApiResponse(description = "The Status", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(
+			@Parameter(description = "ID of the ProjectDomain", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), org.eclipse.mdm.api.dflt.model.Status.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link org.eclipse.mdm.api.dflt.model.Status}s.
+	 * 
+	 * @param filter filter string to filter the
+	 *               {@link org.eclipse.mdm.api.dflt.model.Status} result
+	 * @return the (filtered) {@link ValueList}s as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find Status by filter", description = "Get list of Status", responses = {
+			@ApiResponse(description = "The Status", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	public Response findAll(
+			@Parameter(description = "Filter expression", required = false) @QueryParam("filter") String filter) {
+		return entityService.findAll(V(sourceName), org.eclipse.mdm.api.dflt.model.Status.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link org.eclipse.mdm.api.dflt.model.Status}.
+	 * 
+	 * @param body The {@link org.eclipse.mdm.api.dflt.model.Status} to create.
+	 * @return the created {@link org.eclipse.mdm.api.dflt.model.Status} as
+	 *         {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new Status", responses = {
+			@ApiResponse(description = "The created Status", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	public Response create(String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), org.eclipse.mdm.api.dflt.model.Status.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link org.eclipse.mdm.api.dflt.model.Status} with all parameters
+	 * set in the given JSON body of the request.
+	 * 
+	 * @param id   the identifier of the
+	 *             {@link org.eclipse.mdm.api.dflt.model.Status} to update.
+	 * @param body the body of the request containing the attributes to update
+	 * @return the updated {@link org.eclipse.mdm.api.dflt.model.Status}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing Status", description = "Updates the Status with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated Status", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(
+			@Parameter(description = "ID of the Status", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), org.eclipse.mdm.api.dflt.model.Status.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted
+	 * {@link org.eclipse.mdm.api.dflt.model.Status}.
+	 * 
+	 * @param id The identifier of the {@link org.eclipse.mdm.api.dflt.model.Status}
+	 *           to delete.
+	 * @return the deleted {@link org.eclipse.mdm.api.dflt.model.Status }s as
+	 *         {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing Status", responses = {
+			@ApiResponse(description = "The deleted Status", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(
+			@Parameter(description = "ID of the Status", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), org.eclipse.mdm.api.dflt.model.Status.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateAttributeResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateAttributeResource.java
new file mode 100644
index 0000000..aaa5507
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateAttributeResource.java
@@ -0,0 +1,207 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID3;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link TemplateAttribute} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_ID
+		+ "}/tplcomps/{" + REQUESTPARAM_ID2 + "}/tplattrs")
+public class TemplateAttributeResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link TemplateAttribute}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateAttribute} to
+	 *                    load
+	 * @param id          id of the {@link TemplateAttribute}
+	 * @return the found {@link TemplateAttribute} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String tplCompId, @PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.find(V(sourceName), TemplateAttribute.class, V(id),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, tplCompId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateAttribute}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateAttribute} to
+	 *                    load
+	 * @param filter      filter string to filter the {@link TemplateAttribute}
+	 *                    result
+	 * @return the (filtered) {@link TemplateAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String tplCompId, @QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), TemplateComponent.class, V(tplCompId),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId))
+				.map(tplComp -> List.ofAll(tplComp.getTemplateAttributes()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateAttributeValue}.
+	 * 
+	 * @param body The {@link TemplateAttribute} to create.
+	 * @return the created {@link TemplateAttribute} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String tplCompId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateAttribute.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), TemplateComponent.class, V(tplCompId),
+										ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateAttribute} with all parameters set in the given
+	 * JSON body of the request
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateAttribute} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateAttribute}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String tplCompId, @PathParam(REQUESTPARAM_ID3) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateAttribute.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, tplCompId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TemplateAttribute}.
+	 * 
+	 * @param id The identifier of the {@link TemplateAttribute} to delete.
+	 * @return the deleted {@link TemplateAttribute }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String tplCompId, @PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), TemplateAttribute.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId, tplCompId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateAttribute} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateAttribute.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateAttribute.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateComponentResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateComponentResource.java
new file mode 100644
index 0000000..5458b2f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateComponentResource.java
@@ -0,0 +1,211 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link TemplateComponent} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_ID
+		+ "}/tplcomps")
+public class TemplateComponentResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link TemplateComponent}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateComponent} to
+	 *                    load
+	 * @param id          id of the {@link TemplateComponent}
+	 * @return the found {@link TemplateComponent} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.find(V(sourceName), TemplateComponent.class, V(id),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateComponent}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateComponent} to
+	 *                    load
+	 * @param filter      filter string to filter the {@link TemplateComponent}
+	 *                    result
+	 * @return the (filtered) {@link TemplateComponent}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), TemplateRoot.class, V(tplRootId),
+						ServiceUtils.getContextTypeSupplier(contextTypeParam))
+				.map(tplRoot -> List.ofAll(tplRoot.getTemplateComponents()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateComponentValue}.
+	 * 
+	 * @param body The {@link TemplateComponent} to create.
+	 * @return the created {@link TemplateComponent} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateComponent.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), TemplateRoot.class, V(tplRootId),
+										ServiceUtils.getContextTypeSupplier(contextTypeParam)),
+								entityService.find(V(sourceName), CatalogComponent.class,
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_CATALOGCOMPONENT_ID),
+										ServiceUtils.getContextTypeSupplier(contextTypeParam))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateComponent} with all parameters set in the given
+	 * JSON body of the request
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateComponent} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateComponent}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateComponent.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TemplateComponent}.
+	 * 
+	 * @param id The identifier of the {@link TemplateComponent} to delete.
+	 * @return the deleted {@link TemplateComponent }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String tplRootId,
+			@PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), TemplateComponent.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam), SL(tplRootId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateComponent} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateComponent.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateComponent.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java
new file mode 100644
index 0000000..9952587
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java
@@ -0,0 +1,194 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link TemplateRoot} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/{" + REQUESTPARAM_CONTEXTTYPE + "}")
+public class TemplateRootResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link TemplateRoot}.
+	 * 
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateRoot} to load
+	 * @param id          id of the {@link TemplateRoot}
+	 * @return the found {@link TemplateRoot} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService
+				.find(V(sourceName), TemplateRoot.class, V(id), ServiceUtils.getContextTypeSupplier(contextTypeParam))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateRoot}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateRoot} to load
+	 * @param filter      filter string to filter the {@link TemplateRoot} result
+	 * @return the (filtered) {@link TemplateRoot}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @QueryParam("filter") String filter) {
+		return entityService
+				.findAll(V(sourceName), TemplateRoot.class, filter,
+						ServiceUtils.getContextTypeSupplier(contextTypeParam))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateRootValue}.
+	 * 
+	 * @param body The {@link TemplateRoot} to create.
+	 * @return the created {@link TemplateRoot} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateRoot.class,
+						L(ServiceUtils.getContextTypeSupplier(contextTypeParam),
+								requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateRoot} with all parameters set in the given JSON
+	 * body of the request
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateRoot} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateRoot}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateRoot.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TemplateRoot}.
+	 * 
+	 * @param id The identifier of the {@link TemplateRoot} to delete.
+	 * @return the deleted {@link TemplateRoot }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), TemplateRoot.class, V(id),
+								ServiceUtils.getContextTypeSupplier(contextTypeParam)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateRoot} type.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateRoot.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateRoot.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateSensorAttributeResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateSensorAttributeResource.java
new file mode 100644
index 0000000..70593fa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateSensorAttributeResource.java
@@ -0,0 +1,177 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID3;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID4;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateSensor;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link TemplateAttribute} resource handling REST requests
+ * 
+ * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/testequipment/{" + REQUESTPARAM_ID + "}/tplcomps/{"
+		+ REQUESTPARAM_ID2 + "}/tplsensors/{" + REQUESTPARAM_ID3 + "}/tplsensorattrs")
+public class TemplateSensorAttributeResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/*
+	 * Create not implemented as TemplateSensorAttributes are created implicitly
+	 * with the TemplateSensor
+	 */
+
+	/**
+	 * Returns the found {@link TemplateAttribute}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param tplRootId   id of the {@link TemplateRoot}
+	 * @param tplCompId   id of the {@link TemplateComponent}
+	 * @param tplSensorId id of the {@link TemplateSensor}
+	 * @param id          id of the {@link TemplateAttribute}
+	 * @return the found {@link TemplateAttribute} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID4 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId,
+			@PathParam(REQUESTPARAM_ID3) String tplSensorId, @PathParam(REQUESTPARAM_ID4) String id) {
+		return entityService
+				.find(V(sourceName), TemplateAttribute.class, V(id), V(ContextType.TESTEQUIPMENT),
+						SL(tplRootId, tplCompId, tplSensorId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateAttribute}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param tplRootId   id of the {@link TemplateRoot}
+	 * @param tplCompId   id of the {@link TemplateComponent}
+	 * @param tplSensorId id of the {@link TemplateSensor}
+	 * @param filter      filter string to filter the {@link TemplateAttribute}
+	 *                    result
+	 * @return the (filtered) {@link TemplateAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId,
+			@PathParam(REQUESTPARAM_ID3) String tplSensorId, @QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), TemplateSensor.class, V(tplSensorId), V(ContextType.TESTEQUIPMENT),
+						SL(tplRootId, tplCompId))
+				.map(tplSensor -> List.ofAll(tplSensor.getTemplateAttributes()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateAttribute} with all parameters set in the given
+	 * JSON body of the request
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param tplRootId   id of the {@link TemplateRoot}
+	 * @param tplCompId   id of the {@link TemplateComponent}
+	 * @param tplSensorId id of the {@link TemplateSensor}
+	 * @param id          the identifier of the {@link TemplateAttribute} to delete.
+	 * @param body        the body of the request containing the attributes to
+	 *                    update
+	 * @return the updated {@link TemplateAttribute}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID4 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId,
+			@PathParam(REQUESTPARAM_ID3) String tplSensorId, @PathParam(REQUESTPARAM_ID4) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateAttribute.class, V(id), V(ContextType.TESTEQUIPMENT),
+								SL(tplRootId, tplCompId, tplSensorId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/*
+	 * Delete not implemented as TemplateSensorAttributes can't be deleted
+	 */
+
+	/**
+	 * Returns the search attributes for the {@link TemplateAttribute} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateAttribute.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateAttribute.class, entityService);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateSensorResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateSensorResource.java
new file mode 100755
index 0000000..6dbf74d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateSensorResource.java
@@ -0,0 +1,214 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_CATALOGSENSOR_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_QUANTITY_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID3;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateSensor;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.Lazy;
+import io.vavr.collection.List;
+
+/**
+ * {@link TemplateSensor} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplroots/testequipment/{" + REQUESTPARAM_ID + "}/tplcomps/{"
+		+ REQUESTPARAM_ID2 + "}/tplsensors")
+public class TemplateSensorResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link TemplateSensor}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TemplateSensor}
+	 * @return the found {@link TemplateSensor} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId,
+			@PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.find(V(sourceName), TemplateSensor.class, V(id), V(ContextType.TESTEQUIPMENT),
+						SL(tplRootId, tplCompId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateSensor}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link TemplateSensor} result
+	 * @return the (filtered) {@link TemplateSensor}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId,
+			@QueryParam("filter") String filter) {
+		return entityService
+				.find(V(sourceName), TemplateComponent.class, V(tplCompId), V(ContextType.TESTEQUIPMENT), SL(tplRootId))
+				.map(tplComp -> List.ofAll(tplComp.getTemplateSensors()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateSensorValue}.
+	 * 
+	 * @param body The {@link TemplateSensor} to create.
+	 * @return the created {@link TemplateSensor} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		// TODO anehmer on 2017-11-25: test that tplComp is only once fetched
+		// get memoized (Lazy) tplComp as it is used twiced and should only fetched once
+		Lazy<TemplateComponent> tplCompSupplier = Lazy.of(() -> entityService
+				.find(V(sourceName), TemplateComponent.class, V(tplCompId), V(ContextType.TESTEQUIPMENT), SL(tplRootId))
+				.get());
+
+		return entityService
+				.create(V(sourceName), TemplateSensor.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME), tplCompSupplier,
+								entityService.find(V(sourceName), CatalogSensor.class,
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_CATALOGSENSOR_ID),
+										V(ContextType.TESTEQUIPMENT),
+										SL(tplCompSupplier.map(tplComp -> tplComp.getCatalogComponent().getID()))),
+								entityService.find(V(sourceName), Quantity.class,
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_QUANTITY_ID))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateSensor} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateSensor} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateSensor}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId,
+			@PathParam(REQUESTPARAM_ID3) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateSensor.class, V(id), V(ContextType.TESTEQUIPMENT),
+								SL(tplRootId, tplCompId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TemplateSensor}.
+	 * 
+	 * @param id The identifier of the {@link TemplateSensor} to delete.
+	 * @return the deleted {@link TemplateSensor }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID3 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplRootId, @PathParam(REQUESTPARAM_ID2) String tplCompId,
+			@PathParam(REQUESTPARAM_ID3) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), TemplateSensor.class, V(id), V(ContextType.TESTEQUIPMENT),
+								SL(tplRootId, tplCompId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateSensor} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateSensor.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateSensor.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java
new file mode 100644
index 0000000..8a7d459
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java
@@ -0,0 +1,174 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link TemplateTest} resource handling REST requests
+ * 
+ * @author Gunnar Schmidt, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tpltests")
+public class TemplateTestResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link TemplateTest}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TemplateTest}
+	 * @return the found {@link TemplateTest} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), TemplateTest.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateTest}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link TemplateTest} result
+	 * @return the (filtered) {@link TemplateTest}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@QueryParam("filter") String filter) {
+		return entityService.findAll(V(sourceName), TemplateTest.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateTestValue}.
+	 * 
+	 * @param body The {@link TemplateTest} to create.
+	 * @return the created {@link TemplateTest} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateTest.class, L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateTest} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateTest} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateTest}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), TemplateTest.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TemplateTest}.
+	 * 
+	 * @param id The identifier of the {@link TemplateTest} to delete.
+	 * @return the deleted {@link TemplateTest }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), TemplateTest.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateTest} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateTest.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateTest.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java
new file mode 100644
index 0000000..e8a8d24
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java
@@ -0,0 +1,184 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link TemplateTestStep} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tplteststeps")
+public class TemplateTestStepResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link TemplateTestStep}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateTestStep} to
+	 *                    load
+	 * @param id          id of the {@link TemplateTestStep}
+	 * @return the found {@link TemplateTestStep} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), TemplateTestStep.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateTestStep}s.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param contextType {@link ContextType} of the {@link TemplateTestStep} to
+	 *                    load
+	 * @param filter      filter string to filter the {@link TemplateTestStep}
+	 *                    result
+	 * @return the (filtered) {@link TemplateTestStep}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @QueryParam("filter") String filter) {
+		return entityService.findAll(V(sourceName), TemplateTestStep.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateTestStepValue}.
+	 * 
+	 * @param body The {@link TemplateTestStep} to create.
+	 * @return the created {@link TemplateTestStep} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateTestStep.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateTestStep} with all parameters set in the given
+	 * JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateTestStep} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateTestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), TemplateTestStep.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TemplateTestStep}.
+	 * 
+	 * @param id The identifier of the {@link TemplateTestStep} to delete.
+	 * @return the deleted {@link TemplateTestStep }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), TemplateTestStep.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateTestStep} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateTestStep.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateTestStep.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepUsageResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepUsageResource.java
new file mode 100644
index 0000000..984e5dd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepUsageResource.java
@@ -0,0 +1,197 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_TEMPLATETESTSTEP_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link TemplateTestStepUsage} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Template")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tpltests/{" + REQUESTPARAM_ID + "}/tplteststepusages")
+public class TemplateTestStepUsageResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link TemplateTestStep}.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TemplateTestStep}
+	 * @return the found {@link TemplateTestStep} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplTestId, @PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService.find(V(sourceName), TemplateTestStepUsage.class, V(id), SL(tplTestId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link TemplateTestStepUsage}s.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link TemplateTestStepUsage}
+	 *                   result
+	 * @return the (filtered) {@link TemplateTestStepUsage}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplTestId, @QueryParam("filter") String filter) {
+		return entityService.find(V(sourceName), TemplateTest.class, V(tplTestId))
+				.map(tplTest -> List.ofAll(tplTest.getTemplateTestStepUsages()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TemplateTestStepUsageValue}.
+	 * 
+	 * 
+	 * @param body The {@link TemplateTestStepUsage} to create.
+	 * @return the created {@link TemplateTestStepUsage} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplTestId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), TemplateTestStepUsage.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), TemplateTest.class, V(tplTestId)),
+								entityService.find(V(sourceName), TemplateTestStep.class,
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_TEMPLATETESTSTEP_ID))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TemplateTestUsage} with all parameters set in the given
+	 * JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateTestUsage} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TemplateTestUsage}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplTestId, @PathParam(REQUESTPARAM_ID2) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName),
+						entityService.find(V(sourceName), TemplateTestStepUsage.class, V(id), SL(tplTestId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TemplateTestStepUsage}.
+	 * 
+	 * 
+	 * @param id The identifier of the {@link TemplateTestStepUsage} to delete.
+	 * @return the deleted {@link TemplateTestStepUsage }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String tplTestId, @PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.delete(V(sourceName),
+						entityService.find(V(sourceName), TemplateTestStepUsage.class, V(id), SL(tplTestId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link TemplateTestStepUsage} type.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), TemplateTestStepUsage.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), TemplateTestStepUsage.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
new file mode 100644
index 0000000..358ee3b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
@@ -0,0 +1,359 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.annotation.security.RolesAllowed;
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ResourceContext;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.model.Classification;
+import org.eclipse.mdm.api.dflt.model.Domain;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.ProjectDomain;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.control.FileLinkActivity;
+import org.eclipse.mdm.businessobjects.entity.ContextResponse;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
+import org.eclipse.mdm.businessobjects.service.ContextService;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.Value;
+import io.vavr.collection.List;
+import io.vavr.collection.Seq;
+import io.vavr.collection.Vector;
+import io.vavr.control.Try;
+
+/**
+ * {@link Test} resource
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Tag(name = "Test")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/tests")
+public class TestResource {
+
+	private static final String ATTR_WITHTESTSTEPS = "WithTestSteps";
+
+	private static final Logger LOG = LoggerFactory.getLogger(TestResource.class);
+
+	@EJB
+	private TestService testService;
+
+	@EJB
+	private EntityService entityService;
+
+	@EJB
+	private ContextService contextService;
+
+	@EJB
+	private FileLinkActivity fileLinkActivity;
+
+	@Context
+	private ResourceContext resourceContext;
+
+	/**
+	 * delegates the request to the {@link TestService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Test} result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find Tests by filter", description = "Get list of Tests", responses = {
+			@ApiResponse(description = "The projects", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getTests(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "Filter expression", required = false) @QueryParam("filter") String filter) {
+
+		return Try.of(() -> testService.getTests(sourceName, filter)).map(List::ofAll)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK, Test.class))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the search attributes", description = "Get a list of search attributes", responses = {
+			@ApiResponse(description = "The search attributes", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try.of(() -> testService.getSearchAttributes(sourceName))
+				.map(attrs -> ServiceUtils.toResponse(new SearchAttributeResponse(attrs), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link Test}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find a Test by ID", description = "Returns Test based on ID", responses = {
+			@ApiResponse(description = "The Test", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response findTest(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Test", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), Test.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Test localizations", description = "Returns Test localizations", responses = {
+			@ApiResponse(description = "The Test localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		try {
+			Map<Attribute, String> localizedAttributeMap = this.testService.localizeAttributes(sourceName);
+			Map<EntityType, String> localizedEntityTypeMap = this.testService.localizeType(sourceName);
+			return ServiceUtils.toResponse(new I18NResponse(localizedEntityTypeMap, localizedAttributeMap), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * Returns the created {@link Test}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link Test} to create.
+	 * @return the created {@link Test} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new Test", responses = {
+			@ApiResponse(description = "The created Test", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			String body) {
+		// TODO
+
+		Seq<Value<?>> extractRequestBody = entityService.extractRequestBody(body, sourceName,
+				io.vavr.collection.List.of(Pool.class, org.eclipse.mdm.api.dflt.model.Status.class, TemplateTest.class,
+						ProjectDomain.class, Domain.class, Classification.class));
+
+		java.util.List<Value<?>> asJavaMutable = extractRequestBody.asJavaMutable();
+
+		org.eclipse.mdm.api.dflt.model.Status status = null;
+		ProjectDomain projectDomain = null;
+		Domain domain = null;
+
+		Seq<Value<?>> finalAttrSeq = Vector.empty();
+
+		for (Value<?> v : asJavaMutable) {
+			if (v.get() instanceof org.eclipse.mdm.api.dflt.model.Status) {
+				status = (org.eclipse.mdm.api.dflt.model.Status) v.get();
+				extractRequestBody.remove(v);
+			} else if (v.get() instanceof ProjectDomain) {
+				projectDomain = (ProjectDomain) v.get();
+				extractRequestBody.remove(v);
+			} else if (v.get() instanceof Domain) {
+				domain = (Domain) v.get();
+				extractRequestBody.remove(v);
+			} else {
+				finalAttrSeq = finalAttrSeq.append(v);
+			}
+		}
+
+		if (status != null && projectDomain != null && domain != null) {
+			Classification classification = testService.getClassification(sourceName, status, projectDomain, domain);
+			finalAttrSeq = finalAttrSeq.append(V(classification));
+		}
+
+		RequestBody requestBody = RequestBody.create(body);
+
+		try {
+			Try<String> stringValueSupplier = requestBody.getStringValueSupplier(ATTR_WITHTESTSTEPS);
+			finalAttrSeq = finalAttrSeq.append(V(Boolean.valueOf(stringValueSupplier.get())));
+		} catch (NoSuchElementException e) {
+			// If with TestStep not exist, do nothing
+		}
+
+		return entityService.create(V(sourceName), Test.class, finalAttrSeq)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link Test} with all parameters set in the given JSON body of
+	 * the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TestValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link Test}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing Test", description = "Updates the Test with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated TestStep", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	@RolesAllowed({ "write-user" })
+	public Response update(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Test", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), Test.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link Test}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link Test} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing Test", responses = {
+			@ApiResponse(description = "The deleted Test", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the Test", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), Test.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	@Path("/{" + REQUESTPARAM_ID + "}/files/")
+	public FilesAttachableSubresource getFilesAttachableSubresource() {
+		FilesAttachableSubresource resource = resourceContext.getResource(FilesAttachableSubresource.class);
+		resource.setEntityClass(Test.class);
+		return resource;
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TestStep}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the test constant context data for a Test", description = "Returns the test constant context", responses = {
+			@ApiResponse(responseCode = "200", description = "The test constant context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
+	public Response findContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return contextService.getTestContext(V(sourceName), V(id), false).map(ServiceUtils::contextMapToJava)
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link TestStep} with all parameters set in the given
+	 * JSON body of the request.
+	 *
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TestStep} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of the updated {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
+	@RolesAllowed({ "write-user" })
+	public Response updateContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), TestStep.class, V(id))
+				.map(testStep -> contextService.updateContext(body, testStep)).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestService.java
new file mode 100644
index 0000000..961b865
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestService.java
@@ -0,0 +1,209 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.Condition;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Classification;
+import org.eclipse.mdm.api.dflt.model.Domain;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.ProjectDomain;
+import org.eclipse.mdm.api.dflt.model.Status;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+import com.google.common.collect.Lists;
+
+/**
+ * TestService Bean implementation with available {@link Test} operations
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class TestService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private I18NActivity i18nActivity;
+	@EJB
+	private SearchActivity searchActivity;
+	@EJB
+	private NavigationActivity navigationActivity;
+
+	/**
+	 * returns the matching {@link Test}s using the given filter or all
+	 * {@link Test}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Test} result
+	 * @return the found {@link Test}s
+	 */
+	public List<Test> getTests(String sourceName, String filter) {
+
+		try {
+			ApplicationContext context = this.connectorService.getContextByName(sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			if (filter == null || filter.trim().length() <= 0) {
+				return em.loadAll(Test.class);
+			}
+
+			if (ServiceUtils.isParentFilter(context, filter, Pool.class)) {
+				String id = ServiceUtils.extactIdFromParentFilter(context, filter, Pool.class);
+				return this.navigationActivity.getTests(sourceName, id);
+			}
+
+			return this.searchActivity.search(context, Test.class, filter);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns the {@link SearchAttribute} for the entity type Test in the given
+	 * data source.
+	 * 
+	 * @param sourceName The name of the data source.
+	 * @return the found {@link SearchAttribute}s
+	 */
+	public List<SearchAttribute> getSearchAttributes(String sourceName) {
+		return this.searchActivity.listAvailableAttributes(this.connectorService.getContextByName(sourceName),
+				Test.class);
+	}
+
+	/**
+	 * returns a {@link Test} identified by the given id.
+	 * 
+	 * @param testId     id of the {@link Test}
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link Test}
+	 * @return the matching {@link Test}
+	 */
+	public Test getTest(String sourceName, String testId) {
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			return em.load(Test.class, testId);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns localized {@link Test} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Test} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.i18nActivity.localizeAttributes(sourceName, Test.class);
+	}
+
+	/**
+	 * returns the localized {@link Test} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link Test} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.i18nActivity.localizeType(sourceName, Test.class);
+	}
+	
+	public Classification getClassification(String sourceName, Status status, ProjectDomain projectDomain, Domain domain) {
+		Optional<QueryService> queryService = connectorService.getContextByName(sourceName).getQueryService();
+		Optional<ModelManager> modelManager = connectorService.getContextByName(sourceName).getModelManager();
+		
+		EntityType entityType = modelManager.get().getEntityType(Classification.class);
+		Condition c1 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("ProjectDomain"), projectDomain.getID());
+		Condition c2 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("Domain"), domain.getID());
+		Condition c3 = ComparisonOperator.CASE_INSENSITIVE_EQUAL.create(entityType.getAttribute("Status"), status.getID());
+		
+		java.util.List<Result> fetch = queryService.get().createQuery().selectID(entityType).fetch(Filter.and().addAll(c1, c2, c3));
+		
+		java.util.List<String> collect = fetch.stream()
+		.map(r -> r.getRecord(entityType)).map(Record::getID).collect(Collectors.toList());
+		
+		EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+				.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+		
+		Classification classification = null;
+		if (!collect.isEmpty()) {
+			
+			classification = em.load(Classification.class, collect.get(0));
+		} else {
+			StringBuilder className = new StringBuilder();
+			className.append("ProjDomainId_");
+			className.append(projectDomain.getID());
+			className.append(".DomainId_");
+			className.append(domain.getID());
+			className.append(".StatusId_");
+			className.append(status.getID());
+			
+			boolean classificationCreated = false;
+			Transaction transaction = em.startTransaction();
+			
+			try {
+				
+				EntityFactory ef = this.connectorService.getContextByName(sourceName).getEntityFactory()
+						.orElseThrow(() -> new MDMEntityAccessException("Entity factory not present!"));
+				classification = ef.createClassification(className.toString(), status, projectDomain, domain);
+				transaction.create(Lists.newArrayList(classification));
+				transaction.commit();
+				classificationCreated = true;
+			} finally {
+				if (!classificationCreated) {
+					transaction.abort();
+					throw new MDMEntityAccessException("Failed to create classification!");
+				}
+			}
+			
+		}
+		
+		
+		return classification;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
new file mode 100644
index 0000000..ded5f5f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
@@ -0,0 +1,471 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ATTRIBUTENAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTCOMPONENTNAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_CONTEXTTYPE;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.annotation.security.RolesAllowed;
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.container.ResourceContext;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.model.Classification;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.businessobjects.control.FileLinkActivity;
+import org.eclipse.mdm.businessobjects.entity.ContextResponse;
+import org.eclipse.mdm.businessobjects.entity.ContextSensorResponse;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
+import org.eclipse.mdm.businessobjects.service.ContextService;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+import io.vavr.control.Try;
+
+/**
+ * {@link TestStep} resource
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Tag(name = "TestStep")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/teststeps")
+public class TestStepResource {
+
+	@EJB
+	private TestStepService testStepService;
+
+	@EJB
+	private EntityService entityService;
+
+	@EJB
+	private ContextService contextService;
+
+	@EJB
+	private FileLinkActivity fileLinkActivity;
+
+	@Context
+	private ResourceContext resourceContext;
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the TestStep result
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Operation(summary = "Find TestSteps by filter", description = "Get list of TestSteps", responses = {
+			@ApiResponse(description = "The projects", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	public Response getTestSteps(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "Filter expression", required = false) @QueryParam("filter") String filter) {
+
+		return Try.of(() -> testStepService.getTestSteps(sourceName, filter)).map(List::ofAll)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK, TestStep.class))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the search attributes", description = "Get a list of search attributes", responses = {
+			@ApiResponse(description = "The search attributes", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try.of(() -> testStepService.getSearchAttributes(sourceName))
+				.map(attrs -> ServiceUtils.toResponse(new SearchAttributeResponse(attrs), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TestStep}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Find a TestStep by ID", description = "Returns TestStep based on ID", responses = {
+			@ApiResponse(description = "The TestStep", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response findTestStep(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the TestStep", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), TestStep.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TestStep}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the complete context data for a TestStep", description = "Returns the complete context", responses = {
+			@ApiResponse(responseCode = "200", description = "The TestStep context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
+	public Response findContext(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the TestStep", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return contextService.getTestStepContext(V(sourceName), V(id)).map(ServiceUtils::contextMapToJava)
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link TestStep} with all parameters set in the given
+	 * JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TestStep} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of the updated {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
+//	@RolesAllowed({ "write-user" })
+	public Response updateContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), TestStep.class, V(id))
+				.map(testStep -> contextService.updateContext(body, testStep)).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TestStep}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the UnitUnderTest context data for a TestStep", description = "Returns the complete context", responses = {
+			@ApiResponse(responseCode = "200", description = "The UnitUnderTest context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
+	public Response findContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return contextService.getTestStepContext(V(sourceName), V(id), ContextType.UNITUNDERTEST)
+				.map(ServiceUtils::contextMapToJava).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link ContextType} UNITUNDERTEST of {@link TestStep}
+	 * with all parameters set in the given JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TestStep} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of {@link ContextType} UNITUNDERTEST of the updated
+	 *         {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
+	@RolesAllowed({ "write-user" })
+	public Response updateContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), TestStep.class, V(id))
+				.map(testStep -> contextService.updateContext(body, testStep, ContextType.UNITUNDERTEST))
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TestStep}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the TestSequence context data for a TestStep", description = "Returns the TestSequence context data", responses = {
+			@ApiResponse(responseCode = "200", description = "The TestSequence context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
+	public Response findContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return contextService.getTestStepContext(V(sourceName), V(id), ContextType.TESTSEQUENCE)
+				.map(ServiceUtils::contextMapToJava).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link ContextType} TESTSEQUENCE of {@link TestStep}
+	 * with all parameters set in the given JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TestStep} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of {@link ContextType} TESTSEQUENCE of the updated
+	 *         {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
+	@RolesAllowed({ "write-user" })
+	public Response updateContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), TestStep.class, V(id))
+				.map(testStep -> contextService.updateContext(body, testStep, ContextType.TESTSEQUENCE))
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TestStep}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the TestEquipment context data for a TestStep", description = "Returns the TestEquipment context data", responses = {
+			@ApiResponse(responseCode = "200", description = "The TestEquipment context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
+	public Response findContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return contextService.getTestStepContext(V(sourceName), V(id), ContextType.TESTEQUIPMENT)
+				.map(ServiceUtils::contextMapToJava).map(ContextResponse::new)
+				.map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the context of {@link ContextType} TESTEQUIPMENT of {@link TestStep}
+	 * with all parameters set in the given JSON body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TestStep} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the context map of {@link ContextType} TESTEQUIPMENT of the updated
+	 *         {@link TestStep}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
+	@RolesAllowed({ "write-user" })
+	public Response updateContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id, String body) {
+
+		return entityService.find(V(sourceName), TestStep.class, V(id))
+				.map(testStep -> contextService.updateContext(body, testStep, ContextType.TESTEQUIPMENT))
+				.map(ContextResponse::new).map(contextResponse -> ServiceUtils.toResponse(contextResponse, Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link TestStep}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the Sensor context data", description = "Returns the Sensor context data of TestEquipments", responses = {
+			@ApiResponse(responseCode = "200", description = "The Sensor context data", content = @Content(schema = @Schema(implementation = ContextResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment/sensors")
+	public Response getContextTEQSensors(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+
+		return Try.of(() -> testStepService.getSensors(sourceName, id))
+				.map(sensorMap -> ServiceUtils.toResponse(new ContextSensorResponse(sensorMap), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * delegates the request to the {@link TestStepService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Operation(summary = "Get the TestStep localizations", description = "Returns TestStep localizations", responses = {
+			@ApiResponse(description = "The TestStep localizations", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+
+		return Try
+				.of(() -> new I18NResponse(testStepService.localizeType(sourceName),
+						testStepService.localizeAttributes(sourceName)))
+				.map(resp -> ServiceUtils.toResponse(resp, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link TestStep}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link TestStep} to create.
+	 * @return the created {@link TestStep} as {@link Response}.
+	 */
+	@POST
+	@Operation(summary = "Create a new TestStep", responses = {
+			@ApiResponse(description = "The created TestStep", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "500", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			String body) {
+
+		return entityService
+				.create(V(sourceName), TestStep.class,
+						entityService.extractRequestBody(body, sourceName,
+								List.of(Test.class, TemplateTestStep.class, Classification.class)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link TestStep} with all parameters set in the given JSON body
+	 * of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TestStep} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link TestStep}
+	 */
+	@PUT
+	@Operation(summary = "Update an existing TestStep", description = "Updates the TestStep with all parameters set in the body of the request.", responses = {
+			@ApiResponse(description = "The updated Project", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	@RolesAllowed({ "write-user" })
+	public Response update(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the TestStep", required = true) @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), TestStep.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link TestStep}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link TestStep} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Operation(summary = "Delete an existing TestStep", responses = {
+			@ApiResponse(description = "The deleted TestStep", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
+			@ApiResponse(responseCode = "400", description = "Invalid ID supplied") })
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@Parameter(description = "ID of the TestStep", required = true) @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), TestStep.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	@Path("/{" + REQUESTPARAM_ID + "}/contexts/{" + REQUESTPARAM_CONTEXTTYPE + "}/{" + REQUESTPARAM_CONTEXTCOMPONENTNAME
+			+ "}/{" + REQUESTPARAM_ATTRIBUTENAME + "}/files")
+	public ContextFilesSubresource getContextFilesSubresource() {
+		ContextFilesSubresource resource = resourceContext.getResource(ContextFilesSubresource.class);
+		resource.setEntityClass(TestStep.class);
+		return resource;
+	}
+
+	@Path("/{" + REQUESTPARAM_ID + "}/files")
+	public FilesAttachableSubresource getFilesAttachableSubresource() {
+		FilesAttachableSubresource resource = resourceContext.getResource(FilesAttachableSubresource.class);
+		resource.setEntityClass(TestStep.class);
+		return resource;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepService.java
new file mode 100644
index 0000000..1f899ca
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepService.java
@@ -0,0 +1,204 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextSensor;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.control.ContextActivity;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * TestStepService Bean implementation with available {@link TestStep}
+ * operations
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class TestStepService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private I18NActivity i18nActivity;
+	@EJB
+	private NavigationActivity navigationActivity;
+	@EJB
+	private ContextActivity contextActivity;
+	@EJB
+	private SearchActivity searchActivity;
+
+	/**
+	 * returns the matching {@link TestStep}s using the given filter or all
+	 * {@link TestStep}s if no filter is available
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the TestStep result
+	 * @return the found {@link TestStep}s
+	 */
+	public List<TestStep> getTestSteps(String sourceName, String filter) {
+		try {
+
+			ApplicationContext context = this.connectorService.getContextByName(sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			if (filter == null || filter.trim().length() <= 0) {
+				return em.loadAll(TestStep.class);
+			}
+
+			if (ServiceUtils.isParentFilter(context, filter, TestStep.PARENT_TYPE_TEST)) {
+				String id = ServiceUtils.extactIdFromParentFilter(context, filter, TestStep.PARENT_TYPE_TEST);
+				return this.navigationActivity.getTestSteps(sourceName, id);
+			}
+
+			return this.searchActivity.search(context, TestStep.class, filter);
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns the {@link SearchAttribute} for the entity type TestStep in the given
+	 * data source.
+	 * 
+	 * @param sourceName The name of the data source.
+	 * @return the found {@link SearchAttribute}s
+	 */
+	public List<SearchAttribute> getSearchAttributes(String sourceName) {
+		return this.searchActivity.listAvailableAttributes(this.connectorService.getContextByName(sourceName),
+				TestStep.class);
+	}
+
+	/**
+	 * returns a {@link TestStep} identified by the given id.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link TestStep}
+	 * @return the matching {@link TestStep}
+	 */
+	public TestStep getTestStep(String sourceName, String testStepId) {
+		try {
+			return this.connectorService.getContextByName(sourceName).getEntityManager()
+					.map(em -> em.load(TestStep.class, testStepId))
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns the complete context data (ordered and measured) for a
+	 * {@link TestStep}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link TestStep}
+	 * @return a map with the complete context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContext(String sourceName, String testStepId) {
+		return this.contextActivity.getTestStepContext(sourceName, testStepId);
+	}
+
+	/**
+	 * returns the UnitUnderTest context data (ordered and measured) for a
+	 * {@link TestStep}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link TestStep}
+	 * @return a map with the UnitUnderTest context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContextUUT(String sourceName, String testStepId) {
+		return this.contextActivity.getTestStepContext(sourceName, testStepId, ContextType.UNITUNDERTEST);
+	}
+
+	/**
+	 * returns the TestSequence context data (ordered and measured) for a
+	 * {@link TestStep}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link TestStep}
+	 * @return a map with the TestSequence context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContextTSQ(String sourceName, String testStepId) {
+		return this.contextActivity.getTestStepContext(sourceName, testStepId, ContextType.TESTSEQUENCE);
+	}
+
+	/**
+	 * returns the TestEquipment context data (ordered and measured) for a
+	 * {@link TestStep}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link TestStep}
+	 * @return a map with the TestEquipment context data (ordered and measured)
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getContextTEQ(String sourceName, String testStepId) {
+		return this.contextActivity.getTestStepContext(sourceName, testStepId, ContextType.TESTEQUIPMENT);
+	}
+
+	/**
+	 * returns all sensor context data of TestEquipment sensor configuration
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param testStepId id of the {@link TestStep}
+	 * @return a map with the TestEquipment sensor context data (ordered and
+	 *         measured)
+	 */
+	public Map<String, List<ContextSensor>> getSensors(String sourceName, String testStepId) {
+		return this.contextActivity.getTestStepSensorContext(sourceName, testStepId);
+	}
+
+	/**
+	 * returns localized {@link TestStep} attributes
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link TestStep} attributes
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName) {
+		return this.i18nActivity.localizeAttributes(sourceName, TestStep.class);
+	}
+
+	/**
+	 * returns the localized {@link TestStep} type name
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the localized {@link TestStep} type name
+	 */
+	public Map<EntityType, String> localizeType(String sourceName) {
+		return this.i18nActivity.localizeType(sourceName, TestStep.class);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/UnitResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/UnitResource.java
new file mode 100644
index 0000000..62cf093
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/UnitResource.java
@@ -0,0 +1,184 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_PHYSICALDIMENSION_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.PhysicalDimension;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link Unit} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "Unit")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/units")
+public class UnitResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link Unit}. {@link WebApplicationException} on error.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link Unit}
+	 * @return the found {@link Unit} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), Unit.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link Unit}s.
+	 * 
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link Unit} result
+	 * @return the (filtered) {@link Unit}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@QueryParam("filter") String filter) {
+		return entityService.findAll(V(sourceName), Unit.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link Unit}.
+	 * 
+	 * 
+	 * @param body The {@link Unit} to create.
+	 * @return the created {@link Unit} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), Unit.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), PhysicalDimension.class,
+										requestBody.getStringValueSupplier(ENTITYATTRIBUTE_PHYSICALDIMENSION_ID))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link Unit} with all parameters set in the given JSON body of
+	 * the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link Unit} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link Unit}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), Unit.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link Unit}. {@link WebApplicationException}
+	 * on error.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link Unit} to delete.
+	 * @return the deleted {@link Unit }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), Unit.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link Unit} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), Unit.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), Unit.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/UserResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/UserResource.java
new file mode 100644
index 0000000..c5d74d8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/UserResource.java
@@ -0,0 +1,76 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.security.PermitAll;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.SecurityContext;
+
+import org.eclipse.mdm.businessobjects.entity.User;
+
+import com.google.common.base.Splitter;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@Tag(name = "User")
+@Path("/user")
+@PermitAll
+public class UserResource {
+
+	@Context
+	public SecurityContext securityContext;
+
+	@GET
+	@Path("/current")
+	@Operation(summary = "Read authenticated user information", description = "Read the current user name and which of the given roles the user has.", responses = {
+			@ApiResponse(description = "The authenticated user.", content = @Content(schema = @Schema(implementation = User.class))),
+			@ApiResponse(responseCode = "400", description = "Error") })
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response currentUser(
+			@Parameter(description = "Comma separated list of roles. This method checks, if the user belongs to each role. If the user does not belong to a role or the role is not queried, it will not be returned.", required = true) @QueryParam("roles") String roles) {
+		/*
+		 * There is no reliable way in getting the (possibly mapped) roles of a user.
+		 * Thus the check if a user is in a role is only against the given list of
+		 * roles.
+		 */
+		List<String> roleList = new ArrayList<>();
+		if (roles != null) {
+			for (String role : Splitter.on(",").trimResults().split(roles)) {
+				if (securityContext.isUserInRole(role)) {
+					roleList.add(role);
+				}
+			}
+		}
+
+		User user = new User();
+		user.setUsername(securityContext.getUserPrincipal().getName());
+		user.setRoles(roleList);
+		return Response.ok(user).build();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValueListResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValueListResource.java
new file mode 100644
index 0000000..31537b6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValueListResource.java
@@ -0,0 +1,177 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.api.dflt.model.ValueListValue;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link ValueList} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "ValueList")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/valuelists")
+public class ValueListResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link ValueList}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link ValueList}
+	 * @return the found {@link ValueList} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.find(V(sourceName), ValueList.class, V(id))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link ValueList}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link ValueList} result
+	 * @return the (filtered) {@link ValueList}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@QueryParam("filter") String filter) {
+		return entityService.findAll(V(sourceName), ValueList.class, filter)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link ValueList}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param body       The {@link ValueList} to create.
+	 * @return the created {@link ValueList} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), ValueList.class, L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link ValueList} with all parameters set in the given JSON body
+	 * of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link ValueListValue} to update.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link ValueList}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
+			String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), ValueList.class, V(id)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link ValueList}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link ValueList} to delete.
+	 * @return the deleted {@link ValueList }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String id) {
+		return entityService.delete(V(sourceName), entityService.find(V(sourceName), ValueList.class, V(id)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link ValueList} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), ValueList.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), ValueList.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValueListValueResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValueListValueResource.java
new file mode 100644
index 0000000..4d00bff
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValueListValueResource.java
@@ -0,0 +1,188 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
+import static org.eclipse.mdm.businessobjects.service.EntityService.L;
+import static org.eclipse.mdm.businessobjects.service.EntityService.SL;
+import static org.eclipse.mdm.businessobjects.service.EntityService.V;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.api.dflt.model.ValueListValue;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.vavr.collection.List;
+
+/**
+ * {@link ValueListValue} resource handling REST requests
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Tag(name = "ValueList")
+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/valuelists/{" + REQUESTPARAM_ID + "}/values")
+public class ValueListValueResource {
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Returns the found {@link ValueListValue}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         id of the {@link ValueListValue}
+	 * @return the found {@link ValueListValue} as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String valueListId, @PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService.find(V(sourceName), ValueListValue.class, V(id), SL(valueListId))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the (filtered) {@link ValueListValue}s.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param filter     filter string to filter the {@link ValueListValue} result
+	 * @return the (filtered) {@link ValueListValue}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String valueListId, @QueryParam("filter") String filter) {
+
+		return entityService.find(V(sourceName), ValueList.class, V(valueListId))
+				.map(valueList -> List.ofAll(valueList.getValueListValues()))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the created {@link ValueListValue}.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param valueListId id of the {@link ValueList} to create to value for
+	 * @param body        The {@link ValueListValue} to create.
+	 * @return the created {@link ValueListValue} as {@link Response}.
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String valueListId, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.create(V(sourceName), ValueListValue.class,
+						L(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME),
+								entityService.find(V(sourceName), ValueList.class, V(valueListId))))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Updates the {@link ValueListValue} with all parameters set in the given JSON
+	 * body of the request.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link ValueListValue} to delete.
+	 * @param body       the body of the request containing the attributes to update
+	 * @return the updated {@link ValueListValue}
+	 */
+	@PUT
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response update(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String valueListId, @PathParam(REQUESTPARAM_ID2) String id, String body) {
+		RequestBody requestBody = RequestBody.create(body);
+
+		return entityService
+				.update(V(sourceName), entityService.find(V(sourceName), ValueListValue.class, V(id), SL(valueListId)),
+						requestBody.getValueMapSupplier())
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Deletes and returns the deleted {@link ValueListValue}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         The identifier of the {@link ValueListValue} to delete.
+	 * @return the deleted {@link ValueListValue }s as {@link Response}
+	 */
+	@DELETE
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_ID2 + "}")
+	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_ID) String valueListId, @PathParam(REQUESTPARAM_ID2) String id) {
+		return entityService
+				.delete(V(sourceName), entityService.find(V(sourceName), ValueListValue.class, V(id), SL(valueListId)))
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER)
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Returns the search attributes for the {@link ValueListValue} type.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the {@link SearchAttribute}s as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/searchattributes")
+	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildSearchAttributesResponse(V(sourceName), ValueListValue.class, entityService);
+	}
+
+	/**
+	 * Returns a map of localization for the entity type and the attributes.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @return the I18N as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/localizations")
+	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
+		return ServiceUtils.buildLocalizationResponse(V(sourceName), ValueListValue.class, entityService);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValuesResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValuesResource.java
new file mode 100644
index 0000000..0169a8c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValuesResource.java
@@ -0,0 +1,85 @@
+/********************************************************************************

+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+

+package org.eclipse.mdm.businessobjects.boundary;

+

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.MEDIATYPE_APPLICATION_PROTOBUF;

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;

+

+import javax.ejb.EJB;

+import javax.ws.rs.Consumes;

+import javax.ws.rs.POST;

+import javax.ws.rs.Path;

+import javax.ws.rs.PathParam;

+import javax.ws.rs.Produces;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.Response;

+

+import org.eclipse.mdm.protobuf.Mdm;

+

+import io.swagger.v3.oas.annotations.Operation;

+import io.swagger.v3.oas.annotations.Parameter;

+import io.swagger.v3.oas.annotations.media.Content;

+import io.swagger.v3.oas.annotations.media.Schema;

+import io.swagger.v3.oas.annotations.parameters.RequestBody;

+import io.swagger.v3.oas.annotations.responses.ApiResponse;

+import io.swagger.v3.oas.annotations.tags.Tag;

+

+@Tag(name = "Values")

+@Consumes({ MEDIATYPE_APPLICATION_PROTOBUF, MediaType.APPLICATION_JSON })

+@Produces({ MEDIATYPE_APPLICATION_PROTOBUF, MediaType.APPLICATION_JSON })

+@Path("/environments/{" + REQUESTPARAM_SOURCENAME + "}/values")

+public class ValuesResource {

+

+	@EJB

+	private ValuesService valuesService;

+

+	@POST

+	@Path("read")

+	@Operation(summary = "Read measurement data", description = "Read measurement specified by a ReadRequest.", responses = {

+			@ApiResponse(description = "A list with MeasuredValues. Each MeasuredValues represents the values of a Channel.", content = @Content(schema = @Schema(implementation = Mdm.MeasuredValuesList.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	public Response read(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@RequestBody(description = "ReadRequest specifying the Channels and the portion of the Channel's data to read.", required = true, content = @Content(schema = @Schema(implementation = Mdm.ReadRequest.class))) Mdm.ReadRequest protoReadRequest) {

+

+		return Response.ok(valuesService.load(sourceName, protoReadRequest)).build();

+	}

+

+	@POST

+	@Path("write")

+	@Operation(summary = "Write measurement data", description = "Write measurement data for the specified ChannelGroup and Channels. Both ChannelGroup and Channels must exist.", responses = {

+			@ApiResponse(description = "An empty response"),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	public Response write(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@RequestBody(description = "WriteRequestList specifying the Channels and measurement data to write.", required = true, content = @Content(schema = @Schema(implementation = Mdm.WriteRequestList.class))) Mdm.WriteRequestList protoWriteRequestList) {

+

+		valuesService.write(sourceName, protoWriteRequestList);

+

+		return Response.noContent().build();

+	}

+

+	@POST

+	@Path("preview")

+	@Operation(summary = "Read preview data", description = "Read preview data for the specified ReadRequest. The number of chunks defines the number of returned values per channel. The original measured values are chunked and for each chunk the average, minimum and maximum values are calculated.", responses = {

+			@ApiResponse(description = "Average, minimum and maximum values for each chunk are returned as MeasuredValues. Each MeasuredValues represents the preview of a Channel where the lenght of MeasuredValues equals numberOfChunks.", content = @Content(schema = @Schema(implementation = Mdm.PreviewValuesList.class))),

+			@ApiResponse(responseCode = "400", description = "Error") })

+	public Response preview(

+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,

+			@RequestBody(description = "PreviewRequest specifying the Channels and number of chunks to read.", required = true, content = @Content(schema = @Schema(implementation = Mdm.PreviewRequest.class))) Mdm.PreviewRequest previewRequest) {

+

+		return Response.ok(valuesService.preview(sourceName, previewRequest)).build();

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValuesService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValuesService.java
new file mode 100644
index 0000000..5f96b50
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ValuesService.java
@@ -0,0 +1,328 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+

+package org.eclipse.mdm.businessobjects.boundary;

+

+import java.time.LocalDateTime;

+import java.time.ZoneId;

+import java.util.ArrayList;

+import java.util.List;

+

+import javax.ejb.Stateless;

+import javax.inject.Inject;

+

+import org.eclipse.mdm.api.base.Transaction;

+import org.eclipse.mdm.api.base.massdata.AnyTypeValuesBuilder;

+import org.eclipse.mdm.api.base.massdata.ComplexNumericalValuesBuilder;

+import org.eclipse.mdm.api.base.massdata.IndependentBuilder;

+import org.eclipse.mdm.api.base.massdata.ReadRequest;

+import org.eclipse.mdm.api.base.massdata.WriteRequest;

+import org.eclipse.mdm.api.base.massdata.WriteRequestBuilder;

+import org.eclipse.mdm.api.base.massdata.WriteRequestFinalizer;

+import org.eclipse.mdm.api.base.model.AxisType;

+import org.eclipse.mdm.api.base.model.Channel;

+import org.eclipse.mdm.api.base.model.ChannelGroup;

+import org.eclipse.mdm.api.base.model.DoubleComplex;

+import org.eclipse.mdm.api.base.model.Environment;

+import org.eclipse.mdm.api.base.model.FloatComplex;

+import org.eclipse.mdm.api.base.model.MeasuredValues;

+import org.eclipse.mdm.api.dflt.ApplicationContext;

+import org.eclipse.mdm.api.dflt.EntityManager;

+import org.eclipse.mdm.businessobjects.utils.PreviewHelper;

+import org.eclipse.mdm.businessobjects.utils.ProtobufConverter;

+import org.eclipse.mdm.connector.boundary.ConnectorService;

+import org.eclipse.mdm.protobuf.Mdm;

+import org.eclipse.mdm.protobuf.Mdm.MeasuredValuesList;

+import org.eclipse.mdm.protobuf.Mdm.PreviewRequest;

+import org.eclipse.mdm.protobuf.Mdm.PreviewValuesList;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ExplicitData;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ImplicitConstant;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ImplicitLinear;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ImplicitSaw;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.RawLinear;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.RawLinearCalibrated;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.RawPolynomial;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+

+import com.google.common.base.Supplier;

+import com.google.common.base.Suppliers;

+import com.google.common.primitives.Booleans;

+import com.google.common.primitives.Doubles;

+import com.google.common.primitives.Floats;

+import com.google.common.primitives.Ints;

+import com.google.common.primitives.Longs;

+import com.google.common.primitives.Shorts;

+

+@Stateless

+public class ValuesService {

+

+	private static final Logger LOG = LoggerFactory.getLogger(ValuesService.class);

+

+	@Inject

+	private ConnectorService connectorService;

+

+	/**

+	 * Loads multiple MeasuredValues as specified in ReadRequest.

+	 * 

+	 * @param sourceName       name of the source (MDM {@link Environment} name)

+	 * @param protoReadRequest Protobuf ReadRequest

+	 * @return the loaded MeasuredValuesList

+	 */

+	public MeasuredValuesList load(String sourceName, Mdm.ReadRequest protoReadRequest) {

+

+		ApplicationContext context = connectorService.getContextByName(sourceName);

+

+		ReadRequest readRequest = ProtobufConverter.convert(context, protoReadRequest);

+

+		List<MeasuredValues> measuredValues = context.getEntityManager().get().readMeasuredValues(readRequest);

+

+		return ProtobufConverter.convert(measuredValues);

+	}

+

+	/**

+	 * Loads preview values for multiple channels as specified in

+	 * {@link PreviewRequest}. The preview consists of minimum (min), maximum (max)

+	 * and average (avg) values for each chunk of values. The number of chunks must

+	 * be given in {@link PreviewRequest}.

+	 * 

+	 * @param sourceName       name of the source (MDM {@link Environment} name)

+	 * @param protoReadRequest Protobuf {@link PreviewRequest}

+	 * @return the loaded PreviewValuesList

+	 */

+	public PreviewValuesList preview(String sourceName, Mdm.PreviewRequest previewRequest) {

+		ApplicationContext context = connectorService.getContextByName(sourceName);

+

+		ReadRequest readRequest = ProtobufConverter.convert(context, previewRequest.getReadRequest());

+

+		List<Mdm.MeasuredValues> measuredValues = ProtobufConverter

+				.convert(context.getEntityManager().get().readMeasuredValues(readRequest)).getValuesList();

+

+		// Calculate Preview

+		return new PreviewHelper().calculatePreview(measuredValues, previewRequest.getNumberOfChunks());

+	}

+

+	/**

+	 * Writes values for multiple Channels.

+	 * 

+	 * @param sourceName            name of the source (MDM {@link Environment}

+	 *                              name)

+	 * @param protoWriteRequestList Protobuf {@link WriteRequest}

+	 */

+	public void write(String sourceName, Mdm.WriteRequestList protoWriteRequestList) {

+		ApplicationContext context = connectorService.getContextByName(sourceName);

+		Supplier<ZoneId> zoneId = Suppliers

+				.memoize(() -> getServerZoneId(context.getEntityManager().get().loadEnvironment()));

+

+		List<WriteRequest> writeRequests = new ArrayList<>();

+		for (Mdm.WriteRequestList.WriteRequest r : protoWriteRequestList.getValuesList()) {

+			writeRequests.add(convert(context, r, zoneId));

+		}

+

+		Transaction t = context.getEntityManager().get().startTransaction();

+		t.writeMeasuredValues(writeRequests);

+		t.commit();

+	}

+

+	/**

+	 * Converts a Protobuf to a api.base WritRequest.

+	 * 

+	 * @param context           {@link ApplicationContext} to write to.

+	 * @param protoWriteRequest Data to write.

+	 * @param zoneId            A supplier for a {@link ZoneId} which will be used,

+	 *                          if Data with DT_DATE is written.

+	 * @return converted {@link WriteRequest}

+	 */

+	private WriteRequest convert(ApplicationContext context, Mdm.WriteRequestList.WriteRequest protoWriteRequest,

+			Supplier<ZoneId> zoneId) {

+		EntityManager em = context.getEntityManager().get();

+

+		ChannelGroup channelGroup = em.load(ChannelGroup.class, protoWriteRequest.getChannelGroupId());

+		Channel channel = em.load(Channel.class, protoWriteRequest.getChannelId());

+		AxisType axisType = ProtobufConverter.convert(protoWriteRequest.getAxisType());

+

+		WriteRequestBuilder rb = WriteRequest.create(channelGroup, channel, axisType);

+

+		WriteRequestFinalizer wrf;

+		switch (protoWriteRequest.getDataCase()) {

+		case EXPLICIT:

+			wrf = setValues(rb.explicit(), protoWriteRequest.getExplicit(), zoneId);

+			break;

+		case IMPLICIT_CONSTANT:

+			ImplicitConstant ic = protoWriteRequest.getImplicitConstant();

+			wrf = rb.implicitConstant(ProtobufConverter.convert(ic.getScalarType()), ic.getOffset());

+			break;

+		case IMPLICIT_LINEAR:

+			ImplicitLinear il = protoWriteRequest.getImplicitLinear();

+			wrf = rb.implicitLinear(ProtobufConverter.convert(il.getScalarType()), il.getStart(), il.getIncrement());

+			break;

+		case IMPLICIT_SAW:

+			ImplicitSaw is = protoWriteRequest.getImplicitSaw();

+			wrf = rb.implicitSaw(ProtobufConverter.convert(is.getScalarType()), is.getStart(), is.getIncrement(),

+					is.getStop());

+			break;

+		case RAW_LINEAR:

+			RawLinear rl = protoWriteRequest.getRawLinear();

+			wrf = setValues(rb.rawLinear(rl.getOffset(), rl.getFactor()), rl.getValues(), zoneId);

+			break;

+		case RAW_LINEAR_CALIBRATED:

+			RawLinearCalibrated rlc = protoWriteRequest.getRawLinearCalibrated();

+			wrf = setValues(rb.rawLinearCalibrated(rlc.getOffset(), rlc.getFactor(), rlc.getCalibration()),

+					rlc.getValues(), zoneId);

+			break;

+		case RAW_POLYNOMIAL:

+			RawPolynomial rp = protoWriteRequest.getRawPolynomial();

+			wrf = setValues(rb.rawPolynomial(Doubles.toArray(rp.getCoefficientsList())), rp.getValues(), zoneId);

+			break;

+		case DATA_NOT_SET:

+		default:

+			throw new RuntimeException("Not supported yet: " + protoWriteRequest.getDataCase());

+

+		}

+

+		// TODO mkoller 04.11.2019, Unit conversion is not yet supported.

+

+//		if (wrf instanceof UnitBuilder) {

+//			// Unit convertion not supported yet!

+//			Unit unit = context.getEntityManager().get().load(Unit.class, "" + protoWriteRequest.getUnitId());

+//			wrf = ((UnitBuilder) wrf).sourceUnit(unit);

+//		}

+//		if (wrf instanceof UnitIndependentBuilder) {

+//			// Unit convertion not supported yet!

+//			Unit unit = context.getEntityManager().get().load(Unit.class, "" + protoWriteRequest.getUnitId());

+//			wrf = ((UnitBuilder) wrf).sourceUnit(unit);

+//		}

+

+		if (wrf instanceof IndependentBuilder) {

+			wrf = ((IndependentBuilder) wrf).independent(protoWriteRequest.getIndependent());

+		}

+		return wrf.build();

+

+	}

+

+	/**

+	 * Helper function to set values for the appropriate datatype in an

+	 * {@link AnyTypeValuesBuilder}

+	 * 

+	 * @param builder

+	 * @param explicitData

+	 * @param zoneId

+	 * @return {@link WriteRequestFinalizer}

+	 */

+	private WriteRequestFinalizer setValues(AnyTypeValuesBuilder builder, ExplicitData explicitData,

+			Supplier<ZoneId> zoneId) {

+		boolean[] flags = Booleans.toArray(explicitData.getFlagsList());

+		switch (explicitData.getValuesCase()) {

+		case STRING_ARRAY:

+			String[] strings = ProtobufConverter.convertStrings(explicitData.getStringArray());

+			return (flags.length > 0) ? builder.stringValues(strings, flags) : builder.stringValues(strings);

+		case DATE_ARRAY:

+			LocalDateTime[] dates = ProtobufConverter.convertDates(explicitData.getDateArray(), zoneId.get());

+			return (flags.length > 0) ? builder.dateValues(dates, flags) : builder.dateValues(dates);

+		case BOOLEAN_ARRAY:

+			boolean[] booleans = Booleans.toArray(explicitData.getBooleanArray().getValuesList());

+			return (flags.length > 0) ? builder.booleanValues(booleans, flags) : builder.booleanValues(booleans);

+		case BYTE_STREAM_ARRAY:

+			byte[][] byteStreams = ProtobufConverter

+					.convertByteStreams(explicitData.getByteStreamArray().getValuesList());

+			return (flags.length > 0) ? builder.byteStreamValues(byteStreams, flags)

+					: builder.byteStreamValues(byteStreams);

+		case BYTE_ARRAY:

+		case SHORT_ARRAY:

+		case INTEGER_ARRAY:

+		case LONG_ARRAY:

+		case FLOAT_ARRAY:

+		case DOUBLE_ARRAY:

+		case FLOAT_COMPLEX_ARRAY:

+		case DOUBLE_COMPLEX_ARRAY:

+			return setValues((ComplexNumericalValuesBuilder) builder, explicitData, zoneId);

+		case VALUES_NOT_SET:

+		default:

+			throw new RuntimeException("No explicit data set!");

+		}

+	}

+

+	/**

+	 * Helper function to set values for the appropriate datatype in a

+	 * {@link ComplexNumericalValuesBuilder}.

+	 * 

+	 * @param builder

+	 * @param explicitData

+	 * @param zoneId

+	 * @return {@link WriteRequestFinalizer}

+	 */

+	private WriteRequestFinalizer setValues(ComplexNumericalValuesBuilder builder, ExplicitData explicitData,

+			Supplier<ZoneId> zoneId) {

+		boolean[] flags = Booleans.toArray(explicitData.getFlagsList());

+		switch (explicitData.getValuesCase()) {

+		case STRING_ARRAY:

+		case DATE_ARRAY:

+		case BOOLEAN_ARRAY:

+		case BYTE_STREAM_ARRAY:

+			throw new RuntimeException(

+					explicitData.getValuesCase() + " not supported by ComplexNumericalValuesBuilder!");

+		case BYTE_ARRAY:

+			byte[] bytes = explicitData.getByteArray().getValues().toByteArray();

+			return (flags.length > 0) ? builder.byteValues(bytes, flags) : builder.byteValues(bytes);

+		case SHORT_ARRAY:

+			short[] shorts = Shorts.toArray(explicitData.getShortArray().getValuesList());

+			return (flags.length > 0) ? builder.shortValues(shorts, flags) : builder.shortValues(shorts);

+		case INTEGER_ARRAY:

+			int[] ints = Ints.toArray(explicitData.getIntegerArray().getValuesList());

+			return (flags.length > 0) ? builder.integerValues(ints, flags) : builder.integerValues(ints);

+		case LONG_ARRAY:

+			long[] longs = Longs.toArray(explicitData.getLongArray().getValuesList());

+			return (flags.length > 0) ? builder.longValues(longs, flags) : builder.longValues(longs);

+		case FLOAT_ARRAY:

+			float[] floats = Floats.toArray(explicitData.getFloatArray().getValuesList());

+			return (flags.length > 0) ? builder.floatValues(floats, flags) : builder.floatValues(floats);

+		case DOUBLE_ARRAY:

+			double[] doubles = Doubles.toArray(explicitData.getDoubleArray().getValuesList());

+			return (flags.length > 0) ? builder.doubleValues(doubles, flags) : builder.doubleValues(doubles);

+		case FLOAT_COMPLEX_ARRAY:

+			FloatComplex[] floatComplexes = ProtobufConverter

+					.convertFloatComplex(explicitData.getFloatComplexArray().getValuesList());

+			return (flags.length > 0) ? builder.floatComplexValues(floatComplexes, flags)

+					: builder.floatComplexValues(floatComplexes);

+		case DOUBLE_COMPLEX_ARRAY:

+			DoubleComplex[] doubleComplexes = ProtobufConverter

+					.convertDoubleComplex(explicitData.getDoubleComplexArray().getValuesList());

+			return (flags.length > 0) ? builder.doubleComplexValues(doubleComplexes, flags)

+					: builder.doubleComplexValues(doubleComplexes);

+		case VALUES_NOT_SET:

+		default:

+			throw new RuntimeException("No explicit data set!");

+		}

+	}

+

+	/**

+	 * Returns the ZonId configured in the {@link Environment}

+	 * 

+	 * @param env {@link Environment} for extracting the ZoneId

+	 * @return ZonId configured in the {@link Environment}

+	 */

+	private ZoneId getServerZoneId(Environment env) {

+		String timezone = env.getTimezone();

+		try {

+			return ZoneId.of(timezone);

+		} catch (Exception e) {

+			if (LOG.isDebugEnabled()) {

+				LOG.debug("Timezone '" + timezone + "' of Environment '" + env.getName() + "' is invalid!", e);

+			} else {

+				LOG.warn("Timezone '" + timezone + "' of Environment '" + env.getName() + "' is invalid!");

+			}

+			return ZoneId.systemDefault();

+		}

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/ContextActivity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/ContextActivity.java
new file mode 100644
index 0000000..88693f8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/ContextActivity.java
@@ -0,0 +1,249 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+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.ContextSensor;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * ContextActivity Bean implementation to get ordered and measured context data
+ * for {@link ContextDescribable} business objects (e.g. TestStep)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class ContextActivity implements Serializable {
+
+	public static final String CONTEXT_GROUP_ORDERED = "ordered";
+	public static final String CONTEXT_GROUP_MEASURED = "measured";
+
+	public static final String CONTEXT_SENSOR_GROUP_ORDERED = "sensor_ordered";
+	public static final String CONTEXT_SENSOR_GROUP_MEASURED = "sensor_measured";
+
+	@Inject
+	private ConnectorService connectorService;
+
+	/**
+	 * returns the ordered and measurement context for a {@link TestStep} MDM
+	 * business object identified by the given MDM system name and {@link TestStep}
+	 * ID. If no {@link ContextType}s are defined for this method call, the method
+	 * returns all context informations of the available {@link ContextType}s.
+	 * Otherwise you can specify a list of {@link ContextType}s.
+	 * 
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 * 
+	 * @param sourceName   the MDM system name
+	 * @param testStepID   instance id if the {@link TestStep}
+	 * @param contextTypes list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link TestStep}
+	 * @throws ContextProviderException if an error occurs during lookup the context
+	 *                                  informations
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getTestStepContext(String sourceName, String testStepID,
+			ContextType... contextTypes) {
+		try {
+
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			TestStep testStep = em.load(TestStep.class, testStepID);
+
+			Map<ContextType, ContextRoot> orderedContext = em.loadContexts(testStep, contextTypes);
+			Map<ContextType, ContextRoot> measuredContext = lookupMeasuredContextByTestStep(em, testStep, contextTypes);
+
+			Map<String, Map<ContextType, ContextRoot>> contextMap = new HashMap<>();
+			contextMap.put(CONTEXT_GROUP_ORDERED, orderedContext);
+			contextMap.put(CONTEXT_GROUP_MEASURED, measuredContext);
+
+			return contextMap;
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns the ordered and measurement context for a {@link Measurement} MDM
+	 * business object identified by the given MDM system name and
+	 * {@link Measurement} ID. If no {@link ContextType}s are defined for this
+	 * method call, the method returns all context informations of the available
+	 * {@link ContextType}s. Otherwise you can specify a list of
+	 * {@link ContextType}s.
+	 * 
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 * 
+	 * @param sourceName    the MDM system name
+	 * @param measurementID instance id if the {@link Measurement}
+	 * @param contextTypes  list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link Measurement}
+	 * @throws ContextProviderException if an error occurs during lookup the context
+	 *                                  informations
+	 */
+	public Map<String, Map<ContextType, ContextRoot>> getMeasurementContext(String sourceName, String measurementID,
+			ContextType... contextTypes) {
+
+		try {
+
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			Measurement measurement = em.load(Measurement.class, measurementID);
+
+			Map<ContextType, ContextRoot> measuredContext = em.loadContexts(measurement, contextTypes);
+			Map<ContextType, ContextRoot> orderedContext = lookupOrderedContextByMeasurement(em, measurement,
+					contextTypes);
+
+			Map<String, Map<ContextType, ContextRoot>> contextMap = new HashMap<>();
+			contextMap.put(CONTEXT_GROUP_ORDERED, orderedContext);
+			contextMap.put(CONTEXT_GROUP_MEASURED, measuredContext);
+
+			return contextMap;
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+
+	}
+
+	/**
+	 * returns the sensor context of the given {@link TestStep}. The sensor
+	 * informations will extracted from the TestEquipment part of the context data.
+	 * 
+	 * @param sourceName the MDM system name
+	 * @param testStepID instance id if the {@link TestStep}
+	 * @return a map with the TestEquipment sensor context data (ordered and
+	 *         measured)
+	 */
+	public Map<String, List<ContextSensor>> getTestStepSensorContext(String sourceName, String testStepID) {
+
+		try {
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+
+			TestStep testStep = em.load(TestStep.class, testStepID);
+
+			Map<ContextType, ContextRoot> orderedContext = em.loadContexts(testStep, ContextType.TESTEQUIPMENT);
+			Map<ContextType, ContextRoot> measuredContext = lookupMeasuredContextByTestStep(em, testStep,
+					ContextType.TESTEQUIPMENT);
+
+			return createSensorMap(orderedContext, measuredContext);
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns the sensor context of the given {@link Measurement}. The sensor
+	 * informations will extracted from the TestEquipment part of the context data.
+	 * 
+	 * @param sourceName    the MDM system name
+	 * @param measurementID instance id if the {@link Measurement}
+	 * @return a map with the TestEquipment sensor context data (ordered and
+	 *         measured)
+	 */
+	public Map<String, List<ContextSensor>> getMeasurementSensorContext(String sourceName, String measurementID) {
+		try {
+
+			EntityManager em = this.connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+			Measurement measurement = em.load(Measurement.class, measurementID);
+
+			Map<ContextType, ContextRoot> measuredContext = em.loadContexts(measurement, ContextType.TESTEQUIPMENT);
+			Map<ContextType, ContextRoot> orderedContext = lookupOrderedContextByMeasurement(em, measurement,
+					ContextType.TESTEQUIPMENT);
+
+			return createSensorMap(orderedContext, measuredContext);
+
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	private Map<ContextType, ContextRoot> lookupOrderedContextByMeasurement(EntityManager em, Measurement measurement,
+			ContextType... contextTypes) throws DataAccessException {
+
+		Optional<TestStep> optional = em.loadParent(measurement, Measurement.PARENT_TYPE_TESTSTEP);
+
+		if (!optional.isPresent()) {
+			return Collections.emptyMap();
+		}
+
+		TestStep testStep = optional.get();
+		return em.loadContexts(testStep, contextTypes);
+	}
+
+	private Map<ContextType, ContextRoot> lookupMeasuredContextByTestStep(EntityManager em, TestStep testStep,
+			ContextType... contextTypes) throws DataAccessException {
+
+		List<Measurement> childList = em.loadChildren(testStep, TestStep.CHILD_TYPE_MEASUREMENT);
+		if (childList.size() > 0) {
+			return em.loadContexts(childList.get(0), contextTypes);
+		}
+		return Collections.emptyMap();
+	}
+
+	private Map<String, List<ContextSensor>> createSensorMap(Map<ContextType, ContextRoot> orderedContext,
+			Map<ContextType, ContextRoot> measuredContext) {
+
+		Map<String, List<ContextSensor>> sensorMap = new HashMap<String, List<ContextSensor>>();
+
+		ContextRoot orderedContextRoot = orderedContext.get(ContextType.TESTEQUIPMENT);
+		if (orderedContextRoot != null) {
+			List<ContextSensor> orderedSensors = extractContextSensors(orderedContextRoot);
+			sensorMap.put(CONTEXT_SENSOR_GROUP_ORDERED, orderedSensors);
+		}
+
+		ContextRoot measuredContextRoot = measuredContext.get(ContextType.TESTEQUIPMENT);
+		if (measuredContextRoot != null) {
+			List<ContextSensor> measuredSensors = extractContextSensors(measuredContextRoot);
+			sensorMap.put(CONTEXT_SENSOR_GROUP_MEASURED, measuredSensors);
+		}
+
+		return sensorMap;
+	}
+
+	private List<ContextSensor> extractContextSensors(ContextRoot contextRoot) {
+		List<ContextSensor> contextSensors = new ArrayList<ContextSensor>();
+		List<ContextComponent> contextComponents = contextRoot.getContextComponents();
+		for (ContextComponent contextComponent : contextComponents) {
+			contextSensors.addAll(contextComponent.getContextSensors());
+		}
+		return contextSensors;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FileLinkActivity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FileLinkActivity.java
new file mode 100644
index 0000000..8faad3a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FileLinkActivity.java
@@ -0,0 +1,570 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.StreamingOutput;
+
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.file.FileService;
+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.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.FileLink.Format;
+import org.eclipse.mdm.api.base.model.FilesAttachable;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.MimeType;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.entity.FileSize;
+import org.eclipse.mdm.businessobjects.service.ContextService;
+import org.eclipse.mdm.businessobjects.service.DescribableContexts;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+import com.google.common.io.ByteStreams;
+
+import io.vavr.Tuple;
+import io.vavr.Tuple2;
+
+@Stateless
+public class FileLinkActivity {
+
+	@Inject
+	private ConnectorService connectorService;
+
+	@EJB
+	private ContextService contextService;
+
+	@EJB
+	private ContextActivity contextActivity;
+
+	/**
+	 * Loads size of File with given remotePath.
+	 * 
+	 * @param sourceName      name of the source (MDM {@link Environment})
+	 * @param filesAttachable the {@link FilesAttachable} {@link Entity} the file is
+	 *                        attached to
+	 * @param remotePath      the remotePath
+	 * @return the {@link FileSize}
+	 */
+	public FileSize loadFileSize(String sourceName, Entity entity, FileLink fileLink) {
+		FileService fileService = getFileService(sourceName);
+		return loadSize(entity, fileLink, fileService);
+	}
+
+	/**
+	 * Loads sizes for all files attached to the given entity.
+	 * 
+	 * @param sourceName      name of the source (MDM {@link Environment})
+	 * @param filesAttachable the {@link FilesAttachable} {@link Entity} the files
+	 *                        are attached to
+	 * @return the {@link FileSize}s as {@link List}
+	 */
+	public List<FileSize> loadFileSizes(String sourceName, FilesAttachable fileAttachable) {
+		FileService fileService = getFileService(sourceName);
+		return Arrays.asList(fileAttachable.getFileLinks()).stream()
+				.map(fileLink -> loadSize(fileAttachable, fileLink, fileService)).collect(Collectors.toList());
+	}
+
+	/**
+	 * Helping function to trigger the actual file size loading process via given
+	 * {@link FileService}
+	 * 
+	 * @param filesAttachable the {@link FilesAttachable} {@link Entity} the file is
+	 *                        attached to
+	 * @param fileLink        the {@link FileLink}
+	 * @param fileService     the {@link FileService}
+	 * @return the {@link FileSize}
+	 */
+	private FileSize loadSize(Entity entity, FileLink fileLink, FileService fileService) {
+		FileSize fileSize = new FileSize();
+		try {
+			fileService.loadSize(entity, fileLink);
+			fileSize.setRemotePath(fileLink.getRemotePath());
+			fileSize.setSize(fileLink.getSize(Format.BINARY));
+		} catch (IOException e) {
+			throw new MDMFileAccessException(e.getMessage(), e);
+		}
+		return fileSize;
+	}
+
+	/**
+	 * Persists file at file server. Creates a new {@link FileLink} (pointing at the
+	 * new file) and adds it to the {@link FilesAttachable}
+	 * 
+	 * @param sourceName      name of the source (MDM {@link Environment})
+	 * @param filesAttachable the {@link FilesAttachable} {@link Entity} the file is
+	 *                        attached to
+	 * @param fileName        the name of the file
+	 * @param fis             the {@code InputStream} with the file data
+	 * @param description     the file description. Default value is the file name.
+	 * @param mimeType        the mimeType of the file.
+	 * @return the {@link FileLink} to the created File
+	 */
+	public FileLink createFile(String sourceName, FilesAttachable filesAttachable, String fileName, InputStream fis,
+			String description, MimeType mimeType) {
+
+		FileLink fileLink = null;
+		try {
+			// Create new local FileLink
+			fileLink = newLocalFileLink(fileName, fis, description, mimeType);
+
+			// Upload fileLink. Upload will create remote path.
+			uploadFile(sourceName, filesAttachable, fileLink);
+
+			// Add file link to fileAttachable
+			filesAttachable.addFileLink(fileLink);
+
+			// Persist changes
+			persistEntity(sourceName, filesAttachable);
+		} catch (IOException e) {
+			throw new MDMFileAccessException(
+					String.format("File (%s, %s, %s) could not be created.", fileName, description, mimeType), e);
+		}
+		return fileLink;
+	}
+
+	/**
+	 * Persists file at file server. Creates a new {@link FileLink} (pointing at the
+	 * new file) and adds it to the specified context attribute
+	 * 
+	 * @param sourceName           name of the source (MDM {@link Environment})
+	 * @param contextDescribable   the {@link ContextDescribable}
+	 * @param fileName             the name of the file
+	 * @param fis                  the {@code InputStream} with the file data
+	 * @param description          the file description. Default value is the file
+	 *                             name.
+	 * @param mimeType             the mimeType of the file.
+	 * @param contextType          the {@link ContextType} holding the component
+	 * @param contextComponentName the name of the component holding the file link
+	 *                             attribute
+	 * @param attributeName        the name of the attribute holding the file link
+	 * @return
+	 */
+	public FileLink createFile(String sourceName, ContextDescribable contextDescribable, String fileName,
+			InputStream fis, String description, MimeType mimeType, ContextType contextType,
+			String contextComponentName, String attributeName) {
+
+		Map<ContextType, ContextRoot> contextMap = getContextMap(sourceName, contextDescribable, contextType);
+		Value value = findValueInContext(contextType, contextComponentName, contextMap, attributeName);
+
+		FileLink fileLink = null;
+		try {
+			// Create new local FileLink
+			fileLink = newLocalFileLink(fileName, fis, description, mimeType);
+			// Upload file to file server. Upload creates and sets remote path in fileLink.
+			uploadFile(sourceName, contextDescribable, fileLink);
+
+			// Since attributes of type FILE_LINK can hold a maximum of one file, the old
+			// file has to be deleted from fileServer
+			if (ValueType.FILE_LINK.equals(value.getValueType())) {
+				deleteFile(sourceName, contextDescribable, value.extract(ValueType.FILE_LINK));
+			}
+
+			// Adds file link to the context attribute
+			setOrAddFileLinkToValue(value, fileLink);
+
+			// Persist changes
+			DescribableContexts dc = createDescribableContext(contextDescribable, contextMap);
+			contextService.persist(dc);
+
+		} catch (IOException e) {
+			throw new MDMFileAccessException(
+					String.format("File (%s, %s, %s) could not be created.", fileName, description, mimeType), e);
+		}
+		return fileLink;
+	}
+
+	/**
+	 * Deletes file from file server and removes the related {@link FileLink} from
+	 * the {@link FilesAttachable}
+	 * 
+	 * @param sourceName      name of the source (MDM {@link Environment})
+	 * @param filesAttachable the {@link FilesAttachable} {@link Entity} the file is
+	 *                        attached to
+	 * @param remotePath      the remotePath
+	 * @return the {@link FileLink} to the deleted File
+	 */
+	public FileLink deleteFileLink(String sourceName, FilesAttachable filesAttachable, String remotePath) {
+
+		// Find file link
+		FileLink fileLink = findFileLinkAtFileAttachable(remotePath, filesAttachable);
+
+		// Delete file from FileServer
+		deleteFile(sourceName, filesAttachable, fileLink);
+
+		// Remove FileLink from FileAttachable
+		filesAttachable.removeFileLink(fileLink);
+
+		// Persist changes
+		persistEntity(sourceName, filesAttachable);
+
+		return fileLink;
+	}
+
+	/**
+	 * Deletes file from file server and removes the related {@link FileLink} from
+	 * the specified context attribute.
+	 * 
+	 * @param sourceName           name of the source (MDM {@link Environment})
+	 * @param contextDescribable   the context describable
+	 * @param contextType          the {@link ContextType} holding the component
+	 * @param contextComponentName the name of the component holding the file link
+	 *                             attribute
+	 * @param attributeName        the name of the attribute holding the file link
+	 * @param remotePath           the remotePath
+	 * @return
+	 */
+	public FileLink deleteFileLink(String sourceName, ContextDescribable contextDescribable, ContextType contextType,
+			String contextComponentName, String attributeName, String remotePath) {
+
+		// Find link attribute in context
+		Map<ContextType, ContextRoot> contextMap = getContextMap(sourceName, contextDescribable, contextType);
+		Value value = findValueInContext(contextType, contextComponentName, contextMap, attributeName);
+		FileLink fileLink = extractFileLink(remotePath, value);
+
+		// Delete the file from file Server
+		deleteFile(sourceName, contextDescribable, fileLink);
+
+		// Removes file link from the context attribute
+		removeFileLinkfromValue(value, fileLink);
+
+		// Persist changes
+		DescribableContexts dc = createDescribableContext(contextDescribable, contextMap);
+		contextService.persist(dc);
+		return fileLink;
+	}
+
+	/**
+	 * Helping function to find the {@link FileLink} with the specified remotePath
+	 * attached to the given entity.
+	 * 
+	 * @param remotePath      the remotePath
+	 * @param filesAttachable the {@link ContextDescribable} the file is attached to
+	 * @return the specified {@link FileLink}
+	 */
+	public FileLink findFileLinkInContext(String remotePath, String sourceName, ContextDescribable contextDescribable,
+			ContextType contextType, String contextComponentName, String attributeName) {
+		Map<ContextType, ContextRoot> contextMap = getContextMap(sourceName, contextDescribable, contextType);
+		Value value = findValueInContext(contextType, contextComponentName, contextMap, attributeName);
+		return extractFileLink(remotePath, value);
+	}
+
+	/**
+	 * Helping function to find the {@link FileLink} with the specified remotePath
+	 * attached to the given entity.
+	 * 
+	 * @param remotePath      the remotePath
+	 * @param filesAttachable the {@link FilesAttachable} the file is attached to
+	 * @return the specified {@link FileLink}
+	 */
+	public FileLink findFileLinkAtFileAttachable(String remotePath, FilesAttachable entity) {
+		for (FileLink l : ((FilesAttachable) entity).getFileLinks()) {
+			if (l.isRemote() && l.getRemotePath().equals(remotePath)) {
+				return l;
+			}
+		}
+		throw new MDMEntityAccessException("FileLink with remotePath " + remotePath + " not found!");
+	}
+
+	public StreamingOutput toStreamingOutput(String sourceName, Entity entity, FileLink fileLink) {
+		return new StreamingOutput() {
+			@Override
+			public void write(OutputStream output) throws IOException, WebApplicationException {
+				streamFileLink(sourceName, entity, fileLink, output);
+			}
+		};
+	}
+
+	/**
+	 * Creates {@link StreamingOutput} for file. Guesses mime-type to ensure proper
+	 * display/download functionality at client side.
+	 * 
+	 * @TODO Mime-type guess works only for limited types, but CorbaFileServer does
+	 *       not offer methods to properly load mime-type. Find a solution!
+	 * 
+	 * @param sourceName
+	 * @param entity
+	 * @param fileLink
+	 * @return
+	 */
+	public Tuple2<StreamingOutput, String> toStreamingOutputGuessMimeType(String sourceName, Entity entity,
+			FileLink fileLink) {
+		String m = null;
+		StreamingOutput o = null;
+		try {
+			InputStream in = getFileService(sourceName).openStream(entity, fileLink);
+			m = URLConnection.guessContentTypeFromStream(in);
+			o = new StreamingOutput() {
+				public void write(OutputStream output) throws IOException, WebApplicationException {
+					ByteStreams.copy(in, output);
+				}
+			};
+		} catch (IOException e) {
+			throw new MDMFileAccessException(e.getMessage(), e);
+		}
+		return Tuple.of(o, m);
+	}
+
+	/**
+	 * Helping function to physically delete file from file server
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment})
+	 * @param entity     the {@link Entity} the file is attached to or holding the
+	 *                   context with the file attribute
+	 * @param fileLink   the {@link FileLink} related to the file
+	 */
+	private void deleteFile(String sourceName, Entity entity, FileLink fileLink) {
+		FileService fileService = getFileService(sourceName);
+		fileService.delete(entity, fileLink);
+	}
+
+	/**
+	 * Helping function to physically upload file to file server
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment})
+	 * @param entity     the {@link Entity} the file is attached to or holding the
+	 *                   context with the file attribute
+	 * @param fileLink   the {@link FileLink} related to the file
+	 */
+	private void uploadFile(String sourceName, Entity entity, FileLink fileLink) throws IOException {
+		FileService fileService = getFileService(sourceName);
+		List<FileLink> fileLinks = new ArrayList<>();
+		fileLinks.add(fileLink);
+		fileService.uploadSequential(entity, fileLinks, null);
+	}
+
+	/**
+	 * Helping function to persist an {@link Entity}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment})
+	 * @param entity     the {@link Entity} the file is attached to or holding the
+	 *                   context with the file attribute
+	 */
+	private void persistEntity(String sourceName, Entity entity) {
+		List<Entity> enteties = new ArrayList<>();
+		enteties.add(entity);
+
+		EntityManager em = getEntityManager(sourceName);
+		Transaction t = em.startTransaction();
+		t.update(enteties);
+		t.commit();
+	}
+
+	/**
+	 * Helping function to create new local {@FileLink}. Sets filename as default
+	 * description, if no description is provided.
+	 * 
+	 * @param fileName    the file name
+	 * @param fis         the file {@link InputStream}
+	 * @param description the file description
+	 * @param mimeType    the files {@link MimeType}
+	 * @return the new {@FileLink}
+	 * @throws IOException
+	 */
+	private FileLink newLocalFileLink(String fileName, InputStream fis, String description, MimeType mimeType)
+			throws IOException {
+		String desc = (description == null || description.isEmpty()) ? fileName : description;
+		return FileLink.newLocal(fis, fileName, -1, mimeType, desc);
+	}
+
+	/**
+	 * Helping function to load context for {@link ContextDescribable}s.
+	 * 
+	 * Notice: For {@link TestStep}s only the ordered context is loaded. For
+	 * {@link Measurement}s only the measured context is loaded.
+	 * 
+	 * @param sourceName         name of the source (MDM {@link Environment})
+	 * @param contextDescribable the {@link ContextDescribable}
+	 * @param contextType        the {@link ContextType} holding the component
+	 * @return
+	 */
+	private Map<ContextType, ContextRoot> getContextMap(String sourceName, ContextDescribable contextDescribable,
+			ContextType contextType) {
+		if (contextDescribable instanceof TestStep) {
+			return contextActivity.getTestStepContext(sourceName, contextDescribable.getID(), contextType)
+					.get(ContextActivity.CONTEXT_GROUP_ORDERED);
+		} else if (contextDescribable instanceof Measurement) {
+			return contextActivity.getMeasurementContext(sourceName, contextDescribable.getID(), contextType)
+					.get(ContextActivity.CONTEXT_GROUP_MEASURED);
+		}
+		throw new MDMEntityAccessException(
+				"No context of type " + contextType + " not found for " + contextDescribable.toString());
+	}
+
+	/**
+	 * Helping function to add {@link FileLink} to a {@link Value}
+	 * 
+	 * @param value    the {@link Value}
+	 * @param fileLink the {@link FileLink}
+	 */
+	private void setOrAddFileLinkToValue(Value value, FileLink fileLink) {
+		if (ValueType.FILE_LINK.equals(value.getValueType())) {
+			value.set(fileLink);
+		} else if (ValueType.FILE_LINK_SEQUENCE.equals(value.getValueType())) {
+			// delete if exists or create if not exists.
+			FileLink[] old = value.extract(ValueType.FILE_LINK_SEQUENCE);
+			FileLink[] current = Arrays.copyOf(old, old.length + 1);
+			current[old.length] = fileLink;
+			value.set(current);
+		}
+	}
+
+	/**
+	 * Helping function to remove {@link FileLink} from a {@link Value}
+	 * 
+	 * @param value    the {@link Value}
+	 * @param fileLink the {@link FileLink}
+	 */
+	private void removeFileLinkfromValue(Value value, FileLink fileLink) {
+		if (ValueType.FILE_LINK.equals(value.getValueType())) {
+			value.set(null);
+		} else if (ValueType.FILE_LINK_SEQUENCE.equals(value.getValueType())) {
+			FileLink[] links = Stream.of(value.extract(ValueType.FILE_LINK_SEQUENCE))
+					.filter(link -> !link.equals(fileLink)).toArray(FileLink[]::new);
+			value.set(links);
+		}
+	}
+
+	/**
+	 * Helping function to create {@link DescribableContexts}
+	 * 
+	 * @param contextDescribable the {@link ContextDescribable}
+	 * @param contextMap         the context
+	 * @return
+	 */
+	private DescribableContexts createDescribableContext(ContextDescribable contextDescribable,
+			Map<ContextType, ContextRoot> contextMap) {
+		DescribableContexts dc = new DescribableContexts();
+		dc.setTestStep(contextService.getTestStep(contextDescribable));
+		if (contextDescribable instanceof TestStep) {
+			dc.setOrdered(contextMap);
+		}
+		if (contextDescribable instanceof Measurement) {
+			List<Measurement> list = new ArrayList<>();
+			list.add((Measurement) contextDescribable);
+			dc.setMeasurements(list);
+			dc.setMeasured(contextMap);
+		}
+		return dc;
+	}
+
+	/**
+	 * 
+	 * Helping function to extract {@link Value} from context
+	 * 
+	 * @param contextType
+	 * @param componentName
+	 * @param typeRootMap
+	 * @param attributeName
+	 * @return
+	 */
+	private Value findValueInContext(ContextType contextType, String componentName,
+			Map<ContextType, ContextRoot> typeRootMap, String attributeName) {
+
+		ContextRoot contextRoot = typeRootMap.get(contextType);
+		if (contextRoot != null) {
+			List<ContextComponent> components = contextRoot.getContextComponents().stream()
+					.filter(cc -> cc.getName().equals(componentName)).collect(Collectors.toList());
+			if (components != null && !components.isEmpty()) {
+				return components.get(0).getValue(attributeName);
+			}
+		}
+		throw new MDMEntityAccessException(
+				"ContextComponent with name " + componentName + " not found in context of type " + contextType);
+	}
+
+	/**
+	 * 
+	 * @param remotePath
+	 * @param value
+	 * @return
+	 */
+	private FileLink extractFileLink(String remotePath, Value value) {
+		FileLink fileLink = null;
+		if (ValueType.FILE_LINK.equals(value.getValueType())) {
+			fileLink = value.extract(ValueType.FILE_LINK);
+		} else if (ValueType.FILE_LINK_SEQUENCE.equals(value.getValueType())) {
+			List<FileLink> fileLinks = Stream.of(value.extract(ValueType.FILE_LINK_SEQUENCE))
+					.filter(link -> link.getRemotePath().equals(remotePath)).collect(Collectors.toList());
+			fileLink = fileLinks.get(0);
+		}
+		return fileLink;
+	}
+
+	/**
+	 * Opens an {@code InputStream} for given {@link FileLink} and copies it to
+	 * {@param outputStream}.
+	 * 
+	 * @param sourceName      name of the source (MDM {@link Environment})
+	 * @param filesAttachable the {@link FilesAttachable} {@link Entity} the file is
+	 *                        attached to
+	 * @param fileLink        the {@link FileLink}
+	 * @param outputStream    the {link OutputStream}
+	 * @throws IOException Thrown if unable to provide as stream
+	 */
+	private void streamFileLink(String sourceName, Entity entity, FileLink fileLink, OutputStream outputStream)
+			throws IOException {
+
+		try (InputStream in = getFileService(sourceName).openStream(entity, fileLink)) {
+			ByteStreams.copy(in, outputStream);
+		}
+	}
+
+	/**
+	 * Helping function to load an {@link FileService}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment})
+	 * @return the {@link FileService}
+	 */
+	private FileService getFileService(String sourceName) {
+		ApplicationContext context = this.connectorService.getContextByName(sourceName);
+		return context.getFileService()
+				.orElseThrow(() -> new MDMFileAccessException("FileService not present in '" + sourceName + "'."));
+	}
+
+	/**
+	 * Helping function to load an {@link EntityManager}
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment})
+	 * @return the {@link EntityManager}
+	 */
+	private EntityManager getEntityManager(String sourceName) {
+		ApplicationContext context = this.connectorService.getContextByName(sourceName);
+		return context.getEntityManager()
+				.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present in '" + sourceName + "'."));
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FilterParser.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FilterParser.java
new file mode 100644
index 0000000..d85ef55
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FilterParser.java
@@ -0,0 +1,486 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.antlr.v4.runtime.ANTLRInputStream;
+import org.antlr.v4.runtime.BaseErrorListener;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.RecognitionException;
+import org.antlr.v4.runtime.Recognizer;
+import org.antlr.v4.runtime.misc.ParseCancellationException;
+import org.antlr.v4.runtime.tree.TerminalNode;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarBaseVisitor;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarLexer;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.AndExpressionContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.AttributeContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.ComparatorExpressionContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.ListComparatorExpressionContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.NotExpressionContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.OrExpressionContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.UnaryComparatorExpressionContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.ValueContext;
+import org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.ValuesContext;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import com.google.common.base.Strings;
+import com.google.common.primitives.Booleans;
+import com.google.common.primitives.Bytes;
+import com.google.common.primitives.Doubles;
+import com.google.common.primitives.Floats;
+import com.google.common.primitives.Ints;
+import com.google.common.primitives.Longs;
+import com.google.common.primitives.Shorts;
+
+/**
+ * Class for parsing filter strings.
+ * 
+ * @author Matthias Koller
+ *
+ */
+public class FilterParser {
+
+	private FilterParser() {
+	}
+
+	/**
+	 * Visitor class to convert the parsed tree into a {@link Filter}.
+	 */
+	private static final class FilterVisitor extends FilterGrammarBaseVisitor<Filter> {
+		private List<EntityType> availableEntityTypes;
+
+		/**
+		 * Constructs a new Visitor operating on the given search attributes.
+		 * 
+		 * @param availableEntityTypes List of {@link EntityType}s to match the parsed
+		 *                             attributes against.
+		 */
+		private FilterVisitor(List<EntityType> availableEntityTypes) {
+			this.availableEntityTypes = availableEntityTypes;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.mdm.businessobjects.filter.FilterGrammarBaseVisitor#
+		 * visitAndExpression(org.eclipse.mdm.businessobjects.filter.FilterGrammarParser
+		 * .AndExpressionContext)
+		 */
+		@Override
+		public Filter visitAndExpression(AndExpressionContext ctx) {
+			return Filter.and().merge(visit(ctx.left), visit(ctx.right));
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.mdm.businessobjects.filter.FilterGrammarBaseVisitor#
+		 * visitOrExpression(org.eclipse.mdm.businessobjects.filter.FilterGrammarParser.
+		 * OrExpressionContext)
+		 */
+		@Override
+		public Filter visitOrExpression(OrExpressionContext ctx) {
+			return Filter.or().merge(visit(ctx.left), visit(ctx.right));
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.mdm.businessobjects.filter.FilterGrammarBaseVisitor#
+		 * visitNotExpression(org.eclipse.mdm.businessobjects.filter.FilterGrammarParser
+		 * .NotExpressionContext)
+		 */
+		@Override
+		public Filter visitNotExpression(NotExpressionContext ctx) {
+			return super.visitNotExpression(ctx).invert();
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.mdm.businessobjects.filter.FilterGrammarBaseVisitor#
+		 * visitComparatorExpression(org.eclipse.mdm.businessobjects.filter.
+		 * FilterGrammarParser.ComparatorExpressionContext)
+		 */
+		@Override
+		public Filter visitComparatorExpression(ComparatorExpressionContext ctx) {
+			ComparisonOperator operator = getOperator(ctx.op);
+			Attribute attribute = getAttribute(ctx.left);
+			Object value = createConditionValue(attribute.getValueType(), getValue(ctx.right));
+
+			return Filter.and().add(operator.create(attribute, value));
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.mdm.businessobjects.filter.FilterGrammarBaseVisitor#
+		 * visitListComparatorExpression(org.eclipse.mdm.businessobjects.filter.
+		 * FilterGrammarParser.ListComparatorExpressionContext)
+		 */
+		@Override
+		public Filter visitListComparatorExpression(ListComparatorExpressionContext ctx) {
+			ComparisonOperator operator = getOperator(ctx.op);
+			Attribute attribute = getAttribute(ctx.left);
+			Object value = createConditionValues(attribute.getValueType(), getValues(ctx.right));
+
+			return Filter.and().add(operator.create(attribute, value));
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.mdm.businessobjects.filter.FilterGrammarBaseVisitor#
+		 * visitUnaryComparatorExpression(org.eclipse.mdm.businessobjects.filter.
+		 * FilterGrammarParser.UnaryComparatorExpressionContext)
+		 */
+		@Override
+		public Filter visitUnaryComparatorExpression(UnaryComparatorExpressionContext ctx) {
+			ComparisonOperator operator = getOperator(ctx.op);
+			Attribute attribute = getAttribute(ctx.left);
+			Object value = createConditionValue(attribute.getValueType(), null);
+
+			return Filter.and().add(operator.create(attribute, value));
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.antlr.v4.runtime.tree.AbstractParseTreeVisitor#aggregateResult(java.lang.
+		 * Object, java.lang.Object)
+		 */
+		@Override
+		protected Filter aggregateResult(Filter aggregate, Filter nextResult) {
+			if (nextResult == null) {
+				return aggregate;
+			}
+			return super.aggregateResult(aggregate, nextResult);
+		}
+
+		/**
+		 * Extract a string from the given {@link ValueContext}. Basically this methods
+		 * returns a string representation of the value without enclosing quotes (if
+		 * there were any).
+		 * 
+		 * @param ctx {@link ValueContext} containing the parsed value.
+		 * @return string representation of the value given by {@link ValueContext}
+		 */
+		private String getValue(ValueContext ctx) {
+
+			TerminalNode typeNode = (TerminalNode) ctx.getChild(0);
+			switch (typeNode.getSymbol().getType()) {
+			case FilterGrammarLexer.STRINGLITERAL:
+				String str = ctx.STRINGLITERAL().getText();
+				if (!str.isEmpty() && str.charAt(0) == '\'') {
+					// replace leading and trailing ' and unescape '
+					return ctx.STRINGLITERAL().getText().replaceAll("(\\A')|('\\z)", "").replaceAll("\\\\'", "'");
+				} else if (!str.isEmpty() && str.charAt(0) == '\"') {
+					// replace leading and trailing " and unescape "
+					return ctx.STRINGLITERAL().getText().replaceAll("(\\A\")|(\"\\z)", "").replaceAll("\\\\\\\"", "\"");
+				} else {
+					return str;
+				}
+			case FilterGrammarLexer.DECIMAL:
+			case FilterGrammarLexer.LONG:
+			case FilterGrammarLexer.BOOL:
+				return ctx.getText();
+			default:
+				throw new RuntimeException("Unsupported Symbol: " + typeNode.getSymbol().getType());
+			}
+		}
+
+		/**
+		 * Extract a list string from the given {@link ValuesContext}. Basically this
+		 * methods returns a list of string representations of the values without
+		 * enclosing quotes (if there were any).
+		 * 
+		 * @param ctx {@link ValuesContext} containing the parsed values.
+		 * @return string representations of the values given by {@link ValuesContext}
+		 */
+		private List<String> getValues(ValuesContext ctx) {
+			List<String> values = new ArrayList<>();
+			for (org.antlr.v4.runtime.tree.ParseTree child : ctx.children) {
+				if (child instanceof ValueContext) {
+					values.add(getValue((ValueContext) child));
+				}
+			}
+			return values;
+		}
+
+		/**
+		 * Converts an {@link AttributeContext} into an {@link Attribute} using the list
+		 * of available EntityTypes.
+		 * 
+		 * @param ctx parsed entitytype / attribute
+		 * @return the matched {@link Attribute} given by {@link AttributeContext}
+		 * @throws IllegalArgumentException if {@link EntityType} or {@link Attribute}
+		 *                                  given by <code>ctx</code> cannot be found.
+		 */
+		private Attribute getAttribute(AttributeContext ctx) {
+			String[] name = ctx.getText().split("\\.");
+			return availableEntityTypes.stream().filter(e -> ServiceUtils.workaroundForTypeMapping(e).equals(name[0]))
+					.findAny()
+					.orElseThrow(() -> new IllegalArgumentException("Entity " + name[0] + " not found in data source!"))
+					.getAttribute(name[1]);
+		}
+
+		/**
+		 * Converts a {@link ParserRuleContext} containing a {@link TerminalNode} into a
+		 * {@link ComparisonOperator}.
+		 * 
+		 * @param ctx {@link UnaryComparatorExpressionContext},
+		 *            {@link ComparatorExpressionContext} or
+		 *            {@link ListComparatorExpressionContext} or
+		 * @return converted {@link ComparisonOperator}
+		 * @throws IllegalArgumentException if the operator given by <code>ctx</code> is
+		 *                                  unknown or cannot be converted.
+		 */
+		private ComparisonOperator getOperator(ParserRuleContext ctx) {
+			TerminalNode typeNode = (TerminalNode) ctx.getChild(0);
+			switch (typeNode.getSymbol().getType()) {
+			case FilterGrammarLexer.EQUAL:
+				return ComparisonOperator.EQUAL;
+			case FilterGrammarLexer.NOT_EQUAL:
+				return ComparisonOperator.NOT_EQUAL;
+			case FilterGrammarLexer.LESS_THAN:
+				return ComparisonOperator.LESS_THAN;
+			case FilterGrammarLexer.LESS_THAN_OR_EQUAL:
+				return ComparisonOperator.LESS_THAN_OR_EQUAL;
+			case FilterGrammarLexer.GREATER_THAN:
+				return ComparisonOperator.GREATER_THAN;
+			case FilterGrammarLexer.GREATER_THAN_OR_EQUAL:
+				return ComparisonOperator.GREATER_THAN_OR_EQUAL;
+			case FilterGrammarLexer.IN_SET:
+				return ComparisonOperator.IN_SET;
+			case FilterGrammarLexer.NOT_IN_SET:
+				return ComparisonOperator.NOT_IN_SET;
+			case FilterGrammarLexer.LIKE:
+				return ComparisonOperator.LIKE;
+			case FilterGrammarLexer.NOT_LIKE:
+				return ComparisonOperator.NOT_LIKE;
+			case FilterGrammarLexer.CASE_INSENSITIVE_EQUAL:
+				return ComparisonOperator.CASE_INSENSITIVE_EQUAL;
+			case FilterGrammarLexer.CASE_INSENSITIVE_NOT_EQUAL:
+				return ComparisonOperator.CASE_INSENSITIVE_NOT_EQUAL;
+			case FilterGrammarLexer.CASE_INSENSITIVE_LESS_THAN:
+				return ComparisonOperator.CASE_INSENSITIVE_LESS_THAN;
+			case FilterGrammarLexer.CASE_INSENSITIVE_LESS_THAN_OR_EQUAL:
+				return ComparisonOperator.CASE_INSENSITIVE_LESS_THAN_OR_EQUAL;
+			case FilterGrammarLexer.CASE_INSENSITIVE_GREATER_THAN:
+				return ComparisonOperator.CASE_INSENSITIVE_GREATER_THAN;
+			case FilterGrammarLexer.CASE_INSENSITIVE_GREATER_THAN_OR_EQUAL:
+				return ComparisonOperator.CASE_INSENSITIVE_GREATER_THAN_OR_EQUAL;
+			case FilterGrammarLexer.CASE_INSENSITIVE_IN_SET:
+				return ComparisonOperator.CASE_INSENSITIVE_IN_SET;
+			case FilterGrammarLexer.CASE_INSENSITIVE_NOT_IN_SET:
+				return ComparisonOperator.CASE_INSENSITIVE_NOT_IN_SET;
+			case FilterGrammarLexer.CASE_INSENSITIVE_LIKE:
+				return ComparisonOperator.CASE_INSENSITIVE_LIKE;
+			case FilterGrammarLexer.CASE_INSENSITIVE_NOT_LIKE:
+				return ComparisonOperator.CASE_INSENSITIVE_NOT_LIKE;
+			case FilterGrammarLexer.IS_NULL:
+				return ComparisonOperator.IS_NULL;
+			case FilterGrammarLexer.IS_NOT_NULL:
+				return ComparisonOperator.IS_NOT_NULL;
+			case FilterGrammarLexer.BETWEEN:
+				return ComparisonOperator.BETWEEN;
+			default:
+				throw new IllegalArgumentException(
+						"Operator " + typeNode.getSymbol().getType() + " not supported yet!");
+			}
+		}
+	}
+
+	/**
+	 * Class to convert a antlr syntax error into a unchecked
+	 * ParserCancellationException.
+	 */
+	private static class ThrowingErrorListener extends BaseErrorListener {
+
+		public static final ThrowingErrorListener INSTANCE = new ThrowingErrorListener();
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.antlr.v4.runtime.BaseErrorListener#syntaxError(org.antlr.v4.runtime.
+		 * Recognizer, java.lang.Object, int, int, java.lang.String,
+		 * org.antlr.v4.runtime.RecognitionException)
+		 */
+		@Override
+		public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine,
+				String msg, RecognitionException e) throws ParseCancellationException {
+			throw new ParseCancellationException("line " + line + ":" + charPositionInLine + " " + msg);
+		}
+	}
+
+	/**
+	 * Parses the given filter string. The filter string must conform to the ANTLR
+	 * grammer defined in FilterGrammar.g4.
+	 * 
+	 * @param possibleEntityTypes The possible {@link EntityType}s /
+	 *                            {@link Attribute}s
+	 * @param filterString        The filter string to parse.
+	 * @return the parsed {@link Filter}
+	 * @throws IllegalArgumentExceptionThrown if parsing fails.
+	 */
+	public static Filter parseFilterString(List<EntityType> possibleEntityTypes, String filterString)
+			throws IllegalArgumentException {
+
+		if (Strings.isNullOrEmpty(filterString)) {
+			return Filter.and();
+		}
+
+		try {
+			FilterGrammarLexer lexer = new FilterGrammarLexer(new ANTLRInputStream(filterString));
+			lexer.removeErrorListeners();
+			lexer.addErrorListener(ThrowingErrorListener.INSTANCE);
+
+			FilterGrammarParser parser = new FilterGrammarParser(new CommonTokenStream(lexer));
+			parser.removeErrorListeners();
+			parser.addErrorListener(ThrowingErrorListener.INSTANCE);
+
+			return new FilterVisitor(possibleEntityTypes).visit(parser.parse());
+		} catch (ParseCancellationException e) {
+			throw new IllegalArgumentException(
+					"Could not parse filter string '" + filterString + "'. Error: " + e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Creates the value for the condition from the value given as string.
+	 * 
+	 * @param valueType     The type that the value should have.
+	 * @param valueAsString The value as string.
+	 * @return The created value for the condition.
+	 * @throws IllegalArgumentException Thrown if the value type is not supported
+	 */
+	private static Object createConditionValue(ValueType<?> valueType, String valueAsString) {
+		Object ret = null;
+		if (ValueType.BOOLEAN.equals(valueType)) {
+			ret = Boolean.valueOf(valueAsString);
+		} else if (ValueType.LONG.equals(valueType)) {
+			ret = Long.valueOf(valueAsString);
+		} else if (ValueType.STRING.equals(valueType)) {
+			ret = valueAsString;
+		} else if (ValueType.BYTE.equals(valueType)) {
+			ret = Byte.valueOf(valueAsString);
+		} else if (ValueType.DOUBLE.equals(valueType)) {
+			ret = Double.valueOf(valueAsString);
+		} else if (ValueType.FLOAT.equals(valueType)) {
+			ret = Float.valueOf(valueAsString);
+		} else if (ValueType.INTEGER.equals(valueType)) {
+			ret = Integer.valueOf(valueAsString);
+		} else if (ValueType.SHORT.equals(valueType)) {
+			ret = Short.valueOf(valueAsString);
+		} else if (ValueType.DATE.equals(valueType)) {
+			try {
+				ret = LocalDateTime.parse(valueAsString);
+			} catch (DateTimeParseException e) {
+				throw new IllegalArgumentException(
+						"Unsupported value for date: '" + valueAsString + "'. Expected format: '2007-12-03T10:15:30'");
+			}
+		} else {
+			throw new IllegalArgumentException("Unsupported value type: " + valueType.toString());
+		}
+		return ret;
+	}
+
+	/**
+	 * Creates the values for the condition from the values given in the list of
+	 * strings.
+	 * 
+	 * @param valueType      The type that the value should have.
+	 * @param valuesAsString The values as a list of string.
+	 * @return The created value for the condition.
+	 * @throws IllegalArgumentException Thrown if the value type is not supported
+	 */
+	private static Object createConditionValues(ValueType<?> valueType, List<String> valuesAsStrings) {
+
+		if (ValueType.BOOLEAN.equals(valueType)) {
+			List<Boolean> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(Boolean.valueOf(valueAsString));
+			}
+			return Booleans.toArray(list);
+		} else if (ValueType.LONG.equals(valueType)) {
+			List<Long> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(Long.valueOf(valueAsString));
+			}
+			return Longs.toArray(list);
+		} else if (ValueType.STRING.equals(valueType)) {
+			List<String> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(valueAsString);
+			}
+			return list.toArray(new String[0]);
+		} else if (ValueType.BYTE.equals(valueType)) {
+			List<Byte> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(Byte.valueOf(valueAsString));
+			}
+			return Bytes.toArray(list);
+		} else if (ValueType.DOUBLE.equals(valueType)) {
+			List<Double> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(Double.valueOf(valueAsString));
+			}
+			return Doubles.toArray(list);
+		} else if (ValueType.FLOAT.equals(valueType)) {
+			List<Float> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(Float.valueOf(valueAsString));
+			}
+			return Floats.toArray(list);
+		} else if (ValueType.INTEGER.equals(valueType)) {
+			List<Integer> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(Integer.valueOf(valueAsString));
+			}
+			return Ints.toArray(list);
+		} else if (ValueType.SHORT.equals(valueType)) {
+			List<Short> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				list.add(Short.valueOf(valueAsString));
+			}
+			return Shorts.toArray(list);
+		} else if (ValueType.DATE.equals(valueType)) {
+			List<LocalDateTime> list = new ArrayList<>();
+			for (String valueAsString : valuesAsStrings) {
+				try {
+					list.add(LocalDateTime.parse(valueAsString));
+				} catch (DateTimeParseException e) {
+					throw new IllegalArgumentException("Unsupported value for date: '" + valueAsString
+							+ "'. Expected format: '2007-12-03T10:15:30'");
+				}
+			}
+			return list.toArray(new LocalDateTime[0]);
+		} else {
+			throw new IllegalArgumentException("Unsupported value type: " + valueType.toString());
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/I18NActivity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/I18NActivity.java
new file mode 100644
index 0000000..01f0a82
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/I18NActivity.java
@@ -0,0 +1,169 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * I18NActivity Bean implementation to lookup localizations for business objects
+ * attributes and types
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class I18NActivity {
+
+	private static final Logger LOG = LoggerFactory.getLogger(I18NActivity.class);
+
+	private String RESOURCE_FILE = "org/eclipse/mdm/businessobjects/control/i18n/locale/localization";
+	private ResourceBundle LOCALIZATION_RESOURCES = ResourceBundle.getBundle(RESOURCE_FILE);
+
+	@Inject
+	private ConnectorService connectorService;
+
+	/**
+	 * localizes all attributes names from a type (e.g. TestStep.class)
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param type       MDM business object type (e.g. TestStep.class)
+	 * @return a {@link Map} with localized {@link Attribute} names (key is
+	 *         attribute name, value is localized attribute name)
+	 */
+	public Map<Attribute, String> localizeAttributes(String sourceName, Class<? extends Entity> type) {
+
+		Map<Attribute, String> map = new HashMap<>();
+
+		ApplicationContext context = this.connectorService.getContextByName(sourceName);
+
+		EntityType entityType = lookupEntityType(context, type);
+		localizeAttributes(entityType, map);
+
+		return map;
+	}
+
+	/**
+	 * localizes the type name of the given type (e.g. TestStep.class)
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param type       type to localize its type name
+	 * @return the localizes type name (key is the original type name, value is the
+	 *         localized type name)
+	 */
+	public Map<EntityType, String> localizeType(String sourceName, Class<? extends Entity> type) {
+
+		Map<EntityType, String> map = new HashMap<>();
+
+		ApplicationContext context = this.connectorService.getContextByName(sourceName);
+		EntityType entityType = lookupEntityType(context, type);
+		localizeType(entityType, map);
+
+		return map;
+	}
+
+	/**
+	 * localizes all {@link Attribute}s of all types from the source identified by
+	 * the given soureName
+	 * 
+	 * @param sourceName source name to identify the MDM data source
+	 * @return a {@link Map} with localized {@link Attribute} names (key is
+	 *         attribute name, value is localized attribute name)
+	 */
+	public Map<Attribute, String> localizeAllAttributes(String sourceName) {
+
+		Map<Attribute, String> map = new HashMap<>();
+		ApplicationContext context = this.connectorService.getContextByName(sourceName);
+		List<EntityType> list = lookupAllEntityTypes(context);
+
+		for (EntityType entityType : list) {
+			localizeAttributes(entityType, map);
+		}
+
+		return map;
+	}
+
+	/**
+	 * localizes all types form the source identified by the given sourceName
+	 * 
+	 * @param sourceName source name to identify the MDM data source
+	 * @return the localizes type names (key is the original type name, value is the
+	 *         localized type name)
+	 */
+	public Map<EntityType, String> localizeAllTypes(String sourceName) {
+
+		Map<EntityType, String> map = new HashMap<>();
+		ApplicationContext context = this.connectorService.getContextByName(sourceName);
+		List<EntityType> list = lookupAllEntityTypes(context);
+
+		for (EntityType entityType : list) {
+			localizeType(entityType, map);
+		}
+
+		return map;
+	}
+
+	private void localizeType(EntityType entityType, Map<EntityType, String> map) {
+		String localization = localize(entityType.getName(), entityType.getName());
+		map.put(entityType, localization);
+	}
+
+	private void localizeAttributes(EntityType entityType, Map<Attribute, String> map) {
+
+		for (Attribute attribute : entityType.getAttributes()) {
+			String key = entityType.getName() + "." + attribute.getName();
+			String localization = localize(key, attribute.getName());
+			map.put(attribute, localization);
+		}
+
+	}
+
+	private EntityType lookupEntityType(ApplicationContext context, Class<? extends Entity> type) {
+		return context.getModelManager().map(mm -> mm.getEntityType(type))
+				.orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+	}
+
+	private List<EntityType> lookupAllEntityTypes(ApplicationContext context) {
+		return context.getModelManager().map(mm -> mm.listEntityTypes())
+				.orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+	}
+
+	private String localize(String key, String defaultValue) {
+		try {
+			return LOCALIZATION_RESOURCES.getString(key);
+		} catch (MissingResourceException e) {
+			LOG.debug("unable to localize key '" + key + "', no translation possible!");
+			return defaultValue;
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/MDMEntityAccessException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/MDMEntityAccessException.java
new file mode 100644
index 0000000..0db40c3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/MDMEntityAccessException.java
@@ -0,0 +1,29 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+public class MDMEntityAccessException extends RuntimeException {
+
+	private static final long serialVersionUID = -4196754501456211418L;
+
+	public MDMEntityAccessException(String message) {
+		super(message);
+	}
+
+	public MDMEntityAccessException(String message, Throwable t) {
+		super(message, t);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/MDMFileAccessException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/MDMFileAccessException.java
new file mode 100644
index 0000000..4c25cfa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/MDMFileAccessException.java
@@ -0,0 +1,29 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+package org.eclipse.mdm.businessobjects.control;

+

+public class MDMFileAccessException extends RuntimeException {

+	

+	/**

+	 * 

+	 */

+	private static final long serialVersionUID = -2670077604805809256L;

+

+	public MDMFileAccessException(String message) {

+		super(message);

+	}

+

+	public MDMFileAccessException(String message, Throwable t) {

+		super(message, t);

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/NavigationActivity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/NavigationActivity.java
new file mode 100644
index 0000000..422fc05
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/NavigationActivity.java
@@ -0,0 +1,195 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+/**
+ * NavigationActivity Bean implementation to lookup specified business object
+ * children
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class NavigationActivity {
+
+	@Inject
+	private ConnectorService connectorService;
+
+	// here for cdi to work
+	public NavigationActivity() {
+
+	}
+
+	public NavigationActivity(ConnectorService connectorService) {
+		this.connectorService = requireNonNull(connectorService, "ConnectorService cannot be null!");
+	}
+
+	/**
+	 * returns the MDM {@link Environment} business objects of all connected MDM
+	 * systems
+	 * 
+	 * @return MDM {@link Environment} business objects
+	 */
+	public List<Environment> getEnvironments() {
+		try {
+			return this.connectorService.getContexts().stream().map(c -> c.getEntityManager())
+					.filter(Optional::isPresent).map(em -> em.get().loadEnvironment()).collect(Collectors.toList());
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns all MDM {@link Project} business objects of the connected MDM system
+	 * identified by the given name
+	 * 
+	 * @param sourceName Name of the MDM system
+	 * @return MDM {@link Project} business objects
+	 */
+	public List<Project> getProjects(String sourceName) {
+		try {
+			return this.connectorService.getContextByName(sourceName).getEntityManager()
+					.map(em -> em.loadAll(Project.class)).orElseThrow(() -> new MDMEntityAccessException(
+							"No EntityManager found for source " + sourceName + "!"));
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns all MDM {@link Test} business objects of the connected MDM system
+	 * identified by the given name
+	 * 
+	 * @param sourceName Name of the MDM system
+	 * @return MDM {@link Test} business objects
+	 */
+	public List<Test> getTests(String sourceName) {
+		try {
+			return this.connectorService.getContextByName(sourceName).getEntityManager()
+					.map(em -> em.loadAll(Test.class)).orElseThrow(() -> new MDMEntityAccessException(
+							"No EntityManager found for source " + sourceName + "!"));
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * returns all MDM {@link Test} business object children for a MDM {@link Pool}
+	 * identified by the given source name and {@link Pool} ID.
+	 * 
+	 * @param sourceName Name of the MDM system
+	 * @param poolID     The {@code Pool} instance ID
+	 * @return MDM {@link Test} business objects
+	 */
+	public List<Test> getTests(String sourceName, String poolID) {
+		return getChildren(sourceName, Pool.class, poolID, Test.class);
+	}
+
+	/**
+	 * returns all MDM {@link Pool} business object children for a MDM
+	 * {@link Project} identified by the given source name and {@link Project} ID.
+	 * 
+	 * @param sourceName Name of the MDM system
+	 * @param projectID  The {@code Project} instance ID
+	 * @return MDM {@link Pool} business objects
+	 */
+	public List<Pool> getPools(String sourceName, String projectID) {
+		return getChildren(sourceName, Project.class, projectID, Pool.class);
+	}
+
+	/**
+	 * returns all MDM {@link TestStep} business object children for a MDM
+	 * {@link Test} identified by the given source name and {@link Test} ID.
+	 * 
+	 * @param sourceName Name of the MDM system
+	 * @param testID     The {@code Test} instance ID
+	 * @return MDM {@link TestStep} business objects
+	 */
+	public List<TestStep> getTestSteps(String sourceName, String testID) {
+		return getChildren(sourceName, Test.class, testID, TestStep.class);
+	}
+
+	/**
+	 * returns all MDM {@link Measurement} business object children for a MDM
+	 * {@link TestStep} identified by the given source name and {@link TestStep} ID.
+	 * 
+	 * @param sourceName Name of the MDM system
+	 * @param testStepID The {@code TestStep} instance ID
+	 * @return MDM {@link Measurement} business objects
+	 */
+	public List<Measurement> getMeasurements(String sourceName, String testStepID) {
+		return getChildren(sourceName, TestStep.class, testStepID, Measurement.class);
+	}
+
+	/**
+	 * returns all MDM {@link ChannelGroup} business object children for a MDM
+	 * {@link Measurement} identified by the given source name and
+	 * {@link Measurement} ID.
+	 * 
+	 * @param sourceName    Name of the MDM system
+	 * @param measurementID The {@code Measurement} instance ID
+	 * @return MDM {@link ChannelGroup} business objects
+	 */
+	public List<ChannelGroup> getChannelGroups(String sourceName, String measurementID) {
+		return getChildren(sourceName, Measurement.class, measurementID, ChannelGroup.class);
+	}
+
+	/**
+	 * returns all MDM {@link Channel} business object children for a MDM
+	 * {@link ChannelGroup} identified by the given source name and
+	 * {@link ChannelGroup} ID.
+	 * 
+	 * @param sourceName     Name of the MDM system
+	 * @param channelGroupID The {@code ChannelGroup} instance ID
+	 * @return MDM {@link Channel} business objects
+	 */
+	public List<Channel> getChannels(String sourceName, String channelGroupID) {
+		return getChildren(sourceName, ChannelGroup.class, channelGroupID, Channel.class);
+	}
+
+	private <T extends Entity> List<T> getChildren(String sourceName, Class<? extends Entity> parentType,
+			String parentID, Class<T> childType) {
+		try {
+			return this.connectorService.getContextByName(sourceName).getEntityManager()
+					.map(em -> em.loadChildren(em.load(parentType, parentID), childType))
+					.orElseThrow(() -> new MDMEntityAccessException(
+							"No EntityManager found for source " + sourceName + "!"));
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchActivity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchActivity.java
new file mode 100644
index 0000000..282a869
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchActivity.java
@@ -0,0 +1,155 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.ejb.SessionContext;
+import javax.ejb.Stateless;
+import javax.mail.search.SearchException;
+
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.FilterItem;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.entity.SearchDefinition;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+/**
+ * SearchActivity Bean for searching business object and managing search
+ * definitions
+ *
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class SearchActivity {
+
+	@Resource
+	private SessionContext sessionContext;
+
+	/**
+	 * lists available global and user specific search definitions
+	 *
+	 * @return available global and user specific search definitions
+	 * @throws SearchException if an error occurs during lookup available search
+	 *                         definitions
+	 */
+	public List<SearchDefinition> listSearchDefinitions() {
+		Principal principal = sessionContext.getCallerPrincipal();
+		SearchDefinitionReader scReader = new SearchDefinitionReader(principal);
+		return scReader.readSearchDefinitions();
+	}
+
+	/**
+	 * lists the available search attributes for the given result type.
+	 * 
+	 * @param resultType The result type.
+	 * @return The available search attributes.
+	 */
+	public <T extends Entity> List<SearchAttribute> listAvailableAttributes(ApplicationContext context,
+			Class<T> resultType) {
+
+		SearchService searchService = context.getSearchService()
+				.orElseThrow(() -> new MDMEntityAccessException("SearchService not found!"));
+
+		try {
+			List<SearchAttribute> searchAttributes = new ArrayList<>();
+			List<EntityType> entityTypes = searchService.listEntityTypes(resultType);
+
+			for (EntityType entityType : entityTypes) {
+				for (Attribute attr : entityType.getAttributes()) {
+					searchAttributes.add(new SearchAttribute(ServiceUtils.workaroundForTypeMapping(entityType),
+							attr.getName(), attr.getValueType().toString(), "*"));
+				}
+			}
+			return searchAttributes;
+
+		} catch (IllegalArgumentException e) {
+			return new ArrayList<>();
+		}
+	}
+
+	/**
+	 * executes a search using the given filter and returns the search result
+	 *
+	 * @param resultType   business object type of the search results
+	 * @param filterString filter for the search request
+	 * @return the found business objects
+	 */
+	public <T extends Entity> List<T> search(ApplicationContext context, Class<T> resultType, String filterString) {
+		try {
+			SearchService searchService = context.getSearchService()
+					.orElseThrow(() -> new ServiceNotProvidedException(SearchService.class));
+			List<EntityType> searchable = searchService.listEntityTypes(resultType);
+			Filter filter = FilterParser.parseFilterString(searchable, filterString);
+			List<Attribute> attributesList = getAttributeListFromFilter(filter);
+			return searchService.fetch(resultType, attributesList, filter);
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	private List<Attribute> getAttributeListFromFilter(Filter filter) {
+
+		List<Attribute> attributeList = new ArrayList<>();
+		Iterator<FilterItem> fIterator = filter.iterator();
+		while (fIterator.hasNext()) {
+			FilterItem filterItem = fIterator.next();
+			if (filterItem.isCondition()) {
+				attributeList.add(filterItem.getCondition().getAttribute());
+			}
+		}
+
+		return attributeList;
+	}
+
+	/**
+	 * executes a free textsearch
+	 *
+	 * @param query the query given to the search
+	 * @return the found business objects
+	 */
+	public List<Entity> search(ApplicationContext context, String query) {
+		try {
+			SearchService searchService = context.getSearchService()
+					.orElseThrow(() -> new ServiceNotProvidedException(SearchService.class));
+			List<Entity> allEntities = new ArrayList<>();
+
+			if (searchService.isTextSearchAvailable()) {
+				Map<Class<? extends Entity>, List<Entity>> fetch = searchService.fetch(query);
+				for (List<Entity> entities : fetch.values()) {
+					allEntities.addAll(entities);
+				}
+			}
+
+			return allEntities;
+		} catch (DataAccessException e) {
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchDefinitionReader.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchDefinitionReader.java
new file mode 100644
index 0000000..ade2bbe
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchDefinitionReader.java
@@ -0,0 +1,215 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.mail.search.SearchException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.mdm.businessobjects.entity.SearchDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * SearchDefinitionReader class to read {@link SearchDefinition}s from an XML
+ * files
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class SearchDefinitionReader {
+
+	private static final String ROOT_ELEMENT_NAME = "mdm_search_definition";
+	private static final String ROOT_ELEMENT_ATTR_NAME = "name";
+	private static final String ROOT_ELEMENT_ATTR_RESULT = "resultType";
+	private static final String ATTRIBUTE_GROUP_ELEMENT = "attributes";
+	private static final String ATTRIBUTE_ELEMENT = "attribute";
+	private static final String ATTRIBUTE_ELEMENT_ATTR_TYPE = "boType";
+	private static final String ATTRIBUTE_ELEMENT_ATTR_VALUENAME = "attrName";
+	private static final String ATTRIBUTE_ELEMENT_ATTR_VALUETYPE = "valueType";
+	private static final String ATTRIBUTE_ELEMENT_ATTR_CRITERIA = "criteria";
+
+	private static final String COMPONENT_CONFIG_ROOT_FOLDER = "org.eclipse.mdm.search";
+
+	private final Principal principal;
+
+	private static final Logger LOG = LoggerFactory.getLogger(SearchDefinitionReader.class);
+
+	/**
+	 * Constructor
+	 * 
+	 * @param principal the current principal to load user specific search
+	 *                  definition if available
+	 */
+	public SearchDefinitionReader(Principal principal) {
+		this.principal = principal;
+	}
+
+	/**
+	 * reads the {@link SearchDefinition}s from a available {@link SearchDefinition}
+	 * XML files
+	 * 
+	 * @return the read {@link SearchDefinition}s
+	 * 
+	 * @throws SearchException if an error occurs during reading the
+	 *                         {@link SearchException}s from the XML files
+	 */
+	public List<SearchDefinition> readSearchDefinitions() {
+
+		List<SearchDefinition> searchDefinitionList = new ArrayList<>();
+		List<File> files = listSearchDefinitionFiles();
+
+		for (File file : files) {
+			searchDefinitionList.add(readSearchDefinitionFile(file));
+		}
+
+		return searchDefinitionList;
+	}
+
+	private SearchDefinition readSearchDefinitionFile(File file) {
+
+		InputStream is = null;
+
+		try {
+
+			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+			DocumentBuilder db = dbf.newDocumentBuilder();
+
+			is = new BufferedInputStream(new FileInputStream(file));
+			Document doc = db.parse(is);
+			Element root = doc.getDocumentElement();
+			if (!root.getNodeName().equalsIgnoreCase(ROOT_ELEMENT_NAME)) {
+				String message = "unable to find root element with name '" + ROOT_ELEMENT_NAME + "'";
+				throw new XMLFormatException(message);
+			}
+
+			String name = readElementAttribute(ROOT_ELEMENT_ATTR_NAME, "", true, root);
+			String resultType = readElementAttribute(ROOT_ELEMENT_ATTR_RESULT, "", true, root);
+
+			SearchDefinition searchDefinition = new SearchDefinition(name, resultType);
+
+			Element[] attributeGroups = getChildElementsByName(root, ATTRIBUTE_GROUP_ELEMENT, true);
+			for (Element attributeGroup : attributeGroups) {
+				Element[] attributes = getChildElementsByName(attributeGroup, ATTRIBUTE_ELEMENT, true);
+				for (Element attribute : attributes) {
+					String boType = readElementAttribute(ATTRIBUTE_ELEMENT_ATTR_TYPE, "", true, attribute);
+					String attrName = readElementAttribute(ATTRIBUTE_ELEMENT_ATTR_VALUENAME, "", true, attribute);
+					String valueType = readElementAttribute(ATTRIBUTE_ELEMENT_ATTR_VALUETYPE, "", true, attribute);
+					String criteria = readElementAttribute(ATTRIBUTE_ELEMENT_ATTR_CRITERIA, "*", false, attribute);
+					searchDefinition.addSearchAttribute(boType, attrName, valueType, criteria);
+				}
+			}
+			return searchDefinition;
+
+		} catch (ParserConfigurationException | SAXException | IOException e) {
+			throw new XMLParseException(e.getMessage(), e);
+		} finally {
+			closeInputStream(is);
+		}
+	}
+
+	private Element[] getChildElementsByName(Element element, String name, boolean mandatory) {
+
+		List<Element> elements = new ArrayList<Element>();
+
+		NodeList childNodes = element.getChildNodes();
+		for (int i = 0; i < childNodes.getLength(); i++) {
+			Node node = childNodes.item(i);
+			if (node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equalsIgnoreCase(name)) {
+				elements.add((Element) node);
+			}
+		}
+
+		if (mandatory && elements.size() <= 0) {
+			String message = "mandatory element '" + name + "' not found!";
+			throw new XMLFormatException(message);
+		}
+
+		return elements.toArray(new Element[elements.size()]);
+	}
+
+	private String readElementAttribute(String attrName, String defaultValue, boolean mandatory, Element element) {
+
+		String value = element.getAttribute(attrName);
+		if (value.trim().length() <= 0) {
+			if (mandatory) {
+				String elementName = element.getNodeName();
+				String message = "mandatory attribute '" + attrName + "' at element '" + elementName + "' is missing!";
+				throw new XMLFormatException(message);
+			}
+			value = defaultValue;
+		}
+		return value;
+	}
+
+	private List<File> listSearchDefinitionFiles() {
+
+		List<File> files = new ArrayList<>();
+
+		File globalFolder = new File(COMPONENT_CONFIG_ROOT_FOLDER);
+		if (!globalFolder.exists() || !globalFolder.isDirectory()) {
+			return Collections.emptyList();
+		}
+		files.addAll(listSearchDefinitionFiles(globalFolder));
+
+		File userFolder = new File(globalFolder, this.principal.getName());
+		if (userFolder.exists() && userFolder.isDirectory()) {
+			files.addAll(listSearchDefinitionFiles(userFolder));
+		}
+
+		return files;
+	}
+
+	private List<File> listSearchDefinitionFiles(File rootFolder) {
+		List<File> list = new ArrayList<>();
+		File[] files = rootFolder.listFiles();
+		for (File file : files) {
+			if (file.isDirectory()) {
+				continue;
+			}
+			if (file.getName().toLowerCase().endsWith(".xml")) {
+				list.add(file);
+			}
+		}
+		return list;
+	}
+
+	private void closeInputStream(InputStream is) {
+		try {
+			if (is != null) {
+				is.close();
+			}
+		} catch (IOException e) {
+			LOG.error(e.getMessage());
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchFilterBuilder.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchFilterBuilder.java
new file mode 100644
index 0000000..7628b2e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/SearchFilterBuilder.java
@@ -0,0 +1,112 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mdm.api.base.query.Condition;
+import org.eclipse.mdm.api.base.query.Filter;
+
+/**
+ * Filter builder.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class SearchFilterBuilder {
+
+	private static final String AND = "and";
+	private static final String OR = "or";
+
+	private List<Object> filterElements = new ArrayList<>();
+	private List<Filter> filterList = new ArrayList<>();
+	private String currentFilterType = null;
+	private Filter currentFilter = null;
+
+	/**
+	 * Adds a condition
+	 * 
+	 * @param condition
+	 */
+	public void addCondition(Condition condition) {
+		filterElements.add(condition);
+	}
+
+	/**
+	 * Adds a and operator.
+	 */
+	public void addAnd() {
+		filterElements.add(AND);
+	}
+
+	/**
+	 * Adds an or operator.
+	 */
+	public void addOr() {
+		filterElements.add(OR);
+	}
+
+	/**
+	 * Creates the filter.
+	 * 
+	 * @return The created filter.
+	 */
+	public Filter build() {
+		for (int i = 0; i < filterElements.size(); i++) {
+			if (filterElements.get(i) instanceof Condition) {
+				if (currentFilter == null) {
+					createNextFilter(i);
+				}
+				if (filterElements.size() > (i + 1) && AND.equals(currentFilterType)
+						&& OR.equals(filterElements.get(i + 1))) {
+					filterList.add(currentFilter);
+					currentFilter = Filter.or();
+					currentFilterType = OR;
+				}
+				currentFilter.add((Condition) filterElements.get(i));
+			} else {
+				if (currentFilterType != filterElements.get(i)) {
+					filterList.add(currentFilter);
+					currentFilterType = (String) filterElements.get(i);
+					currentFilter = null;
+				}
+			}
+		}
+		if (currentFilter != null) {
+			filterList.add(currentFilter);
+		}
+		return Filter.and().merge(filterList);
+	}
+
+	/**
+	 * Create the next filter.
+	 * 
+	 * @param index The current filter element index.
+	 * @return The created filter.
+	 */
+	private Filter createNextFilter(int index) {
+		if (filterElements.size() > (index + 1)) {
+			currentFilter = AND.equals((String) filterElements.get(index + 1)) ? Filter.and() : Filter.or();
+			currentFilterType = (String) filterElements.get(index + 1);
+		} else if (AND.equals(currentFilterType)) {
+			currentFilter = Filter.and();
+		} else {
+			currentFilter = Filter.or();
+		}
+		return null;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/XMLFormatException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/XMLFormatException.java
new file mode 100644
index 0000000..b2de972
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/XMLFormatException.java
@@ -0,0 +1,29 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+public class XMLFormatException extends RuntimeException {
+
+	private static final long serialVersionUID = -4196754501456211418L;
+
+	public XMLFormatException(String message) {
+		super(message);
+	}
+
+	public XMLFormatException(String message, Throwable t) {
+		super(message, t);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/XMLParseException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/XMLParseException.java
new file mode 100644
index 0000000..0132a4e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/XMLParseException.java
@@ -0,0 +1,29 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+public class XMLParseException extends RuntimeException {
+
+	private static final long serialVersionUID = -4196754501456211418L;
+
+	public XMLParseException(String message) {
+		super(message);
+	}
+
+	public XMLParseException(String message, Throwable t) {
+		super(message, t);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextCollection.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextCollection.java
new file mode 100644
index 0000000..c77c2f6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextCollection.java
@@ -0,0 +1,92 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+
+/**
+ * ContextCollection (Entity for context data (ordered and measured))
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class ContextCollection {
+
+	// consistent naming to ContextActivity.CONTEXT_GROUP_MEASURED
+	public Map<ContextType, List<MDMContextEntity>> measured = new HashMap<>();
+	// consistent naming to ContextActivity.CONTEXT_GROUP_ORDERED
+	public Map<ContextType, List<MDMContextEntity>> ordered = new HashMap<>();
+
+	/**
+	 * set the measured context data map
+	 * 
+	 * @param contextMap the measured context data map
+	 */
+	public void setMeasured(Map<ContextType, ContextRoot> contextMap) {
+
+		for (java.util.Map.Entry<ContextType, ContextRoot> setEntry : contextMap.entrySet()) {
+
+			ContextType contextType = setEntry.getKey();
+			ContextRoot contextRoot = setEntry.getValue();
+
+			this.measured.put(contextType, new ArrayList<>());
+
+			for (ContextComponent contextComponent : contextRoot.getContextComponents()) {
+				MDMContextEntity entity = new MDMContextEntity(contextComponent);
+				this.measured.get(contextType).add(entity);
+			}
+
+			// sort by SortIndex
+			Collections.sort(this.measured.get(contextType), Comparator.comparing(MDMContextEntity::getSortIndex,
+					Comparator.nullsFirst(Comparator.naturalOrder())));
+
+		}
+	}
+
+	/**
+	 * sets the ordered context data map
+	 * 
+	 * @param contextMap the ordered context data map
+	 */
+	public void setOrdered(Map<ContextType, ContextRoot> contextMap) {
+
+		for (java.util.Map.Entry<ContextType, ContextRoot> setEntry : contextMap.entrySet()) {
+
+			ContextType contextType = setEntry.getKey();
+			ContextRoot contextRoot = setEntry.getValue();
+
+			this.ordered.put(contextType, new ArrayList<>());
+
+			for (ContextComponent contextComponent : contextRoot.getContextComponents()) {
+				MDMContextEntity entity = new MDMContextEntity(contextComponent);
+				this.ordered.get(contextType).add(entity);
+			}
+
+			// sort by SortIndex
+			Collections.sort(this.ordered.get(contextType), Comparator.comparing(MDMContextEntity::getSortIndex,
+					Comparator.nullsFirst(Comparator.naturalOrder())));
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
new file mode 100644
index 0000000..3c84f90
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
@@ -0,0 +1,73 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.control.ContextActivity;
+import org.eclipse.mdm.businessobjects.service.DescribableContexts;
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ContextResponse {
+
+	/** transferable data content */
+	private List<ContextCollection> data;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param contextMap map with context data (ordered and measured)
+	 */
+	public ContextResponse(Map<String, Map<ContextType, ContextRoot>> contextMap) {
+		this.data = new ArrayList<>();
+		ContextCollection contextData = new ContextCollection();
+		contextData.setOrdered(contextMap.get(ContextActivity.CONTEXT_GROUP_ORDERED));
+		contextData.setMeasured(contextMap.get(ContextActivity.CONTEXT_GROUP_MEASURED));
+		this.data.add(contextData);
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param context {@link DescribableContexts} holding the context data (ordered
+	 *                and measured)
+	 */
+	public ContextResponse(DescribableContexts context) {
+		this.data = new ArrayList<>();
+		ContextCollection contextData = new ContextCollection();
+		contextData.setOrdered(context.getOrderedContext());
+		contextData.setMeasured(context.getMeasuredContext());
+		this.data.add(contextData);
+	}
+
+	/**
+	 * returns the context data
+	 * 
+	 * @return the context data
+	 */
+	public List<ContextCollection> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextSensorCollection.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextSensorCollection.java
new file mode 100644
index 0000000..b03df0c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextSensorCollection.java
@@ -0,0 +1,61 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mdm.api.base.model.ContextSensor;
+
+/**
+ * ContextSensorCollection (Entity for context data (ordered and measured))
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class ContextSensorCollection {
+
+	// consistent naming to ContextActivity.CONTEXT_SENSOR_GROUP_MEASURED
+	public List<MDMEntity> sensor_measured = new ArrayList<>();
+	// consistent naming to ContextActivity.CONTEXT_SENSOR_GROUP_ORDERED
+	public List<MDMEntity> sensor_ordered = new ArrayList<>();
+
+	/**
+	 * set the measured context sensor data list
+	 * 
+	 * @param sensorList the measured context sensor data list
+	 */
+	public void setMeasuredSensorContext(List<ContextSensor> sensorList) {
+
+		for (ContextSensor contextSensor : sensorList) {
+			MDMEntity entity = new MDMEntity(contextSensor);
+			this.sensor_measured.add(entity);
+		}
+	}
+
+	/**
+	 * set the ordered context sensor data list
+	 * 
+	 * @param sensorList the ordered context sensor data list
+	 */
+	public void setOrderedSensorContext(List<ContextSensor> sensorList) {
+
+		for (ContextSensor contextSensor : sensorList) {
+			MDMEntity entity = new MDMEntity(contextSensor);
+			this.sensor_ordered.add(entity);
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextSensorResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextSensorResponse.java
new file mode 100644
index 0000000..5a7f1ce
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextSensorResponse.java
@@ -0,0 +1,61 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.eclipse.mdm.api.base.model.ContextSensor;
+import org.eclipse.mdm.businessobjects.control.ContextActivity;
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ContextSensorResponse {
+
+	/** transferable data content */
+	private List<ContextSensorCollection> data;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param contextMap map with context data (ordered and measured)
+	 */
+	public ContextSensorResponse(Map<String, List<ContextSensor>> sensorMap) {
+		this.data = new ArrayList<>();
+		ContextSensorCollection contextSensorData = new ContextSensorCollection();
+		if (sensorMap.containsKey(ContextActivity.CONTEXT_SENSOR_GROUP_ORDERED)) {
+			contextSensorData.setOrderedSensorContext(sensorMap.get(ContextActivity.CONTEXT_SENSOR_GROUP_ORDERED));
+		}
+		if (sensorMap.containsKey(ContextActivity.CONTEXT_SENSOR_GROUP_MEASURED)) {
+			contextSensorData.setMeasuredSensorContext(sensorMap.get(ContextActivity.CONTEXT_SENSOR_GROUP_MEASURED));
+		}
+		this.data.add(contextSensorData);
+	}
+
+	/**
+	 * returns the {@link ContextSensor} data
+	 * 
+	 * @return the {@link ContextSensor} data
+	 */
+	public List<ContextSensorCollection> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/FileSize.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/FileSize.java
new file mode 100644
index 0000000..b51e881
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/FileSize.java
@@ -0,0 +1,60 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+package org.eclipse.mdm.businessobjects.entity;

+

+import java.io.Serializable;

+

+public class FileSize implements Serializable {

+

+	private static final long serialVersionUID = 1228535240780890498L;

+	

+	private String remotePath;

+	private String size;

+	

+	public FileSize() {

+		// intentially empty

+	}

+	

+	/**

+	 * 

+	 * @return

+	 */

+	public String getRemotePath() {

+		return remotePath;

+	}

+	

+	/**

+	 * 

+	 * @param remotePath

+	 */

+	public void setRemotePath(String remotePath) {

+		this.remotePath = remotePath;

+	}

+	

+	/**

+	 * 

+	 * @return

+	 */

+	public String getSize() {

+		return size;

+	}

+	

+	/**

+	 * 

+	 * @param size

+	 */

+	public void setSize(String size) {

+		this.size = size;

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/I18NLocalization.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/I18NLocalization.java
new file mode 100644
index 0000000..5c98e98
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/I18NLocalization.java
@@ -0,0 +1,49 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+/**
+ * ContextData (Entity for I18N localizations (with original name and localized
+ * name)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class I18NLocalization {
+
+	/** name of the attribute */
+	private final String name;
+	/** localized name of the attribute */
+	private final String localizedName;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param name          name of the attribute
+	 * @param localizedName name of the localized attribute
+	 */
+	public I18NLocalization(String name, String localizedName) {
+		this.name = name;
+		this.localizedName = localizedName;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public String getLocalizedName() {
+		return this.localizedName;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/I18NResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/I18NResponse.java
new file mode 100644
index 0000000..3ecdd96
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/I18NResponse.java
@@ -0,0 +1,85 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+
+/**
+ * I18NResponse (Container for {@link I18NLocalization}s)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class I18NResponse {
+
+	/** transferable data content */
+	private final List<I18NLocalization> data;
+
+	/**
+	 * 
+	 * @param localizedEntityTypeMap
+	 * @param localizedAttributeMap
+	 */
+	public I18NResponse(Map<EntityType, String> localizedEntityTypeMap, Map<Attribute, String> localizedAttributeMap) {
+		this.data = toTransferable(localizedEntityTypeMap, localizedAttributeMap);
+	}
+
+	public List<I18NLocalization> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+
+	private List<I18NLocalization> toTransferable(Map<EntityType, String> localizedEntityTypeMap,
+			Map<Attribute, String> localizedAttributeMap) {
+
+		List<I18NLocalization> localizationList = new ArrayList<>();
+
+		Set<Entry<EntityType, String>> entityTypeSet = localizedEntityTypeMap.entrySet();
+
+		for (Entry<EntityType, String> entry : entityTypeSet) {
+
+			EntityType entityType = entry.getKey();
+			String key = entityType.getName();
+
+			localizationList.add(new I18NLocalization(key, entry.getValue()));
+		}
+
+		Set<Entry<Attribute, String>> attributeSet = localizedAttributeMap.entrySet();
+
+		for (Entry<Attribute, String> entry : attributeSet) {
+
+			Attribute attribute = entry.getKey();
+			EntityType entityType = attribute.getEntityType();
+			String key = entityType.getName() + "." + attribute.getName();
+
+			localizationList.add(new I18NLocalization(key, entry.getValue()));
+		}
+
+		return localizationList;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMAttribute.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMAttribute.java
new file mode 100644
index 0000000..aa3bc98
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMAttribute.java
@@ -0,0 +1,83 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Attribute (Entity for attribute informations)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Schema(description = "Representation of a MDM attribute")
+public class MDMAttribute {
+
+	/** name of the attribute value */
+	private final String name;
+	/** value of the attribute value */
+	private final Object value;
+	/** unit of the attribute value */
+	private final String unit;
+	/** data type of the attribute value */
+	private final String dataType;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param name     name of the attribute value
+	 * @param value    string value of the attribute value
+	 * @param unit     unit of the attribute value
+	 * @param dataType data type of the attribute value
+	 */
+	public MDMAttribute(String name, Object value, String unit, String dataType) {
+		this.name = name;
+		this.value = value;
+		this.unit = unit;
+		this.dataType = dataType;
+	}
+
+	/**
+	 * Copy constructor
+	 * 
+	 * @param attribute attribute to copy
+	 */
+	public MDMAttribute(MDMAttribute attribute) {
+		this.name = attribute.getName();
+		this.value = attribute.getValue();
+		this.unit = attribute.getUnit();
+		this.dataType = attribute.getDataType();
+	}
+
+	@Schema(description = "name of the attribute")
+	public String getName() {
+		return this.name;
+	}
+
+	@Schema(description = "value of the attribute")
+	public Object getValue() {
+		return this.value;
+	}
+
+	@Schema(description = "unit of the attribute value")
+	public String getUnit() {
+		return this.unit;
+	}
+
+	@Schema(description = "data of the attribute", example = "FLOAT_SEQUENCE")
+	public String getDataType() {
+		return this.dataType;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextAttribute.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextAttribute.java
new file mode 100644
index 0000000..932c358
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextAttribute.java
@@ -0,0 +1,78 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+/**
+ * Attribute (Entity for attribute information)
+ *
+ * @author Juergen Kleck, Peak Solution GmbH
+ *
+ */
+public class MDMContextAttribute extends MDMAttribute {
+
+	/** The sort index of the template */
+	private final Integer sortIndex;
+	/** boolean flag if this attribute is readonly or writeable in edit mode */
+	private final Boolean readOnly;
+	/** boolean flag if this attribute is optional in edit mode */
+	private final Boolean optional;
+	/** description text of this attribute */
+	private final String description;
+
+	/**
+	 * Constructor
+	 *
+	 * @param name      name of the attribute value
+	 * @param value     value of the attribute value
+	 * @param unit      unit of the attribute value
+	 * @param dataType  data type of the attribute value
+	 * @param sortIndex optional sort index of the attribute value
+	 * @param readOnly  optional flag if it is readonly in edit mode
+	 * @param optional  optional flag if it is optinal in edit mode
+	 */
+	public MDMContextAttribute(String name, Object value, String unit, String dataType, Integer sortIndex,
+			Boolean readOnly, Boolean optional, String description) {
+		super(name, value, unit, dataType);
+		this.sortIndex = sortIndex;
+		this.readOnly = readOnly;
+		this.optional = optional;
+		this.description = description;
+	}
+
+	public MDMContextAttribute(MDMAttribute attribute, Integer sortIndex, Boolean readOnly, Boolean optinal,
+			String description) {
+		super(attribute);
+		this.sortIndex = sortIndex;
+		this.readOnly = readOnly;
+		this.optional = optinal;
+		this.description = description;
+	}
+
+	public Integer getSortIndex() {
+		return sortIndex;
+	}
+
+	public Boolean getReadOnly() {
+		return readOnly;
+	}
+
+	public Boolean isOptional() {
+		return optional;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextEntity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextEntity.java
new file mode 100644
index 0000000..58a5184
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextEntity.java
@@ -0,0 +1,168 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.eclipse.mdm.api.base.model.BaseEntity;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Sortable;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+
+/**
+ * MDMEntity (Entity for a business object (contains a list of
+ * {@link MDMContextAttribute}s)
+ *
+ * @author Juergen Kleck, Peak Solution GmbH
+ */
+public class MDMContextEntity extends MDMEntity {
+
+	/**
+	 * sort index of the MDM business object
+	 */
+	private final Integer sortIndex;
+	/**
+	 * list of attribute to transfer
+	 */
+	private List<MDMContextAttribute> attributes;
+	/**
+	 * list of relations to transfer
+	 */
+	private List<MDMContextRelation> relations;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param entity the business object
+	 */
+	public MDMContextEntity(Entity entity) {
+		super(entity);
+		// special handling for context component
+		if (entity instanceof ContextComponent) {
+			TemplateComponent tplCmp = TemplateComponent.of((ContextComponent) entity).get();
+			this.sortIndex = tplCmp.getSortIndex();
+			this.attributes = convertAttributeValues(entity.getValues(), tplCmp.getTemplateAttributes());
+			this.relations = convertRelations(entity, tplCmp);
+		} else {
+			this.sortIndex = 0;
+			this.attributes = convertAttributeValues(entity.getValues(), null);
+			this.relations = convertRelations(entity, null);
+		}
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name       Name of the Entity
+	 * @param id         ID of the Entity
+	 * @param type       Type of the Entity
+	 * @param sourceType Source type of the Entity
+	 * @param sourceName Source name of the Entity
+	 * @param attributes Attributes of the Entity
+	 */
+	public MDMContextEntity(String name, String id, String type, String sourceType, String sourceName,
+			List<MDMContextAttribute> attributes) {
+		super(name, id, type, sourceType, sourceName, Collections.emptyList());
+		this.sortIndex = 0;
+		if (attributes != null) {
+			this.attributes = new ArrayList<>(attributes);
+		} else {
+			this.attributes = new ArrayList<>();
+		}
+		this.relations = new ArrayList<>();
+	}
+
+	public Integer getSortIndex() {
+		return sortIndex;
+	}
+
+	public List<MDMContextAttribute> getAttributes() {
+		return Collections.unmodifiableList(this.attributes);
+	}
+
+	public List<MDMContextRelation> getRelations() {
+		return Collections.unmodifiableList(this.relations);
+	}
+
+	/**
+	 * converts the MDM business object values to string values
+	 *
+	 * @param values        values of a MDM business object
+	 * @param tplAttributes optional list of template attributes
+	 * @return list with converted attribute values
+	 */
+	private List<MDMContextAttribute> convertAttributeValues(Map<String, Value> values,
+			List<TemplateAttribute> tplAttributes) {
+
+		List<MDMContextAttribute> listAttrs = new ArrayList<>();
+		for (MDMAttribute attr : super.convertAttributeValues(values)) {
+			TemplateAttribute tplAttr = null;
+
+			if (tplAttributes != null && !tplAttributes.isEmpty()) {
+				tplAttr = tplAttributes.stream().filter(tpl -> tpl.getName().equals(attr.getName())).findFirst()
+						.orElse(null);
+			}
+
+			listAttrs.add(toContextAttribute(attr, tplAttr));
+		}
+
+		// clear unneeded elements
+		listAttrs.removeIf(attr -> attr.getName().equals(BaseEntity.ATTR_NAME)
+				|| attr.getName().equals(BaseEntity.ATTR_MIMETYPE) || attr.getName().equals(Sortable.ATTR_SORT_INDEX));
+
+		// pre-sort attributes by sort index
+		Collections.sort(listAttrs, Comparator.comparing(MDMContextAttribute::getSortIndex,
+				Comparator.nullsFirst(Comparator.naturalOrder())));
+
+		return listAttrs;
+	}
+
+	private MDMContextAttribute toContextAttribute(MDMAttribute attr, TemplateAttribute tplAttr) {
+		Integer sortIndex = null;
+		Boolean optional = null;
+		Boolean readOnly = null;
+		String description = null;
+		if (tplAttr != null) {
+			sortIndex = tplAttr.getCatalogAttribute().getSortIndex();
+			description = tplAttr.getCatalogAttribute().getDescription();
+			optional = (Boolean) tplAttr.isOptional();
+			readOnly = (Boolean) tplAttr.isValueReadOnly();
+		}
+		return new MDMContextAttribute(attr, sortIndex, readOnly, optional, description);
+	}
+
+	/**
+	 * Converts all relations to MDMContextRelations. The potential ContextType of
+	 * the children is assumed to be the parent's one.
+	 *
+	 * @param entity to get {@link MDMContextRelation}s for
+	 * @return a list of {@link MDMContextRelation}s
+	 */
+	private List<MDMContextRelation> convertRelations(Entity entity, TemplateComponent tplCmp) {
+
+		String parentId = tplCmp.getParentTemplateComponent().map(p -> p.getID()).orElse(null);
+
+		return convertRelations(entity).stream().map(m -> new MDMContextRelation(m, parentId))
+				.collect(Collectors.toList());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextRelation.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextRelation.java
new file mode 100644
index 0000000..2d37981
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMContextRelation.java
@@ -0,0 +1,68 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.List;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+
+/**
+ * Relation (Entity for relation information)
+ *
+ * @author Juergen Kleck, Peak Solution GmbH
+ *
+ */
+public class MDMContextRelation extends MDMRelation {
+
+	private String parentId;
+
+	/**
+	 * Default constructor used for entity deserialization
+	 */
+	public MDMContextRelation() {
+
+	}
+
+	/**
+	 * Constructor
+	 *
+	 * @param name        name of the relation
+	 * @param type        type of the relation
+	 * @param entityType  type of the related entity
+	 * @param contextType ContextType of the entity if the entityType has one
+	 * @param ids         ids of the related entities
+	 * @param parentId    the parent template id
+	 */
+	public MDMContextRelation(String name, RelationType type, String entityType, ContextType contextType,
+			List<String> ids, String parentId) {
+		super(name, type, entityType, contextType, ids);
+		this.parentId = parentId;
+	}
+
+	/**
+	 * Constructor
+	 *
+	 * @param relation MDMRelation
+	 * @param parentId parentId
+	 */
+	public MDMContextRelation(MDMRelation relation, String parentId) {
+		super(relation);
+		this.parentId = parentId;
+	}
+
+	public String getParentId() {
+		return parentId;
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMEntity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMEntity.java
new file mode 100644
index 0000000..c7d959a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMEntity.java
@@ -0,0 +1,290 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.model.BaseEntity;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.businessobjects.utils.Serializer;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.vavr.collection.HashMap;
+
+/**
+ * MDMEntity (Entity for a business object (contains a list of
+ * {@link MDMAttribute}s)
+ *
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ */
+@Schema(description = "Representation of a MDM entity")
+public class MDMEntity {
+
+	/**
+	 * name of the MDM business object
+	 */
+	private final String name;
+	/**
+	 * id of the MDM business object
+	 */
+	private final String id;
+	/**
+	 * type as String of the MDM business object (e.g. TestStep)
+	 */
+	private final String type;
+	/**
+	 * source type name of the business object at the data source
+	 */
+	private final String sourceType;
+	/**
+	 * source name (e.g. MDM Environment name)
+	 */
+	private final String sourceName;
+	/**
+	 * list of attribute to transfer
+	 */
+	private List<MDMAttribute> attributes;
+
+	/**
+	 * list of relations to transfer
+	 */
+	private List<MDMRelation> relations;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param entity the business object
+	 */
+	public MDMEntity(Entity entity) {
+		this.name = entity.getName();
+		this.id = entity.getID();
+		this.type = entity.getClass().getSimpleName();
+		this.sourceType = entity.getTypeName();
+		this.sourceName = entity.getSourceName();
+		this.attributes = convertAttributeValues(entity.getValues());
+		this.relations = convertRelations(entity);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name       Name of the Entity
+	 * @param id         ID of the Entity
+	 * @param type       Type of the Entity
+	 * @param sourceType Source type of the Entity
+	 * @param sourceName Source name of the Entity
+	 * @param attributes Attributes of the Entity
+	 */
+	public MDMEntity(String name, String id, String type, String sourceType, String sourceName,
+			List<MDMAttribute> attributes) {
+		this(name, id, type, sourceType, sourceName, attributes, Collections.emptyList());
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name       Name of the Entity
+	 * @param id         ID of the Entity
+	 * @param type       Type of the Entity
+	 * @param sourceType Source type of the Entity
+	 * @param sourceName Source name of the Entity
+	 * @param attributes Attributes of the Entity
+	 * @param relations  Relations of the Entity
+	 */
+	public MDMEntity(String name, String id, String type, String sourceType, String sourceName,
+			List<MDMAttribute> attributes, List<? extends MDMRelation> relations) {
+		this.name = name;
+		this.id = id;
+		this.type = type;
+		this.sourceType = sourceType;
+		this.sourceName = sourceName;
+		if (attributes != null) {
+			this.attributes = new ArrayList<>(attributes);
+		} else {
+			this.attributes = new ArrayList<>();
+		}
+		if (relations != null) {
+			this.relations = new ArrayList<>(relations);
+		} else {
+			this.relations = new ArrayList<>();
+		}
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public String getId() {
+		return this.id;
+	}
+
+	public String getType() {
+		return this.type;
+	}
+
+	public String getSourceType() {
+		return this.sourceType;
+	}
+
+	public String getSourceName() {
+		return this.sourceName;
+	}
+
+	public List<? extends MDMAttribute> getAttributes() {
+		return Collections.unmodifiableList(this.attributes);
+	}
+
+	public List<? extends MDMRelation> getRelations() {
+		return Collections.unmodifiableList(this.relations);
+	}
+
+	/**
+	 * converts the MDM business object values to string values
+	 *
+	 * @param values values of a MDM business object
+	 * @return list with converted attribute values
+	 */
+	protected List<MDMAttribute> convertAttributeValues(Map<String, Value> values) {
+		List<MDMAttribute> listAttrs = new ArrayList<>();
+		Set<java.util.Map.Entry<String, Value>> set = values.entrySet();
+
+		for (java.util.Map.Entry<String, Value> entry : set) {
+
+			if (entry.getKey().equals(BaseEntity.ATTR_ID)) {
+				continue;
+			}
+
+			if (!entry.getValue().isValid()) {
+				String dt = entry.getValue().getValueType().toString();
+				listAttrs.add(new MDMAttribute(entry.getKey(), "", "", dt));
+				continue;
+			}
+
+			if (entry.getValue().getValueType().isSequence()) {
+				listAttrs.add(sequenceType2Attribute(entry.getKey(), entry.getValue()));
+			} else {
+				listAttrs.add(singleType2Attribute(entry.getKey(), entry.getValue()));
+			}
+		}
+
+		return listAttrs;
+	}
+
+	/**
+	 * converts a single type MDM business object value to a attribute
+	 *
+	 * @param name        name of the attribute value
+	 * @param singleValue single MDM business object value
+	 * @return the converted attribute value
+	 */
+	protected MDMAttribute singleType2Attribute(String name, Value singleValue) {
+		Object value = Serializer.serializeValue(singleValue);
+		String unit = singleValue.getUnit();
+		String dt = singleValue.getValueType().toString();
+		return new MDMAttribute(name, value, unit, dt);
+	}
+
+	/**
+	 * converts a sequence type MDM business object value to a attribute
+	 *
+	 * @param name          name of the attribute value
+	 * @param sequenceValue sequence MDM business object value
+	 * @return the converted attribute value
+	 */
+	protected MDMAttribute sequenceType2Attribute(String name, Value sequenceValue) {
+
+		if (sequenceValue.getValueType().isStringSequence()) {
+			return stringSeq2Attribute(name, sequenceValue);
+		} else if (sequenceValue.getValueType().isFileLinkSequence()) {
+			String unit = sequenceValue.getUnit();
+			String dt = sequenceValue.getValueType().toString();
+			return new MDMAttribute(name, Serializer.serializeValue(sequenceValue), unit, dt);
+		}
+
+		String dt = sequenceValue.getValueType().toString();
+		String defValue = "sequence type '" + dt + "' not implemented yet";
+		return new MDMAttribute(name, defValue, "", dt);
+	}
+
+	/**
+	 * converts a string sequence MDM business object value to a attribute The
+	 * result is a separated string (separator: ';')
+	 *
+	 * @param name  name of the attribute value
+	 * @param value string sequence MDM business object value
+	 * @return the converted attribute value
+	 */
+	protected MDMAttribute stringSeq2Attribute(String name, Value value) {
+		String[] stringSeq = value.extract();
+		StringBuffer sb = new StringBuffer();
+
+		for (String stringSeqValue : stringSeq) {
+			sb.append(";").append(stringSeqValue);
+		}
+
+		String stringValue = sb.toString().replaceFirst(";", "");
+		String unit = value.getUnit();
+		String dt = value.getValueType().toString();
+		return new MDMAttribute(name, stringValue, unit, dt);
+	}
+
+	/**
+	 * Converts all relations to MDMRelations. The potential ContextType of the
+	 * children is assumed to be the parent's one.
+	 *
+	 * @param entity to get
+	 *               {@link org.eclipse.mdm.businessobjects.entity.MDMRelation}s for
+	 * @return a list of {@link org.eclipse.mdm.businessobjects.entity.MDMRelation}s
+	 */
+	protected List<MDMRelation> convertRelations(Entity entity) {
+		// write out children
+		Core core = ServiceUtils.getCore(entity);
+		// get children hash (type is key)
+		return HashMap.ofAll(core.getChildrenStore().getCurrent())
+				// if we don't check the size we crash, some elements may not have a relation
+				.filter(entry -> entry._2.size() > 0)
+				// create child relations (the ContextType is assumed to be same as the parent's
+				// one
+				.filterValues(l -> l.size() > 0)
+				.map(entry -> new MDMRelation(null, MDMRelation.RelationType.CHILDREN, entry._1.getSimpleName(),
+						ServiceUtils.getContextType(entry._2.get(0)),
+						// call get id on all related entities
+						io.vavr.collection.List.ofAll(entry._2).map(Deletable::getID).asJava()))
+				// append related entities from the mutable store
+				.appendAll(io.vavr.collection.List.ofAll(core.getMutableStore().getCurrent()).
+				// convert list to map: use simple class name as this is the MDM entity type in
+				// conjunction with the ContextType
+						groupBy(e -> e.getClass().getSimpleName() + "_" + ServiceUtils.getContextType(e))
+						// create relation for every entry
+						.map(entry -> new MDMRelation(null, MDMRelation.RelationType.MUTABLE,
+								entry._2.get(0).getClass().getSimpleName(),
+								ServiceUtils.getContextType(entry._2.get(0)), entry._2.map(Entity::getID).asJava())))
+				.appendAll(io.vavr.collection.List.ofAll(core.getPermanentStore().getCurrent())
+						.groupBy(e -> e.getClass().getSimpleName())
+						// create relation for every entry
+						.map(entry -> new MDMRelation(null, MDMRelation.RelationType.PARENT, entry._1,
+								ServiceUtils.getContextType(entry._2.get(0)), entry._2.map(Entity::getID).asJava())))
+				.asJava();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMEntityResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMEntityResponse.java
new file mode 100644
index 0000000..afada80
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMEntityResponse.java
@@ -0,0 +1,84 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.eclipse.mdm.api.base.model.Entity;
+
+/**
+ * EntryResponse (Container for {@link MDMEntity}s)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class MDMEntityResponse {
+
+	/** type of all content entries (e.g. TestStep) */
+	private final String type;
+	/** transferable data content */
+	private final List<MDMEntity> data;
+
+	/**
+	 * Constructor (for a list of business objects {@link MDMEntity}s)
+	 * 
+	 * @param type    type of all containging {@link MDMEntity}s
+	 * @param entries list of {@link MDMEntity}
+	 */
+	// TODO move to Vavr List
+	public <T extends Entity> MDMEntityResponse(Class<? extends Entity> type, List<T> businessObjects) {
+		this.type = type.getSimpleName();
+		this.data = toTransferable(businessObjects);
+	}
+
+	/**
+	 * Constructor (for a single business object {@link MDMEntity})
+	 * 
+	 * @param type           type of the {@link MDMEntity}
+	 * @param businessObject single {@link MDMEntity}
+	 */
+	public <T extends Entity> MDMEntityResponse(Class<? extends Entity> type, T businessObject) {
+		List<T> businessObjects = new ArrayList<>();
+		businessObjects.add(businessObject);
+		this.type = type.getSimpleName();
+		this.data = toTransferable(businessObjects);
+	}
+
+	public String getType() {
+		return this.type;
+	}
+
+	public List<MDMEntity> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+
+	private <T extends Entity> List<MDMEntity> toTransferable(List<T> businessObjects) {
+		List<MDMEntity> mdmEntityList = new ArrayList<MDMEntity>();
+		for (Entity businessObject : businessObjects) {
+			MDMEntity mdmEntity = new MDMEntity(businessObject);
+			mdmEntityList.add(mdmEntity);
+		}
+		return mdmEntityList;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMFileLink.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMFileLink.java
new file mode 100644
index 0000000..97e57e8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMFileLink.java
@@ -0,0 +1,70 @@
+/********************************************************************************

+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+package org.eclipse.mdm.businessobjects.entity;

+

+import org.eclipse.mdm.api.base.model.FileLink;

+

+import io.swagger.v3.oas.annotations.media.Schema;

+

+/**

+ * MDMFileLink (Entity for a {@link FileLink})

+ * 

+ */

+@Schema(description = "Representation of a MDM FileLink")

+public class MDMFileLink {

+

+	private final String remotePath;

+

+	private final String mimeType;

+

+	private final String description;

+

+	/**

+	 * Constructor.

+	 * 

+	 * @param remotePath

+	 * @param mimeType

+	 * @param description

+	 */

+	public MDMFileLink(String remotePath, String mimeType, String description) {

+		this.remotePath = remotePath;

+		this.mimeType = mimeType;

+		this.description = description;

+	}

+

+	/**

+	 * @return the remotePath

+	 */

+	@Schema(description = "The remote path of the FileLink")

+	public String getRemotePath() {

+		return remotePath;

+	}

+

+	/**

+	 * @return the mimeType

+	 */

+	@Schema(description = "The mimetype of the FileLink")

+	public String getMimeType() {

+		return mimeType;

+	}

+

+	/**

+	 * @return the description

+	 */

+	@Schema(description = "The description of the FileLink")

+	public String getDescription() {

+		return description;

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMRelation.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMRelation.java
new file mode 100644
index 0000000..9c93727
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/MDMRelation.java
@@ -0,0 +1,100 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.List;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+
+/**
+ * Relation (Entity for relation informations)
+ * 
+ * @author Alexander Nehmer, science + computing (ATOS SE)
+ *
+ */
+public class MDMRelation {
+
+	/** name of the relation */
+	private String name;
+	/** type of the relation */
+	private RelationType type;
+	/** type of the related entity */
+	private String entityType;
+	/** ContextType if the entityType has one */
+	private ContextType contextType;
+	/** ids of the related entities */
+	private List<String> ids;
+
+	public enum RelationType {
+		CHILDREN, MUTABLE, PARENT;
+	}
+
+	/**
+	 * Default constructor used for entity deserialization
+	 */
+	public MDMRelation() {
+
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param name        name of the relation
+	 * @param type        type of the relation
+	 * @param entityType  type of the related entity
+	 * @param contextType ContextType of the entity if the entityType has one
+	 * @param ids         ids of the related entities
+	 */
+	public MDMRelation(String name, RelationType type, String entityType, ContextType contextType, List<String> ids) {
+		this.name = name;
+		this.type = type;
+		this.entityType = entityType;
+		this.contextType = contextType;
+		this.ids = ids;
+	}
+
+	/**
+	 * Copy constructor
+	 * 
+	 * @param relation relation to copy
+	 */
+	public MDMRelation(MDMRelation relation) {
+		this.name = relation.getName();
+		this.type = relation.getType();
+		this.entityType = relation.getEntityType();
+		this.contextType = relation.getContextType();
+		this.ids = relation.getIds();
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public RelationType getType() {
+		return type;
+	}
+
+	public String getEntityType() {
+		return entityType;
+	}
+
+	public ContextType getContextType() {
+		return contextType;
+	}
+
+	public List<String> getIds() {
+		return ids;
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchAttribute.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchAttribute.java
new file mode 100644
index 0000000..46a787b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchAttribute.java
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+/**
+ * SearchAttibute (Entity for {@link SearchAttribute}s defined at a
+ * {@link SearchDefinition})
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class SearchAttribute {
+
+	private final String boType;
+	private final String attrName;
+	private final String valueType;
+	private final String criteria;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param boType    name of MDM business object (e.g. TestStep)
+	 * @param attrName  name of an attribute for the MDM business object (e.g. Name)
+	 * @param valueType value type of this attribute (e.g. String)
+	 * @param criteria  default criteria
+	 */
+	public SearchAttribute(String boType, String attrName, String valueType, String criteria) {
+		this.boType = boType;
+		this.attrName = attrName;
+		this.valueType = valueType;
+		this.criteria = criteria;
+	}
+
+	/**
+	 * returns the name of the MDM business object (e.g. TestStep)
+	 * 
+	 * @return the name of the MDM business object (e.g. TestStep)
+	 */
+	public String getBoType() {
+		return this.boType;
+	}
+
+	/**
+	 * returns the name of an attribute for the MDM business object (e.g. Name)
+	 * 
+	 * @return the name of an attribute for the MDM business object (e.g. Name)
+	 */
+	public String getAttrName() {
+		return this.attrName;
+	}
+
+	/**
+	 * returns the value type of this attribute (e.g. String)
+	 * 
+	 * @return the value type of this attribute (e.g. String)
+	 */
+	public String getValueType() {
+		return this.valueType;
+	}
+
+	/**
+	 * returns the default criteria
+	 * 
+	 * @return the default criteria
+	 */
+	public String getCriteria() {
+		return this.criteria;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchAttributeResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchAttributeResponse.java
new file mode 100644
index 0000000..3dd629c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchAttributeResponse.java
@@ -0,0 +1,58 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * SearchDefinitionResponse (Container for {@link SearchAttribute}s)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class SearchAttributeResponse {
+
+	/** transferable data content */
+	private List<SearchAttribute> data;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param searchAttributes list of {@link SearchAttribute}s to transfer
+	 */
+	public SearchAttributeResponse(List<SearchAttribute> searchAttributes) {
+		data = new ArrayList<>(searchAttributes);
+	}
+
+	/**
+	 * Constructor
+	 */
+	public SearchAttributeResponse() {
+		data = new ArrayList<>();
+	}
+
+	public List<SearchAttribute> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchDefinition.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchDefinition.java
new file mode 100644
index 0000000..d6ee13a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchDefinition.java
@@ -0,0 +1,85 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * SearchDefinition (Entity with a list of defined {@link SearchAttribute}s)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class SearchDefinition {
+
+	private final String name;
+	private final String resultType;
+	private List<SearchAttribute> attributeList;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param name       name of this search definition
+	 * @param resultType result type by executing this defined search (e.g.
+	 *                   TestStep)
+	 */
+	public SearchDefinition(String name, String resultType) {
+		this.name = name;
+		this.resultType = resultType;
+		this.attributeList = new ArrayList<>();
+	}
+
+	/**
+	 * adds an {@link SearchAttribute} to this SearchDefinition
+	 * 
+	 * @param boType    name of MDM business object (e.g. TestStep)
+	 * @param attrName  name of an attribute for the MDM business object (e.g. Name)
+	 * @param valueType value type of this attribute (e.g. String)
+	 * @param criteria  default criteria
+	 */
+	public void addSearchAttribute(String boType, String attrName, String valueType, String criteria) {
+		this.attributeList.add(new SearchAttribute(boType, attrName, valueType, criteria));
+	}
+
+	/**
+	 * returns the name of this search definition
+	 * 
+	 * @return the name of this search definition
+	 */
+	public String getName() {
+		return this.name;
+	}
+
+	/**
+	 * returns the result type of this search definition
+	 * 
+	 * @return the result type of this search definition
+	 */
+	public String getResultType() {
+		return this.resultType;
+	}
+
+	/**
+	 * lists the defined {@link SearchAttribute}s for this search definition
+	 * 
+	 * @return the defined {@link SearchAttribute}s for ths search definition
+	 */
+	public List<SearchAttribute> listSearchAttributes() {
+		return Collections.unmodifiableList(this.attributeList);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchDefinitionResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchDefinitionResponse.java
new file mode 100644
index 0000000..b0fc3e6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/SearchDefinitionResponse.java
@@ -0,0 +1,57 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * SearchDefinitionResponse (Container for {@link SearchDefinition}s)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class SearchDefinitionResponse {
+
+	/** transferable data content */
+	private List<SearchDefinition> data;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param searchDefinitions list of {@link SearchDefinition}s to transfer
+	 */
+	public SearchDefinitionResponse(List<SearchDefinition> searchDefinitions) {
+		this.data = new ArrayList<>(searchDefinitions);
+	}
+
+	/**
+	 * Constructor
+	 */
+	public SearchDefinitionResponse() {
+		this.data = new ArrayList<>();
+	}
+
+	public List<SearchDefinition> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/User.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/User.java
new file mode 100644
index 0000000..7051983
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/User.java
@@ -0,0 +1,35 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.entity;
+
+import java.util.List;
+
+public class User {
+	private String username;
+	private List<String> roles;
+	
+	public String getUsername() {
+		return username;
+	}
+	public void setUsername(String username) {
+		this.username = username;
+	}
+	public List<String> getRoles() {
+		return roles;
+	}
+	public void setRoles(List<String> roles) {
+		this.roles = roles;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
new file mode 100644
index 0000000..3eaf779
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
@@ -0,0 +1,569 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.service;
+
+import static org.eclipse.mdm.businessobjects.control.ContextActivity.CONTEXT_GROUP_MEASURED;
+import static org.eclipse.mdm.businessobjects.control.ContextActivity.CONTEXT_GROUP_ORDERED;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.NoSuchElementException;
+import java.util.stream.Collectors;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.Transaction;
+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.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.businessobjects.control.ContextActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.entity.MDMContextAttribute;
+import org.eclipse.mdm.businessobjects.entity.MDMContextEntity;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.Serializer;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+import com.google.common.base.Strings;
+
+import io.vavr.Lazy;
+import io.vavr.Value;
+import io.vavr.collection.HashMap;
+import io.vavr.collection.List;
+import io.vavr.collection.Map;
+import io.vavr.control.Try;
+
+/**
+ * Class providing basic data access methods to contexts.
+ * 
+ * @author Johannes Stamm, PeakSolution GmbH Nuernberg
+ *
+ */
+@Stateless
+public class ContextService {
+
+	@Inject
+	private ConnectorService connectorService;
+
+	@EJB
+	private EntityService entityService;
+
+	/**
+	 * Vavr conform version of contextActivity getTestStepContext function.
+	 * 
+	 * returns the ordered and measurement context for a {@link TestStep}. If no
+	 * {@link ContextType}s are defined for this method call, the method returns all
+	 * context informations of the available {@link ContextType}s. Otherwise you can
+	 * specify a list of {@link ContextType}s.
+	 * 
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 * 
+	 * @param sourceName      name of the source (MDM {@link Environment} name)
+	 * @param testId          the id of {@link TestStep} context is looked up for
+	 * @param includeVariable true then teststep variable data is included, false
+	 *                        only test constant data is included
+	 * @param contextTypes    list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link TestStep}
+	 */
+	public Try<Map<String, Map<ContextType, ContextRoot>>> getTestContext(Value<String> sourceName,
+			Value<String> testId, boolean includeVariable, ContextType... contextTypes) {
+		Try<Test> test = entityService.find(sourceName, Test.class, testId);
+		return getTestContext(sourceName, test, includeVariable, contextTypes);
+	}
+
+	/**
+	 * Vavr conform version of contextActivity getTestStepContext function.
+	 *
+	 * returns the ordered and measurement context for a {@link TestStep}. If no
+	 * {@link ContextType}s are defined for this method call, the method returns all
+	 * context informations of the available {@link ContextType}s. Otherwise you can
+	 * specify a list of {@link ContextType}s.
+	 *
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 *
+	 * @param sourceName   name of the source (MDM {@link Environment} name)
+	 * @param testStepId   the id of {@link TestStep} context is looked up for
+	 * @param contextTypes list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link TestStep}
+	 */
+	public Try<Map<String, Map<ContextType, ContextRoot>>> getTestStepContext(Value<String> sourceName,
+			Value<String> testStepId, ContextType... contextTypes) {
+		return getTestStepContext(sourceName, entityService.find(sourceName, TestStep.class, testStepId), contextTypes);
+	}
+
+	/**
+	 * Vavr conform version of contextActivity getTestStepContext function.
+	 * 
+	 * returns the ordered and measurement context for a {@link TestStep}. If no
+	 * {@link ContextType}s are defined for this method call, the method returns all
+	 * context informations of the available {@link ContextType}s. Otherwise you can
+	 * specify a list of {@link ContextType}s.
+	 * 
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 * 
+	 * @param sourceName   name of the source (MDM {@link Environment} name)
+	 * @param testStep     {@link Try} of the {@link TestStep}
+	 * @param contextTypes list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link TestStep}
+	 */
+	private Try<Map<String, Map<ContextType, ContextRoot>>> getTestStepContext(Value<String> sourceName,
+			Try<TestStep> testStep, ContextType... contextTypes) {
+
+		Try<Map<ContextType, ContextRoot>> contextOrdered = getEntityManager(sourceName)
+				.map(e -> HashMap.ofAll(e.loadContexts(testStep.get(), contextTypes)));
+
+		Try<Map<ContextType, ContextRoot>> contextMeasured = getEntityManager(sourceName).map(
+				e -> HashMap.ofAll(e.loadContexts(findMeasurements(sourceName, testStep).get().get(), contextTypes)));
+
+		return Try
+				.of(() -> Lazy
+						.of(() -> HashMap.of(CONTEXT_GROUP_ORDERED,
+								contextOrdered.recover(NoSuchElementException.class, t -> HashMap.empty()).get(),
+								CONTEXT_GROUP_MEASURED,
+								contextMeasured.recover(NoSuchElementException.class, t -> HashMap.empty()).get()))
+						.get());
+	}
+
+	/**
+	 * Vavr conform version of contextActivity getTestContext function.
+	 *
+	 * returns the ordered and measurement context for a {@link Test}. If no
+	 * {@link ContextType}s are defined for this method call, the method returns all
+	 * context informations of the available {@link ContextType}s. Otherwise you can
+	 * specify a list of {@link ContextType}s.
+	 *
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 *
+	 * @param sourceName      name of the source (MDM {@link Environment} name)
+	 * @param test            {@link Try} of the {@link Test}
+	 * @param includeVariable true then teststep variable data is included, false
+	 *                        only test constant data is included
+	 * @param contextTypes    list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link TestStep}
+	 */
+	private Try<Map<String, Map<ContextType, ContextRoot>>> getTestContext(Value<String> sourceName, Try<Test> test,
+			boolean includeVariable, ContextType... contextTypes) {
+
+		// init an empty hashmap
+		HashMap<ContextType, ContextRoot> mapOrdered = HashMap.empty();
+		HashMap<ContextType, ContextRoot> mapMeasured = HashMap.empty();
+
+		if (test.isSuccess()) {
+
+			java.util.List<TestStep> list = getEntityManager(sourceName).get().loadChildren(test.get(), TestStep.class);
+
+			// merge all attributes from all test steps together
+			for (TestStep testStep : list) {
+				Try<Map<ContextType, ContextRoot>> contextOrdered = getEntityManager(sourceName)
+						.map(e -> HashMap.ofAll(e.loadContexts(testStep, contextTypes)));
+
+				if (contextOrdered.isSuccess()) {
+					mapOrdered = mapOrdered.merge(contextOrdered.get());
+				}
+
+				Try<Map<ContextType, ContextRoot>> contextMeasured = getEntityManager(sourceName).map(e -> HashMap
+						.ofAll(e.loadContexts(findMeasurements(sourceName, testStep).get().get(), contextTypes)));
+
+				if (contextMeasured.isSuccess()) {
+					mapMeasured = mapMeasured.merge(contextMeasured.get());
+				}
+			}
+
+			// filter data out to reduce traffic in the json rest service
+			if (!includeVariable) {
+				mapOrdered.values().forEach(ctxRoot -> {
+					java.util.List<ContextComponent> removals = new ArrayList<>();
+					ctxRoot.getContextComponents().forEach(ctxCmp -> {
+						if (TemplateComponent.of(ctxCmp).isPresent()) {
+							org.eclipse.mdm.api.base.model.Value attr = TemplateComponent.of(ctxCmp).get()
+									.getValue("TestStepSeriesVariable");
+							if (attr.isValid() && ((Boolean) attr.extract()).booleanValue()) {
+								removals.add(ctxCmp);
+							}
+						}
+					});
+					for (ContextComponent ctxCmp : removals) {
+						ctxRoot.removeContextComponent(ctxCmp.getName());
+					}
+				});
+				mapMeasured.values().forEach(ctxRoot -> {
+					java.util.List<ContextComponent> removals = new ArrayList<>();
+					ctxRoot.getContextComponents().forEach(ctxCmp -> {
+						if (TemplateComponent.of(ctxCmp).isPresent()) {
+							org.eclipse.mdm.api.base.model.Value attr = TemplateComponent.of(ctxCmp).get()
+									.getValue("TestStepSeriesVariable");
+							if (attr.isValid() && ((Boolean) attr.extract()).booleanValue()) {
+								removals.add(ctxCmp);
+							}
+						}
+					});
+					for (ContextComponent ctxCmp : removals) {
+						ctxRoot.removeContextComponent(ctxCmp.getName());
+					}
+				});
+			}
+		}
+
+		// set final for follow-up lambda
+		final HashMap<ContextType, ContextRoot> tmpMapOrdered = mapOrdered;
+		final HashMap<ContextType, ContextRoot> tmpMapMeasured = mapMeasured;
+
+		// convert to try class object
+		Try<Map<ContextType, ContextRoot>> contextOrdered = Try.of(() -> tmpMapOrdered);
+		Try<Map<ContextType, ContextRoot>> contextMeasured = Try.of(() -> tmpMapMeasured);
+
+		return Try
+				.of(() -> Lazy
+						.of(() -> HashMap.of(CONTEXT_GROUP_ORDERED,
+								contextOrdered.recover(NoSuchElementException.class, t -> HashMap.empty()).get(),
+								CONTEXT_GROUP_MEASURED,
+								contextMeasured.recover(NoSuchElementException.class, t -> HashMap.empty()).get()))
+						.get());
+	}
+
+	/**
+	 * Vavr conform version of contextActivity getMeasurementContext function.
+	 * 
+	 * returns the ordered and measurement context for a {@link Measurement}. If no
+	 * {@link ContextType}s are defined for this method call, the method returns all
+	 * context informations of the available {@link ContextType}s. Otherwise you can
+	 * specify a list of {@link ContextType}s.
+	 * 
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 * 
+	 * @param sourceName    name of the source (MDM {@link Environment} name)
+	 * @param measurementId the id of {@link Measurement} context is looked up for
+	 * @param contextTypes  list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link Measurement}
+	 */
+	public Try<Map<String, Map<ContextType, ContextRoot>>> getMeasurementContext(Value<String> sourceName,
+			Value<String> measurementId, ContextType... contextTypes) {
+		return getMeasurementContext(sourceName, entityService.find(sourceName, Measurement.class, measurementId),
+				contextTypes);
+	}
+
+	/**
+	 * Vavr conform version of contextActivity getTestStepContext function.
+	 * 
+	 * returns the ordered and measurement context for a {@link Measurement}. If no
+	 * {@link ContextType}s are defined for this method call, the method returns all
+	 * context informations of the available {@link ContextType}s. Otherwise you can
+	 * specify a list of {@link ContextType}s.
+	 * 
+	 * Possible {@link ContextType}s are {@link ContextType}.UNITUNDERTEST,
+	 * {@link ContextType}.TESTSEQUENCE and {@link ContextType}.TESTEQUIPMENT.
+	 * 
+	 * @param sourceName   name of the source (MDM {@link Environment} name)
+	 * @param measurement  {@link Try} of the {@link Measurement}
+	 * @param contextTypes list of {@link ContextType}s
+	 * @return the ordered and measured context data as context object for the
+	 *         identified {@link Measurement}
+	 */
+	private Try<Map<String, Map<ContextType, ContextRoot>>> getMeasurementContext(Value<String> sourceName,
+			Try<Measurement> measurement, ContextType... contextTypes) {
+
+		Try<Map<ContextType, ContextRoot>> contextOrdered = getEntityManager(sourceName)
+				.map(e -> HashMap.ofAll(e.loadContexts(findTestStep(sourceName, measurement).get(), contextTypes)));
+
+		Try<Map<ContextType, ContextRoot>> contextMeasured = getEntityManager(sourceName)
+				.map(e -> HashMap.ofAll(e.loadContexts(measurement.get(), contextTypes)));
+
+		return Try.of(() -> Lazy.of(() -> HashMap.of(CONTEXT_GROUP_ORDERED, contextOrdered.get(),
+				CONTEXT_GROUP_MEASURED, contextMeasured.get())).get());
+	}
+
+	/**
+	 * 
+	 * @param sourceName
+	 * @return
+	 */
+	private Try<EntityManager> getEntityManager(Value<String> sourceName) {
+		return Try.of(() -> Lazy.of(() -> connectorService.getContextByName(sourceName.get()).getEntityManager()
+				.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"))).get());
+	}
+
+	/**
+	 * 
+	 * @param sourceName
+	 * @param testStep
+	 * @return
+	 */
+	private Try<List<Measurement>> findMeasurements(Value<String> sourceName, Try<TestStep> testStep) {
+		return getEntityManager(sourceName).map(
+				e -> Lazy.of(() -> List.ofAll(e.loadChildren(testStep.get(), TestStep.CHILD_TYPE_MEASUREMENT))).get());
+	}
+
+	/**
+	 *
+	 * @param sourceName
+	 * @param testStep
+	 * @return
+	 */
+	private Try<List<Measurement>> findMeasurements(Value<String> sourceName, TestStep testStep) {
+		return getEntityManager(sourceName)
+				.map(e -> Lazy.of(() -> List.ofAll(e.loadChildren(testStep, TestStep.CHILD_TYPE_MEASUREMENT))).get());
+	}
+
+	/**
+	 * 
+	 * @param sourceName
+	 * @param measurement
+	 * @return
+	 */
+	private Try<TestStep> findTestStep(Value<String> sourceName, Try<Measurement> measurement) {
+		return getEntityManager(sourceName)
+				.map(e -> Lazy.of(() -> e.loadParent(measurement.get(), Measurement.PARENT_TYPE_TESTSTEP).get()).get());
+	}
+
+	/**
+	 * Updates the context of the given ContextDescribable.
+	 * 
+	 * @param body               update data
+	 * @param contextDescribable ContextDescribable to update
+	 * @param contextTypes       contextTypes which whould be updated. Empty means
+	 *                           all contextTypes.
+	 * @return
+	 */
+	public DescribableContexts updateContext(String body, ContextDescribable contextDescribable,
+			ContextType... contextTypes) {
+		// extract request body
+		RequestBody rqBody = RequestBody.create(body);
+
+		Try<Map<String, Object>> contextMap = rqBody.getValueMapSupplier()
+				.map(dataMap -> dataMap.get("data")
+						.getOrElseThrow(() -> new MDMEntityAccessException("Missing attribute 'data'")))
+				.map(this::transformList).map(List::get).map(this::transformMap);
+
+		DescribableContexts ec = updateContext(getTestStep(contextDescribable), contextMap,
+				getContextTypes(contextTypes));
+		persist(ec);
+		return ec;
+	}
+
+	private DescribableContexts updateContext(TestStep testStep, Try<Map<String, Object>> contextMap,
+			ContextType[] contextTypes) {
+		Map<ContextType, Object> orderedMap = contextMap.get().get(ContextActivity.CONTEXT_GROUP_ORDERED)
+				.map(this::transformMap).getOrElse(HashMap.empty())
+				.mapKeys(t -> ServiceUtils.getContextTypeSupplier(t).get())
+				.filterKeys(t -> Arrays.asList(contextTypes).contains(t));
+
+		DescribableContexts ec = new DescribableContexts();
+		ec.setTestStep(testStep);
+		ec.setOrdered(updateContextDescribableContext(testStep, orderedMap, contextTypes));
+
+		Map<ContextType, Object> measuredMap = contextMap.get().get(ContextActivity.CONTEXT_GROUP_MEASURED)
+				.map(this::transformMap).getOrElse(HashMap.empty())
+				.mapKeys(t -> ServiceUtils.getContextTypeSupplier(t).get())
+				.filterKeys(t -> Arrays.asList(contextTypes).contains(t));
+
+		ec.setMeasurements(getEntityManager(testStep.getSourceName()).loadChildren(testStep, Measurement.class));
+		ec.getAnyMeasurement().map(m -> updateContextDescribableContext(m, measuredMap, contextTypes))
+				.ifPresent(ec::setMeasured);
+
+		return ec;
+	}
+
+	private java.util.Map<ContextType, ContextRoot> updateContextDescribableContext(
+			ContextDescribable contextDescribable, Map<ContextType, Object> rootMap, ContextType[] contextTypes) {
+		java.util.Map<ContextType, ContextRoot> existingRootMap = getEntityManager(contextDescribable.getSourceName())
+				.loadContexts(contextDescribable, contextTypes);
+
+		for (ContextType contextType : contextTypes) {
+			ContextRoot existingRoot = existingRootMap.computeIfAbsent(contextType,
+					ct -> createContextRoot(contextDescribable, ct));
+
+			rootMap.get(contextType).forEach(newContextRoot -> updateContextRoot(existingRoot, newContextRoot));
+		}
+		return existingRootMap;
+	}
+
+	private ContextRoot createContextRoot(ContextDescribable contextDescribable, ContextType contextType) {
+		EntityFactory factory = getEntityFactory(contextDescribable.getSourceName());
+
+		TemplateRoot templateRoot = findTemplateRoot(contextDescribable, contextType);
+
+		if (contextDescribable instanceof Measurement) {
+			return factory.createContextRoot((Measurement) contextDescribable, templateRoot);
+		} else if (contextDescribable instanceof TestStep) {
+			return factory.createContextRoot((TestStep) contextDescribable, templateRoot);
+		} else {
+			throw new MDMEntityAccessException("Only entities TestStep and Measurement are supported!");
+		}
+	}
+
+	private void updateContextRoot(ContextRoot existingRoot, Object newContextRoot) {
+		transformList(newContextRoot).map(this::transformMap).map(this::transformToMDMEntity).forEach(mdmEntity -> {
+			ContextComponent comp = existingRoot.getContextComponent(mdmEntity.getName())
+					.orElseGet(() -> getEntityFactory(existingRoot.getSourceName())
+							.createContextComponent(mdmEntity.getName(), existingRoot));
+
+			updateContextComponent(comp, mdmEntity.getAttributes());
+		});
+	}
+
+	private void updateContextComponent(ContextComponent contextComponent,
+			java.util.List<MDMContextAttribute> nameValues) {
+		nameValues.forEach(attribute -> Serializer.applyValue(contextComponent.getValue(attribute.getName()),
+				attribute.getValue()));
+	}
+
+	private TemplateRoot findTemplateRoot(ContextDescribable contextDescribable, ContextType contextType) {
+		TestStep testStep;
+		if (contextDescribable instanceof Measurement) {
+			testStep = getTestStep((Measurement) contextDescribable);
+		} else if (contextDescribable instanceof TestStep) {
+			testStep = (TestStep) contextDescribable;
+		} else {
+			throw new MDMEntityAccessException("Only entities TestStep and Measurement are supported!");
+		}
+		TemplateTestStep tpl = TemplateTestStep.of(testStep).orElseThrow(
+				() -> new MDMEntityAccessException("Cannot find TemplateTestStep for TestStep: " + testStep));
+
+		return tpl.getTemplateRoot(contextType).orElseThrow(() -> new MDMEntityAccessException(
+				"Cannot find TemplateRoot for ContextType " + contextType + " on Template TestStep " + tpl));
+	}
+
+	public TestStep getTestStep(ContextDescribable contextDescribable) {
+		if (contextDescribable instanceof TestStep) {
+			return (TestStep) contextDescribable;
+		} else {
+			return getTestStep((Measurement) contextDescribable);
+		}
+	}
+
+	private TestStep getTestStep(Measurement measurement) {
+		return getEntityManager(measurement.getSourceName()).loadParent(measurement, TestStep.class).orElseThrow(
+				() -> new MDMEntityAccessException("Cannot find parent TestStep of Measurement: " + measurement));
+	}
+
+	private EntityManager getEntityManager(String sourceName) {
+		return connectorService.getContextByName(sourceName).getEntityManager()
+				.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present!"));
+	}
+
+	private EntityFactory getEntityFactory(String sourceName) {
+		return connectorService.getContextByName(sourceName).getEntityFactory()
+				.orElseThrow(() -> new MDMEntityAccessException("Entity factory not present!"));
+	}
+
+	private ContextType[] getContextTypes(ContextType[] types) {
+		if (types.length == 0) {
+			return ContextType.values();
+		} else {
+			return types;
+		}
+	}
+
+	public void persist(DescribableContexts ec) {
+		Transaction t = null;
+		try {
+			// start transaction to persist ValueList
+			t = getEntityManager(ec.getTestStep().getSourceName()).startTransaction();
+
+			java.util.Map<Boolean, java.util.List<Entity>> map = ec.getEntities().stream()
+					.collect(Collectors.groupingBy(this::isPersisted));
+
+			t.create(map.getOrDefault(Boolean.FALSE, Collections.emptyList()));
+			t.update(map.getOrDefault(Boolean.TRUE, Collections.emptyList()));
+
+			// commit the transaction
+			t.commit();
+		} catch (Exception e) {
+			if (t != null) {
+				t.abort();
+			}
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	private boolean isPersisted(Entity e) {
+		return !Strings.isNullOrEmpty(e.getID()) && !"0".equals(e.getID());
+	}
+
+	@SuppressWarnings("unchecked")
+	private Map<String, Object> transformMap(Object obj) {
+		if (obj instanceof java.util.Map) {
+			return HashMap.ofAll(java.util.Map.class.cast(obj));
+		} else {
+			throw new MDMEntityAccessException(String.format("Expected instance of '%s', but got '%s'",
+					java.util.Map.class.getName(), obj.getClass().getName()));
+		}
+	}
+
+	/**
+	 * Casts an {@link Object} holding a {@link java.util.List<Object>} to a
+	 * {@link io.vavr.collection.List<Object>}
+	 * 
+	 * @param obj the {@link Object} to cast
+	 * @return the {@link io.vavr.collection.List<Object>}
+	 */
+	@SuppressWarnings("unchecked")
+	public List<Object> transformList(Object obj) {
+		if (obj instanceof java.util.List) {
+			return List.ofAll(java.util.List.class.cast(obj));
+		} else {
+			throw new MDMEntityAccessException(String.format("Expected instance of '%s', but got '%s'",
+					java.util.List.class.getName(), obj.getClass().getName()));
+		}
+	}
+
+	public MDMContextEntity transformToMDMEntity(Map<String, Object> component) {
+		return new MDMContextEntity(
+				component.get("name").map(Object::toString)
+						.getOrElseThrow(() -> new MDMEntityAccessException("Missing attribute 'name' in MDMEntity")),
+				component.get("id").map(Object::toString).getOrElse(""),
+				component.get("type").map(Object::toString).getOrElse(""),
+				component.get("sourceType").map(Object::toString).getOrElse(""),
+				component.get("sourceName").map(Object::toString).getOrElse(""),
+				transformList(component.get("attributes").getOrElseThrow(
+						() -> new MDMEntityAccessException("Missing attribute 'attributes' in MDMEntity")))
+								.map(this::transformMap)
+								.map(m -> new MDMContextAttribute(
+										m.get("name").map(Object::toString)
+												.getOrElseThrow(() -> new MDMEntityAccessException(
+														"Missing attribute 'name' in MDMAttribute")),
+										m.get("value").map(Object::toString)
+												.getOrElseThrow(() -> new MDMEntityAccessException(
+														"Missing attribute 'value' in MDMAttribute")),
+										m.get("unit").map(Object::toString).getOrElse(""),
+										m.get("datatype").map(Object::toString).getOrElse(""), null, null, null, null))
+								.toJavaList());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/DataAccessHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/DataAccessHelper.java
new file mode 100644
index 0000000..15e3c0e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/DataAccessHelper.java
@@ -0,0 +1,129 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.service;
+
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.vavr.CheckedFunction2;
+
+/**
+ * Helper class providing functions to realize transactional data operations
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+public final class DataAccessHelper {
+
+	private static final Logger LOG = LoggerFactory.getLogger(DataAccessHelper.class);
+
+	/**
+	 * Just hide the default constructor
+	 */
+	private DataAccessHelper() {
+	}
+
+	/**
+	 * Returns a function that executes one transactional operation within a
+	 * transaction.
+	 * 
+	 * @return Function that executes a transactional operation on an entity within
+	 *         a transaction.
+	 */
+	// TODO anehmer on 2017-11-22: extend this method to handle lists of objects
+	public static <T extends Entity> T execute(EntityManager em, T entity,
+			CheckedFunction2<Transaction, Entity, Entity> operation) {
+		Transaction t = null;
+		try {
+			// start transaction to persist ValueList
+			t = em.startTransaction();
+			// perform the transactional operation
+			@SuppressWarnings("unchecked")
+			T processedEntity = (T) operation.apply(t, entity);
+			// commit the transaction
+			t.commit();
+			// return the processed entity
+			return processedEntity;
+		} catch (Throwable e) {
+			if (t != null) {
+				t.abort();
+			}
+			throw new MDMEntityAccessException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Function that creates an {@link Entity} and returns it.
+	 */
+	public static final CheckedFunction2<Transaction, Entity, Entity> DELETE = (transaction, entity) -> {
+		if (entity instanceof Deletable) {
+			// TODO anehmer on 2017-11-22: call to delete() should return entity
+			transaction.delete(Arrays.asList((Deletable) entity));
+		}
+		// if entity cannot be deleted
+		else {
+			throw new MDMEntityAccessException("Entity to delete is no Deletable");
+		}
+		return entity;
+	};
+
+	/**
+	 * Function that creates the given {@link Entity} and returns the updated
+	 * entity.
+	 */
+	public static final CheckedFunction2<Transaction, Entity, Entity> CREATE = (transaction, entity) -> {
+		// TODO anehmer on 2017-11-22: call to create() should return entity
+		transaction.create(Arrays.asList(entity));
+		return entity;
+	};
+
+	/**
+	 * Function that updates the given {@link Entity} it is executed upon and
+	 * returns the updated entity.
+	 */
+	public static final CheckedFunction2<Transaction, Entity, Entity> UPDATE = (transaction, entity) -> {
+		// TODO anehmer on 2017-11-22: call to update() should return entity
+		transaction.update(Arrays.asList(entity));
+		return entity;
+	};
+
+	/**
+	 * Handles a {@link Throwable} by loggging the exception message and rethrowing
+	 * a {@link MDMEntityAccessException}
+	 */
+	// TODO should be replaced in Resources by buildErrorResponse()
+	public static final Consumer<? super Throwable> rethrowAsMDMEntityAccessException = e -> {
+		// TODO anehmer on 2017-11-09: check if logging is necessary depending on how we
+		// handle error logging and client response in general
+		LOG.error(e.getMessage(), e);
+		throw new MDMEntityAccessException(e.getMessage(), e);
+	};
+
+	/**
+	 * Function that handles an occurred exception without rethrowing it
+	 */
+	// TODO anehmer on 2017-11-22: remove method and logger
+	public static final Consumer<? super Throwable> handleException = e -> {
+		LOG.error(e.getMessage(), e);
+	};
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/DescribableContexts.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/DescribableContexts.java
new file mode 100644
index 0000000..7e6affc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/DescribableContexts.java
@@ -0,0 +1,98 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.service;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.TestStep;
+
+/**
+ * DescribableContexts hold Context information for a TestStep and child
+ * Measurements.
+ *
+ */
+public class DescribableContexts {
+
+	private TestStep testStep;
+	private List<Measurement> measurements = new ArrayList<>();
+
+	private Map<ContextType, ContextRoot> orderedContext = new EnumMap<>(ContextType.class);
+	private Map<ContextType, ContextRoot> measuredContext = new EnumMap<>(ContextType.class);
+
+	public TestStep getTestStep() {
+		return testStep;
+	}
+
+	public void setTestStep(TestStep testStep) {
+		this.testStep = testStep;
+	}
+
+	public List<Measurement> getMeasurements() {
+		return measurements;
+	}
+
+	public void setMeasurements(List<Measurement> measurements) {
+		this.measurements = measurements;
+	}
+
+	public void setOrdered(Map<ContextType, ContextRoot> orderedContext) {
+		this.orderedContext = orderedContext;
+	}
+
+	public void setMeasured(Map<ContextType, ContextRoot> measuredContext) {
+		this.measuredContext = measuredContext;
+	}
+
+	public Map<ContextType, ContextRoot> getMeasuredContext() {
+		return measuredContext;
+	}
+
+	public Map<ContextType, ContextRoot> getOrderedContext() {
+		return orderedContext;
+	}
+
+	/**
+	 * @return a list with all entities (TestStep, Measurements, ContextRoots)
+	 */
+	public List<Entity> getEntities() {
+		List<Entity> entities = new ArrayList<>();
+
+		entities.addAll(orderedContext.values());
+		entities.addAll(measuredContext.values());
+		entities.add(getTestStep());
+		entities.addAll(getMeasurements());
+
+		return entities;
+	}
+
+	/**
+	 * @return optional Measurement if existing
+	 */
+	public Optional<Measurement> getAnyMeasurement() {
+		if (measurements.isEmpty()) {
+			return Optional.empty();
+		} else {
+			return Optional.of(measurements.get(0));
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
new file mode 100644
index 0000000..6977e24
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
@@ -0,0 +1,739 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.service;
+
+import static io.vavr.API.$;
+import static io.vavr.API.Case;
+import static io.vavr.API.Tuple;
+import static io.vavr.Predicates.instanceOf;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.ENTITYATTRIBUTE_NAME;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityStore;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.BaseEntity;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.EnumRegistry;
+import org.eclipse.mdm.api.base.model.EnumerationValue;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.api.dflt.model.ValueListValue;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.eclipse.mdm.businessobjects.utils.EntityNotFoundException;
+import org.eclipse.mdm.businessobjects.utils.ReflectUtil;
+import org.eclipse.mdm.businessobjects.utils.RequestBody;
+import org.eclipse.mdm.businessobjects.utils.Serializer;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.vavr.CheckedFunction0;
+import io.vavr.Function0;
+import io.vavr.Tuple;
+import io.vavr.Tuple2;
+import io.vavr.Value;
+import io.vavr.collection.HashMap;
+import io.vavr.collection.List;
+import io.vavr.collection.Map;
+import io.vavr.collection.Seq;
+import io.vavr.collection.Set;
+import io.vavr.collection.Stream;
+import io.vavr.control.Option;
+import io.vavr.control.Try;
+
+/**
+ * Class providing basic data access methods to {@link Entity}s.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+@Stateless
+public class EntityService {
+
+	@Inject
+	private ConnectorService connectorService;
+
+	@EJB
+	private SearchActivity searchActivity;
+
+	@EJB
+	private NavigationActivity navigationActivity;
+
+	@EJB
+	private I18NActivity i18nActivity;
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(EntityService.class);
+
+	/**
+	 * Converts a {@code value} into a {@link Value}. If {@code value} is
+	 * {@code null}, {@code Value.isEmpty() == true}.
+	 * 
+	 * @param value the value to wrap in a {@link Value}
+	 * @return the created {@link Value}
+	 */
+	// TODO anehmer on 2017-11-26: rename to toValue()?
+	public static <T> Value<T> V(T value) {
+		return Option.of(value);
+	}
+
+	/**
+	 * Converts the given string values into a {@link Seq} of {@link Value}s
+	 * wrapping the value.
+	 * 
+	 * @param value the {@link Value}s to put in a {@link Seq}
+	 * @return the created {@link Seq} of {@link Value}s
+	 */
+	public static Seq<Value<String>> SL(String... values) {
+		return List.of(values).map(Option::of);
+	}
+
+	/**
+	 * Converts the given string {@link Value}s into a {@link Seq} of string
+	 * {@link Value}s.
+	 * 
+	 * @param value the {@link Value}s to put in a {@link Seq}
+	 * @return the created {@link Seq} of {@link Value}s
+	 */
+	@SafeVarargs
+	public static Seq<Value<String>> SL(Value<String>... values) {
+		return List.of(values);
+	}
+
+	/**
+	 * Converts the given {@link Value}s into a {@link Seq} of {@link Value}s.
+	 * 
+	 * @param value the {@link Value}s to put in a {@link Seq}
+	 * @return the created {@link Seq} of {@link Value}s
+	 */
+	@SafeVarargs
+	public static Seq<Value<?>> L(Value<?>... values) {
+		return List.of(values);
+	}
+
+	/**
+	 * @see #find(Value, Class, Value, Value, Value...)
+	 */
+	public <T extends Entity> Try<T> find(Value<String> sourceNameSupplier, Class<T> entityClass,
+			Value<String> idSupplier) {
+		return find(sourceNameSupplier, entityClass, idSupplier, (Value<ContextType>) null, null);
+	}
+
+	/**
+	 * @see #find(Value, Class, Value, Value, Value...)
+	 */
+	public <T extends Entity> Try<T> find(Value<String> sourceNameSupplier, Class<T> entityClass,
+			Value<String> idSupplier, Seq<Value<String>> parentIdSuppliers) {
+		return find(sourceNameSupplier, entityClass, idSupplier, (Value<ContextType>) null, parentIdSuppliers);
+	}
+
+	/**
+	 * @see #find(Value, Class, Value, Value, Value...)
+	 */
+	public <T extends Entity> Try<T> find(Value<String> sourceNameSupplier, Class<T> entityClass,
+			Value<String> idSupplier, Value<ContextType> contextTypeSupplier) {
+		return find(sourceNameSupplier, entityClass, idSupplier, contextTypeSupplier, null);
+	}
+
+	/**
+	 * Returns the specified entity by given {@code entityClass} and given
+	 * {@code id}. If the {@code entityClass} is either {@link CatalogAttribute},
+	 * {@link TemplateCompont}, {@link TemplateAttributeAttribute} or
+	 * {@link ContextComponent} the respective root entities
+	 * {@link CatalogComponent}, {@link TemplateRoot} or {@link ContextRoot} are
+	 * used to get the entity to find.
+	 * 
+	 * @param sourceNameSupplier  {@link Value} with the name of the source (MDM
+	 *                            {@link Environment} name)
+	 * @param entityClass         entityType
+	 * @param idSupplier          {@link Value} with id of entity to find
+	 * @param contextTypeSupplier {@link Value} with the contextType of entity to
+	 *                            find. Can be {@code null} if {@code EntityType}
+	 *                            has no {@code ContextType}.
+	 * @param parentIdSuppliers   {@link Value}s with the id(s) of parent(s). For
+	 *                            {@link CatalogAttribute} the parentId must be the
+	 *                            id of the {@link CatalogComponent}, for
+	 *                            {@link TemplateComponent} it must be the id of the
+	 *                            {@link TemplateRoot}, for
+	 *                            {@link TemplateAttribute} it must be the id of the
+	 *                            {@link TemplateRoot} first and also the
+	 *                            {@link TemplateComponent}, for a nested
+	 *                            {@link TemplateComponent} it must be the id of the
+	 *                            {@link TemplateRoot} first and the id of the
+	 *                            parent {@link TemplateComponent} second, for a
+	 *                            {@link TemplateAttribute} within a nested
+	 *                            {@link TemplateComponent} it must be the id of the
+	 *                            {@link TemplateRoot} first, the id of the parent
+	 *                            {@link TemplateComponent} second and the id of the
+	 *                            {@link TemplateComponent} last and for
+	 *                            {@link ContextComponent} it must be the id of the
+	 *                            {@link ContextRoot}.
+	 * @return {@link Try} with the found entity
+	 */
+	// TODO anehmer on 2017-11-22: complete javadoc for ValueListValue and
+	// TemplateTestStepUsage
+	// TODO anehmer on 2017-11-22: add comment for parentIds for TplSensors and
+	// nested TplSensors as well as for TplSensorAttrs and nested TplSensorAttrs
+	@SuppressWarnings("unchecked")
+	public <T extends Entity> Try<T> find(Value<String> sourceNameSupplier, Class<T> entityClass,
+			Value<String> idSupplier, Value<ContextType> contextTypeSupplier, Seq<Value<String>> parentIdSuppliers) {
+
+		// validate parentIds count
+		Map<Class<?>, Integer> minParentsForEntity = HashMap.empty();
+		minParentsForEntity = minParentsForEntity.put(Tuple(CatalogAttribute.class, 1))
+				.put(Tuple(CatalogSensor.class, 1)).put(Tuple(TemplateComponent.class, 1))
+				.put(Tuple(TemplateAttribute.class, 2)).put(Tuple(TemplateSensor.class, 2))
+				.put(Tuple(ValueListValue.class, 1)).put(Tuple(TemplateTestStepUsage.class, 1));
+
+		// return failure if number of parentIds do not correspond with the minimu
+		// required by the entity type
+		Option<Integer> minParents = minParentsForEntity.get(entityClass);
+		// TODO anehmer on 2017-11-25: add entity types to message
+		if (minParents.isDefined() && (parentIdSuppliers == null || minParents.get() > parentIdSuppliers.size())) {
+			return Try.failure(new IllegalArgumentException("ParentId(s) of " + entityClass.getSimpleName()
+					+ " not set appropriately. Expected minimum: " + minParents.get()));
+		}
+
+		// if the find is contextType specific
+		if (contextTypeSupplier != null && !contextTypeSupplier.isEmpty()) {
+			if (entityClass.equals(CatalogAttribute.class)) {
+				// get CatalogAttribute from CatalogComponent
+				if (parentIdSuppliers.size() == 1) {
+					return find(sourceNameSupplier, CatalogComponent.class, parentIdSuppliers.get(0),
+							contextTypeSupplier)
+									.map(catComp -> (T) getChild(CatalogAttribute.class, idSupplier,
+											catComp::getCatalogAttributes));
+				}
+				// get the CatalogAttribute from a CatalogSensor
+				else if (parentIdSuppliers.size() == 2) {
+					return find(sourceNameSupplier, CatalogSensor.class, parentIdSuppliers.get(1), contextTypeSupplier,
+							parentIdSuppliers.dropRight(1))
+									.map(catComp -> (T) getChild(CatalogAttribute.class, idSupplier,
+											catComp::getCatalogAttributes));
+				}
+			}
+
+			// get CatalogSensor from CatalogComponent
+			else if (entityClass.equals(CatalogSensor.class)) {
+				return find(sourceNameSupplier, CatalogComponent.class, parentIdSuppliers.get(0), contextTypeSupplier)
+						.map(catComp -> (T) getChild(CatalogSensor.class, idSupplier, catComp::getCatalogSensors));
+			}
+
+			// get TemplateComponent from TemplateRoot or parent TemplateComponent(s)
+			else if (entityClass.equals(TemplateComponent.class)) {
+				// if nested TplComp has to be found
+				if (parentIdSuppliers.size() > 1) {
+					return find(sourceNameSupplier, TemplateComponent.class,
+							parentIdSuppliers.get(parentIdSuppliers.size() - 1), contextTypeSupplier,
+							parentIdSuppliers.dropRight(1))
+									.map(tplComp -> (T) getChild(TemplateComponent.class, idSupplier,
+											tplComp::getTemplateComponents));
+				}
+				// if non-nested TplComp has to be found: exit condition of recursive call
+				return find(sourceNameSupplier, TemplateRoot.class, parentIdSuppliers.get(0), contextTypeSupplier).map(
+						tplRoot -> (T) getChild(TemplateComponent.class, idSupplier, tplRoot::getTemplateComponents));
+			}
+
+			// get TemplateAttributes from TemplateComponent
+			else if (entityClass.equals(TemplateAttribute.class)) {
+				Try<TemplateComponent> tplCompTry = find(sourceNameSupplier, TemplateComponent.class,
+						parentIdSuppliers.get(parentIdSuppliers.size() - 1), contextTypeSupplier,
+						parentIdSuppliers.dropRight(1));
+				// if TemplateSensorAttribute has to be found
+				if (!tplCompTry.isFailure()) {
+					return tplCompTry.map(tplComp -> (T) getChild(TemplateAttribute.class, idSupplier,
+							tplComp::getTemplateAttributes));
+				} else {
+					return find(sourceNameSupplier, TemplateSensor.class,
+							parentIdSuppliers.get(parentIdSuppliers.size() - 1), contextTypeSupplier,
+							parentIdSuppliers.dropRight(1))
+									.map(tplComp -> (T) getChild(TemplateAttribute.class, idSupplier,
+											tplComp::getTemplateAttributes));
+				}
+			}
+
+			// get TemplateSensor from TemplateComponent
+			else if (entityClass.equals(TemplateSensor.class)) {
+				return find(sourceNameSupplier, TemplateComponent.class,
+						parentIdSuppliers.get(parentIdSuppliers.size() - 1), contextTypeSupplier,
+						parentIdSuppliers.dropRight(1)).map(
+								tplComp -> (T) getChild(TemplateSensor.class, idSupplier, tplComp::getTemplateSensors));
+			}
+
+			// get ContextComponent from ContextRoot
+			else if (entityClass.equals(ContextComponent.class)) {
+				// TODO anehmer on 2017-11-09: implement (also for nested ContextComponents)
+				throw new RuntimeException("NOT IMPLEMENTED YET");
+			}
+
+			// get root nested entities (CatalogComponent, TemplateRoot, ContextRoot)
+			return getEntityManager(sourceNameSupplier)
+					.mapTry(em -> em.load(entityClass, contextTypeSupplier.get(), idSupplier.get()));
+		}
+
+		// get ValueListValue from ValueList
+		else if (entityClass.equals(ValueListValue.class)) {
+			return find(sourceNameSupplier, ValueList.class, parentIdSuppliers.get(0))
+					.map(valueList -> (T) getChild(ValueListValue.class, idSupplier, valueList::getValueListValues));
+		}
+
+		// get TemplateTestStepUsage from TemplateTest
+		else if (entityClass.equals(TemplateTestStepUsage.class)) {
+			return find(sourceNameSupplier, TemplateTest.class, parentIdSuppliers.get(0))
+					.map(tplTest -> (T) getChild(TemplateTestStepUsage.class, idSupplier,
+							tplTest::getTemplateTestStepUsages));
+		}
+
+		// for all other cases
+		return getEntityManager(sourceNameSupplier).map(em -> em.load(entityClass, idSupplier.get()));
+	}
+
+	/**
+	 * Gets the child with the given {@code childId} or an EntityNotFoundException
+	 * if the child was not found
+	 * 
+	 * @param childClass      class of child to construct exception on failure
+	 * @param childIdSupplier supplier of the id of child to find
+	 * @param childSupplier   function that gets all children
+	 * @return the found child
+	 */
+	private <T extends Entity> T getChild(Class<T> childClass, Value<String> childIdSupplier,
+			Function0<java.util.List<T>> childSupplier) {
+		return Stream.ofAll(childSupplier.apply())
+				.find(childEntity -> childEntity.getID().equals(childIdSupplier.get()))
+				.getOrElseThrow(() -> new EntityNotFoundException(childClass, childIdSupplier.get()));
+	}
+
+	/**
+	 * Returns a {@link Try} of all {@link Entity}s if no filter is available.
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param entityClass class of the {@link Entity} to find
+	 * @param filter      filter string to filter the {@link Entity} result. Can be
+	 *                    null.
+	 * @return a {@link Try} of the list of found {@link Entity}s
+	 */
+	// TODO anehmer on 2017-11-26: make filter Value<String>
+	public <T extends Entity> Try<List<T>> findAll(Value<String> sourceNameSupplier, Class<T> entityClass,
+			String filter) {
+		return findAll(sourceNameSupplier, entityClass, filter, null);
+	}
+
+	/**
+	 * Returns a {@link Try} of the matching {@link Entity}s of the given
+	 * contextType using the given filter or all {@link Entity}s of the given
+	 * contextType provided by the {@code contextTypeSupplier} if no filter is
+	 * available.
+	 * 
+	 * @param sourceNameSupplier  {@link Value} with the name of the source (MDM
+	 *                            {@link Environment} name)
+	 * @param entityClass         class of the {@link Entity} to find
+	 * @param filter              filter string to filter the {@link Entity} result
+	 * @param contextTypeSupplier a {@link Value} with the contextType of entity to
+	 *                            find. Can be {@code null} if {@code EntityType}
+	 *                            has no {@code ContextType}.
+	 * @return a {@link Try} of the list of found {@link Entity}s
+	 */
+	// TODO anehmer on 2017-11-26: make filter Value<String>
+	public <T extends Entity> Try<List<T>> findAll(Value<String> sourceNameSupplier, Class<T> entityClass,
+			String filter, Value<ContextType> contextTypeSupplier) {
+		// TODO anehmer on 2017-11-22: do we need to implement the navigationActivity
+		// filter shortcut like in ChannelGroupService.getChannelGroups()
+		if (filter == null || filter.trim().length() <= 0) {
+			return Try.of(getLoadAllEntitiesMethod(getEntityManager(sourceNameSupplier).get(), entityClass,
+					contextTypeSupplier)).map(javaList -> List.ofAll(javaList));
+		} else {
+			// TODO anehmer on 2017-11-15: not tested
+			return Try.of(() -> this.searchActivity.search(connectorService.getContextByName(sourceNameSupplier.get()),
+					entityClass, filter)).map(javaList -> List.ofAll(javaList));
+		}
+	}
+
+	/**
+	 * Returns the method to load all entities of type {@code entityClass}. If a
+	 * {@code ContextType} is given the appropriate method in
+	 * {@link org.eclipse.mdm.api.dflt.EntityManager} is used
+	 * 
+	 * @param entityManager entityManager to load entities with
+	 * @param entityClass   class of entites to load
+	 * @param contextType   {@link ContextType} of entities of null if none
+	 * @return the appropriate loadAllEntities() method
+	 */
+	private <T extends Entity> CheckedFunction0<java.util.List<T>> getLoadAllEntitiesMethod(EntityManager entityManager,
+			Class<T> entityClass, Value<ContextType> contextType) {
+		// if contextType is specified
+		if (contextType != null && !contextType.isEmpty()) {
+			return (() -> entityManager.loadAll(entityClass, contextType.get()));
+		}
+		return (() -> entityManager.loadAll(entityClass));
+	}
+
+	/**
+	 * Creates a new {@link Entity} of type entityClass. The method searches the
+	 * {@link EntityFactory} for a suitable create() method by matching the return
+	 * parameter and the given entity class. If more than one method is found, the
+	 * first one is taken. The argument are provided by {@link Try<Object>}s so that
+	 * any exceptions thrown throughout retrieval will be wrapped in the returned
+	 * {@link Try}.
+	 * 
+	 * @param entityClass       class of the {@link Entity} to create
+	 * @param sourceName        name of the source (MDM {@link Environment} name)
+	 * @param argumentSuppliers varargs of {@link Try<?>s that supply the create()
+	 * method arguments
+	 * @return a {@link Try} with the created {@link Entity}
+	 */
+	@SuppressWarnings("unchecked")
+	public <T extends Entity> Try<T> create(Value<String> sourceNameSupplier, Class<T> entityClass,
+			Seq<Value<?>> argumentSuppliers) {
+
+		// get corresponding create method for entityClass from EntityFactory
+		return Try.of(() -> connectorService.getContextByName(sourceNameSupplier.get()).getEntityFactory())
+				.mapTry(factory -> (T) Stream.of(EntityFactory.class.getMethods())
+						// find method with the return type matching entityClass
+						.filter(m -> m.getReturnType().equals(entityClass))
+						.filter(m -> satisfiesParameters(m.getParameterTypes(),
+								argumentSuppliers.map(s -> s.get().getClass())))
+						.getOrElseThrow(
+								() -> new NoSuchMethodException("No matching create()-method found for EntityType "
+										+ entityClass.getSimpleName() + " taking the parameters "
+										+ argumentSuppliers.map(s -> s.get().getClass().getName())
+												.collect(Collectors.joining(", "))))
+						// invoke with given arguments
+						.invoke(factory.get(), argumentSuppliers.map(Value::get).toJavaArray()))
+				.mapFailure(Case($(instanceOf(InvocationTargetException.class)),
+						t -> ((InvocationTargetException) t).getTargetException()), Case($(), t -> t))
+				.map(e -> DataAccessHelper.execute(getEntityManager(sourceNameSupplier).get(), e,
+						DataAccessHelper.CREATE));
+	}
+
+	/**
+	 * Checks if the given parameter types are all assignable from the required
+	 * parameters
+	 * 
+	 * @param parameterTypes
+	 * @param requiredParameters
+	 * @return true if the given parameter types are all assignable from the
+	 *         required parameters
+	 */
+	boolean satisfiesParameters(Class<?>[] parameterTypes, Seq<Class<?>> requiredParameters) {
+		boolean result = parameterTypes.length == requiredParameters.length();
+		result &= List.of(parameterTypes).zip(requiredParameters)
+				.filter(t -> !ReflectUtil.isAssignableTo(t._2(), t._1())).isEmpty();
+		return result;
+	}
+
+	/**
+	 * Updates the given {@link Entity} with the values of the given map provided by
+	 * the {@code valueMapSupplier}.
+	 * 
+	 * @param sourceName       name of the source (MDM {@link Environment} name)
+	 * @param entity           the entity to update
+	 * @param valueMapSupplier {@link Supplier<Map<String, Object>> of a map of
+	 * values to update the entity with according to matching attribute values by
+	 * name case sensitive
+	 * @return a {@link Try} of the updated entity
+	 */
+	public <T extends Entity> Try<T> update(Value<String> sourceNameSupplier, Try<T> entity,
+			Value<Map<String, Object>> valueMapSupplier) {
+		// return updated entity
+		return
+		// update entity values
+		entity.map(e -> updateEntityValues(e, valueMapSupplier.get(), sourceNameSupplier))
+				// persist entity
+				.map(e -> DataAccessHelper.execute(getEntityManager(sourceNameSupplier).get(), e.get(),
+						DataAccessHelper.UPDATE));
+	}
+
+	/**
+	 * Deletes the given {@link Entity} {@code valueMapSupplier}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param entity     the entity to delete
+	 * @return a {@link Try} of the deleted entity
+	 */
+	public <T extends Entity> Try<T> delete(Value<String> sourceNameSupplier, Try<T> entity) {
+		return entity.map(
+				e -> DataAccessHelper.execute(getEntityManager(sourceNameSupplier).get(), e, DataAccessHelper.DELETE));
+	}
+
+	/**
+	 * Returns a {@link Try} of the the {@link SearchAttribute}s for the given
+	 * entityClass
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param entityClass class of the {@link Entity} to get the
+	 *                    {@link SearchAttribute}s for
+	 * 
+	 * @return a {@link Try} with the {@link SearchAttribute}s
+	 */
+	public <T extends Entity> Try<List<SearchAttribute>> getSearchAttributesSupplier(Value<String> sourceNameSupplier,
+			Class<T> entityClass) {
+		return Try.of(() -> List.ofAll(this.searchActivity
+				.listAvailableAttributes(connectorService.getContextByName(sourceNameSupplier.get()), entityClass)));
+	}
+
+	/**
+	 * Returns a {@link Try} of the localized {@link Entity} type name
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param entityClass class of the {@link Entity} to be localized
+	 * 
+	 * @return a {@link Try} with the localized {@link Entity} type name
+	 */
+	public <T extends Entity> Try<Map<EntityType, String>> getLocalizeTypeSupplier(Value<String> sourceNameSupplier,
+			Class<T> entityClass) {
+		return Try.of(() -> HashMap.ofAll(this.i18nActivity.localizeType(sourceNameSupplier.get(), entityClass)));
+	}
+
+	/**
+	 * Returns a {@link Try} of the localized {@link Entity} attributes
+	 * 
+	 * @param sourceName  name of the source (MDM {@link Environment} name)
+	 * @param entityClass class of the {@link Entity} to be localized
+	 * @return a {@link Try} with the the localized {@link Entity} attributes
+	 */
+	public <T extends Entity> Try<Map<Attribute, String>> getLocalizeAttributesSupplier(
+			Value<String> sourceNameSupplier, Class<T> entityClass) {
+		return Try.of(() -> HashMap.ofAll(this.i18nActivity.localizeAttributes(sourceNameSupplier.get(), entityClass)));
+	}
+
+	/**
+	 * Returns a {@link Try} of an {@link EnumerationValue} for the name supplied by
+	 * the {@code enumValueNameSupplier}
+	 * 
+	 * @param enumValueNameSupplier supplies the name of the
+	 *                              {@link EnumerationValue} to get
+	 * @return a {@link Try} with the resolved {@link EnumerationValue}
+	 */
+	public Try<EnumerationValue> getEnumerationValueSupplier(Try<?> enumValueNameSupplier) {
+		return Try.of(() -> EnumRegistry.getInstance().get(EnumRegistry.VALUE_TYPE)
+				.valueOf(enumValueNameSupplier.get().toString()));
+	}
+
+	/**
+	 * Gets the EntityManager from the ConnectorService with the given source name
+	 * provided by the {@code sourceNameSupplier}.
+	 * 
+	 * @param sourceNameSupplier {@link Value} with the name of the datasource to
+	 *                           get EntityManager for
+	 * @return the found EntityManager. Throws {@link MDMEntityAccessException} if
+	 *         not found.
+	 */
+	private Try<EntityManager> getEntityManager(Value<String> sourceNameSupplier) {
+		return Try.of(() -> this.connectorService.getContextByName(sourceNameSupplier.get()).getEntityManager()
+				.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present")));
+	}
+
+	/**
+	 * Updates the given {@link Entity} with the values from the given valueMap. All
+	 * matching attributes (case sensitive) are updated as well as the referenced
+	 * relations by the id of the given
+	 * {@link org.eclipse.mdm.api.base.model.Entity} and the simple class name as
+	 * the key (the data model attribute name is the reference, case sensitive).
+	 * 
+	 * @param entity   the entity to update
+	 * @param valueMap values to update the entity with according to matching
+	 *                 attribute names. The keys are compared case sensitive.
+	 * @return a {@link Try} with the the updated entity
+	 */
+	@SuppressWarnings("unchecked")
+	public <T extends Entity> Try<T> updateEntityValues(T entity, Map<String, Object> valueMap,
+			Value<String> sourceNameSupplier) {
+
+		HashMap<String, org.eclipse.mdm.api.base.model.Value> entityValues = HashMap.ofAll(entity.getValues());
+
+		// update primitive values where the key from the valueMap has a matching entity
+		// value and collect the updated keys
+		Set<String> updatedPrimitiveValues = valueMap
+				.filter((valueMapEntryKey, valueMapEntryValue) -> entityValues.containsKey(valueMapEntryKey)
+						&& !(valueMapEntryValue instanceof java.util.Map))
+				.map((entityValueEntryKey, entityValueEntryValue) -> {
+					entityValues.get(entityValueEntryKey)
+							.forEach(value -> Serializer.applyValue(value, entityValueEntryValue));
+					return new Tuple2<>(entityValueEntryKey, entityValueEntryValue);
+				}).keySet();
+
+		// update enumeration values
+		Set<String> updatedEnumerationValues = valueMap
+				.filter((valueMapEntryKey, valueMapEntryValue) -> entityValues.containsKey(valueMapEntryKey)
+						&& (valueMapEntryValue instanceof java.util.Map))
+				.map((entityValueEntryKey, entityValueEntryValue) -> {
+					entityValues.get(entityValueEntryKey).forEach(value -> {
+						// get key-value-pairs that identify the enum und enumValue
+						String enumName = ((java.util.Map<String, String>) entityValueEntryValue).get("Enumeration");
+						String enumValueName = ((java.util.Map<String, String>) entityValueEntryValue)
+								.get("EnumerationValue");
+
+						if (enumName == null || enumValueName == null) {
+							throw new IllegalArgumentException("EnumerationValue is set by providing a map "
+									+ "containing the keys 'Enumeration' and 'EnumerationValue' "
+									+ "and the respective names as the values");
+						}
+
+						// find enumeration and the enumeration value
+						Option.of(EnumRegistry.getInstance()
+								// get enum
+								.get(enumName)).onEmpty(() -> {
+									throw new IllegalArgumentException("Enumeration [" + enumName + "] not found");
+								})
+								// get enumValue
+								.map(enumeration -> enumeration.valueOf(enumValueName))
+								// if enumValue is not found, null is returned
+								.filter(Objects::nonNull).onEmpty(() -> {
+									throw new IllegalArgumentException("EnumerationValue [" + enumValueName
+											+ "] not found in Enumeration [" + enumName + "]");
+								})
+								// set enumValue
+								.map(enumValue -> {
+									value.set(enumValue);
+									return enumValue;
+								});
+
+					});
+					return new Tuple2<>(entityValueEntryKey, entityValueEntryValue);
+				}).keySet();
+
+		// update the relations and gather the updated keys
+		// use only those keys that have not been updated yet and can be resolved as
+		// class names. If so, try to update accordingly named relation with the entity
+		// found by its id given as the value
+		Set<String> updatedRelations = valueMap
+				.filter((valueMapEntryKey, valueMapEntryValue) -> !updatedPrimitiveValues.contains(valueMapEntryKey)
+						&& !updatedEnumerationValues.contains(valueMapEntryKey))
+				.filter((relatedEntityClassName, relatedEntityId) -> {
+					EntityStore store = getMutableStore(entity);
+
+					ContextType contextType = null;
+					// determine if class has a context type
+					for (ContextType ct : ContextType.values()) {
+						int index = relatedEntityClassName.toUpperCase().indexOf(ct.name());
+						if (index > 0) {
+							contextType = ct;
+							// cut out ContextType
+							relatedEntityClassName = relatedEntityClassName.substring(0, index)
+									+ relatedEntityClassName.substring(index + ct.name().length());
+						}
+					}
+
+					// to have final variables for Try
+					final String processedRelatedEntityClassName = relatedEntityClassName;
+					final ContextType contextTypeIfPresent = contextType;
+
+					// load class from model packages
+					Try<Class<Entity>> updateTry = Try
+							.of(() -> (Class<Entity>) Class
+									.forName("org.eclipse.mdm.api.base.model." + processedRelatedEntityClassName))
+							.orElse(Try.of(() -> (Class<Entity>) Class
+									.forName("org.eclipse.mdm.api.dflt.model." + processedRelatedEntityClassName)))
+							// update related entity by first finding the related entity by its id
+							// use find and store.set() with ContextType if needed
+							.andThenTry(entityClass -> {
+								if (contextTypeIfPresent == null) {
+									store.set(find(sourceNameSupplier, entityClass, V(relatedEntityId.toString()))
+											.onFailure(e -> LOGGER.error(e.getMessage())).get());
+								} else {
+									store.set(
+											find(sourceNameSupplier, entityClass, V(relatedEntityId.toString()),
+													V(contextTypeIfPresent))
+															.onFailure(e -> LOGGER.error(e.getMessage())).get(),
+											contextTypeIfPresent);
+								}
+							}).onFailure(e -> LOGGER.error("Entity of type [" + processedRelatedEntityClassName
+									+ "] and ID " + relatedEntityId + " not found", e));
+
+					return updateTry.isSuccess() ? true : false;
+				}).keySet();
+
+		// return Try.Failure if there are keys that are not present in the entity and
+		// thus are not updated
+		String unmappedKeys = valueMap.filterKeys(key -> !updatedPrimitiveValues.contains(key)
+				&& !updatedEnumerationValues.contains(key) && !updatedRelations.contains(key)).map(Tuple::toString)
+				.collect(Collectors.joining(", "));
+
+		if (unmappedKeys != null && !unmappedKeys.isEmpty()) {
+			return Try.failure(
+					new IllegalArgumentException("ValueMap to update entity contains the following keys that either "
+							+ "have no match in the entity values or relations to update "
+							+ "or an error occurred while finding the related entity: " + unmappedKeys));
+		} else {
+			return Try.of(() -> entity);
+		}
+	}
+
+	/**
+	 * Get the mutableStore from {@link org.eclipse.mdm.api.base.adapter.Core} of
+	 * given {@link org.eclipse.mdm.api.base.model.Entity}
+	 * 
+	 * @param e Entity to get Core of
+	 * @return Core of given Entity
+	 */
+	private static EntityStore getMutableStore(Entity e) {
+		return Try.of(() -> {
+			Method getMetod;
+			try {
+				getMetod = BaseEntity.class.getDeclaredMethod("getCore");
+				getMetod.setAccessible(true);
+			} catch (NoSuchMethodException | SecurityException x) {
+				throw new IllegalStateException(
+						"Unable to load 'getCore()' in class '" + BaseEntity.class.getSimpleName() + "'.", x);
+			}
+			Core core = (Core) getMetod.invoke(e);
+			return core.getMutableStore();
+		}).get();
+	}
+
+	public Seq<Value<?>> extractRequestBody(String body, String sourceName) {
+		return extractRequestBody(body, sourceName, List.empty());
+	}
+
+	// TODO: Clarify which input should be handled.
+	// TODO: Improve error msg?
+	public Seq<Value<?>> extractRequestBody(String body, String sourceName,
+			List<Class<? extends Entity>> entityClasses) {
+		RequestBody requestBody = RequestBody.create(body);
+		List<Try<?>> name = List.of(requestBody.getStringValueSupplier(ENTITYATTRIBUTE_NAME));
+		return entityClasses
+				.map(clazz -> find(V(sourceName), clazz, requestBody.getStringValueSupplier(clazz.getSimpleName())))
+				.foldLeft(name, (l, e) -> l.append(e)).filter(Try::isSuccess).map(Try::toOption);
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java
new file mode 100755
index 0000000..b4bc1bd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java
@@ -0,0 +1,49 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.utils;
+
+import org.eclipse.mdm.api.base.model.Entity;
+
+/**
+ * Exception thrown if entity could not be retrieved from the datastore
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+public class EntityNotFoundException extends RuntimeException {
+
+	private static final long serialVersionUID = 6862157710262117670L;
+
+	/**
+	 * Default constructor with causing exception
+	 * 
+	 * @param entityClass Class of entity that could not be found
+	 * @param id          id of entity that could not be found
+	 * @param x           the cause of the exception
+	 */
+	public EntityNotFoundException(Class<? extends Entity> entityClass, String id, Throwable x) {
+		super(entityClass.getSimpleName() + " with ID " + id + " not found.", x);
+	}
+
+	/**
+	 * Default constructor without causing exception
+	 * 
+	 * @param entityClass Class of entity that could not be found
+	 * @param id          id of entity that could not be found
+	 */
+	public EntityNotFoundException(Class<? extends Entity> entityClass, String id) {
+		super(entityClass.getSimpleName() + " with ID " + id + " not found.");
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityTypeUtil.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityTypeUtil.java
new file mode 100644
index 0000000..536eb77
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityTypeUtil.java
@@ -0,0 +1,60 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+package org.eclipse.mdm.businessobjects.utils;

+

+import org.eclipse.mdm.api.base.model.ContextDescribable;

+import org.eclipse.mdm.api.base.model.FilesAttachable;

+import org.eclipse.mdm.api.base.model.Measurement;

+import org.eclipse.mdm.api.base.model.Test;

+import org.eclipse.mdm.api.base.model.TestStep;

+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;

+

+public class EntityTypeUtil {

+	

+	private static final String ENTITYTYPE_TEST = "TEST";

+	private static final String ENTITYTYPE_TESTSTEP = "TESTSTEP";

+	private static final String ENTITYTYPE_MEASUREMENT = "MEASUREMENT";

+

+	public static Class<? extends FilesAttachable> getFilesAttachableClassByEntityType(String entityType) {

+		Class<? extends FilesAttachable> response;

+		switch (entityType.toUpperCase()) {

+			case ENTITYTYPE_TEST:

+				response = Test.class;

+				break;

+			case ENTITYTYPE_TESTSTEP:

+				response = TestStep.class;

+				break;

+			case ENTITYTYPE_MEASUREMENT:

+				response = Measurement.class;

+				break;

+			default:

+				throw new MDMEntityAccessException("Given entity type is unknown or not implementing FilesAttachable interface.");

+		}

+		return response;

+	}

+	

+	public static Class<? extends ContextDescribable> getContextDescribableClassByEntityType(String entityType) {

+		Class<? extends ContextDescribable> response;

+		switch (entityType.toUpperCase()) {

+			case ENTITYTYPE_TESTSTEP:

+				response = TestStep.class;

+				break;

+			case ENTITYTYPE_MEASUREMENT:

+				response = Measurement.class;

+				break;

+			default:

+				throw new MDMEntityAccessException("Given entity type is unknown or not implementing ContextDescribable interface.");

+		}

+		return response;

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
new file mode 100755
index 0000000..e3882e2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
@@ -0,0 +1,66 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.utils;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.regex.Pattern;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonTokenId;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer;
+
+/**
+ * JSON Deserializer for ISO 8601 compliant dates with format
+ * 
+ * <pre>
+ * yyyy-MM-dd'T'HH:mm:ss'Z'
+ * </pre>
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+class ISODateDeseralizer extends UntypedObjectDeserializer {
+
+	private static final long serialVersionUID = 1L;
+
+	transient DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
+	// use pattern for the dateformat as we only compile this
+	private static final Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}Z");
+
+	/**
+	 * Deserialize JSON and try to parse every String as an ISO8601 date
+	 */
+	@Override
+	public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
+		// try to parse every string as a date
+		// TODO anehmer on 2018-04-30: this approach could lead to a performance leak as
+		// every incoming string is tried to be converted into a date though the
+		// approach is very generic
+		// Optimized with pre-compiled pattern to avoid random exception throwing
+		if (jp.getCurrentTokenId() == JsonTokenId.ID_STRING && jp.getTextLength() > 0 && pattern.matcher(jp.getText()).matches()) {
+			try {
+				return LocalDateTime.parse(jp.getText(), dateFormatter);
+			} catch (Exception e) {
+				return super.deserialize(jp, ctxt);
+			}
+		} else {
+			return super.deserialize(jp, ctxt);
+		}
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/JsonMessageBodyProvider.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/JsonMessageBodyProvider.java
new file mode 100644
index 0000000..20c21c5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/JsonMessageBodyProvider.java
@@ -0,0 +1,130 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.nio.charset.Charset;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+
+import com.google.common.base.Charsets;
+import com.google.protobuf.GeneratedMessageV3;
+import com.google.protobuf.Message;
+import com.google.protobuf.util.JsonFormat;
+import com.google.protobuf.util.JsonFormat.Parser;
+import com.google.protobuf.util.JsonFormat.Printer;
+
+/**
+ * MessageBodyProvider for handling json payloads.
+ * 
+ */
+@Provider
+@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();
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.ws.rs.ext.MessageBodyReader#isReadable(java.lang.Class,
+	 * java.lang.reflect.Type, java.lang.annotation.Annotation[],
+	 * javax.ws.rs.core.MediaType)
+	 */
+	@Override
+	public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations,
+			final MediaType mediaType) {
+		return Message.class.isAssignableFrom(type);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.ws.rs.ext.MessageBodyReader#readFrom(java.lang.Class,
+	 * java.lang.reflect.Type, java.lang.annotation.Annotation[],
+	 * javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap,
+	 * java.io.InputStream)
+	 */
+	@Override
+	public Message readFrom(final Class<Message> type, final Type genericType, final Annotation[] annotations,
+			final MediaType mediaType, final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream)
+			throws IOException {
+		try {
+			final Method newBuilder = type.getMethod("newBuilder");
+			final GeneratedMessageV3.Builder<?> builder = (GeneratedMessageV3.Builder<?>) newBuilder.invoke(type);
+			jsonParser.merge(new InputStreamReader(entityStream, charset), builder);
+			return builder.build();
+		} catch (Exception e) {
+			throw new WebApplicationException(e);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.ws.rs.ext.MessageBodyWriter#getSize(java.lang.Object,
+	 * java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[],
+	 * javax.ws.rs.core.MediaType)
+	 */
+	@Override
+	public long getSize(final Message m, final Class<?> type, final Type genericType, final Annotation[] annotations,
+			final MediaType mediaType) {
+		return -1;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.ws.rs.ext.MessageBodyWriter#isWriteable(java.lang.Class,
+	 * java.lang.reflect.Type, java.lang.annotation.Annotation[],
+	 * javax.ws.rs.core.MediaType)
+	 */
+	@Override
+	public boolean isWriteable(final Class<?> type, final Type genericType, final Annotation[] annotations,
+			final MediaType mediaType) {
+		return Message.class.isAssignableFrom(type);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.ws.rs.ext.MessageBodyWriter#writeTo(java.lang.Object,
+	 * java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[],
+	 * javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap,
+	 * java.io.OutputStream)
+	 */
+	@Override
+	public void writeTo(final Message m, final Class<?> type, final Type genericType, final Annotation[] annotations,
+			final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders,
+			final OutputStream entityStream) throws IOException {
+		entityStream.write(jsonPrinter.print(m).getBytes(charset));
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/MDMExceptionMapper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/MDMExceptionMapper.java
new file mode 100644
index 0000000..99fd5d5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/MDMExceptionMapper.java
@@ -0,0 +1,28 @@
+/*******************************************************************************

+ * Copyright (c) 2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *******************************************************************************/

+package org.eclipse.mdm.businessobjects.utils;

+

+import javax.ws.rs.core.Response;

+import javax.ws.rs.core.Response.Status;

+import javax.ws.rs.ext.ExceptionMapper;

+import javax.ws.rs.ext.Provider;

+

+import com.google.common.base.Throwables;

+

+@Provider

+public class MDMExceptionMapper implements ExceptionMapper<Throwable> {

+	@Override

+	public Response toResponse(Throwable t) {

+		return Response.status(Status.INTERNAL_SERVER_ERROR).entity(Throwables.getStackTraceAsString(t)).build();

+	}

+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/PreviewException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/PreviewException.java
new file mode 100644
index 0000000..d7ad550
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/PreviewException.java
@@ -0,0 +1,33 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.utils;

+

+/**

+ * Thrown to indicate errors while calculating preview values.

+ *

+ */

+public class PreviewException extends RuntimeException {

+

+	private static final long serialVersionUID = -6305539444033722516L;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param message The error message.

+	 */

+	public PreviewException(String message) {

+		super(message);

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/PreviewHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/PreviewHelper.java
new file mode 100644
index 0000000..7f13d26
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/PreviewHelper.java
@@ -0,0 +1,271 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.utils;

+

+import java.math.BigDecimal;

+import java.math.RoundingMode;

+import java.util.List;

+

+import org.eclipse.mdm.protobuf.Mdm;

+import org.eclipse.mdm.protobuf.Mdm.DateArray;

+import org.eclipse.mdm.protobuf.Mdm.DoubleArray;

+import org.eclipse.mdm.protobuf.Mdm.MeasuredValues;

+import org.eclipse.mdm.protobuf.Mdm.MeasuredValues.Builder;

+import org.eclipse.mdm.protobuf.Mdm.PreviewValuesList;

+import org.eclipse.mdm.protobuf.Mdm.ScalarType;

+

+import com.google.common.primitives.Bytes;

+import com.google.common.primitives.Ints;

+import com.google.protobuf.Timestamp;

+

+/**

+ * Helper class to calculate preview values.

+ *

+ */

+public class PreviewHelper {

+	/**

+	 * Calcluates the preview values for numerical datatypes. For non numberical

+	 * datatypes an empty MeasuredValues object is returned.

+	 * 

+	 * @param measuredValues List of measuredValues containing the mass data for the

+	 *                       preview.

+	 * @param numberOfChunks number of requested chunks for the preview

+	 * @return calculated preview values

+	 */

+	public PreviewValuesList calculatePreview(List<MeasuredValues> measuredValues, int numberOfChunks) {

+		return measuredValues.stream().map(mv -> calculatePreview(mv, numberOfChunks))

+				.reduce(Mdm.PreviewValuesList.newBuilder(), (pl1, pl2) -> {

+					pl1.addAllMin(pl2.getMinList());

+					pl1.addAllMax(pl2.getMaxList());

+					pl1.addAllAvg(pl2.getAvgList());

+					return pl1;

+				}).build();

+	}

+

+	/**

+	 * Calculate preview for one {@link MeasuredValues}

+	 * 

+	 * @param measuredValues measured values

+	 * @param numberOfChunks number of chunks

+	 * @return a builder with the preview values set

+	 */

+	protected Mdm.PreviewValuesList.Builder calculatePreview(Mdm.MeasuredValues measuredValues, int numberOfChunks) {

+		Mdm.MeasuredValues.Builder mv = Mdm.MeasuredValues.newBuilder(measuredValues).setScalarType(ScalarType.DOUBLE);

+

+		switch (mv.getValuesCase()) {

+		case BOOLEAN_ARRAY:

+			return createEmpty(mv.clearBooleanArray());

+		case BYTE_ARRAY:

+			byte[] bytes = measuredValues.getByteArray().getValues().toByteArray();

+			return calculate(mv, numberOfChunks, Bytes.asList(bytes), measuredValues.getFlagsList());

+		case BYTE_STREAM_ARRAY:

+			return createEmpty(mv.clearByteStreamArray());

+		case DATE_ARRAY:

+			List<Timestamp> timestamps = measuredValues.getDateArray().getValuesList();

+			return calculateDate(mv, numberOfChunks, timestamps, measuredValues.getFlagsList());

+		case DOUBLE_ARRAY:

+			return calculate(mv, numberOfChunks, measuredValues.getDoubleArray().getValuesList(),

+					measuredValues.getFlagsList());

+		case DOUBLE_COMPLEX_ARRAY:

+			return createEmpty(mv.clearDoubleComplexArray());

+		case FLOAT_ARRAY:

+			return calculate(mv, numberOfChunks, measuredValues.getFloatArray().getValuesList(),

+					measuredValues.getFlagsList());

+		case FLOAT_COMPLEX_ARRAY:

+			return createEmpty(mv.clearFloatComplexArray());

+		case INTEGER_ARRAY:

+			return calculate(mv, numberOfChunks, measuredValues.getIntegerArray().getValuesList(),

+					measuredValues.getFlagsList());

+		case LONG_ARRAY:

+			return calculate(mv, numberOfChunks, measuredValues.getLongArray().getValuesList(),

+					measuredValues.getFlagsList());

+		case SHORT_ARRAY:

+			return calculate(mv, numberOfChunks, measuredValues.getShortArray().getValuesList(),

+					measuredValues.getFlagsList());

+		case STRING_ARRAY:

+			return createEmpty(mv.clearStringArray());

+		case VALUES_NOT_SET:

+			throw new PreviewException(

+					"Property 'values' of MeasuredValues with name '" + measuredValues.getName() + "' not set.");

+		default:

+			throw new PreviewException(

+					"The value '" + mv.getValuesCase().name() + "' for Property 'values' of MeasuredValues with name '"

+							+ measuredValues.getName() + "' is not supported.");

+		}

+	}

+

+	/**

+	 * Returns an empty builder.

+	 * 

+	 * @param mv

+	 * @return a builder with no values or flags set

+	 */

+	private Mdm.PreviewValuesList.Builder createEmpty(Builder mv) {

+		return Mdm.PreviewValuesList.newBuilder().addMin(mv.clearFlags().clearLength())

+				.addMax(mv.clearFlags().clearLength()).addAvg(mv.clearFlags().clearLength());

+	}

+

+	/**

+	 * Calculates min, max and avg for the given values for all data types except

+	 * DT_DATE (@see this{@link #calculateDate(Builder, int, List, List)})

+	 * 

+	 * @param builder                 a builder to apply the values to.

+	 * @param requestedNumberOfChunks number of chunks to calculate

+	 * @param values                  measurement values

+	 * @param flags                   list with flags

+	 * @return an builder with the calculated values.

+	 */

+	private Mdm.PreviewValuesList.Builder calculate(Mdm.MeasuredValues.Builder builder, int requestedNumberOfChunks,

+			List<? extends Number> values, List<Boolean> flags) {

+

+		if (requestedNumberOfChunks < 1) {

+			throw new PreviewException("Number of chunks requested must be positive!");

+		}

+

+		// numberOfChunks cannot be larger than length of data

+		int numberOfChunks = Math.min(requestedNumberOfChunks, values.size());

+

+		double chunkSize = values.size() / (double) numberOfChunks;

+

+		DoubleArray.Builder minValues = DoubleArray.newBuilder();

+		DoubleArray.Builder avgValues = DoubleArray.newBuilder();

+		DoubleArray.Builder maxValues = DoubleArray.newBuilder();

+

+		for (int chunkIndex = 0; chunkIndex < numberOfChunks; chunkIndex++) {

+			double min = Double.MAX_VALUE;

+			double sum = 0;

+			double max = Double.MIN_VALUE;

+			int count = 0;

+

+			int startIndex = Ints.checkedCast(Math.round(chunkIndex * chunkSize));

+			int endIndex = Ints.checkedCast(Math.round((chunkIndex + 1) * chunkSize));

+

+			for (int valueIndex = startIndex; valueIndex < endIndex; valueIndex++) {

+				if (valueIndex >= flags.size() || flags.get(valueIndex)) {

+					double value = values.get(valueIndex).doubleValue();

+					sum += value;

+					min = Math.min(min, value);

+					max = Math.max(max, value);

+					count++;

+				}

+			}

+

+			minValues.addValues(min);

+			avgValues.addValues(sum / count);

+			maxValues.addValues(max);

+		}

+

+		builder = builder.setLength(numberOfChunks);

+		return PreviewValuesList.newBuilder().addMin(builder.setDoubleArray(minValues))

+				.addAvg(builder.setDoubleArray(avgValues)).addMax(builder.setDoubleArray(maxValues));

+	}

+

+	/**

+	 * Calculates min, max and avg for the given values for all data type DT_DATE.

+	 * 

+	 * @param builder                 a builder to apply the values to.

+	 * @param requestedNumberOfChunks number of chunks to calculate

+	 * @param values                  measurement values

+	 * @param flags                   list with flags

+	 * @return an builder with the calculated values.

+	 */

+	private Mdm.PreviewValuesList.Builder calculateDate(Mdm.MeasuredValues.Builder builder, int numberOfChunks,

+			List<Timestamp> timestamps, List<Boolean> flags) {

+

+		if (numberOfChunks < 1) {

+			throw new PreviewException("Number of chunks requested must be positive!");

+		}

+

+		// numberOfChunks cannot be larger than length of data

+		numberOfChunks = Math.min(numberOfChunks, timestamps.size());

+

+		double chunkSize = timestamps.size() / (double) numberOfChunks;

+

+		DateArray.Builder minValues = DateArray.newBuilder();

+		DateArray.Builder avgValues = DateArray.newBuilder();

+		DateArray.Builder maxValues = DateArray.newBuilder();

+

+		for (int chunkIndex = 0; chunkIndex < numberOfChunks; chunkIndex++) {

+

+			double sumSeconds = 0.0;

+			double sumNanos = 0.0;

+

+			Timestamp max = Timestamp.newBuilder().setSeconds(0L).setNanos(0).build();

+			Timestamp min = Timestamp.newBuilder().setSeconds(Long.MAX_VALUE).setNanos(Integer.MAX_VALUE).build();

+			int count = 0;

+

+			int startIndex = Ints.checkedCast(Math.round(chunkIndex * chunkSize));

+			int endIndex = Ints.checkedCast(Math.round((chunkIndex + 1) * chunkSize));

+

+			for (int valueIndex = startIndex; valueIndex < endIndex; valueIndex++) {

+				if (valueIndex >= flags.size() || flags.get(valueIndex)) {

+					Timestamp value = timestamps.get(valueIndex);

+					sumSeconds += value.getSeconds();

+					sumNanos += value.getNanos();

+					min = min(min, value);

+					max = max(max, value);

+					count++;

+				}

+			}

+			minValues.addValues(min);

+			maxValues.addValues(max);

+

+			BigDecimal c = BigDecimal.valueOf(count);

+			// calculate average and remainder

+			BigDecimal[] avg = BigDecimal.valueOf(sumSeconds).add(BigDecimal.valueOf(sumNanos * 1E-9))

+					.divideAndRemainder(c);

+

+			// the remainder will be converted to nanoseconds

+			avgValues.addValues(Timestamp.newBuilder().setSeconds(avg[0].longValue())

+					.setNanos(avg[1].multiply(BigDecimal.valueOf(1E9)).divide(c, RoundingMode.HALF_UP).intValue()));

+		}

+

+		return PreviewValuesList.newBuilder().addMin(builder.setDateArray(minValues))

+				.addAvg(builder.setDateArray(avgValues)).addMax(builder.setDateArray(maxValues));

+	}

+

+	/**

+	 * Returns the smaller of the given timestamps.

+	 * 

+	 * @param t1 first timestamp

+	 * @param t2 second timestamp

+	 * @return t1, if t1 before t2 else t2

+	 */

+	private Timestamp min(Timestamp t1, Timestamp t2) {

+		if (t1.getSeconds() < t2.getSeconds()) {

+			return t1;

+		} else if (t1.getSeconds() > t2.getSeconds()) {

+			return t2;

+		} else {

+			return t1.getNanos() <= t2.getNanos() ? t1 : t2;

+		}

+	}

+

+	/**

+	 * Returns the larger of the given timestamps.

+	 * 

+	 * @param t1 first timestamp

+	 * @param t2 second timestamp

+	 * @return t1, if t1 after t2 else t2

+	 */

+	private Timestamp max(Timestamp t1, Timestamp t2) {

+		if (t1.getSeconds() > t2.getSeconds()) {

+			return t1;

+		} else if (t1.getSeconds() < t2.getSeconds()) {

+			return t2;

+		} else {

+			return t1.getNanos() >= t2.getNanos() ? t1 : t2;

+		}

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ProtobufConverter.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ProtobufConverter.java
new file mode 100644
index 0000000..f3d58b4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ProtobufConverter.java
@@ -0,0 +1,442 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+

+package org.eclipse.mdm.businessobjects.utils;

+

+import java.io.ByteArrayOutputStream;

+import java.time.Instant;

+import java.time.LocalDateTime;

+import java.time.ZoneId;

+import java.time.ZoneOffset;

+import java.util.List;

+import java.util.Map;

+import java.util.Optional;

+import java.util.stream.Collectors;

+

+import org.eclipse.mdm.api.base.ServiceNotProvidedException;

+import org.eclipse.mdm.api.base.massdata.ReadRequest;

+import org.eclipse.mdm.api.base.massdata.ReadRequest.ValuesMode;

+import org.eclipse.mdm.api.base.massdata.ReadRequestBuilder;

+import org.eclipse.mdm.api.base.model.AxisType;

+import org.eclipse.mdm.api.base.model.Channel;

+import org.eclipse.mdm.api.base.model.ChannelGroup;

+import org.eclipse.mdm.api.base.model.DoubleComplex;

+import org.eclipse.mdm.api.base.model.FloatComplex;

+import org.eclipse.mdm.api.base.model.MeasuredValues;

+import org.eclipse.mdm.api.base.model.MeasuredValues.ValueIterator;

+import org.eclipse.mdm.api.base.model.ScalarType;

+import org.eclipse.mdm.api.base.model.Unit;

+import org.eclipse.mdm.api.dflt.ApplicationContext;

+import org.eclipse.mdm.api.dflt.EntityManager;

+import org.eclipse.mdm.protobuf.Mdm;

+import org.eclipse.mdm.protobuf.Mdm.BooleanArray;

+import org.eclipse.mdm.protobuf.Mdm.ByteArray;

+import org.eclipse.mdm.protobuf.Mdm.ByteStreamArray;

+import org.eclipse.mdm.protobuf.Mdm.DateArray;

+import org.eclipse.mdm.protobuf.Mdm.DoubleArray;

+import org.eclipse.mdm.protobuf.Mdm.DoubleComplexArray;

+import org.eclipse.mdm.protobuf.Mdm.FloatArray;

+import org.eclipse.mdm.protobuf.Mdm.FloatComplexArray;

+import org.eclipse.mdm.protobuf.Mdm.IntegerArray;

+import org.eclipse.mdm.protobuf.Mdm.LongArray;

+import org.eclipse.mdm.protobuf.Mdm.MeasuredValuesList;

+import org.eclipse.mdm.protobuf.Mdm.ShortArray;

+import org.eclipse.mdm.protobuf.Mdm.StringArray;

+

+import com.google.common.base.Strings;

+import com.google.common.primitives.Doubles;

+import com.google.protobuf.ByteString;

+import com.google.protobuf.Timestamp;

+

+/**

+ * Helper class for converting between protobuf and mdm types.

+ *

+ */

+public class ProtobufConverter {

+

+	/**

+	 * Converted a DateArray to an array of {@link LocalDateTime}

+	 * 

+	 * @param dateArray

+	 * @param zoneId

+	 * @return array of {@link LocalDateTime}

+	 */

+	public static LocalDateTime[] convertDates(DateArray dateArray, ZoneId zoneId) {

+		LocalDateTime[] strings = new LocalDateTime[dateArray.getValuesCount()];

+		for (int i = 0; i < dateArray.getValuesCount(); i++) {

+			Timestamp ts = dateArray.getValues(i);

+			strings[i] = Instant.ofEpochSecond(ts.getSeconds(), ts.getNanos()).atZone(zoneId).toLocalDateTime();

+		}

+		return strings;

+	}

+

+	/**

+	 * Converts a {@link StringArray} to an array of strings

+	 * 

+	 * @param stringArray

+	 * @return array of strings

+	 */

+	public static String[] convertStrings(StringArray stringArray) {

+		String[] strings = new String[stringArray.getValuesCount()];

+		for (int i = 0; i < stringArray.getValuesCount(); i++) {

+			strings[i] = stringArray.getValues(i);

+		}

+		return strings;

+	}

+

+	/**

+	 * Converts a list of {@link org.eclipse.mdm.protobuf.Mdm.FloatComplex} to an

+	 * array of {@link FloatComplex}

+	 * 

+	 * @param valuesList

+	 * @return array of {@link FloatComplex}

+	 */

+	public static FloatComplex[] convertFloatComplex(List<org.eclipse.mdm.protobuf.Mdm.FloatComplex> valuesList) {

+		FloatComplex[] floatComplexes = new FloatComplex[valuesList.size()];

+		for (int i = 0; i < valuesList.size(); i++) {

+			floatComplexes[i] = new FloatComplex(valuesList.get(i).getRe(), valuesList.get(i).getIm());

+		}

+		return floatComplexes;

+	}

+

+	/**

+	 * Converts a list of {@link org.eclipse.mdm.protobuf.Mdm.DoubleComplex} to an

+	 * array of {@link DoubleComplex}

+	 * 

+	 * @param valuesList

+	 * @return array of {@link DoubleComplex}

+	 */

+	public static DoubleComplex[] convertDoubleComplex(List<org.eclipse.mdm.protobuf.Mdm.DoubleComplex> valuesList) {

+		DoubleComplex[] doubleComplexes = new DoubleComplex[valuesList.size()];

+		for (int i = 0; i < valuesList.size(); i++) {

+			doubleComplexes[i] = new DoubleComplex(valuesList.get(i).getRe(), valuesList.get(i).getIm());

+		}

+		return doubleComplexes;

+	}

+

+	/**

+	 * Converts a list of {@link ByteString} to an array of array of byte.

+	 * 

+	 * @param valuesList

+	 * @return array of array of byte.

+	 */

+	public static byte[][] convertByteStreams(List<ByteString> valuesList) {

+		byte[][] byteStreams = new byte[valuesList.size()][];

+		for (int i = 0; i < valuesList.size(); i++) {

+			byteStreams[i] = valuesList.get(i).toByteArray();

+		}

+		return byteStreams;

+	}

+

+	/**

+	 * Converts an {@link org.eclipse.mdm.protobuf.Mdm.AxisType} to {@link AxisType}

+	 * 

+	 * @param axisType

+	 * @return converted {@link AxisType}

+	 */

+	public static AxisType convert(Mdm.AxisType axisType) {

+		switch (axisType) {

+		case X_AXIS:

+			return AxisType.X_AXIS;

+		case Y_AXIS:

+			return AxisType.Y_AXIS;

+		case XY_AXIS:

+			return AxisType.XY_AXIS;

+		default:

+			throw new RuntimeException("Invalid value for AxisType: " + axisType.name());

+		}

+	}

+

+	/**

+	 * Converts an {@link org.eclipse.mdm.protobuf.Mdm.ScalarType} to a

+	 * {@link ScalarType}.

+	 * 

+	 * @param scalarType

+	 * @return converted {@link ScalarType}

+	 */

+	public static ScalarType convert(Mdm.ScalarType scalarType) {

+		switch (scalarType) {

+		case STRING:

+			return ScalarType.STRING;

+		case DATE:

+			return ScalarType.DATE;

+		case BOOLEAN:

+			return ScalarType.BOOLEAN;

+		case BYTE:

+			return ScalarType.BYTE;

+		case SHORT:

+			return ScalarType.SHORT;

+		case INTEGER:

+			return ScalarType.INTEGER;

+		case LONG:

+			return ScalarType.LONG;

+		case FLOAT:

+			return ScalarType.FLOAT;

+		case DOUBLE:

+			return ScalarType.DOUBLE;

+		case BYTE_STREAM:

+			return ScalarType.BYTE_STREAM;

+		case FLOAT_COMPLEX:

+			return ScalarType.FLOAT_COMPLEX;

+		case DOUBLE_COMPLEX:

+			return ScalarType.DOUBLE_COMPLEX;

+		case ENUMERATION:

+			return ScalarType.ENUMERATION;

+		case FILE_LINK:

+			return ScalarType.FILE_LINK;

+		case BLOB:

+			return ScalarType.BLOB;

+		case UNKNOWN:

+			return ScalarType.UNKNOWN;

+		default:

+			throw new RuntimeException("Invalid value for ScalarType: " + scalarType.name());

+		}

+	}

+

+	/**

+	 * Converts a list of {@link MeasuredValues} to a {@link MeasuredValuesList}

+	 * 

+	 * @param measuredValues

+	 * @return converted {@link MeasuredValuesList}

+	 */

+	public static MeasuredValuesList convert(List<MeasuredValues> measuredValues) {

+		MeasuredValuesList.Builder builder = MeasuredValuesList.newBuilder();

+		for (MeasuredValues m : measuredValues) {

+			builder.addValues(convert(m));

+		}

+		return builder.build();

+	}

+

+	/**

+	 * Converts {@link MeasuredValues} to

+	 * {@link org.eclipse.mdm.protobuf.Mdm.MeasuredValues}

+	 * 

+	 * @param m

+	 * @return converted {@link org.eclipse.mdm.protobuf.Mdm.MeasuredValues}

+	 */

+	public static Mdm.MeasuredValues convert(MeasuredValues m) {

+

+		Mdm.MeasuredValues.Builder builder = Mdm.MeasuredValues.newBuilder().setName(m.getName()).setUnit(m.getUnit())

+				.setLength(m.getLength()).setAxisType(convert(m.getAxisType())).setIndependent(m.isIndependent())

+				.setScalarType(Mdm.ScalarType.valueOf(m.getScalarType().name()))

+				.addAllGenerationParameters(Doubles.asList(m.getGenerationParameters()));

+

+		BooleanArray.Builder flags = BooleanArray.newBuilder();

+		ValueIterator<Object> it = m.iterator();

+

+		if (m.getScalarType().isString()) {

+			StringArray.Builder strings = StringArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				strings.addValues((String) it.next());

+			}

+			builder.setStringArray(strings);

+		} else if (m.getScalarType().isDate()) {

+			DateArray.Builder dates = DateArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				LocalDateTime t = (LocalDateTime) it.next();

+				Instant time = t.toInstant(ZoneOffset.UTC);

+				dates.addValues(

+						Timestamp.newBuilder().setSeconds(time.getEpochSecond()).setNanos(time.getNano()).build());

+			}

+			builder.setDateArray(dates);

+		} else if (m.getScalarType().isBoolean()) {

+			BooleanArray.Builder booleans = BooleanArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				booleans.addValues((boolean) it.next());

+			}

+			builder.setBooleanArray(booleans);

+		} else if (m.getScalarType().isByte()) {

+			ByteArrayOutputStream bytes = new ByteArrayOutputStream();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				bytes.write((byte) it.next());

+			}

+			builder.setByteArray(ByteArray.newBuilder().setValues(ByteString.copyFrom(bytes.toByteArray())));

+		} else if (m.getScalarType().isShort()) {

+			ShortArray.Builder shorts = ShortArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				shorts.addValues((short) it.next());

+			}

+			builder.setShortArray(shorts);

+		} else if (m.getScalarType().isInteger()) {

+			IntegerArray.Builder ints = IntegerArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				int i = (int) it.next();

+				ints.addValues(i);

+			}

+			builder.setIntegerArray(ints);

+		} else if (m.getScalarType().isLong()) {

+			LongArray.Builder ints = LongArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				ints.addValues((long) it.next());

+			}

+			builder.setLongArray(ints);

+		} else if (m.getScalarType().isFloat()) {

+			FloatArray.Builder floats = FloatArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				floats.addValues((float) it.next());

+			}

+			builder.setFloatArray(floats);

+		} else if (m.getScalarType().isDouble()) {

+			DoubleArray.Builder doubles = DoubleArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				doubles.addValues((double) it.next());

+			}

+			builder.setDoubleArray(doubles);

+		} else if (m.getScalarType().isByteStream()) {

+			ByteStreamArray.Builder bytestrs = ByteStreamArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				bytestrs.addValues(ByteString.copyFrom((byte[]) it.next()));

+			}

+			builder.setByteStreamArray(bytestrs);

+		} else if (m.getScalarType().isFloatComplex()) {

+			FloatComplexArray.Builder floats = FloatComplexArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				floats.addValues(convert((FloatComplex) it.next()));

+			}

+			builder.setFloatComplexArray(floats);

+		} else if (m.getScalarType().isDoubleComplex()) {

+			DoubleComplexArray.Builder doubles = DoubleComplexArray.newBuilder();

+			while (it.hasNext()) {

+				flags.addValues(it.isValid());

+				doubles.addValues(convert((DoubleComplex) it.next()));

+			}

+			builder.setDoubleComplexArray(doubles);

+		} else {

+			throw new IllegalArgumentException(

+					"MeasuredValues with scalarType '" + m.getScalarType() + "' not supported!");

+		}

+		builder.addAllFlags(flags.getValuesList());

+

+		return builder.build();

+	}

+

+	/**

+	 * Converts between FloatComplex.

+	 * 

+	 * @param complex

+	 * @return

+	 */

+	public static Mdm.FloatComplex convert(FloatComplex complex) {

+		return Mdm.FloatComplex.newBuilder().setRe(complex.real()).setIm(complex.imaginary()).build();

+	}

+

+	/**

+	 * Converts between DoubleComplex.

+	 * 

+	 * @param complex

+	 * @return

+	 */

+	public static Mdm.DoubleComplex convert(DoubleComplex complex) {

+		return Mdm.DoubleComplex.newBuilder().setRe(complex.real()).setIm(complex.imaginary()).build();

+	}

+

+	/**

+	 * Converts between AxisType.

+	 * 

+	 * @param axisType

+	 * @return

+	 */

+	public static Mdm.AxisType convert(AxisType axisType) {

+		return Mdm.AxisType.valueOf(axisType.name());

+	}

+

+	/**

+	 * Converts between ValuesMode.

+	 * 

+	 * @param valuesMode

+	 * @return

+	 */

+	public static ValuesMode convert(Mdm.ValuesMode valuesMode) {

+		return ValuesMode.valueOf(valuesMode.name());

+	}

+

+	/**

+	 * Converts between ScalarType.

+	 * 

+	 * @param value

+	 * @return

+	 */

+	public static Mdm.ScalarType convert(ScalarType value) {

+		return Mdm.ScalarType.valueOf(value.name());

+	}

+

+	/**

+	 * Converts a {@link org.eclipse.mdm.protobuf.Mdm.ReadRequest} to a

+	 * {@link ReadRequest}

+	 * 

+	 * @param context

+	 * @param protoReadRequest

+	 * @return converted {@link ReadRequest}

+	 */

+	public static ReadRequest convert(ApplicationContext context, Mdm.ReadRequest protoReadRequest) {

+

+		EntityManager em = context.getEntityManager()

+				.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));

+

+		ChannelGroup channelGroup = em.load(ChannelGroup.class, protoReadRequest.getChannelGroupId());

+		ReadRequestBuilder rb = ReadRequest.create(channelGroup);

+		if (protoReadRequest.getChannelIdsCount() == 0) {

+			rb = rb.allChannels();

+		} else {

+			// Load Channels and group by ID. If multiple Channels with the same ID are

+			// loaded (which would be incorrect data), only the first one is used.

+			Map<String, Optional<Channel>> channels = em.load(Channel.class, protoReadRequest.getChannelIdsList())

+					.stream().collect(Collectors.groupingBy(Channel::getID, Collectors.reducing((c1, c2) -> c1)));

+

+			// Load Units and group by ID. If multiple Units with the same ID are

+			// loaded (which would be incorrect data), only the first one is used.

+			Map<String, Optional<Unit>> units = em.load(Unit.class, protoReadRequest.getUnitIdsList()).stream()

+					.collect(Collectors.groupingBy(Unit::getID, Collectors.reducing((u1, u2) -> u1)));

+

+			for (int i = 0; i < protoReadRequest.getChannelIdsCount(); i++) {

+				String channelId = protoReadRequest.getChannelIds(i);

+

+				Channel channel = channels.get(channelId).orElseThrow(

+						() -> new IllegalArgumentException("Channel with ID '" + channelId + "' does not exist!"));

+

+				final String unitId;

+				if (i < protoReadRequest.getUnitIdsCount()) {

+					unitId = protoReadRequest.getUnitIds(i);

+				} else {

+					unitId = null;

+				}

+

+				Unit unit;

+

+				if (Strings.isNullOrEmpty(unitId)) {

+					// no unit provided -> use unit from channel

+					unit = channel.getUnit();

+				} else {

+					unit = units.get(unitId).orElseThrow(

+							() -> new IllegalArgumentException("Unit with ID '" + unitId + "' does not exist!"));

+				}

+				rb = rb.channel(channel, unit);

+			}

+		}

+

+		return rb.valuesMode(convert(protoReadRequest.getValuesMode())).values(protoReadRequest.getStartIndex(),

+				protoReadRequest.getRequestSize());

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ProtobufMessageBodyProvider.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ProtobufMessageBodyProvider.java
new file mode 100644
index 0000000..0607eca
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ProtobufMessageBodyProvider.java
@@ -0,0 +1,144 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+

+package org.eclipse.mdm.businessobjects.utils;

+

+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.MEDIATYPE_APPLICATION_PROTOBUF;

+

+import java.io.IOException;

+import java.io.InputStream;

+import java.io.OutputStream;

+import java.lang.annotation.Annotation;

+import java.lang.reflect.InvocationTargetException;

+import java.lang.reflect.Method;

+import java.lang.reflect.Type;

+

+import javax.ws.rs.Consumes;

+import javax.ws.rs.Produces;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.MultivaluedMap;

+import javax.ws.rs.ext.MessageBodyReader;

+import javax.ws.rs.ext.MessageBodyWriter;

+import javax.ws.rs.ext.Provider;

+

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+

+import com.google.common.io.ByteStreams;

+import com.google.protobuf.AbstractMessage;

+import com.google.protobuf.CodedInputStream;

+import com.google.protobuf.InvalidProtocolBufferException;

+import com.google.protobuf.Message;

+

+/**

+ * MessageBodyProvider for handling protobuf payloads.

+ * 

+ */

+@Provider

+@Consumes({ MEDIATYPE_APPLICATION_PROTOBUF })

+@Produces({ MEDIATYPE_APPLICATION_PROTOBUF })

+public class ProtobufMessageBodyProvider implements MessageBodyReader<Message>, MessageBodyWriter<Message> {

+	private static final Logger LOG = LoggerFactory.getLogger(ProtobufMessageBodyProvider.class);

+

+	private static final int DEFAULT_SIZE_LIMIT = 64 << 20; // 64MB

+	private static final int MAX_SIZE = DEFAULT_SIZE_LIMIT;

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see javax.ws.rs.ext.MessageBodyReader#isReadable(java.lang.Class,

+	 * java.lang.reflect.Type, java.lang.annotation.Annotation[],

+	 * javax.ws.rs.core.MediaType)

+	 */

+	@Override

+	public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations,

+			final MediaType mediaType) {

+		return Message.class.isAssignableFrom(type);

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see javax.ws.rs.ext.MessageBodyReader#readFrom(java.lang.Class,

+	 * java.lang.reflect.Type, java.lang.annotation.Annotation[],

+	 * javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap,

+	 * java.io.InputStream)

+	 */

+	@Override

+	public Message readFrom(final Class<Message> type, final Type genericType, final Annotation[] annotations,

+			final MediaType mediaType, final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream)

+			throws IOException {

+		try {

+			final Method newBuilder = type.getMethod("newBuilder");

+			final AbstractMessage.Builder<?> builder = (AbstractMessage.Builder<?>) newBuilder.invoke(type);

+

+			CodedInputStream in = CodedInputStream.newInstance(entityStream);

+			in.setSizeLimit(MAX_SIZE);

+

+			byte[] b = ByteStreams.toByteArray(entityStream);

+			LOG.debug("Reading type {} with size {}.", genericType, b.length);

+			return builder.mergeFrom(b).build();

+		} catch (InvalidProtocolBufferException e) {

+			throw new IOException("Could not read Protobuf entity!", e);

+		} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {

+			throw new IOException("Could not retrive builder for type " + genericType, e);

+		}

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see javax.ws.rs.ext.MessageBodyWriter#getSize(java.lang.Object,

+	 * java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[],

+	 * javax.ws.rs.core.MediaType)

+	 */

+	@Override

+	public long getSize(final Message m, final Class<?> type, final Type genericType, final Annotation[] annotations,

+			final MediaType mediaType) {

+		return -1; // as method is not actually used by JAX-RS

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see javax.ws.rs.ext.MessageBodyWriter#isWriteable(java.lang.Class,

+	 * java.lang.reflect.Type, java.lang.annotation.Annotation[],

+	 * javax.ws.rs.core.MediaType)

+	 */

+	@Override

+	public boolean isWriteable(final Class<?> type, final Type genericType, final Annotation[] annotations,

+			final MediaType mediaType) {

+		return Message.class.isAssignableFrom(type);

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * 

+	 * @see javax.ws.rs.ext.MessageBodyWriter#writeTo(java.lang.Object,

+	 * java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[],

+	 * javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap,

+	 * java.io.OutputStream)

+	 */

+	@Override

+	public void writeTo(final Message m, final Class<?> type, final Type genericType, final Annotation[] annotations,

+			final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders,

+			final OutputStream entityStream) throws IOException {

+

+		if (LOG.isDebugEnabled()) {

+			LOG.debug("Writing type {} with size {}.", genericType, m.getSerializedSize());

+		}

+		m.writeTo(entityStream);

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ReflectUtil.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ReflectUtil.java
new file mode 100644
index 0000000..a56c466
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ReflectUtil.java
@@ -0,0 +1,63 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+

+package org.eclipse.mdm.businessobjects.utils;

+

+import io.vavr.collection.HashMap;

+import io.vavr.collection.Map;

+

+/**

+ * Utility class for method reflection

+ * 

+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg

+ *

+ */

+public class ReflectUtil {

+	private static final Map<Class<?>, Class<?>> primitiveWrapperMap = HashMap.of(boolean.class, Boolean.class,

+			byte.class, Byte.class, char.class, Character.class, double.class, Double.class, float.class, Float.class,

+			int.class, Integer.class, long.class, Long.class, short.class, Short.class);

+

+	public static boolean isPrimitiveWrapperOf(Class<?> targetClass, Class<?> primitive) {

+		if (!primitive.isPrimitive()) {

+			throw new IllegalArgumentException("First argument has to be primitive type");

+		}

+		return primitiveWrapperMap.get(primitive).get() == targetClass;

+	}

+

+	/**

+	 * This function returns same value as to.isAssignableFrom(from), except for

+	 * wrapper classes.

+	 * 

+	 * to.isAssignableFrom(from) returns false for wrapper class <-> primitive This

+	 * function returns true in that case.

+	 * 

+	 * @param from class to assign from

+	 * @param to   class to assign to

+	 * @return true if assigning is possible (respecting auto boxing/unboxing) false

+	 *         otherwise

+	 */

+	public static boolean isAssignableTo(Class<?> from, Class<?> to) {

+		if (to.isAssignableFrom(from)) {

+			return true;

+		}

+		if (from.isPrimitive()) {

+			return isPrimitiveWrapperOf(to, from);

+		}

+		if (to.isPrimitive()) {

+			return isPrimitiveWrapperOf(from, to);

+		}

+		return false;

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/RequestBody.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/RequestBody.java
new file mode 100644
index 0000000..61c4841
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/RequestBody.java
@@ -0,0 +1,126 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.utils;
+
+import java.util.NoSuchElementException;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+import io.vavr.API;
+import io.vavr.CheckedFunction0;
+import io.vavr.Lazy;
+import io.vavr.collection.HashMap;
+import io.vavr.collection.Map;
+import io.vavr.control.Try;
+
+/**
+ * Class representing the JSON request body as a accessible map of values. The
+ * parsing occurs lazily on first get() on a value and as the {@link Lazy}
+ * result is memoized, the body is only parsed once. Any exceptions due to
+ * parsing or non-existing keys are thrown on get() call.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+public final class RequestBody {
+
+	private Lazy<HashMap<String, Object>> requestBodyMap;
+	private static ObjectMapper mapper;
+
+	static {
+		mapper = new ObjectMapper();
+		SimpleModule simpleModule = new SimpleModule();
+		// disabled deserializer as ContextService.updateContextDescribableContext invokes a parsing of ISO date anyways
+		//simpleModule.addDeserializer(Object.class, new ISODateDeseralizer());
+		mapper.registerModule(simpleModule);
+	}
+
+	/**
+	 * Just hide the default constructor
+	 */
+	private RequestBody() {
+	}
+
+	/**
+	 * Builds RequestBody by using the given function that returns the request body
+	 * as a parsed {@link Map<String, Object>.
+	 * 
+	 * @param requestBodyMapSupplier function that return a {@link Map<String,
+	 *                               Object> with the parsed JSON body
+	 */
+	private RequestBody(CheckedFunction0<HashMap<String, Object>> requestBodyMapSupplier) {
+		// make the function lazily evaluated, so that any parsing exception occur on
+		// first get() on a value
+		// unchecked() makes it possible to trick the compiler to not force us to deal
+		// with the checked exceptions here
+		this.requestBodyMap = Lazy.of(API.unchecked(requestBodyMapSupplier));
+	}
+
+	/**
+	 * Creates a RequestBody
+	 * 
+	 * @param body JSON request body to create RequestBody
+	 * @return the RequestBody
+	 */
+	public static RequestBody create(String requestBodyString) {
+		// create requestbody with a function that parses the json request and
+		// transforms it to a {@link Map<String, Object>
+		return new RequestBody(() -> HashMap
+				.ofAll(mapper.readValue(requestBodyString, new TypeReference<java.util.Map<String, Object>>() {
+				})));
+	}
+
+	/**
+	 * Returns a {@link Try> that holds the string value for the given key. If the
+	 * underlying request body map can be parsed, the appropriate JSON exceptions
+	 * are thrown if get() is called on the {@link Try>. If the key was not found, a
+	 * {@link NoSuchElementException} is thrown correspondingly.
+	 * 
+	 * @param key key to get value for
+	 * @return the string value for the given key
+	 */
+	public Try<String> getStringValueSupplier(String key) {
+		return Try.of(() -> Lazy.of(() -> requestBodyMap.get().get(key).map(Object::toString).onEmpty(() -> {
+			throw new NoSuchElementException("Key [" + key + "] not found in request body.");
+		}).get()).get());
+	}
+
+	/**
+	 * Returns a {@link Try<Object>> that holds the value for the given key. If the
+	 * underlying request body map can be parsed, the appropriate JSON exceptions
+	 * are thrown if get() is called on the {@link Try>. If the key was not found, a
+	 * {@link NoSuchElementException} is thrown correspondingly.
+	 * 
+	 * @param key key to get value for
+	 * @return the value for the given key
+	 */
+	public Try<Object> getValueSupplier(String key) {
+		return Try.of(() -> Lazy.of(() -> requestBodyMap.get().get(key).map(Object::toString).onEmpty(() -> {
+			throw new NoSuchElementException("Key [" + key + "] not found in request body.");
+		}).get()).get());
+	}
+
+	/**
+	 * Returns a {@link Try} of the complete {@link Map<String, Object>} of the
+	 * request body
+	 * 
+	 * @return a {@link Try} of {@link Map<String, Object>} of the request body
+	 */
+	public Try<Map<String, Object>> getValueMapSupplier() {
+		return Try.of(() -> requestBodyMap.get());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/Serializer.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/Serializer.java
new file mode 100644
index 0000000..998b0aa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/Serializer.java
@@ -0,0 +1,165 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.utils;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.MimeType;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.entity.MDMFileLink;
+
+import com.google.common.base.Strings;
+
+/**
+ * Serializer for values.
+ */
+public final class Serializer {
+
+	private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
+	private Serializer() {
+	}
+
+	public static Object serializeValue(Value value) {
+		if (value.getValueType().isDate()) {
+			return formatter.format(value.extract());
+		} else if (value.getValueType().isFileLink()) {
+			return serializeFileLink(value.extract(ValueType.FILE_LINK));
+		} else if (value.getValueType().isFileLinkSequence()) {
+			return Stream.of(value.extract(ValueType.FILE_LINK_SEQUENCE)).map(Serializer::serializeFileLink)
+					.collect(Collectors.toList());
+		} else {
+			return value.extract().toString();
+		}
+	}
+
+	public static MDMFileLink serializeFileLink(FileLink fileLink) {
+		return new MDMFileLink(fileLink.getRemotePath(), fileLink.getMimeType().toString(), fileLink.getDescription());
+	}
+
+	public static LocalDateTime parseDate(String value) {
+		return LocalDateTime.from(formatter.parse(value));
+	}
+
+	public static void applyValue(org.eclipse.mdm.api.base.model.Value value, Object newValue) {
+		value.set(deserializeValue(value.getValueType(), newValue));
+	}
+
+	public static Object deserializeValue(ValueType<?> type, Object newValue) {
+
+		if (type.isBoolean()) {
+			if (newValue instanceof Number) {
+				return ((Number) newValue).intValue() == 1;
+			} else if (newValue instanceof String) {
+				return Integer.parseInt((String) newValue) == 1;
+			}
+		} else if (type.isByte()) {
+			if (newValue instanceof Number) {
+				return (byte) ((Number) newValue).intValue();
+			} else if (newValue instanceof String) {
+				return Byte.parseByte((String) newValue);
+			}
+		} else if (type.isShort()) {
+			if (newValue instanceof Number) {
+				return (short) ((Number) newValue).intValue();
+			} else if (newValue instanceof String) {
+				return Short.parseShort((String) newValue);
+			}
+		} else if (type.isInteger()) {
+			if (newValue instanceof Number) {
+				return ((Number) newValue).intValue();
+			} else if (newValue instanceof String) {
+				return Integer.parseInt((String) newValue);
+			}
+		} else if (type.isLong()) {
+			if (newValue instanceof Number) {
+				return ((Number) newValue).longValue();
+			} else if (newValue instanceof String) {
+				return Long.parseLong((String) newValue);
+			}
+		} else if (type.isFloat()) {
+			if (newValue instanceof Number) {
+				return ((Number) newValue).floatValue();
+			} else if (newValue instanceof String) {
+				return Float.parseFloat((String) newValue);
+			}
+		} else if (type.isDouble()) {
+			if (newValue instanceof Number) {
+				return ((Number) newValue).doubleValue();
+			} else if (newValue instanceof String) {
+				return Double.parseDouble((String) newValue);
+			}
+		} else if (type.isDate()) {
+			if (newValue instanceof Number) {
+				return LocalDateTime.ofEpochSecond((long) newValue, 0, ZoneOffset.UTC);
+			} else if (newValue instanceof String) {
+				if (Strings.isNullOrEmpty((String) newValue)) {
+					return null;
+				} else {
+					return Serializer.parseDate((String) newValue);
+				}
+			}
+		} else if (type.isFileLink()) {
+			if (newValue instanceof FileLink) {
+				return newValue;
+			} else {
+				return deserializeFileLink(newValue);
+			}
+		} else if (type.isFileLinkSequence()) {
+			if (newValue instanceof FileLink[]) {
+				return newValue;
+			} else if (newValue instanceof List) {
+				if (((List<?>) newValue).isEmpty()) {
+					return new FileLink[0];
+				} else {
+					List<FileLink> fileLinks = new ArrayList<>();
+					for (Object o : (List<?>) newValue) {
+						fileLinks.add(deserializeFileLink(o));
+					}
+					return fileLinks.toArray(new FileLink[0]);
+				}
+			}
+		}
+		// TODO mkoller on 2018-12-06: Missing ValueTypes: ByteStream, Blob,
+		// FloatComplex, DoubleComplex, Enumeration and all sequence
+		// ValueTypes
+		return newValue;
+	}
+
+	private static FileLink deserializeFileLink(Object newValue) {
+
+		if (newValue == null || newValue instanceof String && ((String) newValue).trim().isEmpty()) {
+			return null;
+		} else if (newValue instanceof Map<?, ?>) {
+			Map<?, ?> map = (Map<?, ?>) newValue;
+			String remotePath = Objects.toString(map.get("remotePath"));
+			MimeType mimeType = new MimeType(Objects.toString(map.get("mimeType")));
+			String description = Objects.toString(map.get("description"));
+			return FileLink.newRemote(remotePath, mimeType, description);
+		}
+
+		throw new MDMEntityAccessException("Cannot deserialize FILE_LINK: " + newValue);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ServiceUtils.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ServiceUtils.java
new file mode 100644
index 0000000..d221850
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ServiceUtils.java
@@ -0,0 +1,345 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.utils;
+
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.BaseEntity;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.Condition;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.FilterItem;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.*;
+import org.eclipse.mdm.businessobjects.control.FilterParser;
+import org.eclipse.mdm.businessobjects.entity.I18NResponse;
+import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
+import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.slf4j.LoggerFactory;
+
+import io.vavr.Value;
+import io.vavr.collection.Map;
+import io.vavr.collection.Stream;
+import io.vavr.control.Try;
+
+public final class ServiceUtils {
+
+	private ServiceUtils() {
+	}
+
+	/**
+	 * returns true if the given filter String is a parent filter of the given
+	 * parent type
+	 *
+	 * @param em         {@link EntityManager} of the data source
+	 * @param filter     parent filter string to check
+	 * @param parentType class of the parent entity
+	 * @return true if the give filter String is a parent filter
+	 */
+	public static boolean isParentFilter(ApplicationContext context, String filter,
+			Class<? extends Entity> parentType) {
+		ModelManager mm = context.getModelManager()
+				.orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+		EntityType et = mm.getEntityType(parentType);
+
+		Filter f = FilterParser.parseFilterString(mm.listEntityTypes(), filter);
+
+		List<FilterItem> filterItems = f.stream().collect(Collectors.toList());
+
+		if (filterItems.size() == 1 && filterItems.get(0).isCondition()) {
+			Condition c = filterItems.get(0).getCondition();
+			return et.getIDAttribute().equals(c.getAttribute())
+					&& ComparisonOperator.EQUAL.equals(c.getComparisonOperator());
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * returns the business object ID from a parent filter
+	 *
+	 * @param em         {@link EntityManager} of the data source
+	 * @param filter     parent filter string
+	 * @param parentType parent type to identify the Id attribute name
+	 * @return the extracted business object Id
+	 * @throws IllegalArgumentException if the given filter is not a parent filter,
+	 *                                  this means the filter does not have exactly
+	 *                                  one condition on the parent's ID attribute
+	 *                                  with {@link ComparisonOperator#EQUAL}
+	 */
+	public static String extactIdFromParentFilter(ApplicationContext context, String filter,
+			Class<? extends Entity> parentType) {
+		ModelManager mm = context.getModelManager()
+				.orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+		EntityType et = mm.getEntityType(parentType);
+
+		Filter f = FilterParser.parseFilterString(mm.listEntityTypes(), filter);
+
+		List<FilterItem> filterItems = f.stream().collect(Collectors.toList());
+
+		if (filterItems.size() == 1 && filterItems.get(0).isCondition()) {
+			Condition c = filterItems.get(0).getCondition();
+			if (et.getIDAttribute().equals(c.getAttribute())
+					&& ComparisonOperator.EQUAL.equals(c.getComparisonOperator())) {
+				return c.getValue().extract(ValueType.STRING);
+			}
+		}
+
+		throw new IllegalArgumentException("Cannot extract parent ID. Filter is not a parent filter: " + filter);
+	}
+
+	/**
+	 * Simple workaround for naming mismatch between Adapter and Business object
+	 * names.
+	 * 
+	 * @param entityType entity type
+	 * @return MDM business object name
+	 */
+	public static String workaroundForTypeMapping(EntityType entityType) {
+		switch (entityType.getName()) {
+		case "StructureLevel":
+			return "Pool";
+		case "MeaResult":
+			return "Measurement";
+		case "SubMatrix":
+			return "ChannelGroup";
+		case "MeaQuantity":
+			return "Channel";
+		default:
+			return entityType.getName();
+		}
+	}
+
+	/**
+	 * Builds {@Link Response} from given {@link Entity}
+	 * 
+	 * @param entity {@link Entity} to build {@link Response} from
+	 * @return the build {@link Response}
+	 */
+	public static <T extends Entity> Response buildEntityResponse(T entity, Status status) {
+		if (entity != null) {
+			MDMEntityResponse response = new MDMEntityResponse(entity.getClass(), entity);
+			// TODO anehmer on 2018-02-08: relations should be included in the output
+			GenericEntity<Object> genEntity = new GenericEntity<>(response, response.getClass());
+			return Response.status(status).entity(genEntity).type(MediaType.APPLICATION_JSON).build();
+		} else {
+			return Response.status(Status.NO_CONTENT).type(MediaType.APPLICATION_JSON).build();
+		}
+	}
+
+	/**
+	 * Builds {@Link Response} from given {@link Entity}
+	 * 
+	 * @param entity {@link Entity} to build {@link Response} from
+	 * @return the build {@link Response} or empty response if entities is empty
+	 */
+	public static <T extends Entity> Response buildEntityResponse(io.vavr.collection.List<T> entities, Status status) {
+		if (entities.nonEmpty()) {
+			@SuppressWarnings("unchecked")
+			Class<T> entityClass = (Class<T>) entities.get().getClass();
+			MDMEntityResponse response = new MDMEntityResponse(entityClass, entities.asJava());
+			GenericEntity<Object> genEntity = new GenericEntity<>(response, response.getClass());
+			return Response.status(status).entity(genEntity).type(MediaType.APPLICATION_JSON).build();
+		} else {
+			return Response.status(Status.NO_CONTENT).type(MediaType.APPLICATION_JSON).build();
+		}
+	}
+
+	/**
+	 * Builds {@Link Response} from given {@link Entity}
+	 * 
+	 * @param entity {@link Entity} to build {@link Response} from
+	 * @param clazz  default class of entity. Used for empty collections.
+	 * @return the build {@link Response}
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T extends Entity> Response buildEntityResponse(io.vavr.collection.List<T> entities, Status status,
+			Class<T> clazz) {
+
+		if (entities != null) {
+			Class<T> entityClass;
+			if (entities.nonEmpty()) {
+				entityClass = (Class<T>) entities.get().getClass();
+			} else {
+				entityClass = clazz;
+			}
+			MDMEntityResponse response = new MDMEntityResponse(entityClass, entities.asJava());
+			GenericEntity<Object> genEntity = new GenericEntity<>(response, response.getClass());
+			return Response.status(status).entity(genEntity).type(MediaType.APPLICATION_JSON).build();
+		} else {
+			return Response.status(Status.NO_CONTENT).type(MediaType.APPLICATION_JSON).build();
+		}
+	}
+
+	/**
+	 * Builds {@Link Response} from given {@link Entity}
+	 * 
+	 * @param entity {@link Entity} to build {@link Response} from
+	 * @return the build {@link Response}
+	 */
+	public static <T extends Entity> Response buildErrorResponse(Throwable t, Status status) {
+		return Response.status(status).entity(t).type(MediaType.APPLICATION_JSON).build();
+	}
+
+	/**
+	 * Converts the given object to a {@link Response} with the given {@link Status}
+	 *
+	 * @param response object to convert
+	 * @param status   {@link Status} of the {@link Response}
+	 * @return the created {@link Response}
+	 */
+	public static Response toResponse(Object response, Status status) {
+		GenericEntity<Object> genEntity = new GenericEntity<>(response, response.getClass());
+		return Response.status(status).entity(genEntity).type(MediaType.APPLICATION_JSON).build();
+	}
+
+	/**
+	 * Return the search attributes for the {@link ValueList} type.
+	 * 
+	 * @param sourceNameSupplier {@link Value} with the name of the source (MDM
+	 *                           {@link org.eclipse.mdm.api.base.model.Environment}
+	 *                           name)
+	 * @param entityClass        {@link Entity} class to get localization data for
+	 * @param entityService      {@link EntityService} used to get localization data
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	public static <T extends Entity> Response buildSearchAttributesResponse(Value<String> sourceNameSupplier,
+			Class<T> entityClass, EntityService entityService) {
+		return entityService.getSearchAttributesSupplier(sourceNameSupplier, entityClass)
+				.map(searchAttributes -> ServiceUtils
+						.toResponse(new SearchAttributeResponse(searchAttributes.toJavaList()), Status.OK))
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * Return the localized type and attributes for the {@link Entity} type.
+	 * 
+	 * @param sourceNameSupplier {@link Value} with the name of the source (MDM
+	 *                           {@link Environment} name)
+	 * @param entityClass        {@link Entity} class to get localization data for
+	 * @param entityService      {@link EntityService} used to get localization data
+	 * @return the {@link Response} with the localized data
+	 */
+	public static <T extends Entity> Response buildLocalizationResponse(Value<String> sourceNameSupplier,
+			Class<T> entityClass, EntityService entityService) {
+		return Try.of(() -> ServiceUtils.toResponse(
+				new I18NResponse(
+						entityService.getLocalizeTypeSupplier(sourceNameSupplier, entityClass).get().toJavaMap(),
+						entityService.getLocalizeAttributesSupplier(sourceNameSupplier, entityClass).get().toJavaMap()),
+				Status.OK)).recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
+	 * A Response representing a server error.
+	 */
+	public static final Response SERVER_ERROR_RESPONSE = Response.serverError().build();
+
+	/**
+	 * Builds an error response based on an exception to be sent to the client
+	 */
+	public static final Function<? super Throwable, Response> ERROR_RESPONSE_SUPPLIER = e -> {
+		LoggerFactory.getLogger(ServiceUtils.class).error(e.getMessage(), e);
+		// TODO anehmer on 2017-11-22: customize status according to exception
+		return Response
+				.status(Status.INTERNAL_SERVER_ERROR).entity(e.getStackTrace()[0].getClassName() + "."
+						+ e.getStackTrace()[0].getMethodName() + ": " + e.getMessage())
+				.type(MediaType.APPLICATION_JSON).build();
+	};
+
+	/**
+	 * Returns a {@link Try} to get the {@link ContextType} for the provided name
+	 * 
+	 * @param contextTypeName name of the {@link ContextType}
+	 * @return a {@link Try} of the {@link ContextType} for the given name
+	 */
+	public static Try<ContextType> getContextTypeSupplier(String contextTypeName) {
+		return Stream.of(ContextType.values())
+				.filter(contextType -> contextType.name().equals(contextTypeName.toUpperCase())).toTry();
+	}
+
+	/**
+	 * Converts vavr style context map to java.util style context map
+	 */
+	public static java.util.Map<String, java.util.Map<ContextType, ContextRoot>> contextMapToJava(
+			Map<String, Map<ContextType, ContextRoot>> ctx) {
+		return ctx.bimap(s -> s, m -> m.toJavaMap()).toJavaMap();
+	}
+
+	/**
+	 * Get {@link ContextType} from given entity if it has one. Otherwise return
+	 * null.
+	 * 
+	 * @param entity {@link Entity} to get {@link ContextType} for
+	 * @return {@link ContextType} or null
+	 */
+	public static ContextType getContextType(Entity entity) {
+		if (entity instanceof CatalogAttribute) {
+			return ((CatalogAttribute) entity).getCatalogComponent().map(CatalogComponent::getContextType)
+					.orElseGet(null);
+		} else if (entity instanceof CatalogComponent) {
+			return ((CatalogComponent) entity).getContextType();
+		} else if (entity instanceof TemplateRoot) {
+			return ((TemplateRoot) entity).getContextType();
+		} else if (entity instanceof TemplateComponent) {
+			return ((TemplateComponent) entity).getTemplateRoot().getContextType();
+		} else if (entity instanceof TemplateAttribute) {
+			return ((TemplateAttribute) entity).getTemplateComponent().map(TemplateComponent::getTemplateRoot)
+					.map(TemplateRoot::getContextType).orElseGet(null);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Get the {@link org.eclipse.mdm.api.base.adapter.Core} of given
+	 * {@link org.eclipse.mdm.api.base.model.Entity}
+	 * 
+	 * @param e Entity to get Core of
+	 * @return Core of given Entity
+	 */
+	public static Core getCore(Entity e) {
+		return Try.of(() -> {
+			Method getMetod;
+			try {
+				getMetod = BaseEntity.class.getDeclaredMethod("getCore");
+				getMetod.setAccessible(true);
+			} catch (NoSuchMethodException | SecurityException x) {
+				throw new IllegalStateException(
+						"Unable to load 'getCore()' in class '" + BaseEntity.class.getSimpleName() + "'.", x);
+			}
+			return (Core) getMetod.invoke(e);
+		}).get();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/boundary/QueryResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/boundary/QueryResource.java
new file mode 100644
index 0000000..c31b283
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/boundary/QueryResource.java
@@ -0,0 +1,69 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.boundary;
+
+import java.util.List;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.query.entity.QueryRequest;
+import org.eclipse.mdm.query.entity.QueryResult;
+import org.eclipse.mdm.query.entity.SuggestionRequest;
+import org.eclipse.mdm.query.entity.SuggestionResponse;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@Tag(name = "Query")
+@Path("/")
+public class QueryResource {
+
+	@EJB
+	private QueryService queryService;
+
+	@POST
+	@Path("query")
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public QueryResult query(QueryRequest request) {
+		return new QueryResult(queryService.queryRows(request));
+	}
+
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("suggestions")
+	public Response getSearchAttributes(SuggestionRequest suggestionRequest) {
+		try {
+			List<String> suggestions = queryService.getSuggestions(suggestionRequest);
+			return ServiceUtils.toResponse(new SuggestionResponse(suggestions), Status.OK);
+		} catch (RuntimeException e) {
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/boundary/QueryService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/boundary/QueryService.java
new file mode 100644
index 0000000..e61086b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/boundary/QueryService.java
@@ -0,0 +1,178 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.boundary;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.businessobjects.control.FilterParser;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.connector.boundary.ConnectorServiceException;
+import org.eclipse.mdm.property.GlobalProperty;
+import org.eclipse.mdm.query.entity.QueryRequest;
+import org.eclipse.mdm.query.entity.Row;
+import org.eclipse.mdm.query.entity.SourceFilter;
+import org.eclipse.mdm.query.entity.SuggestionRequest;
+import org.eclipse.mdm.query.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@Stateless
+public class QueryService {
+
+	private static final Logger LOG = LoggerFactory.getLogger(QueryService.class);
+
+	@Inject
+	@GlobalProperty(value = "businessobjects.query.maxresultspersource")
+	private String maxResultsPerSource = "1001";
+
+	@Inject
+	ConnectorService connectorService;
+
+	public List<Row> queryRows(QueryRequest request) {
+		List<Row> rows = new ArrayList<>();
+
+		for (SourceFilter filter : request.getFilters()) {
+			try {
+				ApplicationContext context = this.connectorService.getContextByName(filter.getSourceName());
+
+				rows.addAll(queryRowsForSource(context, request.getResultType(), request.getColumns(),
+						filter.getFilter(), filter.getSearchString()));
+			} catch (ConnectorServiceException e) {
+				LOG.warn("Could not retrieve EntityManager for environment '" + filter.getSourceName() + "'!", e);
+			} catch (Exception e) {
+				LOG.warn("Could not retrieve query results for environment '" + filter.getSourceName() + "': "
+						+ e.getMessage(), e);
+			}
+		}
+
+		return rows;
+	}
+
+	public List<String> getSuggestions(SuggestionRequest suggestionRequest) {
+
+		List<String> suggestions = new ArrayList<>();
+
+		for (String envName : suggestionRequest.getSourceNames()) {
+
+			ApplicationContext context = this.connectorService.getContextByName(envName);
+			Optional<ModelManager> mm = context.getModelManager();
+			Optional<org.eclipse.mdm.api.base.query.QueryService> qs = context.getQueryService();
+
+			if (mm.isPresent() && qs.isPresent()) {
+
+				try {
+					EntityType entityType = mm.get().getEntityType(suggestionRequest.getType());
+
+					Attribute attr = entityType.getAttribute(suggestionRequest.getAttrName());
+
+					suggestions.addAll(qs.get().createQuery().select(attr).group(attr).fetch().stream()
+							.map(r -> Objects.toString(r.getValue(attr).extract())).collect(Collectors.toList()));
+
+				} catch (DataAccessException | IllegalArgumentException e) {
+					LOG.warn("Cannot retreive suggestions " + suggestionRequest + " for Environment + " + envName + "!",
+							e);
+				}
+			}
+		}
+		return suggestions;
+	}
+
+	List<Row> queryRowsForSource(ApplicationContext context, String resultEntity, List<String> columns,
+			String filterString, String searchString) throws DataAccessException {
+
+		ModelManager modelManager = context.getModelManager()
+				.orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+
+		SearchService searchService = context.getSearchService()
+				.orElseThrow(() -> new IllegalStateException("neccessary SearchService is not available"));
+
+		Class<? extends Entity> resultType = getEntityClassByNameType(searchService, resultEntity);
+
+		List<EntityType> searchableTypes = searchService.listEntityTypes(resultType);
+		List<Attribute> attributes = columns.stream().map(c -> getAttribute(searchableTypes, c))
+				.filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
+
+		Filter filter = FilterParser.parseFilterString(searchableTypes, filterString);
+
+		List<Result> result = searchService.fetchResults(resultType, attributes, filter, searchString);
+
+		return Util.convertResultList(result.subList(0, Math.min(result.size(), getMaxResultsPerSource())), resultType,
+				modelManager.getEntityType(resultType));
+	}
+
+	private Optional<Attribute> getAttribute(List<EntityType> searchableTypes, String c) {
+		String[] parts = c.split("\\.");
+
+		if (parts.length != 2) {
+			throw new IllegalArgumentException("Cannot parse attribute " + c + "!");
+		}
+
+		String type = parts[0];
+		String attributeName = parts[1];
+
+		Optional<EntityType> entityType = searchableTypes.stream()
+				.filter(e -> ServiceUtils.workaroundForTypeMapping(e).equalsIgnoreCase(type)).findFirst();
+
+		if (entityType.isPresent()) {
+			return entityType.get().getAttributes().stream().filter(a -> a.getName().equalsIgnoreCase(attributeName))
+					.findFirst();
+		} else {
+			return Optional.empty();
+		}
+	}
+
+	private Class<? extends Entity> getEntityClassByNameType(SearchService s, String name) {
+
+		for (Class<? extends Entity> entityClass : s.listSearchableTypes()) {
+			if (entityClass.getSimpleName().equalsIgnoreCase(name)) {
+				return entityClass;
+			}
+		}
+		throw new IllegalArgumentException("Invalid Entity '" + name + "'. Allowed values are: "
+				+ s.listSearchableTypes().stream().map(Class::getSimpleName).collect(Collectors.joining(", ")));
+	}
+
+	private int getMaxResultsPerSource() {
+		try {
+			return Integer.parseInt(maxResultsPerSource);
+		} catch (NumberFormatException e) {
+			return 1001;
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/Column.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/Column.java
new file mode 100644
index 0000000..eb44679
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/Column.java
@@ -0,0 +1,98 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+import java.util.Objects;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.google.common.base.MoreObjects;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@JsonInclude(Include.NON_NULL)
+public class Column {
+	private String type;
+	private String attribute;
+	private String value;
+	private String unit;
+
+	public Column(String type, String attribute, String value, String unit) {
+		this.type = type;
+		this.attribute = attribute;
+		this.value = value;
+		this.unit = unit;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getAttribute() {
+		return attribute;
+	}
+
+	public void setAttribute(String attribute) {
+		this.attribute = attribute;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(type, attribute, value, unit);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == null) {
+			return false;
+		}
+
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		final Column other = (Column) obj;
+		return Objects.equals(this.type, other.type) && Objects.equals(this.attribute, other.attribute)
+				&& Objects.equals(this.value, other.value) && Objects.equals(this.unit, other.unit);
+	}
+
+	@Override
+	public String toString() {
+		return MoreObjects.toStringHelper(Column.class).add("type", type).add("attribute", attribute)
+				.add("value", value).add("unit", unit).toString();
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/EntityId.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/EntityId.java
new file mode 100644
index 0000000..f69b088
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/EntityId.java
@@ -0,0 +1,51 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class EntityId {
+	private String source;
+	private String type;
+	private String id;
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/LoadRequest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/LoadRequest.java
new file mode 100644
index 0000000..6198d87
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/LoadRequest.java
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+import java.util.List;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class LoadRequest {
+	private List<EntityId> entityIds;
+	private List<String> columns;
+
+	public List<EntityId> getEntityIds() {
+		return entityIds;
+	}
+
+	public void setEntityIds(List<EntityId> entityIds) {
+		this.entityIds = entityIds;
+	}
+
+	public List<String> getColumns() {
+		return columns;
+	}
+
+	public void setColumns(List<String> columns) {
+		this.columns = columns;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/QueryRequest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/QueryRequest.java
new file mode 100644
index 0000000..a787a5b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/QueryRequest.java
@@ -0,0 +1,53 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+import java.util.List;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class QueryRequest {
+
+	private List<SourceFilter> filters;
+	private List<String> columns;
+	private String resultType;
+
+	public List<SourceFilter> getFilters() {
+		return filters;
+	}
+
+	public void setFilters(List<SourceFilter> filters) {
+		this.filters = filters;
+	}
+
+	public List<String> getColumns() {
+		return columns;
+	}
+
+	public void setColumns(List<String> columns) {
+		this.columns = columns;
+	}
+
+	public String getResultType() {
+		return resultType;
+	}
+
+	public void setResultType(String resultType) {
+		this.resultType = resultType;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/QueryResult.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/QueryResult.java
new file mode 100644
index 0000000..c365cdc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/QueryResult.java
@@ -0,0 +1,38 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+import java.util.List;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class QueryResult {
+	private List<Row> rows;
+
+	public QueryResult(List<Row> rows) {
+		this.rows = rows;
+	}
+
+	public List<Row> getRows() {
+		return rows;
+	}
+
+	public void setRows(List<Row> rows) {
+		this.rows = rows;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/Row.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/Row.java
new file mode 100644
index 0000000..38cac0c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/Row.java
@@ -0,0 +1,101 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class Row {
+
+	private String source;
+	private String type;
+	private String id;
+
+	private List<Column> columns = new ArrayList<>();
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public void addColumn(Column col) {
+		columns.add(col);
+	}
+
+	public List<Column> getColumns() {
+		return columns;
+	}
+
+	public void setColumns(List<Column> columns) {
+		this.columns = columns;
+	}
+
+	public void addColumns(Collection<? extends Column> columns) {
+		this.columns.addAll(columns);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(source, type, id, columns);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == null) {
+			return false;
+		}
+
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		final Row other = (Row) obj;
+		return Objects.equals(this.source, other.source) && Objects.equals(this.type, other.type)
+				&& Objects.equals(this.id, other.id) && Objects.equals(this.columns, other.columns);
+	}
+
+	@Override
+	public String toString() {
+		return MoreObjects.toStringHelper(Row.class).add("source", source).add("type", type).add("id", id)
+				.add("columns", columns).toString();
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SourceFilter.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SourceFilter.java
new file mode 100644
index 0000000..73e1943
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SourceFilter.java
@@ -0,0 +1,50 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class SourceFilter {
+	private String sourceName;
+	private String filter;
+	private String searchString;
+
+	public String getSourceName() {
+		return sourceName;
+	}
+
+	public void setSourceName(String sourceName) {
+		this.sourceName = sourceName;
+	}
+
+	public String getFilter() {
+		return filter;
+	}
+
+	public void setFilter(String filter) {
+		this.filter = filter;
+	}
+
+	public String getSearchString() {
+		return searchString;
+	}
+
+	public void setSearchString(String searchString) {
+		this.searchString = searchString;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SuggestionRequest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SuggestionRequest.java
new file mode 100644
index 0000000..12cd685
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SuggestionRequest.java
@@ -0,0 +1,69 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class SuggestionRequest {
+
+	private List<String> sourceNames;
+	private String type;
+	private String attrName;
+
+	public SuggestionRequest() {
+		// empty no arg constructor
+	}
+
+	public SuggestionRequest(List<String> sourceNames, String type, String name) {
+		this.sourceNames = sourceNames;
+		this.type = type;
+		this.attrName = name;
+	}
+
+	public void setSourceNames(List<String> sourceNames) {
+		this.sourceNames = sourceNames;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public void setAttrName(String attrName) {
+		this.attrName = attrName;
+	}
+
+	public List<String> getSourceNames() {
+		return sourceNames;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public String getAttrName() {
+		return attrName;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SuggestionResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SuggestionResponse.java
new file mode 100644
index 0000000..bf28305
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/entity/SuggestionResponse.java
@@ -0,0 +1,53 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class SuggestionResponse {
+
+	/** transferable data content */
+	private List<String> data;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param searchDefinitions list of {@link Suggestion}s to transfer
+	 */
+	public SuggestionResponse(List<String> suggestions) {
+		this.data = new ArrayList<>(suggestions);
+	}
+
+	public SuggestionResponse() {
+		this.data = new ArrayList<>();
+	}
+
+	public List<String> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/util/Util.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/util/Util.java
new file mode 100644
index 0000000..f892e42
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/query/util/Util.java
@@ -0,0 +1,71 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
+import org.eclipse.mdm.query.entity.Column;
+import org.eclipse.mdm.query.entity.Row;
+
+import com.google.common.base.Strings;
+
+/**
+ * 
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public final class Util {
+
+	private Util() {
+
+	}
+
+	public static List<Row> convertResultList(Collection<Result> results, Class<? extends Entity> resultEntityClass,
+			EntityType type) {
+		List<Row> rows = new ArrayList<>();
+		results.forEach(row -> rows.add(convertResult(row, resultEntityClass, type)));
+		return rows;
+	}
+
+	public static Row convertResult(Result result, Class<? extends Entity> resultEntityClass, EntityType type) {
+		Row row = new Row();
+		row.setSource(type.getSourceName());
+		row.setType(resultEntityClass.getSimpleName());
+		row.setId(result.getRecord(type).getID());
+		result.forEach(record -> row.addColumns(convertRecord(record)));
+		return row;
+	}
+
+	public static List<Column> convertRecord(Record record) {
+		List<Column> columns = new ArrayList<>();
+		record.getValues().values().forEach(value -> columns.add(convertColumn(record, value)));
+		return columns;
+	}
+
+	public static Column convertColumn(Record record, Value value) {
+		return new Column(ServiceUtils.workaroundForTypeMapping(record.getEntityType()), value.getName(),
+				Strings.emptyToNull(Objects.toString(value.extract())), Strings.emptyToNull(value.getUnit()));
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/boundary/ShoppingBasketResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/boundary/ShoppingBasketResource.java
new file mode 100644
index 0000000..3983d39
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/boundary/ShoppingBasketResource.java
@@ -0,0 +1,189 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.shoppingbasket.boundary;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.shoppingbasket.entity.BasketItem;
+import org.eclipse.mdm.shoppingbasket.entity.MDMItem;
+import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasket;
+import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasketRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableMap;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link ShoppingBasketResource} resource
+ *
+ */
+@Tag(name = "ShoppingBasket")
+@Path("/shoppingbasket")
+public class ShoppingBasketResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(ShoppingBasketResource.class);
+
+	private ConnectorService connectorService;
+
+	@Context
+	private UriInfo uriInfo;
+
+	private static final Map<Class<? extends Entity>, String> ENTITY2FRAGMENT_URI = ImmutableMap
+			.<Class<? extends Entity>, String>builder().put(Project.class, "projects").put(Pool.class, "pools")
+			.put(Test.class, "tests").put(TestStep.class, "teststeps").put(Measurement.class, "measurements")
+			.put(ChannelGroup.class, "channelgroups").put(Channel.class, "channels").build();
+
+	private static final Map<String, Class<? extends Entity>> ENTITYNAME2CLASS = ImmutableMap
+			.<String, Class<? extends Entity>>builder().put("Project", Project.class).put("Pool", Pool.class)
+			.put("Test", Test.class).put("TestStep", TestStep.class).put("Measurement", Measurement.class)
+			.put("ChannelGroup", ChannelGroup.class).put("Channel", Channel.class).build();
+
+	/**
+	 * @param connectorService {@link ConnectorService}
+	 */
+	@Inject
+	ShoppingBasketResource(ConnectorService connectorService) {
+		this.connectorService = connectorService;
+	}
+
+	/**
+	 * Returns a shopping basket XML file containing the requested MDM items
+	 * 
+	 * @param items list with items the shopping basket should contain.
+	 * @return a XML file the the shopping basket information.
+	 */
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_XML)
+	public Response getShoppingbasket(ShoppingBasketRequest items) {
+		try {
+			return Response.ok(convertItemsToShoppingBasket(items), MediaType.APPLICATION_XML_TYPE).build();
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+
+	}
+
+	/**
+	 * Converts a {@link ShoppingBasketRequest} into a {@link ShoppingBasket} by
+	 * generating the link and REST URIs for the given MDM items.
+	 * 
+	 * @param items MDM items to convert
+	 * @return a shopping basket representing the given MDM items
+	 */
+	private ShoppingBasket convertItemsToShoppingBasket(ShoppingBasketRequest items) {
+		List<BasketItem> basketItems = new ArrayList<>();
+		Map<String, List<MDMItem>> itemsBySource = items.getItems().stream()
+				.collect(Collectors.groupingBy(MDMItem::getSource));
+
+		for (Map.Entry<String, List<MDMItem>> entry : itemsBySource.entrySet()) {
+			ApplicationContext context = connectorService.getContextByName(entry.getKey());
+			EntityManager em = context.getEntityManager().orElseThrow(() -> new IllegalArgumentException(
+					"Not connected to ApplicationContext with name " + entry.getKey()));
+
+			List<Entity> entities = entry.getValue().stream().map(i -> getEntity(em, i)).collect(Collectors.toList());
+
+			for (Map.Entry<Entity, String> e : em.getLinks(entities).entrySet()) {
+
+				BasketItem basketItem = new BasketItem();
+				basketItem.setSource(context.getAdapterType());
+				basketItem.setLink(e.getValue());
+				basketItem.setRestURI(getURIForEntity(e.getKey()));
+
+				basketItems.add(basketItem);
+			}
+		}
+
+		ShoppingBasket basket = new ShoppingBasket();
+		basket.setName(items.getName());
+		basket.setItems(basketItems);
+		return basket;
+	}
+
+	/**
+	 * Generate the REST URI for a Entity
+	 * 
+	 * @param entity Entity
+	 * @return the REST URI of the given Entity
+	 */
+	private URI getURIForEntity(Entity entity) {
+		return uriInfo.getBaseUriBuilder().path("environments").path(entity.getSourceName())
+				.path(getURIFragmentForEntity(entity)).path(entity.getID()).build();
+	}
+
+	/**
+	 * Returns the URI fragment of a entity. For example, if entity is an instance
+	 * of {@link TestStep} the string "teststeps" is returned.
+	 * 
+	 * @param entity
+	 * @return the URI fragment of the Entity's EntityType
+	 */
+	private String getURIFragmentForEntity(Entity entity) {
+
+		for (Map.Entry<Class<? extends Entity>, String> entry : ENTITY2FRAGMENT_URI.entrySet()) {
+			if (entry.getKey().isInstance(entity)) {
+				return entry.getValue();
+			}
+		}
+		// fallback to generic fragment
+		return entity.getClass().getSimpleName().toLowerCase() + "s";
+	}
+
+	/**
+	 * Loads the entity specified by the given MDM item.
+	 * 
+	 * @param em   {@link EntityManager} used to load the entity.
+	 * @param item MDM item to load based on its type and id.
+	 * @return the loaded Entity
+	 */
+	private Entity getEntity(EntityManager em, MDMItem item) {
+		for (Map.Entry<String, Class<? extends Entity>> entry : ENTITYNAME2CLASS.entrySet()) {
+			if (item.getType().equals(entry.getKey())) {
+				return em.load(entry.getValue(), item.getId());
+			}
+		}
+		throw new IllegalArgumentException("Cannot load type: " + item.getType());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/BasketItem.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/BasketItem.java
new file mode 100644
index 0000000..e9cba05
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/BasketItem.java
@@ -0,0 +1,79 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.shoppingbasket.entity;
+
+import java.net.URI;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * BasketItem represents a single item in a shopping basket.
+ *
+ */
+@XmlRootElement(name = "item")
+@XmlType(propOrder = { "source", "restURI", "link" })
+public class BasketItem {
+
+	private String source;
+	private URI restURI;
+	private String link;
+
+	/**
+	 * @return the adapter source of this item
+	 */
+	@XmlElement(name = "source")
+	public String getSource() {
+		return source;
+	}
+
+	/**
+	 * @param type the adapter source of this item
+	 */
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	/**
+	 * @return rest URI of this item
+	 */
+	@XmlElement(name = "resturi")
+	public URI getRestURI() {
+		return restURI;
+	}
+
+	/**
+	 * @param restURI rest URI of this item
+	 */
+	public void setRestURI(URI restURI) {
+		this.restURI = restURI;
+	}
+
+	/**
+	 * @return link to this item in the adapter's data store
+	 */
+	@XmlElement(name = "link")
+	public String getLink() {
+		return link;
+	}
+
+	/**
+	 * @param link to this item in the adapter's data store
+	 */
+	public void setLink(String link) {
+		this.link = link;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/MDMItem.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/MDMItem.java
new file mode 100644
index 0000000..5f6ca6f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/MDMItem.java
@@ -0,0 +1,67 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.shoppingbasket.entity;
+
+/**
+ * MDMItem contains all information (source, type, id) to identify a MDM Entity.
+ *
+ */
+public class MDMItem {
+	private String source;
+	private String type;
+	private String id;
+
+	/**
+	 * @return the source
+	 */
+	public String getSource() {
+		return source;
+	}
+
+	/**
+	 * @param source the source to set
+	 */
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	/**
+	 * @return the type
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * @param type the type to set
+	 */
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	/**
+	 * @return the id
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * @param id the id to set
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/ShoppingBasket.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/ShoppingBasket.java
new file mode 100644
index 0000000..c71acc0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/ShoppingBasket.java
@@ -0,0 +1,66 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.shoppingbasket.entity;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * ShoppingBasket contains a list of item and an optional name.
+ *
+ */
+@XmlRootElement(name = "shoppingbasket")
+@XmlType(propOrder = { "name", "items" })
+public class ShoppingBasket {
+	private String name;
+
+	private List<BasketItem> items;
+
+	/**
+	 * @return the name
+	 */
+	@XmlElement(name = "name")
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param name the name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * @return the items
+	 */
+
+	@XmlElementWrapper(name = "items")
+	@XmlElement(name = "item")
+	public List<BasketItem> getItems() {
+		return items;
+	}
+
+	/**
+	 * @param items the items to set
+	 */
+	public void setItems(List<BasketItem> items) {
+		this.items = items;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/ShoppingBasketRequest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/ShoppingBasketRequest.java
new file mode 100644
index 0000000..17dfc2c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/ShoppingBasketRequest.java
@@ -0,0 +1,61 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.shoppingbasket.entity;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * ShoppingBasketRequest represents a client request to generate a shopping
+ * basket.
+ *
+ */
+public class ShoppingBasketRequest {
+	private String name;
+	private List<MDMItem> items;
+
+	/**
+	 * @return the name
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param name the name to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * @return the items
+	 */
+	public List<MDMItem> getItems() {
+		return items;
+	}
+
+	/**
+	 * @param items the items to set
+	 */
+	public void setItems(List<MDMItem> items) {
+		if (items == null) {
+			this.items = Collections.emptyList();
+		} else {
+			this.items = items;
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/package-info.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/package-info.java
new file mode 100644
index 0000000..9b928db
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/shoppingbasket/entity/package-info.java
@@ -0,0 +1,20 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional information
+ * regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+@XmlSchema(namespace = "http://www.eclipse/openmdm/shoppingbasket/1.0/", xmlns = {
+		@XmlNs(prefix = "", namespaceURI = "http://www.eclipse/openmdm/shoppingbasket/1.0/"), }, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
+package org.eclipse.mdm.shoppingbasket.entity;
+
+import javax.xml.bind.annotation.XmlNs;
+import javax.xml.bind.annotation.XmlSchema;
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/proto/mdm.proto b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/proto/mdm.proto
new file mode 100644
index 0000000..073d57d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/proto/mdm.proto
@@ -0,0 +1,374 @@
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+syntax = "proto3";

+

+package org.eclipse.mdm.protobuf;

+

+import "google/protobuf/timestamp.proto";

+

+/**

+ * Specifies if the MeasuredValues contain the final values or the generation parameters.

+ */

+enum ValuesMode {

+		/**

+		 * MeasuredValues will contain the final values, calculated for non-explicit

+		 * sequence representations using generation parameters and, if applicable, the

+		 * raw values. No generation parameters are returned in the resulting

+		 * MeasuredValues, SequenceRepresentation will be EXPLICIT.

+		 */

+		CALCULATED = 0;

+		/**

+		 * MeasuredValues will contain the (raw) values and generation parameters as

+		 * present in the storage.

+		 */

+		STORAGE = 1;

+}

+

+/**

+ * Scalar type enumeration represents the datatype of MeasuredValues.

+ */

+enum ScalarType {

+	STRING = 0;          // MeasuredValues are provided as StringArray

+	DATE = 1;            // MeasuredValues are provided as DateArray

+	BOOLEAN = 2;         // MeasuredValues are provided as BooleanArray

+	BYTE = 3;            // MeasuredValues are provided as ByteArray

+	SHORT = 4;           // MeasuredValues are provided as ShortArray

+	INTEGER = 5;         // MeasuredValues are provided as IntegerArray

+	LONG = 6;            // MeasuredValues are provided as LongArray

+	FLOAT = 7;           // MeasuredValues are provided as FloatArray

+	DOUBLE = 8;          // MeasuredValues are provided as DoubleArray

+	BYTE_STREAM = 9;     // MeasuredValues are provided as ByteStreamArray

+	FLOAT_COMPLEX = 10;  // MeasuredValues are provided as FloatComplexArray

+	DOUBLE_COMPLEX = 11; // MeasuredValues are provided as DoubleComplexArray

+	ENUMERATION = 12;    // not used for MeasuredValues

+	FILE_LINK = 13;      // not used for MeasuredValues

+	BLOB = 14;           // not used for MeasuredValues

+	UNKNOWN = 15;        // not used for MeasuredValues

+}

+

+/**

+ * This is the axis type enumeration as defined in the ASAM ODS NVH model.

+ */

+enum AxisType {

+	X_AXIS = 0;  // A Channel of this type may be displayed as the x-axis.

+	Y_AXIS = 1;  // A Channel of this type may be displayed as the y-axis.

+	XY_AXIS = 2; // A Channel of this type may be displayed as the x- or y-axis.

+}

+

+/**

+ * The sequence representation to describe the storage type of measured values.

+ */

+enum SequenceRepresentation {

+  /**

+	 * Measured values are stored as is and values are therefore immediately

+	 * available.

+	 */

+	EXPLICIT = 0;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> = p for i

+	 * &isin; [1, n], n is the total number of values and generation parameter p

+	 * (offset).

+	 */

+	IMPLICIT_CONSTANT = 1;

+	  /**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> =

+	 * p<sub>1</sub>+(i-1)*p<sub>2</sub> for i &isin; [1, n], n is the total number

+	 * of values and generation parameters p<sub>1</sub> (start value) and

+	 * p<sub>2</sub> (increment).

+	 */

+	IMPLICIT_LINEAR = 2;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> =

+	 * p<sub>1</sub>+((i-1)mod(p<sub>3</sub>-p<sub>1</sub>)/p<sub>2</sub>)*

+	 * p<sub>2</sub> for i &isin; [1, n], n is the total number of values and

+	 * generation parameters p<sub>1</sub> (start value), p<sub>2</sub> (increment)

+	 * and p<sub>3</sub> (number of values per saw). The expression

+	 * (p<sub>3</sub>-p<sub>1</sub>)/p<sub>2</sub> must be truncated to integer to

+	 * start each saw curve cycle at p<sub>1</sub>.

+	 */

+	IMPLICIT_SAW = 3;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> =

+	 * p<sub>1</sub>+p<sub>2</sub>*r<sub>i</sub> for i &isin; [1, n], n is the total

+	 * number of values and generation parameters p<sub>1</sub> (offset),

+	 * p<sub>2</sub> (factor) and the raw value r at position i.

+	 */

+	RAW_LINEAR = 4;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> = &sum;

+	 * p<sub>j</sub>*r<sub>i</sub><sup>j-1</sup> = p<sub>2</sub>+p<sub>3

+	 * </sub>*r<sub>i</sub>+p<sub>4</sub>*r<sub>i</sub><sup>2</sup>+... for i &isin;

+	 * [1, n], n is the total number of values and generation parameters

+	 * p<sub>j</sub> for j &isin; [1, p<sub>1</sub>] and the raw value r at position

+	 * i.

+	 */

+	RAW_POLYNOMIAL = 5;

+	/*

+	 * Not used. But keep here to show ordinal sequence.

+	 */

+	FORMULA = 6;

+	/**

+	 * Measured values are stored as is in an external file and values are therefore

+	 * immediately available.

+	 */

+	EXPLICIT_EXTERNAL = 7;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> =

+	 * p<sub>1</sub>+p<sub>2</sub>*r<sub>i</sub> for i &isin; [1, n], n is the total

+	 * number of values and generation parameters p<sub>1</sub> (offset),

+	 * p<sub>2</sub> (factor) and the raw value r at position i read from an

+	 * external file.

+	 */

+	RAW_LINEAR_EXTERNAL = 8;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> = &sum;

+	 * p<sub>j</sub>*r<sub>i</sub><sup>j-1</sup> = p<sub>2</sub>+p<sub>3

+	 * </sub>*r<sub>i</sub>+p<sub>4</sub>*r<sub>i</sub><sup>2</sup>+... for i &isin;

+	 * [1, n], n is the total number of values and generation parameters

+	 * p<sub>j</sub> for j &isin; [1, p<sub>1</sub>] and the raw value r at position

+	 * i read from an external file.

+	 */

+	RAW_POLYNOMIAL_EXTERNAL = 9;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> =

+	 * (p<sub>1</sub>+p<sub>2</sub>*r<sub>i</sub>)*p<sub>3</sub> for i &isin; [1,

+	 * n], n is the total number of values and generation parameters p<sub>1</sub>

+	 * (offset), p<sub>2</sub> (factor), p<sub>2</sub> (calibration) and the raw

+	 * value r at position i.

+	 */

+	RAW_LINEAR_CALIBRATED = 10;

+	/**

+	 * Each value x<sub>i</sub> is generated as follows: x<sub>i</sub> =

+	 * (p<sub>1</sub>+p<sub>2</sub>*r<sub>i</sub>)*p<sub>3</sub> for i &isin; [1,

+	 * n], n is the total number of values and generation parameters p<sub>1</sub>

+	 * (offset), p<sub>2</sub> (factor), p<sub>2</sub> (calibration) and the raw

+	 * value r at position i read from an external file.

+	 */

+	RAW_LINEAR_CALIBRATED_EXTERNAL = 11;

+}

+

+/**

+ * This class provides all required informations to load measured values.

+ */

+ message ReadRequest {

+	string channel_group_id = 1;     // ID of the ChannelGroup which Channel values are requested.

+

+	repeated string channel_ids = 2; // IDs of the channels to load. If empty, all channels are loaded.

+	/**

+	 * IDSs of the units in which the corresponding channel values (i.e. the channels at the same index as in channel_ids)

+	 * are loaded. A missing or empty string is interpreted as the default unit of the channel.

+	 * Superfluous unit IDs are ignored.

+	 */

+	repeated string unit_ids = 3;

+

+	int32 request_size = 4;          // Number of requested values

+	int32 start_index = 5;           // Start index of the requested values

+

+	ValuesMode values_mode = 6;      // Mode in which the values are returned. See description of ValueMode enum.

+}

+

+/**

+ * This message represents a complex value with real and imaginary parts of type float.

+ */

+message FloatComplex {

+	float re = 1; // The real part.

+	float im = 2; // The imaginary part.

+}

+

+/**

+ * This message represents a complex value with real and imaginary parts of type double.

+ */

+message DoubleComplex {

+	double re = 1; // The real part.

+	double im = 2; // The imaginary part.

+}

+

+message StringArray        { repeated string values = 1; }

+message DateArray          { repeated google.protobuf.Timestamp values = 1; }

+message BooleanArray       { repeated bool   values = 1 [packed=true]; }

+message ByteArray          {          bytes  values = 1; }

+message ShortArray         { repeated int32  values = 1 [packed=true]; }

+message IntegerArray       { repeated int32  values = 1 [packed=true]; }

+message LongArray          { repeated int64  values = 1 [packed=true]; }

+message FloatArray         { repeated float  values = 1 [packed=true]; }

+message DoubleArray        { repeated double values = 1 [packed=true]; }

+message ByteStreamArray    { repeated bytes  values = 1; }

+message FloatComplexArray  { repeated FloatComplex  values = 1; }

+message DoubleComplexArray { repeated DoubleComplex values = 1; }

+

+/**

+ * This message represents a sequence of measured values for one Channel.

+ */

+message MeasuredValues {

+	string name = 1;                                         // Name of the channel

+	string unit = 2;                                         // Unit of the values

+	int32 length = 3;                                        // Length of the channel

+

+	SequenceRepresentation sequence_representation = 4;      // The SequenceRepresentation of the measured values.

+	repeated double generation_parameters = 5 [packed=true]; // The generation parameters of the channel

+	bool independent = 6;                                    // The independent flag of the channel

+	AxisType axis_type = 7;                                  // The axis type of the channel

+	ScalarType scalar_type = 8;                              // Scalar type of the channel's values

+	oneof values {

+		StringArray         string_array = 9;                // STRING

+		DateArray           date_array = 10;                 // DATE

+		BooleanArray        boolean_array = 11;              // BOOLEAN

+		ByteArray           byte_array = 12;                 // BYTE

+		ShortArray          short_array = 13;                // SHORT

+		IntegerArray        integer_array = 14;              // INTEGER

+		LongArray           long_array = 15;                 // LONG

+		FloatArray          float_array = 16;                // FLOAT

+		DoubleArray         double_array = 17;               // DOUBLE,

+		ByteStreamArray     byte_stream_array = 18;          // BYTE_STREAM

+		FloatComplexArray   float_complex_array = 19;        // FLOAT_COMPLEX

+		DoubleComplexArray  double_complex_array = 20;       // DOUBLE_COMPLEX

+		// The following datatypes are not supported in ODS for measuredvalues: ENUMERATION, FILE_LINK, BLOB, UNKNOWN

+	}                                                        // the actual measured values

+	repeated bool flags = 21 [packed=true];                  // The flags of the measured values

+}

+

+/**

+ * Container for a list of MeasuredValues

+ */

+message MeasuredValuesList {

+	repeated MeasuredValues values = 1; // List of MeasuredValues

+}

+

+/**

+ * Container for a list of WriteRequests

+ */

+message WriteRequestList {

+	/**

+	 * Holds required data to write mass data.

+	 */

+	message WriteRequest {

+		message ExplicitData {

+			oneof values {

+				StringArray         string_array = 1;          // STRING

+				DateArray           date_array = 2;            // DATE

+				BooleanArray        boolean_array = 3;         // BOOLEAN

+				ByteArray           byte_array = 4;            // BYTE

+				ShortArray          short_array = 5;           // SHORT

+				IntegerArray        integer_array = 6;         // INTEGER

+				LongArray           long_array = 7;            // LONG

+				FloatArray          float_array = 8;           // FLOAT

+				DoubleArray         double_array = 9;          // DOUBLE,

+				ByteStreamArray     byte_stream_array = 10;    // BYTE_STREAM

+				FloatComplexArray   float_complex_array = 11;  // FLOAT_COMPLEX

+				DoubleComplexArray  double_complex_array = 12; // DOUBLE_COMPLEX

+				// The following datatypes are not supported in ODS for measuredvalues: ENUMERATION, FILE_LINK, BLOB, UNKNOWN

+			} // the actual values

+

+			repeated bool flags = 13 [packed=true];            // The flags of the measured values

+		}

+

+		/**

+		 * Configures a WriteRequest to create an implicit linear sequence

+		 * of measured values. See org.eclipse.mdm.api.base.massdata.WriteRequestBuilder.implicitLinear(ScalarType, double, double)

+		 */

+		message ImplicitLinear {

+			ScalarType scalar_type = 1; // Scalar type of the channel's values

+			double start = 2;           // The start value of the line.

+			double increment = 3;       // The gradient of the line.

+		}

+

+		/**

+		 * Configures a WriteRequest to create an implicit saw sequence

+		 * of measured values. See org.eclipse.mdm.api.base.massdata.WriteRequestBuilder.implicitSaw(ScalarType, double, double, double).

+		 */

+		message ImplicitSaw {

+			ScalarType scalar_type = 1; // Scalar type of the channel's values

+			double start = 2;           // The start value of each saw cycle.

+			double increment = 3;       // The increment.

+			double stop = 4;            // The stop value of each saw cycle. The stop value is exclusive.

+		}

+

+		/**

+		 * Configures a WriteRequest to create an implicit constant sequence

+		 * of measured values. See org.eclipse.mdm.api.base.massdata.WriteRequestBuilder.implicitConstant(ScalarType, double).

+		 */

+		message ImplicitConstant {

+			ScalarType scalar_type = 1; // Scalar type of the channel's values

+			double offset = 2;          // The constant value.

+		}

+

+		/**

+		 * Configures the WriteRequest to create a raw linear sequence of

+		 * measured values. See org.eclipse.mdm.api.base.massdata.WriteRequestBuilder.rawLinear(double, double)

+		 */

+		message RawLinear {

+			ScalarType scalar_type = 1; // Scalar type of the channel's values

+			double offset = 2;          // The offset for each value.

+			double factor = 3;          // The factor for each value.

+			ExplicitData values = 4;    // The raw values.

+		}

+

+		/**

+		 * Configures the WriteRequest to create a raw polynomial sequence of

+		 * measured values. See org.eclipse.mdm.api.base.massdata.WriteRequestBuilder.rawPolynomial(double...)

+		 */

+		message RawPolynomial {

+			ScalarType scalar_type = 1;       // Scalar type of the channel's values

+			repeated double coefficients = 2; // At least 2 coefficients must be provided.

+			ExplicitData values = 3;          // The raw values.

+		}

+

+		/**

+		 * Configures the WriteRequest to create a raw linear calibrated sequence of

+		 * measured values. See org.eclipse.mdm.api.base.massdata.WriteRequestBuilder.rawLinearCalibrated(double, double, double)

+		 */

+		message RawLinearCalibrated {

+			ScalarType scalar_type = 1; // Scalar type of the channel's values

+			double offset = 2;          // The offset for each value.

+			double factor = 3;          // The factor for each value.

+			double calibration = 4;     // The calibration factor.

+			ExplicitData values = 5;    // The raw values.

+		}

+

+		string channel_group_id = 1;    // The ChannelGroup for this request.

+		string channel_id = 2;          // The Channel specified mass data will be dedicated to.

+		AxisType axis_type = 3;         // The AxisType of the written mass data.

+		bool independent = 4;           // The independent flag for the Channel

+		oneof data {

+			ExplicitData explicit = 5;

+			ImplicitConstant implicit_constant = 6;

+			ImplicitLinear implicit_linear = 7;

+			ImplicitSaw implicit_saw = 8;

+			RawLinear raw_linear = 9;

+			RawPolynomial raw_polynomial = 10;

+			RawLinearCalibrated raw_linear_calibrated = 11;

+		}                               // The mass data for this Channel

+		string source_unit_id = 12;     // The source Unit ID for the data. (Hint this not implemented as of version 5.1.0M6)

+	}

+	repeated WriteRequest values = 1;   // The List of WriteRequests

+}

+

+/**

+ * Message to request preview values.

+ * Preview values are only provided for numerical Datatypes.

+ * If channels with other Datatypes are requested, an empty MeasuredValues message is returned.

+ */

+message PreviewRequest {

+	ReadRequest read_request = 1; // Read request, which specifies which data should be read.

+	int32 number_of_chunks = 2;   // Number of chunks, e.g. number of values returned by the preview request.

+}

+

+/**

+ * Message containing preview data requested by a PreviewRequest

+ */

+message PreviewValuesList {

+	repeated MeasuredValues min = 1; // minimum values for each chunk

+	repeated MeasuredValues avg = 2; // average values for each chunk

+	repeated MeasuredValues max = 3; // maximum values for each chunk

+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/org/eclipse/mdm/businessobjects/control/i18n/locale/localization.properties b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/org/eclipse/mdm/businessobjects/control/i18n/locale/localization.properties
new file mode 100644
index 0000000..3d78479
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/org/eclipse/mdm/businessobjects/control/i18n/locale/localization.properties
@@ -0,0 +1,63 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+ 
+Environment = Environment
+Environment.Name = Name
+Environment.MimeType = MimeType
+Environment.Description = Description
+Environment.DateCreated = DateCreated
+Environment.Max_test_level = MaxTestLevels
+Environment.Base_model_version = BaseModelVersion
+Environment.AppModelType = ApplicationModelType
+Environment.AppModelVersion = ApplicationModelVersion
+Environment.Timezone = Timezone
+
+Test = Test
+Test.Name = Name
+Test.MimeType = MimeType
+Test.Description = Description
+Test.DateCreated = DateCreated
+Test.DateClosed = DateClosed
+Test.MDMLinks = Links
+
+TestStep = TestStep
+TestStep.Name = Name
+TestStep.MimeType = MimeType
+TestStep.Description = Description
+TestStep.DateCreated = DateCreated
+TestStep.Optional = Optional
+TestStep.MDMLinks = Links
+
+Measurement = Measurement
+Measurement.Name = Name
+Measurement.MimeType = MimeType
+Measurement.Description = Description
+Measurement.DateCreated = DateCreated
+Measurement.MeasurementBegin = Begin
+Measurement.MeasurementEnd = End
+Measurement.MDMLinks = Links
+
+ChannelGroup = ChannelGroup
+ChannelGroup.Name = Name
+ChannelGroup.MimeType = MimeType
+ChannelGroup.SubMatrixNoRows = Rows
+
+Channel = Channel
+Channel.Name = Name
+Channel.Description = MimeType
+Channel.DataType = DataType
+Channel.Minimum = Minimum
+Channel.Maximum = Maximum
+Channel.Average = Average
+Channel.Deviation = Deviation
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/org/eclipse/mdm/businessobjects/control/i18n/locale/localization_de.properties b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/org/eclipse/mdm/businessobjects/control/i18n/locale/localization_de.properties
new file mode 100644
index 0000000..27150c6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/org/eclipse/mdm/businessobjects/control/i18n/locale/localization_de.properties
@@ -0,0 +1,64 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+Environment = Datenquelle
+Environment.Name = Name
+Environment.MimeType = MimeType
+Environment.Description = Beschreibung
+Environment.DateCreated = Angelegt am:
+Environment.Max_test_level = Testlevels
+Environment.Base_model_version = Basismodell Version
+Environment.AppModelType = Applicationmodell Typ
+Environment.AppModelVersion = Applikationsmodell Version
+Environment.Timezone = Zeitzone
+
+Test = Versuch
+Test.Name = Name
+Test.MimeType = MimeType
+Test.Description = Beschreibung
+Test.DateCreated = Angelegt am:
+Test.DateClosed = Geschlossen am:
+Test.MDMLinks = Links
+
+TestStep = Versuchsschritt
+TestStep.Name = Name
+TestStep.MimeType = MimeType
+TestStep.Description = Beschreibung
+TestStep.DateCreated = Angelegt am:
+TestStep.Optional = Optional
+TestStep.MDMLinks = Links
+
+MeaResult = Messung
+MeaResult.Name = Name
+MeaResult.MimeType = MimeType
+MeaResult.Description = Beschreibung
+MeaResult.DateCreated = Angelegt am:
+MeaResult.MeasurementBegin = Messungsbeginn
+MeaResult.MeasurementEnd = Messungsende
+MeaResult.MDMLinks = Links
+
+SubMatrix = Kanalgruppe
+SubMatrix.Name = Name
+SubMatrix.MimeType = MimeType
+SubMatrix.SubMatrixNoRows = Messpunkte pro Kanal
+
+MeaQuantity = Kanal
+MeaQuantity.Name = Name
+MeaQuantity.Description = MimeType
+MeaQuantity.DataType = Datentyp
+MeaQuantity.Minimum = Minimum
+MeaQuantity.Maximum = Maximum
+MeaQuantity.Average = Durchschnitt
+MeaQuantity.Deviation = Standardabweichung
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/shoppingbasket1.0.xsd b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/shoppingbasket1.0.xsd
new file mode 100644
index 0000000..3e8211b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/main/resources/shoppingbasket1.0.xsd
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>

+<!--********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************-->

+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 

+	targetNamespace="http://www.eclipse/openmdm/shoppingbasket/1.0/"

+	xmlns="http://www.eclipse/openmdm/shoppingbasket/1.0/"

+	elementFormDefault="qualified">

+	

+  <xs:element name="shoppingbasket" type="shoppingbasketType"/>

+  <xs:complexType name="itemType">

+    <xs:all>

+      <xs:element type="xs:string" name="source" minOccurs="1" maxOccurs="1"/>

+      <xs:element type="xs:anyURI" name="resturi" minOccurs="1" maxOccurs="1"/>

+      <xs:element type="xs:string" name="link" minOccurs="1" maxOccurs="1"/>

+    </xs:all>

+  </xs:complexType>

+  <xs:complexType name="itemsType">

+    <xs:sequence>

+      <xs:element type="itemType" name="item" minOccurs="0" maxOccurs="unbounded"/>

+    </xs:sequence>

+  </xs:complexType>

+  <xs:complexType name="shoppingbasketType">

+    <xs:all>

+      <xs:element type="xs:string" name="name" minOccurs="0" maxOccurs="1"/>

+      <xs:element type="itemsType" name="items" minOccurs="1" maxOccurs="1"/>

+    </xs:all>

+  </xs:complexType>

+</xs:schema>

+

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/FileLinkActivityTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/FileLinkActivityTest.java
new file mode 100644
index 0000000..8f36ca0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/FileLinkActivityTest.java
@@ -0,0 +1,310 @@
+/********************************************************************************

+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+

+package org.eclipse.mdm.businessobjects.boundary;

+

+import static org.hamcrest.Matchers.equalTo;

+import static org.hamcrest.Matchers.hasItems;

+import static org.mockito.ArgumentMatchers.any;

+import static org.mockito.ArgumentMatchers.eq;

+import static org.mockito.Mockito.mock;

+import static org.mockito.Mockito.when;

+

+import java.io.ByteArrayInputStream;

+import java.io.IOException;

+import java.util.Collection;

+import java.util.Map;

+import java.util.Optional;

+

+import javax.ejb.EJB;

+import javax.inject.Inject;

+import javax.inject.Singleton;

+import javax.ws.rs.core.Application;

+

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

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

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

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

+import org.eclipse.mdm.api.base.file.FileService;

+import org.eclipse.mdm.api.base.model.ContextType;

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

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

+import org.eclipse.mdm.api.base.model.FileLink;

+import org.eclipse.mdm.api.base.model.MimeType;

+import org.eclipse.mdm.api.base.model.Test;

+import org.eclipse.mdm.api.base.model.User;

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

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

+import org.eclipse.mdm.api.dflt.ApplicationContext;

+import org.eclipse.mdm.api.dflt.model.EntityFactory;

+import org.eclipse.mdm.api.dflt.model.Pool;

+import org.eclipse.mdm.api.dflt.model.Project;

+import org.eclipse.mdm.businessobjects.control.FileLinkActivity;

+import org.eclipse.mdm.businessobjects.service.EntityService;

+import org.eclipse.mdm.connector.boundary.ConnectorService;

+import org.glassfish.hk2.api.Factory;

+import org.glassfish.hk2.api.Injectee;

+import org.glassfish.hk2.api.InjectionResolver;

+import org.glassfish.hk2.api.ServiceHandle;

+import org.glassfish.hk2.api.ServiceLocator;

+import org.glassfish.hk2.api.TypeLiteral;

+import org.glassfish.hk2.utilities.binding.AbstractBinder;

+import org.glassfish.jersey.server.ResourceConfig;

+import org.glassfish.jersey.test.JerseyTest;

+import org.junit.Before;

+import org.junit.Ignore;

+

+import com.google.common.collect.ImmutableMap;

+

+import io.restassured.RestAssured;

+import io.vavr.control.Try;

+

+public class FileLinkActivityTest extends JerseyTest {

+

+	public static final String ENV = "MDM";

+	public static final FileLink[] FILE_LINKS = new FileLink[] {

+			FileLink.newRemote("dir/test.txt", new MimeType("text/plain"), "Just a text file"),

+			FileLink.newRemote("dir/subdir/test.bin", new MimeType("application/octet-stream"), "A binary file"),

+			FileLink.newRemote("dir/specialCharsßä#&'.bin", new MimeType("application/octet-stream"),

+					"A binary file") };

+

+	private ConnectorService connectorService = mock(ConnectorService.class);

+	private ApplicationContext context = mock(ApplicationContext.class);

+	private FileService fileService = mock(FileService.class);

+

+	private EntityService entityService = mock(EntityService.class);

+

+	@Override

+	protected Application configure() {

+

+		AbstractBinder binder = new AbstractBinder() {

+

+			@Override

+			protected void configure() {

+				bind(EJBInjectResolver.class).to(new TypeLiteral<InjectionResolver<EJB>>() {

+				}).in(Singleton.class);

+				bind(TestService.class).to(TestService.class);

+				bindFactory(new InstanceFactory<EntityService>(entityService)).to(EntityService.class);

+				bindFactory(new InstanceFactory<ConnectorService>(connectorService)).to(ConnectorService.class);

+				bind(FileLinkActivity.class).to(FileLinkActivity.class);

+

+			}

+		};

+

+		return new ResourceConfig(TestResource.class, TestStepResource.class, MeasurementResource.class)

+				.register(binder);

+	}

+

+	@Before

+	public void init() throws IOException {

+		RestAssured.baseURI = target().getUri().toString();

+

+		final Test test = createTest(FILE_LINKS);

+

+		when(entityService.find(any(), eq(Test.class), any())).thenReturn(Try.of(() -> test));

+

+		when(connectorService.getContextByName(eq(ENV))).thenReturn(context);

+		when(context.getFileService()).thenReturn(Optional.of(fileService));

+		when(fileService.openStream(eq(test), eq(FILE_LINKS[0])))

+				.thenReturn(new ByteArrayInputStream("Some text".getBytes()));

+		when(fileService.openStream(eq(test), eq(FILE_LINKS[2])))

+				.thenReturn(new ByteArrayInputStream("xyz".getBytes()));

+	}

+

+	@Ignore

+	@org.junit.Test

+	public void testMDMLinksAttribute() {

+		// request test and check MDMLinks attribute

+		RestAssured.given().pathParam("SOURCENAME", ENV).pathParam("TESTID", "1").when()

+				.get("/environments/{SOURCENAME}/tests/{TESTID}").then().statusCode(200)

+				.body("data.get(0).attributes.find { it.get('name') == 'MDMLinks' }.value.remotePath",

+						hasItems("dir/test.txt", "dir/subdir/test.bin", "dir/specialCharsßä#&'.bin"))

+				.and()

+				.body("data.get(0).attributes.find { it.get('name') == 'MDMLinks' }.value.description",

+						hasItems("Just a text file", "A binary file", "A binary file"))

+				.and().body("data.get(0).attributes.find { it.get('name') == 'MDMLinks' }.value.mimeType",

+						hasItems("text/plain", "application/octet-stream", "application/octet-stream"));

+	}

+

+	@Ignore

+	@org.junit.Test

+	public void testFileDownload() {

+		RestAssured.given().pathParam("SOURCENAME", ENV).pathParam("TESTID", "1")

+				.pathParam("REMOTE_PATH", "dir/test.txt").when()

+				.get("/environments/{SOURCENAME}/tests/{TESTID}/files/{REMOTE_PATH}").then().statusCode(200)

+				.contentType("text/plain").body(equalTo("Some text"));

+	}

+

+	@Ignore

+	@org.junit.Test

+	public void testFileDownloadWithSpecialChars() {

+		RestAssured.given().pathParam("SOURCENAME", ENV).pathParam("TESTID", "1")

+				.pathParam("REMOTE_PATH", "dir/specialCharsßä#&'.bin").when()

+				.get("/environments/{SOURCENAME}/tests/{TESTID}/files/{REMOTE_PATH}").then().statusCode(200)

+				.contentType("application/octet-stream").body(equalTo("xyz"));

+	}

+

+	private Test createTest(FileLink[] fileLinks) {

+		EntityFactory factory = new JUnitEntityFactory() {

+			@Override

+			protected <T extends Entity> Core createCore(Class<T> entityClass) {

+				return new CoreImpl(ImmutableMap.of("Name", ValueType.STRING.create("test"), "DateCreated",

+						ValueType.DATE.create("DateCreated"), "MDMLinks",

+						ValueType.FILE_LINK_SEQUENCE.create("MDMLinks", fileLinks)));

+			}

+		};

+

+		final Project project = factory.createProject("MyProject");

+		final Pool pool = factory.createPool("MyPool", project);

+		return factory.createTest("MyTest", pool);

+	}

+

+	public static class EJBInjectResolver implements InjectionResolver<EJB> {

+

+		@Inject

+		private ServiceLocator locator;

+

+		@Override

+		public Object resolve(Injectee injectee, ServiceHandle<?> root) {

+			return locator.getService(injectee.getRequiredType());

+		}

+

+		@Override

+		public boolean isConstructorParameterIndicator() {

+			return false;

+		}

+

+		@Override

+		public boolean isMethodParameterIndicator() {

+			return false;

+		}

+	}

+

+	private class JUnitEntityFactory extends EntityFactory {

+

+		@Override

+		protected Optional<User> getLoggedInUser() {

+			return Optional.empty();

+		}

+

+		@Override

+		protected <T extends Entity> Core createCore(Class<T> entityClass) {

+			// noop

+			return null;

+		}

+

+		@Override

+		protected void validateEnum(Enumeration<?> enumerationObj) {

+			// noop

+		}

+

+		@Override

+		protected <T extends Entity> Core createCore(Class<T> entityClass, ContextType contextType) {

+			// noop

+			return null;

+		}

+

+		@Override

+		protected <T extends Entity> Core createCore(String name, Class<T> entityClass) {

+			// noop

+			return null;

+		}

+	}

+

+	public class InstanceFactory<T> implements Factory<T> {

+

+		private T instance;

+

+		public InstanceFactory(T instance) {

+			this.instance = instance;

+		}

+

+		@Override

+		public void dispose(T t) {

+		}

+

+		@Override

+		public T provide() {

+			return instance;

+		}

+

+	}

+

+	public class CoreImpl implements Core {

+

+		private Map<String, Value> values;

+		private EntityStore mutableStore;

+

+		public CoreImpl(Map<String, Value> values) {

+			super();

+			this.values = values;

+			this.mutableStore = new EntityStore();

+		}

+

+		@Override

+		public String getSourceName() {

+			return "UnitTestSource";

+		}

+

+		@Override

+		public String getTypeName() {

+			return "UnitTestType";

+		}

+

+		@Override

+		public String getID() {

+			return "4711l";

+		}

+

+		@Override

+		public void setID(String instanceID) {

+

+		}

+

+		@Override

+		public Map<String, Value> getValues() {

+			return values;

+		}

+

+		@Override

+		public void hideValues(Collection<String> names) {

+

+		}

+

+		@Override

+		public Map<String, Value> getAllValues() {

+			return values;

+		}

+

+		@Override

+		public EntityStore getMutableStore() {

+			return mutableStore;

+		}

+

+		@Override

+		public EntityStore getPermanentStore() {

+			return new EntityStore();

+		}

+

+		@Override

+		public ChildrenStore getChildrenStore() {

+			return new ChildrenStore();

+		}

+

+		@Override

+		public RelationStore getNtoMStore() {

+			return new RelationStore();

+		}

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/PoolServiceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/PoolServiceTest.java
new file mode 100644
index 0000000..c68a44f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/PoolServiceTest.java
@@ -0,0 +1,189 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class PoolServiceTest {
+
+	ApplicationContext context = Mockito.mock(ApplicationContext.class);
+	EntityManager em = Mockito.mock(EntityManager.class);
+	ModelManager mm = mockModelManager();
+	ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+	SearchActivity searchActivity = Mockito.mock(SearchActivity.class);
+	NavigationActivity navigationActivity = Mockito.mock(NavigationActivity.class);
+	I18NActivity i18nActivity = Mockito.mock(I18NActivity.class);
+
+	PoolService service = new PoolService(connectorService, searchActivity, navigationActivity, i18nActivity);
+
+	@Before
+	public void init() {
+		when(connectorService.getContextByName("MDMTEST")).thenReturn(context);
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		when(context.getModelManager()).thenReturn(Optional.of(mm));
+	}
+
+	@Test
+	public void testGetPool() throws DataAccessException {
+		service.getPool("MDMTEST", "1");
+
+		verify(em).load(Pool.class, "1");
+		verifyNoMoreInteractions(searchActivity);
+	}
+
+	@Test
+	public void testGetPoolsEmptyFilter() throws DataAccessException {
+		service.getPools("MDMTEST", "");
+
+		verify(em).loadAll(Mockito.any());
+		verifyNoMoreInteractions(searchActivity);
+	}
+
+	@Test
+	public void testGetPoolsNullFilter() throws DataAccessException {
+		service.getPools("MDMTEST", null);
+
+		verify(em).loadAll(Mockito.any());
+		verifyNoMoreInteractions(searchActivity);
+	}
+
+	@Test(expected = MDMEntityAccessException.class)
+	public void testGetPoolsWrongEnvironment() {
+		doThrow(MDMEntityAccessException.class).when(connectorService).getContextByName("wrongEnvironment");
+
+		service.getPools("wrongEnvironment", "Pool.Name eq 'crash'");
+	}
+
+	@Test
+	public void testGetPoolsParentFilter() {
+		service.getPools("MDMTEST", "Project.Id eq '4711'");
+
+		verify(navigationActivity).getPools("MDMTEST", "4711");
+		verifyZeroInteractions(searchActivity);
+	}
+
+	@Test
+	public void testGetPoolsNoParentFilter() {
+		service.getPools("MDMTEST", "Project.Id eq '4711' or Project.Name eq 'Project A'");
+
+		verify(searchActivity).search(context, Pool.class, "Project.Id eq '4711' or Project.Name eq 'Project A'");
+		verifyZeroInteractions(navigationActivity);
+	}
+
+	@Test
+	public void testGetPools() {
+		service.getPools("MDMTEST", "Pool.Name eq 'crash'");
+
+		verify(searchActivity).search(context, Pool.class, "Pool.Name eq 'crash'");
+	}
+
+	@Test
+	public void testGetSearchAttributes() {
+		service.getSearchAttributes("MDMTEST");
+
+		verify(searchActivity).listAvailableAttributes(context, Pool.class);
+	}
+
+	@Test
+	public void testLocalizeAttributes() {
+		service.localizeAttributes("MDMTEST");
+		verify(i18nActivity).localizeAttributes("MDMTEST", Pool.class);
+	}
+
+	@Test
+	public void testLocalizeType() {
+		service.localizeType("MDMTEST");
+		verify(i18nActivity).localizeType("MDMTEST", Pool.class);
+	}
+
+	private ModelManager mockModelManager() {
+
+		Attribute projectId = mock(Attribute.class);
+		when(projectId.getName()).thenReturn("Id");
+		when(projectId.getValueType()).thenReturn(ValueType.STRING);
+		when(projectId.createValue(any(), any())).thenCallRealMethod();
+		when(projectId.createValue(any(), anyBoolean(), any())).thenCallRealMethod();
+
+		Attribute projectName = mock(Attribute.class);
+		when(projectName.getName()).thenReturn("Name");
+		when(projectName.getValueType()).thenReturn(ValueType.STRING);
+		when(projectName.createValue(any(), any())).thenCallRealMethod();
+		when(projectName.createValue(any(), anyBoolean(), any())).thenCallRealMethod();
+
+		EntityType project = mock(EntityType.class);
+		when(project.getSourceName()).thenReturn("MDMTEST");
+		when(project.getName()).thenReturn("Project");
+		when(project.getAttributes()).thenReturn(Arrays.asList(projectId));
+		when(project.getAttribute("Id")).thenReturn(projectId);
+		when(project.getIDAttribute()).thenReturn(projectId);
+		when(project.getAttribute("Name")).thenReturn(projectName);
+		when(project.getNameAttribute()).thenReturn(projectName);
+
+		Attribute poolId = mock(Attribute.class);
+		when(poolId.getName()).thenReturn("Id");
+		when(poolId.getValueType()).thenReturn(ValueType.LONG);
+
+		Attribute poolName = mock(Attribute.class);
+		when(poolName.getName()).thenReturn("Name");
+		when(poolName.getValueType()).thenReturn(ValueType.STRING);
+
+		EntityType pool = mock(EntityType.class);
+		when(pool.getSourceName()).thenReturn("MDMTEST");
+		when(pool.getName()).thenReturn("Pool");
+		when(pool.getAttributes()).thenReturn(Arrays.asList(poolId, poolName));
+		when(pool.getAttribute("Name")).thenReturn(poolName);
+		when(pool.getIDAttribute()).thenReturn(poolId);
+
+		when(poolId.getEntityType()).thenReturn(pool);
+		when(poolName.getEntityType()).thenReturn(pool);
+
+		ModelManager mmgr = mock(ModelManager.class);
+		when(mmgr.listEntityTypes()).thenReturn(Arrays.asList(project, pool));
+		when(mmgr.getEntityType(Project.class)).thenReturn(project);
+		when(mmgr.getEntityType("Project")).thenReturn(project);
+		when(mmgr.getEntityType(Pool.class)).thenReturn(pool);
+		when(mmgr.getEntityType("Pool")).thenReturn(pool);
+
+		return mmgr;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/ProjectServiceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/ProjectServiceTest.java
new file mode 100644
index 0000000..21c9dce
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/ProjectServiceTest.java
@@ -0,0 +1,111 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary;
+
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class ProjectServiceTest {
+
+	ApplicationContext context = Mockito.mock(ApplicationContext.class);
+	EntityManager em = Mockito.mock(EntityManager.class);
+	ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+	SearchActivity searchActivity = Mockito.mock(SearchActivity.class);
+	NavigationActivity navigationActivity = Mockito.mock(NavigationActivity.class);
+	I18NActivity i18nActivity = Mockito.mock(I18NActivity.class);
+
+	ProjectService service = new ProjectService(connectorService, searchActivity, i18nActivity);
+
+	@Before
+	public void init() {
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		when(connectorService.getContextByName("MDMTEST")).thenReturn(context);
+	}
+
+	@Test
+	public void testGetProject() throws DataAccessException {
+		service.getProject("MDMTEST", "1");
+
+		verify(em).load(Project.class, "1");
+		verifyNoMoreInteractions(searchActivity);
+	}
+
+	@Test
+	public void testGetProjectsEmptyFilter() throws DataAccessException {
+		service.getProjects("MDMTEST", "");
+
+		verify(em).loadAll(Mockito.any());
+		verifyNoMoreInteractions(searchActivity);
+	}
+
+	@Test
+	public void testGetProjectsNullFilter() throws DataAccessException {
+		service.getProjects("MDMTEST", null);
+
+		verify(em).loadAll(Mockito.any());
+		verifyNoMoreInteractions(searchActivity);
+	}
+
+	@Test(expected = MDMEntityAccessException.class)
+	public void testGetProjectsWrongEnvironment() {
+		doThrow(MDMEntityAccessException.class).when(connectorService).getContextByName("wrongEnvironment");
+
+		service.getProjects("wrongEnvironment", "Project.Name eq crash");
+	}
+
+	@Test
+	public void testGetProjects() {
+		service.getProjects("MDMTEST", "Project.Name eq crash");
+
+		verify(searchActivity).search(context, Project.class, "Project.Name eq crash");
+	}
+
+	@Test
+	public void testGetSearchAttributes() {
+		service.getSearchAttributes("MDMTEST");
+
+		verify(searchActivity).listAvailableAttributes(context, Project.class);
+	}
+
+	@Test
+	public void testLocalizeAttributes() {
+		service.localizeAttributes("MDMTEST");
+		verify(i18nActivity).localizeAttributes("MDMTEST", Project.class);
+	}
+
+	@Test
+	public void testLocalizeType() {
+		service.localizeType("MDMTEST");
+		verify(i18nActivity).localizeType("MDMTEST", Project.class);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeTEQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeTEQResourceIntegrationTest.java
new file mode 100644
index 0000000..2bdf496
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeTEQResourceIntegrationTest.java
@@ -0,0 +1,74 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogAttributeResource for TestEquipment
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogAttributeTEQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogAttributeTEQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentTEQResourceIntegrationTest.prepareTestData();
+		CatalogComponentTEQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the ValueList to reference
+		ValueListResourceIntegrationTest.prepareTestData();
+		ValueListResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(CatalogAttributeTEQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/testequipment/"
+				+ getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/catattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatAttrTEQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_DATATYPE, new JsonPrimitive("STRING"));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		json.add("ValueList",
+				new JsonPrimitive(getTestDataValue(ValueListResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(ValueListResourceIntegrationTest.class);
+		ValueListResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeTSQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeTSQResourceIntegrationTest.java
new file mode 100644
index 0000000..f5a1248
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeTSQResourceIntegrationTest.java
@@ -0,0 +1,73 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogAttributeResource for TestSequence {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogAttributeTSQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogAttributeTSQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentTSQResourceIntegrationTest.prepareTestData();
+		CatalogComponentTSQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the ValueList to reference
+		ValueListResourceIntegrationTest.prepareTestData();
+		ValueListResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(CatalogAttributeTSQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/testsequence/"
+				+ getTestDataValue(CatalogComponentTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/catattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatAttrTSQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_DATATYPE, new JsonPrimitive("STRING"));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		json.add("ValueList",
+				new JsonPrimitive(getTestDataValue(ValueListResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(CatalogComponentTSQResourceIntegrationTest.class);
+		CatalogComponentTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(ValueListResourceIntegrationTest.class);
+		ValueListResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeUUTResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeUUTResourceIntegrationTest.java
new file mode 100644
index 0000000..8193565
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogAttributeUUTResourceIntegrationTest.java
@@ -0,0 +1,74 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogAttributeResource for UnitUnderTest
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogAttributeUUTResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogAttributeUUTResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentUUTResourceIntegrationTest.prepareTestData();
+		CatalogComponentUUTResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the ValueList to reference
+		ValueListResourceIntegrationTest.prepareTestData();
+		ValueListResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(CatalogAttributeUUTResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/unitundertest/"
+				+ getTestDataValue(CatalogComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/catattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatAttrUUT");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_DATATYPE, new JsonPrimitive("STRING"));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		json.add("ValueList",
+				new JsonPrimitive(getTestDataValue(ValueListResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(CatalogComponentUUTResourceIntegrationTest.class);
+		CatalogComponentUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(ValueListResourceIntegrationTest.class);
+		ValueListResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentTEQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentTEQResourceIntegrationTest.java
new file mode 100644
index 0000000..7a342fc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentTEQResourceIntegrationTest.java
@@ -0,0 +1,49 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogComponentResource for TestEquipment
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogComponentTEQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogComponentTEQResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/testequipment");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatCompTEQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentTSQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentTSQResourceIntegrationTest.java
new file mode 100644
index 0000000..c2e12eb
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentTSQResourceIntegrationTest.java
@@ -0,0 +1,48 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogComponentResource for TestSequence {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogComponentTSQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogComponentTSQResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(CatalogComponentTSQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/testsequence");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatCompTSQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentUUTResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentUUTResourceIntegrationTest.java
new file mode 100644
index 0000000..e775c33
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogComponentUUTResourceIntegrationTest.java
@@ -0,0 +1,49 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogComponentResource for UnitUnderTest
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogComponentUUTResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogComponentUUTResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(CatalogComponentUUTResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/unitundertest");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatCompUUT");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogSensorAttributeResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogSensorAttributeResourceIntegrationTest.java
new file mode 100644
index 0000000..41c5026
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogSensorAttributeResourceIntegrationTest.java
@@ -0,0 +1,65 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogSensorAttributeResource
+ * 
+ * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogSensorAttributeResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogSensorAttributeResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogSensor
+		CatalogSensorResourceIntegrationTest.prepareTestData();
+		CatalogSensorResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(CatalogSensorAttributeResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/testequipment/"
+				+ getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/catsensors/" + getTestDataValue(CatalogSensorResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/catsensorattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatSensorAttr");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_DATATYPE, new JsonPrimitive("STRING"));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(CatalogSensorResourceIntegrationTest.class);
+		CatalogSensorResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogSensorResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogSensorResourceIntegrationTest.java
new file mode 100755
index 0000000..c55210e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/CatalogSensorResourceIntegrationTest.java
@@ -0,0 +1,61 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for CatalogSensorResource
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class CatalogSensorResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing CatalogSensorResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentTEQResourceIntegrationTest.prepareTestData();
+		CatalogComponentTEQResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(CatalogSensorResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI,
+				"/catcomps/testequipment/"
+						+ getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+						+ "/catsensors");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatSensor");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogSensor");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ChannelGroupResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ChannelGroupResourceIntegrationTest.java
new file mode 100644
index 0000000..4446a25
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ChannelGroupResourceIntegrationTest.java
@@ -0,0 +1,64 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;

+

+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;

+import org.junit.AfterClass;

+import org.junit.BeforeClass;

+

+import com.google.gson.JsonObject;

+import com.google.gson.JsonPrimitive;

+

+/**

+ * Test class for {@ChannelGroupResource}.

+ * 

+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg

+ * @see EntityResourceIntegrationTest

+ *

+ */

+public class ChannelGroupResourceIntegrationTest extends EntityResourceIntegrationTest {

+	@BeforeClass

+	public static void prepareTestData() {

+		getLogger().debug("Preparing ChannelGroupResourceIntegrationTest");

+

+		// prepare test data for creating the parent Measurement

+		MeasurementResourceIntegrationTest.prepareTestData();

+		MeasurementResourceIntegrationTest.createEntity();

+

+		// set up test data

+		setContextClass(ChannelGroupResourceIntegrationTest.class);

+

+		putTestDataValue(TESTDATA_RESOURCE_URI, "/channelgroups");

+		putTestDataValue(TESTDATA_ENTITY_NAME, "testChannelGroup");

+		putTestDataValue(TESTDATA_ENTITY_TYPE, "ChannelGroup");

+		putTestDataValue(TESTDATA_NUMBER_OF_VALUES, "42");

+

+		// json object for teststep entity

+		JsonObject json = new JsonObject();

+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));

+		json.add(ResourceConstants.ENTITYATTRIBUTE_NUMBER_OF_VALUES,

+				new JsonPrimitive(getTestDataValue(TESTDATA_NUMBER_OF_VALUES)));

+		json.add("Measurement",

+				new JsonPrimitive(getTestDataValue(MeasurementResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+

+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());

+	}

+

+	@AfterClass

+	public static void tearDownAfterClass() {

+		// call tearDownAfterClass() of parent entity

+		setContextClass(MeasurementResourceIntegrationTest.class);

+		MeasurementResourceIntegrationTest.tearDownAfterClass();

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ChannelResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ChannelResourceIntegrationTest.java
new file mode 100644
index 0000000..d62bee1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ChannelResourceIntegrationTest.java
@@ -0,0 +1,66 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;

+

+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;

+import org.junit.AfterClass;

+import org.junit.BeforeClass;

+

+import com.google.gson.JsonObject;

+import com.google.gson.JsonPrimitive;

+

+/**

+ * Test class for {@ChannelResource}.

+ * 

+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg

+ * @see EntityResourceIntegrationTest

+ *

+ */

+public class ChannelResourceIntegrationTest extends EntityResourceIntegrationTest {

+	@BeforeClass

+	public static void prepareTestData() {

+		getLogger().debug("Preparing ChannelGroupResourceIntegrationTest");

+

+		// prepare test data for creating the parent Measurement

+		MeasurementResourceIntegrationTest.prepareTestData();

+		MeasurementResourceIntegrationTest.createEntity();

+		// prepare test data for creating Quantity

+		QuantityResourceIntegrationTest.prepareTestData();

+		QuantityResourceIntegrationTest.createEntity();

+

+		// set up test data

+		setContextClass(ChannelResourceIntegrationTest.class);

+

+		putTestDataValue(TESTDATA_RESOURCE_URI, "/channels");

+		putTestDataValue(TESTDATA_ENTITY_NAME, "testChannel");

+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Channel");

+

+		// json object for teststep entity

+		JsonObject json = new JsonObject();

+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));

+		json.add("Measurement",

+				new JsonPrimitive(getTestDataValue(MeasurementResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+		json.add("Quantity",

+				new JsonPrimitive(getTestDataValue(QuantityResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+

+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());

+	}

+

+	@AfterClass

+	public static void tearDownAfterClass() {

+		// call tearDownAfterClass() of parent entity

+		setContextClass(MeasurementResourceIntegrationTest.class);

+		MeasurementResourceIntegrationTest.tearDownAfterClass();

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ContextDescribableResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ContextDescribableResourceIntegrationTest.java
new file mode 100644
index 0000000..cebc995
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ContextDescribableResourceIntegrationTest.java
@@ -0,0 +1,195 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasEntry;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Assume;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+import io.restassured.http.ContentType;
+import io.restassured.response.ExtractableResponse;
+import io.restassured.response.Response;
+
+/*
+* @author Johannes Stamm, Peak Solution GmbH Nuernberg
+*/
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class ContextDescribableResourceIntegrationTest extends ResourceIntegrationTest {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(ContextDescribableResourceIntegrationTest.class);
+
+	@Test
+	public void test1FindContext() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.FIND));
+
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/" + getTestDataValue(TESTDATA_ENTITY_ID) + "/contexts";
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".find() sending GET to " + uri);
+
+		ExtractableResponse<Response> response = given().get(uri).then().log().ifError().contentType(ContentType.JSON)
+				.body("data.first().ordered.UNITUNDERTEST.first().attributes",
+						hasItem(allOf(hasEntry("name", "Name"),
+								hasEntry("value",
+										getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class,
+												TESTDATA_ENTITY_NAME)))))
+				.body("data.first().ordered.UNITUNDERTEST.first().attributes",
+						hasItem(allOf(hasEntry("name",
+								getTestDataValue(TemplateAttributeUUTResourceIntegrationTest.class,
+										TESTDATA_ENTITY_NAME)),
+								hasEntry("value", ""))))
+				.body("data.first().ordered.TESTSEQUENCE", equalTo(new ArrayList<>()))
+				.body("data.first().ordered.TESTEQUIPMENT", equalTo(new ArrayList<>()))
+				.body("data.first().measured", equalTo(new HashMap<>())).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " found " + response.asString());
+	}
+
+	@Test
+	public void test2FindContextTEQ() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.FIND));
+
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/" + getTestDataValue(TESTDATA_ENTITY_ID)
+				+ "/contexts/testequipment";
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".find() sending GET to " + uri);
+
+		Map<String, List<Object>> excpectedAnswer = new HashMap<>();
+		excpectedAnswer.put("TESTEQUIPMENT", new ArrayList<>());
+
+		ExtractableResponse<Response> response = given().get(uri).then().log().ifError().contentType(ContentType.JSON)
+				.body("data.first().ordered", equalTo(excpectedAnswer))
+				.body("data.first().measured", equalTo(new HashMap<>())).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " found " + response.asString());
+	}
+
+	@Test
+	public void test3FindContextTSQ() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.FIND));
+
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/" + getTestDataValue(TESTDATA_ENTITY_ID)
+				+ "/contexts/testsequence";
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".find() sending GET to " + uri);
+
+		Map<String, List<Object>> excpectedAnswer = new HashMap<>();
+		excpectedAnswer.put("TESTSEQUENCE", new ArrayList<>());
+
+		ExtractableResponse<Response> response = given().get(uri).then().log().ifError().contentType(ContentType.JSON)
+				.body("data.first().ordered", equalTo(excpectedAnswer))
+				.body("data.first().measured", equalTo(new HashMap<>())).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " found " + response.asString());
+	}
+
+	@Test
+	public void test4FindContextUUT() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.FIND));
+
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/" + getTestDataValue(TESTDATA_ENTITY_ID)
+				+ "/contexts/unitundertest";
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".find() sending GET to " + uri);
+
+		ExtractableResponse<Response> response = given().get(uri).then().log().ifError().contentType(ContentType.JSON)
+				.body("data.first().ordered.UNITUNDERTEST", notNullValue())
+				.body("data.first().ordered.TESTEQUIPMENT", nullValue())
+				.body("data.first().ordered.TESTSEQUENCE", nullValue())
+				.body("data.first().measured", equalTo(new HashMap<>())).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " found " + response.asString());
+	}
+
+	@Test
+	public void test5UpdateContext() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.UPDATE_CONTEXT));
+
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/" + getTestDataValue(TESTDATA_ENTITY_ID) + "/contexts";
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".update() sending PUT to " + uri + " with: "
+				+ getTestDataValue(TESTDATA_UPDATE_JSON_BODY));
+
+		ExtractableResponse<Response> response = given().contentType(ContentType.JSON)
+				.body(getTestDataValue(TESTDATA_UPDATE_JSON_BODY)).put(uri).then().log().ifError()
+				.contentType(ContentType.JSON)
+				.body("data.first().ordered.UNITUNDERTEST.first().attributes",
+						hasItem(allOf(hasEntry("name", "Name"),
+								hasEntry("value",
+										getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class,
+												TESTDATA_ENTITY_NAME)))))
+				.body("data.first().ordered.UNITUNDERTEST.first().attributes",
+						hasItem(allOf(hasEntry("name",
+								getTestDataValue(TemplateAttributeUUTResourceIntegrationTest.class,
+										TESTDATA_ENTITY_NAME)),
+								hasEntry("value", "updated"))))
+				.body("data.first().measured.UNITUNDERTEST.first().attributes",
+						hasItem(allOf(hasEntry("name", "Name"),
+								hasEntry("value",
+										getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class,
+												TESTDATA_ENTITY_NAME)))))
+				.body("data.first().measured.UNITUNDERTEST.first().attributes", hasItem(allOf(hasEntry("name",
+						getTestDataValue(TemplateAttributeUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)),
+						hasEntry("value", "updated"))))
+				.extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " updated " + response.asString());
+	}
+
+	public static JsonObject createContextRequest(String compName, String attrName) {
+		String req = "{\r\n" + "  \"data\": [{\r\n" + "    \"measured\": {\r\n" + "      \"UNITUNDERTEST\": [{\r\n"
+				+ "        \"attributes\": [{\r\n" + "          \"name\": \"Name\",\r\n" + "          \"value\": \""
+				+ compName + "\"\r\n" + "        },{\r\n" + "          \"name\": \"" + attrName + "\",\r\n"
+				+ "          \"value\": \"updated\"\r\n" + "        }]\r\n" + "      }]\r\n" + "    },\r\n"
+				+ "    \"ordered\": {\r\n" + "      \"UNITUNDERTEST\": [{\r\n" + "        \"attributes\": [{\r\n"
+				+ "          \"name\": \"" + attrName + "\",\r\n" + "          \"value\": \"updated\"\r\n"
+				+ "        },{\r\n" + "          \"name\": \"Name\",\r\n" + "          \"value\": \"" + compName
+				+ "\"\r\n" + "        }]\r\n" + "      }]\r\n" + "    }\r\n" + "  }]\r\n" + "}";
+
+		return new JsonParser().parse(req).getAsJsonObject();
+	}
+
+	/**
+	 * Gets the logger
+	 * 
+	 * @return logger configured to current context class
+	 */
+	public static Logger getLogger() {
+		return LOGGER;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/EntityResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/EntityResourceIntegrationTest.java
new file mode 100644
index 0000000..6ae6aa0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/EntityResourceIntegrationTest.java
@@ -0,0 +1,231 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.equalTo;
+
+import org.junit.Assume;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+
+import io.restassured.http.ContentType;
+import io.restassured.response.ExtractableResponse;
+import io.restassured.response.Response;
+
+/**
+ * Abstract test class for Entity resources. Tests are executed in
+ * {@code FixMethodOrder(MethodSorters.NAME_ASCENDING)} as {@link test1Create},
+ * {@link test2Find()}, {@link test3FindAll()}, {@link test4Update()} and
+ * {@link test5Delete()} depend on the entity created by test1Create().
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ *
+ */
+// TODO anehmer on 2017-11-23: test for specific return codes
+// TODO anehmer on 2017-11-24: expand tests to localization and search attribute
+// information
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public abstract class EntityResourceIntegrationTest extends ResourceIntegrationTest {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(EntityResourceIntegrationTest.class);
+
+	@Test
+	public void test1Create() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.CREATE));
+
+		createEntity();
+	}
+
+	/**
+	 * Static method that can be utilised by tests to create a specific entity or is
+	 * called indirectly by JUnit
+	 */
+	public static void createEntity() {
+		// do not create entity if it was already created in a currently running
+		// prepareTestData() cascade
+		if (isTestDataValuePresent(TESTDATA_ENTITY_ID)) {
+			LOGGER.debug(getContextClass().getSimpleName() + ".create() aborted as entity "
+					+ getTestDataValue(TESTDATA_ENTITY_NAME) + " of type " + getTestDataValue(TESTDATA_ENTITY_TYPE)
+					+ " was already created");
+			return;
+		}
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".create() sending POST to "
+				+ getTestDataValue(TESTDATA_RESOURCE_URI) + " with: " + getTestDataValue(TESTDATA_CREATE_JSON_BODY));
+
+		ExtractableResponse<io.restassured.response.Response> response = given().contentType(ContentType.JSON)
+				.body(getTestDataValue(TESTDATA_CREATE_JSON_BODY)).post(getTestDataValue(TESTDATA_RESOURCE_URI)).then()
+				.log().ifError().contentType(ContentType.JSON)
+				// do not check for name equality as that might be created randomly
+				.and().body("data.first().type", equalTo(getTestDataValue(TESTDATA_ENTITY_TYPE))).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " created " + response.asString());
+
+		putTestDataValue(TESTDATA_ENTITY_ID, response.path("data.first().id"));
+		putTestDataValue(TESTDATA_ENTITY_NAME, response.path("data.first().name"));
+	}
+
+	@Test
+	public void test2Find() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.FIND));
+
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/"
+				+ (EntityResourceIntegrationTest.findByName.getOrElse(getContextClass(), false)
+						? getTestDataValue(TESTDATA_ENTITY_NAME)
+						: getTestDataValue(TESTDATA_ENTITY_ID));
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".find() sending GET to " + uri);
+
+		ExtractableResponse<Response> response = given().get(uri).then().log().ifError().contentType(ContentType.JSON)
+				.body("data.first().name", equalTo(getTestDataValue(TESTDATA_ENTITY_NAME)))
+				.body("data.first().type", equalTo(getTestDataValue(TESTDATA_ENTITY_TYPE))).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " found " + response.asString());
+	}
+
+	/**
+	 * Finds the first entity of the {@code EntityType} set in the context and put
+	 * the found ID in the context for further usage
+	 */
+	public static void findFirst() {
+		LOGGER.debug(getContextClass().getSimpleName() + ".find() sending GET to "
+				+ getTestDataValue(TESTDATA_RESOURCE_URI));
+
+		String id = given().get(getTestDataValue(TESTDATA_RESOURCE_URI)).then().log().ifError()
+				.contentType(ContentType.JSON)
+				.body("data.first().name", equalTo(getTestDataValue(TESTDATA_ENTITY_NAME)))
+				.body("data.first().type", equalTo(getTestDataValue(TESTDATA_ENTITY_TYPE))).extract()
+				.path("data.first().id");
+
+		LOGGER.debug(getContextClass().getSimpleName() + " found " + getTestDataValue(TESTDATA_ENTITY_TYPE)
+				+ " with ID " + id);
+
+		putTestDataValue(TESTDATA_ENTITY_ID, id);
+	}
+
+	@Test
+	public void test3FindAll() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.FINDALL));
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".findAll() sending GET to "
+				+ getTestDataValue(TESTDATA_RESOURCE_URI));
+
+		ExtractableResponse<Response> response = given().get(getTestDataValue(TESTDATA_RESOURCE_URI)).then().log()
+				.ifError().contentType(ContentType.JSON)
+				.body("data.first().type", equalTo(getTestDataValue(TESTDATA_ENTITY_TYPE))).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " found all " + response.asString());
+	}
+
+	// TODO anehmer on 2017-11-09: test findAll with filter
+
+	// TODO anehmer on 2018-02-06: update of relations are not checked as the
+	// returned Json does not include relations
+	@Test
+	public void test4Update() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.UPDATE));
+
+		updateEntity();
+	}
+
+	/**
+	 * Static method that can be utilised by tests to update a specific entity or is
+	 * called indirectly by JUnit
+	 */
+	public static void updateEntity() {
+		JsonObject json;
+		// if no UPDATE_JSON_BODY is defined in implementing test, just run the MimeType
+		// update
+		if (!isTestDataValuePresent(TESTDATA_UPDATE_JSON_BODY)) {
+			json = new JsonObject();
+		}
+		// or add it to the existing update
+		else {
+			json = new JsonParser().parse(getTestDataValue(TESTDATA_UPDATE_JSON_BODY)).getAsJsonObject();
+		}
+		json.add("MimeType", new JsonPrimitive("updatedMimeType"));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/" + getTestDataValue(TESTDATA_ENTITY_ID);
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".update() sending PUT to " + uri + " with: "
+				+ getTestDataValue(TESTDATA_UPDATE_JSON_BODY));
+
+		ExtractableResponse<Response> response = given().contentType(ContentType.JSON)
+				// TODO anehmer on 2017-11-15: the update should use different data but as the
+				// returned JSON represents
+				// the entity prior update it does not make any difference as the update is
+				// performed just based on identical data. We should discuss the PUT-behaviour
+				// instead: return the old or updated object as returning the updated one would
+				// mean to perform another get as the ODSTransaction.update() does not return
+				// the updated entity
+				// TODO anehmer on 2017-11-15: use Description to test update
+				.body(getTestDataValue(TESTDATA_UPDATE_JSON_BODY)).put(uri).then().log().ifError()
+				.contentType(ContentType.JSON)
+				.body("data.first().name", equalTo(getTestDataValue(TESTDATA_ENTITY_NAME)))
+				.body("data.first().type", equalTo(getTestDataValue(TESTDATA_ENTITY_TYPE)))
+				.body("data.first().attributes.find {it.name == 'MimeType'}.value", equalTo("updatedMimeType"))
+				.extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " updated " + response.asString());
+	}
+
+	@Test
+	public void test5Delete() {
+		// only execute if not skipped by implementing test class
+		Assume.assumeFalse(testsToSkip.get(getContextClass()).get().contains(TestType.DELETE));
+
+		deleteEntity();
+	}
+
+	/**
+	 * Static method that can be utilised by tests to delete a specific entity or is
+	 * called indirectly by JUnit
+	 */
+	public static void deleteEntity() {
+		String uri = getTestDataValue(TESTDATA_RESOURCE_URI) + "/" + getTestDataValue(TESTDATA_ENTITY_ID);
+
+		LOGGER.debug(getContextClass().getSimpleName() + ".delete() sending DELETE to " + uri);
+
+		ExtractableResponse<Response> response = given().delete(uri).then().log().ifError()
+				.body("data.first().name", equalTo(getTestDataValue(TESTDATA_ENTITY_NAME)))
+				.body("data.first().type", equalTo(getTestDataValue(TESTDATA_ENTITY_TYPE))).extract();
+
+		LOGGER.debug(getContextClass().getSimpleName() + " deleted " + response.asString());
+
+		removeTestDataValue(TESTDATA_ENTITY_ID);
+	}
+
+	/**
+	 * Gets the logger
+	 * 
+	 * @return logger configured to current context class
+	 */
+	public static Logger getLogger() {
+		return LOGGER;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/MeasurementContextResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/MeasurementContextResourceIntegrationTest.java
new file mode 100644
index 0000000..71ddfbd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/MeasurementContextResourceIntegrationTest.java
@@ -0,0 +1,86 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@TestStepResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+
+public class MeasurementContextResourceIntegrationTest extends ContextDescribableResourceIntegrationTest {
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing MeasurementContextResourceIntegrationTest");
+
+		TemplateAttributeUUTResourceIntegrationTest.prepareTestData();
+		TemplateAttributeUUTResourceIntegrationTest.createEntity();
+		String attrName = getTestDataValue(TESTDATA_ENTITY_NAME);
+		String compName = getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME);
+
+		// prepare test data for creating the linked tempaltes
+		TestStepWithTemplateResourceIntegrationTest.prepareTestData();
+		TestStepWithTemplateResourceIntegrationTest.createEntity();
+		// get id from teststep (contextclass
+		// TestStepWithTemplateResourceIntegrationTest)
+		String tsId = getTestDataValue(TESTDATA_ENTITY_ID);
+
+		// create measurement for this teststep
+		setContextClass(MeasurementResourceIntegrationTest.class);
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/measurements");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testMeasurement");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Measurement");
+
+		JsonObject json1 = new JsonObject();
+		json1.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json1.add("TestStep", new JsonPrimitive(tsId));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json1.toString());
+		MeasurementResourceIntegrationTest.createEntity();
+		// get id from teststep (contextclass
+		// TestStepWithTemplateResourceIntegrationTest)
+		String meaId = getTestDataValue(TESTDATA_ENTITY_ID);
+
+		// set up test data
+		setContextClass(MeasurementContextResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_ENTITY_ID, meaId);
+		putTestDataValue(TESTDATA_CONTEXT_GROUP, "measured");
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/measurements");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testMeasurement");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Measurement");
+
+		JsonObject json = createContextRequest(compName, attrName);
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		// call tearDownAfterClass() of parent entity (without template)
+		setContextClass(TestStepWithTemplateResourceIntegrationTest.class);
+		TestStepWithTemplateResourceIntegrationTest.tearDownAfterClass();
+
+		setContextClass(TemplateAttributeUUTResourceIntegrationTest.class);
+		TemplateAttributeUUTResourceIntegrationTest.tearDownAfterClass();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/MeasurementResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/MeasurementResourceIntegrationTest.java
new file mode 100644
index 0000000..bacad97
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/MeasurementResourceIntegrationTest.java
@@ -0,0 +1,59 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@MeasurementResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class MeasurementResourceIntegrationTest extends EntityResourceIntegrationTest {
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing MeasurementResourceIntegrationTest");
+
+		// prepare test data for creating the parent TestStep
+		TestStepResourceIntegrationTest.prepareTestData();
+		TestStepResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(MeasurementResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/measurements");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testMeasurement");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Measurement");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add("TestStep",
+				new JsonPrimitive(getTestDataValue(TestStepResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TestStepResourceIntegrationTest.class);
+		TestStepResourceIntegrationTest.tearDownAfterClass();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeTEQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeTEQResourceIntegrationTest.java
new file mode 100644
index 0000000..d1c9c6b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeTEQResourceIntegrationTest.java
@@ -0,0 +1,88 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for NestedTemplateAttributeResource for TestEquipment
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class NestedTemplateAttributeTEQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing NestedTemplateAttributeTEQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogAttribute
+		CatalogAttributeTEQResourceIntegrationTest.prepareTestData();
+		CatalogAttributeTEQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the NestedTemplateComponent
+		NestedTemplateComponentTEQResourceIntegrationTest.prepareTestData();
+		NestedTemplateComponentTEQResourceIntegrationTest.createEntity();
+
+		setContextClass(NestedTemplateAttributeTEQResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testequipment/"
+				+ getTestDataValue(TemplateRootTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(NestedTemplateComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME,
+				getTestDataValue(CatalogAttributeTEQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(
+				getTestDataValue(CatalogAttributeTEQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)));
+		json.add("catalogattribute", new JsonPrimitive(
+				getTestDataValue(CatalogAttributeTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		// delete the implicitly created NestedTemplateAttribute
+		NestedTemplateAttributeTEQResourceIntegrationTest.findFirst();
+		NestedTemplateAttributeTEQResourceIntegrationTest.deleteEntity();
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(NestedTemplateComponentTEQResourceIntegrationTest.class);
+		NestedTemplateComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateComponentTEQResourceIntegrationTest.class);
+		TemplateComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+		TemplateRootTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogAttributeTEQResourceIntegrationTest.class);
+		CatalogAttributeTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeTSQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeTSQResourceIntegrationTest.java
new file mode 100644
index 0000000..8fc9469
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeTSQResourceIntegrationTest.java
@@ -0,0 +1,86 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for NestedTemplateAttributeResource for TestSequence
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class NestedTemplateAttributeTSQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing NestedTemplateAttributeTSQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogAttribute
+		CatalogAttributeTSQResourceIntegrationTest.prepareTestData();
+		CatalogAttributeTSQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the NestedTemplateComponent
+		NestedTemplateComponentTSQResourceIntegrationTest.prepareTestData();
+		NestedTemplateComponentTSQResourceIntegrationTest.createEntity();
+
+		setContextClass(NestedTemplateAttributeTSQResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testsequence/"
+				+ getTestDataValue(TemplateRootTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(NestedTemplateComponentTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME,
+				getTestDataValue(CatalogAttributeTSQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(
+				getTestDataValue(CatalogAttributeTSQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		// delete the implicitly created NestedTemplateAttribute
+		NestedTemplateAttributeTSQResourceIntegrationTest.findFirst();
+		NestedTemplateAttributeTSQResourceIntegrationTest.deleteEntity();
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(NestedTemplateComponentTSQResourceIntegrationTest.class);
+		NestedTemplateComponentTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateComponentTSQResourceIntegrationTest.class);
+		TemplateComponentTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTSQResourceIntegrationTest.class);
+		TemplateRootTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogAttributeTSQResourceIntegrationTest.class);
+		CatalogAttributeTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTSQResourceIntegrationTest.class);
+		CatalogComponentTSQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeUUTResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeUUTResourceIntegrationTest.java
new file mode 100644
index 0000000..121b852
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateAttributeUUTResourceIntegrationTest.java
@@ -0,0 +1,86 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for NestedTemplateAttributeResource for UnitUnderTest
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class NestedTemplateAttributeUUTResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing NestedTemplateAttributeUUTResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogAttribute
+		CatalogAttributeUUTResourceIntegrationTest.prepareTestData();
+		CatalogAttributeUUTResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the NestedTemplateComponent
+		NestedTemplateComponentUUTResourceIntegrationTest.prepareTestData();
+		NestedTemplateComponentUUTResourceIntegrationTest.createEntity();
+
+		setContextClass(NestedTemplateAttributeUUTResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/unitundertest/"
+				+ getTestDataValue(TemplateRootUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(NestedTemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME,
+				getTestDataValue(CatalogAttributeUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(
+				getTestDataValue(CatalogAttributeUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		// delete the implicitly created NestedTemplateAttribute
+		NestedTemplateAttributeUUTResourceIntegrationTest.findFirst();
+		NestedTemplateAttributeUUTResourceIntegrationTest.deleteEntity();
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(NestedTemplateComponentUUTResourceIntegrationTest.class);
+		NestedTemplateComponentUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateComponentUUTResourceIntegrationTest.class);
+		TemplateComponentUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootUUTResourceIntegrationTest.class);
+		TemplateRootUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogAttributeUUTResourceIntegrationTest.class);
+		CatalogAttributeUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentUUTResourceIntegrationTest.class);
+		CatalogComponentUUTResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentTEQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentTEQResourceIntegrationTest.java
new file mode 100644
index 0000000..45535fd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentTEQResourceIntegrationTest.java
@@ -0,0 +1,75 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for NestedTemplateComponentResource for TestEquipment
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class NestedTemplateComponentTEQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing NestedTemplateComponentTEQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentTEQResourceIntegrationTest.prepareTestData();
+		CatalogComponentTEQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateRoot
+		TemplateComponentTEQResourceIntegrationTest.prepareTestData();
+		TemplateComponentTEQResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(NestedTemplateComponentTEQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testequipment/"
+				+ getTestDataValue(TemplateRootTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplcomps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testNestedTplCompTEQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID, new JsonPrimitive(
+				getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateComponentTEQResourceIntegrationTest.class);
+		TemplateComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+		TemplateRootTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentTSQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentTSQResourceIntegrationTest.java
new file mode 100644
index 0000000..7ac6684
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentTSQResourceIntegrationTest.java
@@ -0,0 +1,75 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for NestedTemplateComponentResource for TestSequence
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class NestedTemplateComponentTSQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing NestedTemplateComponentTSQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentTSQResourceIntegrationTest.prepareTestData();
+		CatalogComponentTSQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateRoot
+		TemplateComponentTSQResourceIntegrationTest.prepareTestData();
+		TemplateComponentTSQResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(NestedTemplateComponentTSQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testsequence/"
+				+ getTestDataValue(TemplateRootTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplcomps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testNestedTplCompTSQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID, new JsonPrimitive(
+				getTestDataValue(CatalogComponentTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateComponentTSQResourceIntegrationTest.class);
+		TemplateComponentTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTSQResourceIntegrationTest.class);
+		TemplateRootTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTSQResourceIntegrationTest.class);
+		CatalogComponentTSQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentUUTResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentUUTResourceIntegrationTest.java
new file mode 100644
index 0000000..9192d4d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/NestedTemplateComponentUUTResourceIntegrationTest.java
@@ -0,0 +1,75 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for NestedTemplateComponentResource for UnitUnderTest
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class NestedTemplateComponentUUTResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing NestedTemplateComponentUUTResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentUUTResourceIntegrationTest.prepareTestData();
+		CatalogComponentUUTResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateRoot
+		TemplateComponentUUTResourceIntegrationTest.prepareTestData();
+		TemplateComponentUUTResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(NestedTemplateComponentUUTResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/unitundertest/"
+				+ getTestDataValue(TemplateRootUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplcomps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testNestedTplCompUUT");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID, new JsonPrimitive(
+				getTestDataValue(CatalogComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateComponentUUTResourceIntegrationTest.class);
+		TemplateComponentUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootUUTResourceIntegrationTest.class);
+		TemplateRootUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentUUTResourceIntegrationTest.class);
+		CatalogComponentUUTResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/PhysicalDimensionResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/PhysicalDimensionResourceIntegrationTest.java
new file mode 100644
index 0000000..a949d39
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/PhysicalDimensionResourceIntegrationTest.java
@@ -0,0 +1,51 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for PhysicalDimensionResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class PhysicalDimensionResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing PhysicalDimensionResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(PhysicalDimensionResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/physicaldimensions");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testPhysicalDimension");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "PhysicalDimension");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		json.add("Mass", new JsonPrimitive(1));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/PoolResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/PoolResourceIntegrationTest.java
new file mode 100644
index 0000000..da87f9c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/PoolResourceIntegrationTest.java
@@ -0,0 +1,61 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@PoolResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class PoolResourceIntegrationTest extends EntityResourceIntegrationTest {
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing PoolResourceIntegrationTest");
+
+		// prepare test data for creating the parent Project
+		ProjectResourceIntegrationTest.prepareTestData();
+		ProjectResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(PoolResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/pools");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testPool");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Pool");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add("Project",
+				new JsonPrimitive(getTestDataValue(ProjectResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		// delete project
+		setContextClass(ProjectResourceIntegrationTest.class);
+		ProjectResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ProjectResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ProjectResourceIntegrationTest.java
new file mode 100644
index 0000000..f8ec60c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ProjectResourceIntegrationTest.java
@@ -0,0 +1,47 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@ProjectResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class ProjectResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing ProjectResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(ProjectResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/projects");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testProject");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Project");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/QuantityResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/QuantityResourceIntegrationTest.java
new file mode 100755
index 0000000..f811175
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/QuantityResourceIntegrationTest.java
@@ -0,0 +1,62 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for QuantityResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class QuantityResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing QuantityResourceIntegrationTest");
+
+		// prepare test data for creating the Unit
+		UnitResourceIntegrationTest.prepareTestData();
+		UnitResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(QuantityResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/quantities");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testQuantity");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Quantity");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		// TODO anehmer on 2017-11-17: create unit (and physDim) instead of taking fixed
+		// one
+		json.add(ResourceConstants.ENTITYATTRIBUTE_UNIT_ID,
+				new JsonPrimitive(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(UnitResourceIntegrationTest.class);
+		UnitResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ResourceIntegrationTest.java
new file mode 100644
index 0000000..af5510d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ResourceIntegrationTest.java
@@ -0,0 +1,234 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+import java.util.NoSuchElementException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.restassured.RestAssured;
+import io.restassured.authentication.FormAuthConfig;
+import io.restassured.authentication.FormAuthScheme;
+import io.vavr.collection.HashMap;
+import io.vavr.collection.HashSet;
+import io.vavr.collection.Map;
+import io.vavr.collection.Set;
+
+/*
+* @author Johannes Stamm, Peak Solution GmbH Nuernberg
+*/
+
+public abstract class ResourceIntegrationTest {
+	private static Logger LOGGER = LoggerFactory.getLogger(ResourceIntegrationTest.class);
+
+	private static final String HOST = "localhost";
+	private static final String PORT = "8080";
+	private static final String BASE_PATH = "org.eclipse.mdm.nucleus";
+	private static final String API_PATH = "mdm";
+	private static final String ENV_PATH = "environments";
+	protected static final String SOURCE_NAME = "MDMNVH";
+
+	private static final String AUTH_USERNAME = "sa";
+	private static final String AUTH_PASSWORD = "sa";
+
+	protected static final String TESTDATA_ENTITY_ID = "entityId";
+	protected static final String TESTDATA_ENTITY_NAME = "entityName";
+	protected static final String TESTDATA_ENTITY_TYPE = "entityType";
+	protected static final String TESTDATA_CONTEXT_GROUP = "contextGroup";
+	protected static final String TESTDATA_CREATE_JSON_BODY = "createJSONBody";
+	protected static final String TESTDATA_NUMBER_OF_VALUES = "NumberOfValues";
+	protected static final String TESTDATA_UPDATE_JSON_BODY = "updateJSONBody";
+	protected static final String TESTDATA_RESOURCE_URI = "resourceURI";
+	protected static final String TESTDATA_RANDOM_DATA = "RANDOM_DATA";
+
+	private static final String RANDOM_ENTITY_NAME_SUFFIX = "_" + Long.toHexString(System.currentTimeMillis());
+
+	public enum TestType {
+		CREATE, FIND, FINDALL, UPDATE, DELETE, UPDATE_CONTEXT, FIND_CONTEXT;
+	}
+
+	protected static Map<Class<?>, Set<TestType>> testsToSkip = HashMap.empty();
+
+	protected static Map<Class<?>, Map<String, String>> testDataMap = HashMap.empty();
+
+	// if this is set, the resource URI for find() is constructed with the name as
+	// the PATH_PARAM
+	protected static Map<Class<?>, Boolean> findByName = HashMap.empty();
+
+	/**
+	 * The context class must be set by implementing tests as the context to get
+	 * from and put test data values to
+	 */
+	private static Class<?> contextClass;
+
+	static {
+		// configure URI
+		StringBuilder baseURI = new StringBuilder();
+		baseURI.append("http://").append(HOST).append(":").append(PORT).append("/").append(BASE_PATH).append("/")
+				.append(API_PATH);
+		RestAssured.baseURI = baseURI.toString();
+		RestAssured.basePath = ENV_PATH + "/" + SOURCE_NAME;
+
+		LOGGER.debug("RestAssured set up to " + RestAssured.baseURI + "/" + RestAssured.basePath);
+
+		// setup authentication
+//		PreemptiveBasicAuthScheme authScheme = new PreemptiveBasicAuthScheme();
+		FormAuthScheme authScheme = new FormAuthScheme();
+		authScheme.setConfig(new FormAuthConfig("/" + BASE_PATH + "/j_security_check", "j_username", "j_password"));
+		authScheme.setUserName(AUTH_USERNAME);
+		authScheme.setPassword(AUTH_PASSWORD);
+
+		RestAssured.authentication = authScheme;
+
+		LOGGER.debug("RestAssured authentication set to credentials [" + AUTH_USERNAME + "]/[" + AUTH_PASSWORD + "]");
+	}
+
+	/**
+	 * Gets value with key from the testDataMap. The value map is thereby
+	 * automatically identified by the implementing class.
+	 * 
+	 * @param key key to get value for
+	 * @return value for given key
+	 */
+	protected static String getTestDataValue(String key) {
+		return getTestDataValue(getContextClass(), key);
+	}
+
+	/**
+	 * Gets value with key from the testDataMap using the context specified by
+	 * contextClass
+	 * 
+	 * @param contextClass the class of the test implementation
+	 * @param key          key to get value for
+	 * @return value for given key
+	 */
+	protected static String getTestDataValue(Class<?> contextClass, String key) {
+		return testDataMap.get(contextClass)
+				.map(valueMap -> valueMap.get(key).getOrElseThrow(() -> new NoSuchElementException("Key [" + key
+						+ "] not found in test data value map in context [" + contextClass.getSimpleName() + "]")))
+				.get();
+	}
+
+	/**
+	 * Checks if a test data value is present for the given key
+	 * 
+	 * @param key key to check presence of test data value for
+	 * @return true, if a test data value for the given key exists, false if not
+	 */
+	protected static boolean isTestDataValuePresent(String key) {
+		return testDataMap.get(getContextClass()).map(valueMap -> valueMap.get(key).isDefined()).get();
+	}
+
+	/**
+	 * Removes the test data value for the given key. If the key is not present,
+	 * nothing happens.
+	 * 
+	 * @param key key to remove test data value for
+	 */
+	protected static void removeTestDataValue(String key) {
+		testDataMap.get(getContextClass()).map(valueMap -> valueMap.remove(key))
+				.map(newValueMap -> testDataMap = testDataMap.put(getContextClass(), newValueMap));
+	}
+
+	/**
+	 * Puts value with key in the testDataMap. The value map is thereby
+	 * automatically identified by the implementing class.
+	 * 
+	 * @param key   key to store value under
+	 * @param value value to store
+	 */
+	protected static void putTestDataValue(String key, String value) {
+		Map<String, String> entityTestData = testDataMap.getOrElse(getContextClass(), HashMap.empty());
+
+		String valueWithSuffix = value;
+
+		// randomize name to allow failure runs not to require to reset the
+		// database in case the name of the entity must be unique
+		// do not append suffix if name is randomly generated
+		if (key.equals(TESTDATA_ENTITY_NAME) && !value.equals(TESTDATA_RANDOM_DATA)
+				&& (entityTestData.get(TESTDATA_ENTITY_NAME).isEmpty()
+						|| !entityTestData.get(TESTDATA_ENTITY_NAME).get().equals(TESTDATA_RANDOM_DATA))) {
+			// append suffix if it was not already appended or an already suffixed value was
+			// used for a new one (e.g: TplAttr.name and CatAttr.name)
+			if (!value.endsWith(RANDOM_ENTITY_NAME_SUFFIX)) {
+				valueWithSuffix = value + RANDOM_ENTITY_NAME_SUFFIX;
+			}
+		}
+
+		entityTestData = entityTestData.put(key, valueWithSuffix);
+
+		testDataMap = testDataMap.put(getContextClass(), entityTestData);
+	}
+
+	/**
+	 * Gets the context class set by a test implementation used to store context
+	 * aware test data
+	 * 
+	 * @return the context class of the test implementation
+	 */
+	protected static Class<?> getContextClass() {
+		assertThat(contextClass, is(notNullValue()));
+		return contextClass;
+	}
+
+	/**
+	 * Sets the context class used to store context aware test data. This method
+	 * must be called by any test implementation before using
+	 * {@link getTestDataValue} or {@link putTestDataValue}
+	 * 
+	 * @param clazz the context class set by a test implementation
+	 */
+	protected static void setContextClass(Class<?> clazz) {
+		contextClass = clazz;
+		testsToSkip = testsToSkip.put(clazz, HashSet.empty());
+		LOGGER = LoggerFactory.getLogger(clazz);
+	}
+
+	/**
+	 * Set the test with the given {@link TestType} to be skipped
+	 * 
+	 * @param testType the test to skip
+	 */
+	protected static void skipTest(TestType test) {
+		testsToSkip.get(getContextClass()).map(tests -> tests.add(test))
+				.map(newTests -> testsToSkip = testsToSkip.put(getContextClass(), newTests));
+	}
+
+	/**
+	 * Sets the option findByName to either true or false. If it's set to true, the
+	 * URI for find() is constructed with the name rather than with the id of the
+	 * entity as the PATH_PARAM
+	 * 
+	 * @param findByName if find() should use the name instead of the id of the
+	 *                   entity
+	 */
+	protected static void setFindByName(boolean findByNameValue) {
+		findByName = findByName.put(getContextClass(), findByNameValue);
+	}
+
+	/**
+	 * Gets the logger
+	 * 
+	 * @return logger configured to current context class
+	 */
+	protected static Logger getLogger() {
+		return LOGGER;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeTEQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeTEQResourceIntegrationTest.java
new file mode 100644
index 0000000..245c4b1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeTEQResourceIntegrationTest.java
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateAttributeResource for TestEquipment
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateAttributeTEQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateAttributeTEQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogAttribute
+		CatalogAttributeTEQResourceIntegrationTest.prepareTestData();
+		CatalogAttributeTEQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateComponent
+		TemplateComponentTEQResourceIntegrationTest.prepareTestData();
+		TemplateComponentTEQResourceIntegrationTest.createEntity();
+
+		setContextClass(TemplateAttributeTEQResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testequipment/"
+				+ getTestDataValue(TemplateRootTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME,
+				getTestDataValue(CatalogAttributeTEQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(
+				getTestDataValue(CatalogAttributeTEQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		// delete the implicitly created TemplateAttribute
+		TemplateAttributeTEQResourceIntegrationTest.findFirst();
+		TemplateAttributeTEQResourceIntegrationTest.deleteEntity();
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateComponentTEQResourceIntegrationTest.class);
+		TemplateComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+		TemplateRootTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogAttributeTEQResourceIntegrationTest.class);
+		CatalogAttributeTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeTSQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeTSQResourceIntegrationTest.java
new file mode 100644
index 0000000..5a0de60
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeTSQResourceIntegrationTest.java
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateAttributeResource for TestSequence
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateAttributeTSQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateAttributeTSQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogAttribute
+		CatalogAttributeTSQResourceIntegrationTest.prepareTestData();
+		CatalogAttributeTSQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateComponent
+		TemplateComponentTSQResourceIntegrationTest.prepareTestData();
+		TemplateComponentTSQResourceIntegrationTest.createEntity();
+
+		setContextClass(TemplateAttributeTSQResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testsequence/"
+				+ getTestDataValue(TemplateRootTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME,
+				getTestDataValue(CatalogAttributeTSQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(
+				getTestDataValue(CatalogAttributeTSQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		// delete the implicitly created TemplateAttribute
+		TemplateAttributeTSQResourceIntegrationTest.findFirst();
+		TemplateAttributeTSQResourceIntegrationTest.deleteEntity();
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateComponentTSQResourceIntegrationTest.class);
+		TemplateComponentTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTSQResourceIntegrationTest.class);
+		TemplateRootTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogAttributeTSQResourceIntegrationTest.class);
+		CatalogAttributeTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTSQResourceIntegrationTest.class);
+		CatalogComponentTSQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeUUTResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeUUTResourceIntegrationTest.java
new file mode 100644
index 0000000..9dacaaf
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateAttributeUUTResourceIntegrationTest.java
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateAttributeResource for UnitUnderTest
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateAttributeUUTResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateAttributeUUTResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogAttribute
+		CatalogAttributeUUTResourceIntegrationTest.prepareTestData();
+		CatalogAttributeUUTResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateComponent
+		TemplateComponentUUTResourceIntegrationTest.prepareTestData();
+		TemplateComponentUUTResourceIntegrationTest.createEntity();
+
+		setContextClass(TemplateAttributeUUTResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/unitundertest/"
+				+ getTestDataValue(TemplateRootUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME,
+				getTestDataValue(CatalogAttributeUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(
+				getTestDataValue(CatalogAttributeUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		// delete the implicitly created TemplateAttribute
+		TemplateAttributeUUTResourceIntegrationTest.findFirst();
+		TemplateAttributeUUTResourceIntegrationTest.deleteEntity();
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateComponentUUTResourceIntegrationTest.class);
+		TemplateComponentUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootUUTResourceIntegrationTest.class);
+		TemplateRootUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogAttributeUUTResourceIntegrationTest.class);
+		CatalogAttributeUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentUUTResourceIntegrationTest.class);
+		CatalogComponentUUTResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentTEQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentTEQResourceIntegrationTest.java
new file mode 100644
index 0000000..a3e25ae
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentTEQResourceIntegrationTest.java
@@ -0,0 +1,70 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateComponentResource for TestEquipment
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateComponentTEQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateComponentTEQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentTEQResourceIntegrationTest.prepareTestData();
+		CatalogComponentTEQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateRoot
+		TemplateRootTEQResourceIntegrationTest.prepareTestData();
+		TemplateRootTEQResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TemplateComponentTEQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testequipment/"
+				+ getTestDataValue(TemplateRootTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplCompTEQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID, new JsonPrimitive(
+				getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+		TemplateRootTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentTSQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentTSQResourceIntegrationTest.java
new file mode 100644
index 0000000..81f7041
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentTSQResourceIntegrationTest.java
@@ -0,0 +1,70 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateComponentResource for TestSequence
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateComponentTSQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateComponentTSQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentTSQResourceIntegrationTest.prepareTestData();
+		CatalogComponentTSQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateRoot
+		TemplateRootTSQResourceIntegrationTest.prepareTestData();
+		TemplateRootTSQResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TemplateComponentTSQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testsequence/"
+				+ getTestDataValue(TemplateRootTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplCompTSQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID, new JsonPrimitive(
+				getTestDataValue(CatalogComponentTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateRootTSQResourceIntegrationTest.class);
+		TemplateRootTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTSQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentUUTResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentUUTResourceIntegrationTest.java
new file mode 100644
index 0000000..c1ac242
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateComponentUUTResourceIntegrationTest.java
@@ -0,0 +1,70 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateComponentResource for UnitUnderTest
+ * {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateComponentUUTResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateComponentUUTResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogComponent
+		CatalogComponentUUTResourceIntegrationTest.prepareTestData();
+		CatalogComponentUUTResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateRoot
+		TemplateRootUUTResourceIntegrationTest.prepareTestData();
+		TemplateRootUUTResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TemplateComponentUUTResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/unitundertest/"
+				+ getTestDataValue(TemplateRootUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplCompUUT");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateComponent");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_CATALOGCOMPONENT_ID, new JsonPrimitive(
+				getTestDataValue(CatalogComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateRootUUTResourceIntegrationTest.class);
+		TemplateRootUUTResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentUUTResourceIntegrationTest.class);
+		CatalogComponentUUTResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootTEQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootTEQResourceIntegrationTest.java
new file mode 100644
index 0000000..244bc85
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootTEQResourceIntegrationTest.java
@@ -0,0 +1,55 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateRootResource for TestEquipment {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateRootTEQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateRootTEQResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testequipment");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplRootTEQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateRoot");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		JsonObject enumerationJson = new JsonObject();
+		enumerationJson.add("Enumeration", new JsonPrimitive("VersionState"));
+		enumerationJson.add("EnumerationValue", new JsonPrimitive("VALID"));
+		json.add("ValidFlag", enumerationJson);
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootTSQResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootTSQResourceIntegrationTest.java
new file mode 100644
index 0000000..86061a4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootTSQResourceIntegrationTest.java
@@ -0,0 +1,55 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateRootResource for TestSequence {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateRootTSQResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateRootTSQResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(TemplateRootTSQResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testsequence");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplRootTSQ");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateRoot");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		JsonObject enumerationJson = new JsonObject();
+		enumerationJson.add("Enumeration", new JsonPrimitive("VersionState"));
+		enumerationJson.add("EnumerationValue", new JsonPrimitive("VALID"));
+		json.add("ValidFlag", enumerationJson);
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootUUTResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootUUTResourceIntegrationTest.java
new file mode 100644
index 0000000..a5b8e73
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateRootUUTResourceIntegrationTest.java
@@ -0,0 +1,55 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateRootResource for UnitUnderTest {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateRootUUTResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateRootUUTResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(TemplateRootUUTResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/unitundertest");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplRootpUUT");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateRoot");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		JsonObject enumerationJson = new JsonObject();
+		enumerationJson.add("Enumeration", new JsonPrimitive("VersionState"));
+		enumerationJson.add("EnumerationValue", new JsonPrimitive("VALID"));
+		json.add("ValidFlag", enumerationJson);
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateSensorAttributeResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateSensorAttributeResourceIntegrationTest.java
new file mode 100644
index 0000000..f677aed
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateSensorAttributeResourceIntegrationTest.java
@@ -0,0 +1,97 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateComponentResource for TestEquipment
+ * {@link ContextType}.
+ * 
+ * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateSensorAttributeResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateSensorAttributeResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogSensorAttribute
+		CatalogSensorAttributeResourceIntegrationTest.prepareTestData();
+		CatalogSensorAttributeResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateSensor
+		TemplateSensorResourceIntegrationTest.prepareTestData();
+		TemplateSensorResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TemplateSensorAttributeResourceIntegrationTest.class);
+
+		// skip the creation test as TemplateSensorAttributes are implicitly created
+		// with the TemplateSensor
+		skipTest(TestType.CREATE);
+		// skip the deletion test as TemplateSensorAttributes can't be deleted
+		skipTest(TestType.DELETE);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testequipment/"
+				+ getTestDataValue(TemplateRootTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplsensors/" + getTestDataValue(TemplateSensorResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplsensorattrs");
+		putTestDataValue(TESTDATA_ENTITY_NAME,
+				getTestDataValue(CatalogSensorAttributeResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(
+				getTestDataValue(CatalogSensorAttributeResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		// get first TemplateSensorAttribute
+		TemplateSensorAttributeResourceIntegrationTest.findFirst();
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateSensorResourceIntegrationTest.class);
+		TemplateSensorResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateComponentTEQResourceIntegrationTest.class);
+		TemplateComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+		TemplateRootTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogSensorAttributeResourceIntegrationTest.class);
+		CatalogSensorAttributeResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogSensorResourceIntegrationTest.class);
+		CatalogSensorResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(QuantityResourceIntegrationTest.class);
+		QuantityResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateSensorResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateSensorResourceIntegrationTest.java
new file mode 100755
index 0000000..1ff6120
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateSensorResourceIntegrationTest.java
@@ -0,0 +1,92 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateSensorResource {@link ContextType}.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateSensorResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateAttributeTEQResourceIntegrationTest");
+
+		// prepare test data for creating the CatalogSensor
+		CatalogSensorResourceIntegrationTest.prepareTestData();
+		CatalogSensorResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TemplateComponent
+		TemplateComponentTEQResourceIntegrationTest.prepareTestData();
+		TemplateComponentTEQResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the Quantity
+		QuantityResourceIntegrationTest.prepareTestData();
+		QuantityResourceIntegrationTest.createEntity();
+
+		setContextClass(TemplateSensorResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/testequipment/"
+				+ getTestDataValue(TemplateRootTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
+				+ getTestDataValue(TemplateComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+				+ "/tplsensors");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplSensor");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateSensor");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_CATALOGSENSOR_ID,
+				new JsonPrimitive(getTestDataValue(CatalogSensorResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_QUANTITY_ID,
+				new JsonPrimitive(getTestDataValue(QuantityResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_QUANTITY_ID,
+				new JsonPrimitive(getTestDataValue(QuantityResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateComponentTEQResourceIntegrationTest.class);
+		TemplateComponentTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+		TemplateRootTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogSensorResourceIntegrationTest.class);
+		CatalogSensorResourceIntegrationTest.deleteEntity();
+
+		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
+		CatalogSensorResourceIntegrationTest.deleteEntity();
+
+		setContextClass(QuantityResourceIntegrationTest.class);
+		QuantityResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestResourceIntegrationTest.java
new file mode 100755
index 0000000..33eb47c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestResourceIntegrationTest.java
@@ -0,0 +1,54 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateTestResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateTestResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateTestResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(TemplateTestResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tpltests");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplTest");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateTest");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		JsonObject enumerationJson = new JsonObject();
+		enumerationJson.add("Enumeration", new JsonPrimitive("VersionState"));
+		enumerationJson.add("EnumerationValue", new JsonPrimitive("VALID"));
+		json.add("ValidFlag", enumerationJson);
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestStepResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestStepResourceIntegrationTest.java
new file mode 100755
index 0000000..015a3ec
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestStepResourceIntegrationTest.java
@@ -0,0 +1,83 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateTestStepResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateTestStepResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateTestResourceIntegrationTest");
+
+		// prepare test data for creating the TemplateRoots
+		TemplateRootTEQResourceIntegrationTest.prepareTestData();
+		TemplateRootTEQResourceIntegrationTest.createEntity();
+		TemplateRootTSQResourceIntegrationTest.prepareTestData();
+		TemplateRootTSQResourceIntegrationTest.createEntity();
+		TemplateRootUUTResourceIntegrationTest.prepareTestData();
+		TemplateRootUUTResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TemplateTestStepResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplteststeps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTplTestStep");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, ResourceConstants.ENTITYATTRIBUTE_TEMPLATETESTSTEP_ID);
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		JsonObject enumerationJson = new JsonObject();
+		enumerationJson.add("Enumeration", new JsonPrimitive("VersionState"));
+		enumerationJson.add("EnumerationValue", new JsonPrimitive("VALID"));
+		json.add("ValidFlag", enumerationJson);
+
+		json.add("TemplateTestEquipmentRoot",
+				new JsonPrimitive(getTestDataValue(TemplateRootTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		json.add("TemplateTestSequenceRoot",
+				new JsonPrimitive(getTestDataValue(TemplateRootTSQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		json.add("TemplateUnitUnderTestRoot",
+				new JsonPrimitive(getTestDataValue(TemplateRootUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateRootTEQResourceIntegrationTest.class);
+		TemplateRootTEQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootTSQResourceIntegrationTest.class);
+		TemplateRootTSQResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateRootUUTResourceIntegrationTest.class);
+		TemplateRootUUTResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestStepUsageResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestStepUsageResourceIntegrationTest.java
new file mode 100644
index 0000000..5d3d85f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TemplateTestStepUsageResourceIntegrationTest.java
@@ -0,0 +1,77 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for TemplateTestStepUsageResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TemplateTestStepUsageResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TemplateTestResourceIntegrationTest");
+
+		// prepare test data for creating the Test
+		TemplateTestResourceIntegrationTest.prepareTestData();
+		TemplateTestResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TestStep
+		TemplateTestStepResourceIntegrationTest.prepareTestData();
+		TemplateTestStepResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TemplateTestStepUsageResourceIntegrationTest.class);
+
+		// skip the update as TemplateTestStepUsages cannot be updated
+		// skipTest(TestType.UPDATE);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI,
+				"/tpltests/" + getTestDataValue(TemplateTestResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
+						+ "/tplteststepusages");
+		// indicates that the value is set with the response data from create()
+		putTestDataValue(TESTDATA_ENTITY_NAME, TESTDATA_RANDOM_DATA);
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateTestStepUsage");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_TEMPLATETESTSTEP_ID,
+				new JsonPrimitive(getTestDataValue(TemplateTestStepResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		json.add("DefaultActive", new JsonPrimitive(true));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(TemplateTestResourceIntegrationTest.class);
+		TemplateTestResourceIntegrationTest.deleteEntity();
+
+		setContextClass(TemplateTestStepResourceIntegrationTest.class);
+		TemplateTestStepResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestResourceIntegrationTest.java
new file mode 100644
index 0000000..f4f73a3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestResourceIntegrationTest.java
@@ -0,0 +1,59 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@TestResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TestResourceIntegrationTest extends EntityResourceIntegrationTest {
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TestResourceIntegrationTest");
+
+		// prepare test data for creating the parent Pool
+		PoolResourceIntegrationTest.prepareTestData();
+		PoolResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TestResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tests");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTest");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Test");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add("Pool", new JsonPrimitive(getTestDataValue(PoolResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		// call tearDownAfterClass() of parent entity
+		setContextClass(PoolResourceIntegrationTest.class);
+		PoolResourceIntegrationTest.tearDownAfterClass();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepContextResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepContextResourceIntegrationTest.java
new file mode 100644
index 0000000..773259d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepContextResourceIntegrationTest.java
@@ -0,0 +1,77 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+public class TestStepContextResourceIntegrationTest extends ContextDescribableResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TestStepContextResourceIntegrationTest");
+		TemplateAttributeUUTResourceIntegrationTest.prepareTestData();
+		TemplateAttributeUUTResourceIntegrationTest.createEntity();
+		String attrName = getTestDataValue(TESTDATA_ENTITY_NAME);
+		String compName = getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME);
+
+		// prepare test data for creating the linked tempaltes
+		TestStepWithTemplateResourceIntegrationTest.prepareTestData();
+		TestStepWithTemplateResourceIntegrationTest.createEntity();
+		// get id from teststep (contextclass
+		// TestStepWithTemplateResourceIntegrationTest)
+		String id = getTestDataValue(TESTDATA_ENTITY_ID);
+
+		// create measurement for this teststep
+		setContextClass(MeasurementResourceIntegrationTest.class);
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/measurements");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testMeasurement");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Measurement");
+
+		JsonObject json1 = new JsonObject();
+		json1.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json1.add("TestStep", new JsonPrimitive(id));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json1.toString());
+		MeasurementResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TestStepContextResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_ENTITY_ID, id);
+		putTestDataValue(TESTDATA_CONTEXT_GROUP, "ordered");
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/teststeps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTestStep");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TestStep");
+
+		JsonObject json = createContextRequest(compName, attrName);
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		// call tearDownAfterClass() of parent entity (without template)
+		setContextClass(TestStepWithTemplateResourceIntegrationTest.class);
+		TestStepWithTemplateResourceIntegrationTest.deleteEntity();
+		TestStepWithTemplateResourceIntegrationTest.tearDownAfterClass();
+
+		setContextClass(TemplateAttributeUUTResourceIntegrationTest.class);
+		TemplateAttributeUUTResourceIntegrationTest.tearDownAfterClass();
+
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepResourceIntegrationTest.java
new file mode 100644
index 0000000..f5a0fd1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepResourceIntegrationTest.java
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@TestStepResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TestStepResourceIntegrationTest extends EntityResourceIntegrationTest {
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TestStepResourceIntegrationTest");
+
+		// prepare test data for creating the parent Test
+		TestResourceIntegrationTest.prepareTestData();
+		TestResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TestStepResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/teststeps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTestStep");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TestStep");
+
+		// json object for teststep entity
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add("Test", new JsonPrimitive(getTestDataValue(TestResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		// call tearDownAfterClass() of parent entity
+		setContextClass(TestResourceIntegrationTest.class);
+		TestResourceIntegrationTest.tearDownAfterClass();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepWithTemplateResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepWithTemplateResourceIntegrationTest.java
new file mode 100644
index 0000000..5e6bd7b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestStepWithTemplateResourceIntegrationTest.java
@@ -0,0 +1,74 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@TestStepResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TestStepWithTemplateResourceIntegrationTest extends EntityResourceIntegrationTest {
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TestStepWithTemplateResourceIntegrationTest");
+
+		// prepare test data for creating the parent {@Test}
+		TestWithTemplateResourceIntegrationTest.prepareTestData();
+		TestWithTemplateResourceIntegrationTest.createEntity();
+
+		// prepare test data for creating the TestStep
+		TemplateTestStepResourceIntegrationTest.prepareTestData();
+		TemplateTestStepResourceIntegrationTest.createEntity();
+		TemplateTestStepResourceIntegrationTest.updateEntity();
+
+		// prepare test data for creating the linked templates
+		TemplateTestStepUsageResourceIntegrationTest.prepareTestData();
+		TemplateTestStepUsageResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TestStepWithTemplateResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/teststeps");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTestStep");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "TestStep");
+
+		// json object for teststep entity
+		JsonObject json = new JsonObject();
+		json.add("Test",
+				new JsonPrimitive(getTestDataValue(TestWithTemplateResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		json.add("TemplateTestStep",
+				new JsonPrimitive(getTestDataValue(TemplateTestStepResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		// call tearDownAfterClass() of parent entity (without template)
+		setContextClass(TestResourceIntegrationTest.class);
+		TestResourceIntegrationTest.tearDownAfterClass();
+
+		// delete Templates
+		setContextClass(TemplateTestStepUsageResourceIntegrationTest.class);
+		TemplateTestStepUsageResourceIntegrationTest.tearDownAfterClass();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestWithTemplateResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestWithTemplateResourceIntegrationTest.java
new file mode 100644
index 0000000..5ea2ba2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/TestWithTemplateResourceIntegrationTest.java
@@ -0,0 +1,68 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for {@TestResource}.
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class TestWithTemplateResourceIntegrationTest extends EntityResourceIntegrationTest {
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing TestResourceIntegrationTest");
+
+		// prepare test data for creating the parent Pool
+		PoolResourceIntegrationTest.prepareTestData();
+		PoolResourceIntegrationTest.createEntity();
+		// prepare test data for creating the linked TemplateTest
+		TemplateTestResourceIntegrationTest.prepareTestData();
+		TemplateTestResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(TestWithTemplateResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/tests");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testTest");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Test");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add("Pool", new JsonPrimitive(getTestDataValue(PoolResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		json.add("TemplateTest",
+				new JsonPrimitive(getTestDataValue(TemplateTestResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		// call tearDownAfterClass() of parent entity
+		setContextClass(PoolResourceIntegrationTest.class);
+		PoolResourceIntegrationTest.tearDownAfterClass();
+
+		// delete Template
+		setContextClass(TemplateTestResourceIntegrationTest.class);
+		TemplateTestResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/UnitResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/UnitResourceIntegrationTest.java
new file mode 100644
index 0000000..72fa257
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/UnitResourceIntegrationTest.java
@@ -0,0 +1,65 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for UnitResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class UnitResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing UnitResourceIntegrationTest");
+
+		// prepare test data for creating the PhysicalDimension
+		PhysicalDimensionResourceIntegrationTest.prepareTestData();
+		PhysicalDimensionResourceIntegrationTest.createEntity();
+
+		// set up test data
+		setContextClass(UnitResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/units");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testUnit");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "Unit");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		json.add(ResourceConstants.ENTITYATTRIBUTE_PHYSICALDIMENSION_ID, new JsonPrimitive(
+				getTestDataValue(PhysicalDimensionResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+
+		json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_PHYSICALDIMENSION_ID, new JsonPrimitive(
+				getTestDataValue(PhysicalDimensionResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));
+		putTestDataValue(TESTDATA_UPDATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(PhysicalDimensionResourceIntegrationTest.class);
+		PhysicalDimensionResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValueListResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValueListResourceIntegrationTest.java
new file mode 100644
index 0000000..2fee745
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValueListResourceIntegrationTest.java
@@ -0,0 +1,47 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for ValueListResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class ValueListResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing ValueListResourceIntegrationTest");
+
+		// set up test data
+		setContextClass(ValueListResourceIntegrationTest.class);
+
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/valuelists");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testValueList");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "ValueList");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValueListValueResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValueListValueResourceIntegrationTest.java
new file mode 100644
index 0000000..b8d2e6a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValueListValueResourceIntegrationTest.java
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;
+
+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+/**
+ * Test class for ValueListValueResource.
+ * 
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
+ * @see EntityResourceIntegrationTest
+ *
+ */
+public class ValueListValueResourceIntegrationTest extends EntityResourceIntegrationTest {
+
+	@BeforeClass
+	public static void prepareTestData() {
+		getLogger().debug("Preparing ValueListValueResourceIntegrationTest");
+
+		// prepare test data for creating the ValueList
+		ValueListResourceIntegrationTest.prepareTestData();
+		ValueListResourceIntegrationTest.createEntity();
+
+		// reset the context
+		setContextClass(ValueListValueResourceIntegrationTest.class);
+
+		// set up test data
+		putTestDataValue(TESTDATA_RESOURCE_URI, "/valuelists/"
+				+ getTestDataValue(ValueListResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/values");
+		putTestDataValue(TESTDATA_ENTITY_NAME, "testValueListValue");
+		putTestDataValue(TESTDATA_ENTITY_TYPE, "ValueListValue");
+
+		JsonObject json = new JsonObject();
+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive(getTestDataValue(TESTDATA_ENTITY_NAME)));
+		putTestDataValue(TESTDATA_CREATE_JSON_BODY, json.toString());
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() {
+		setContextClass(ValueListResourceIntegrationTest.class);
+		ValueListResourceIntegrationTest.deleteEntity();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValuesResourceIntegrationTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValuesResourceIntegrationTest.java
new file mode 100644
index 0000000..4513315
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/boundary/integrationtest/ValuesResourceIntegrationTest.java
@@ -0,0 +1,766 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.boundary.integrationtest;

+

+import static io.restassured.RestAssured.given;

+import static org.assertj.core.api.Assertions.tuple;

+import static org.hamcrest.Matchers.equalTo;

+

+import java.util.Arrays;

+import java.util.Comparator;

+import java.util.EnumSet;

+import java.util.HashMap;

+import java.util.List;

+import java.util.Map;

+import java.util.Map.Entry;

+import java.util.Optional;

+import java.util.stream.Collectors;

+import java.util.stream.IntStream;

+

+import javax.ws.rs.core.Response.Status;

+

+import org.assertj.core.api.SoftAssertions;

+import org.assertj.core.groups.Tuple;

+import org.eclipse.mdm.businessobjects.boundary.ResourceConstants;

+import org.eclipse.mdm.protobuf.Mdm;

+import org.eclipse.mdm.protobuf.Mdm.AxisType;

+import org.eclipse.mdm.protobuf.Mdm.BooleanArray;

+import org.eclipse.mdm.protobuf.Mdm.ByteArray;

+import org.eclipse.mdm.protobuf.Mdm.ByteStreamArray;

+import org.eclipse.mdm.protobuf.Mdm.DateArray;

+import org.eclipse.mdm.protobuf.Mdm.DoubleArray;

+import org.eclipse.mdm.protobuf.Mdm.DoubleComplex;

+import org.eclipse.mdm.protobuf.Mdm.DoubleComplexArray;

+import org.eclipse.mdm.protobuf.Mdm.FloatArray;

+import org.eclipse.mdm.protobuf.Mdm.FloatComplex;

+import org.eclipse.mdm.protobuf.Mdm.FloatComplexArray;

+import org.eclipse.mdm.protobuf.Mdm.IntegerArray;

+import org.eclipse.mdm.protobuf.Mdm.LongArray;

+import org.eclipse.mdm.protobuf.Mdm.MeasuredValues;

+import org.eclipse.mdm.protobuf.Mdm.MeasuredValuesList;

+import org.eclipse.mdm.protobuf.Mdm.ScalarType;

+import org.eclipse.mdm.protobuf.Mdm.ShortArray;

+import org.eclipse.mdm.protobuf.Mdm.StringArray;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.DataCase;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ExplicitData;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ImplicitConstant;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ImplicitLinear;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.ImplicitSaw;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.RawLinear;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.RawLinearCalibrated;

+import org.eclipse.mdm.protobuf.Mdm.WriteRequestList.WriteRequest.RawPolynomial;

+import org.junit.AfterClass;

+import org.junit.BeforeClass;

+import org.junit.Test;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+

+import com.google.common.primitives.Booleans;

+import com.google.common.primitives.Doubles;

+import com.google.common.primitives.Floats;

+import com.google.common.primitives.Ints;

+import com.google.common.primitives.Longs;

+import com.google.gson.JsonObject;

+import com.google.gson.JsonPrimitive;

+import com.google.protobuf.ByteString;

+import com.google.protobuf.InvalidProtocolBufferException;

+import com.google.protobuf.Timestamp;

+import com.google.protobuf.util.Timestamps;

+

+import io.restassured.http.ContentType;

+import io.restassured.response.ExtractableResponse;

+

+/**

+ * Test class for {@ChannelResource}.

+ * 

+ * @author Johannes Stamm, Peak Solution GmbH Nuernberg

+ * @see EntityResourceIntegrationTest

+ *

+ */

+public class ValuesResourceIntegrationTest extends ResourceIntegrationTest {

+

+	public static final EnumSet<ScalarType> scalarTypes = EnumSet.of(ScalarType.STRING, ScalarType.DATE,

+			ScalarType.BOOLEAN, ScalarType.BYTE, ScalarType.SHORT, ScalarType.INTEGER, ScalarType.LONG,

+			ScalarType.FLOAT, ScalarType.DOUBLE, ScalarType.BYTE_STREAM, ScalarType.FLOAT_COMPLEX,

+			ScalarType.DOUBLE_COMPLEX);

+

+	private static final List<Boolean> SCALARTYPE_BOOLEAN = Booleans.asList(true, false, true);

+	private static final ByteString SCALARTYPE_BYTES = ByteString

+			.copyFrom(new byte[] { (byte) 0x01, (byte) 0xFF, (byte) 0xF1 });

+	private static final List<Integer> SCALARTYPE_SHORTS = Ints.asList(12, 13, 14);

+	private static final List<Integer> SCALARTYPE_INTEGER = Ints.asList(12, 13, 14);

+	private static final List<Long> SCALARTYPE_LONG = Longs.asList(12L, 13L, 14L);

+	private static final List<Float> SCALARTYPE_FLOAT = Floats.asList(12f, 13f, 14f);

+	private static final List<Double> SCALARTYPE_DOUBLE = Doubles.asList(12.0, 13.0, 14.0);

+	private static final List<FloatComplex> SCALARTYPE_FLOAT_COMPLEX = Arrays.asList(

+			FloatComplex.newBuilder().setRe(12f).setIm(11f).build(),

+			FloatComplex.newBuilder().setRe(13f).setIm(10f).build(),

+			FloatComplex.newBuilder().setRe(14f).setIm(9f).build());

+	private static final List<DoubleComplex> SCALARTYPE_DOUBLE_COMPLEX = Arrays.asList(

+			DoubleComplex.newBuilder().setRe(12.0).setIm(11.0).build(),

+			DoubleComplex.newBuilder().setRe(13.0).setIm(10.0).build(),

+			DoubleComplex.newBuilder().setRe(14.0).setIm(9.0).build());

+	private static final List<ByteString> SCALARTYPE_BYTE_STREAM = Arrays.asList(

+			ByteString.copyFrom(new byte[] { (byte) 12, (byte) 11 }),

+			ByteString.copyFrom(new byte[] { (byte) 13, (byte) 10 }),

+			ByteString.copyFrom(new byte[] { (byte) 14, (byte) 9 }));

+	private static final List<String> SCALARTYPE_STRING = Arrays.asList("one", "two", "three");

+	private static final List<Timestamp> SCALARTYPE_DATE = Arrays.asList(Timestamps.fromMillis(1546300800000L),

+			Timestamps.fromMillis(1546400800000L), Timestamps.fromMillis(1546500800000L));

+	private static final List<Boolean> SCALARTYPE_FLAGS = Booleans.asList(true, true, true);

+

+	private static final String MIMETYPE_APPLICATION_PROTOBUF = "application/protobuf";

+

+	private static final Logger LOGGER = LoggerFactory.getLogger(ValuesResourceIntegrationTest.class);

+

+	private static final int LENGTH = 5;

+

+	private static final List<Integer> INTS = IntStream.range(0, LENGTH)

+			.map(i -> (int) (10 * Math.sin((double) i / LENGTH * Math.PI))).boxed().collect(Collectors.toList());

+

+	private static final List<Double> DOUBLES = IntStream.range(0, LENGTH)

+			.mapToDouble(i -> 10 * Math.sin((double) i / LENGTH * Math.PI)).boxed().collect(Collectors.toList());

+

+	private static final ExplicitData INT_DATA = ExplicitData.newBuilder()

+			.setIntegerArray(IntegerArray.newBuilder().addAllValues(INTS)).build();

+

+	private static final ExplicitData DOUBLE_DATA = ExplicitData.newBuilder()

+			.setDoubleArray(DoubleArray.newBuilder().addAllValues(DOUBLES)).build();

+

+	private static List<Boolean> FLAGS;

+

+	@BeforeClass

+	public static void prepareTestData() {

+		LOGGER.debug("Preparing ValuesResourceIntegrationTest");

+

+		boolean[] flagsArray = new boolean[LENGTH];

+		Arrays.fill(flagsArray, true);

+		FLAGS = Booleans.asList(flagsArray);

+

+		// prepare test data for creating the parent Measurement

+		MeasurementResourceIntegrationTest.prepareTestData();

+		MeasurementResourceIntegrationTest.createEntity();

+		// prepare test data for creating Quantity

+		QuantityResourceIntegrationTest.prepareTestData();

+		QuantityResourceIntegrationTest.createEntity();

+	}

+

+	@Test

+	public void testAllDataSeqReps() throws InvalidProtocolBufferException {

+

+		String channelGroupId = createChannelGroup();

+

+		Map<String, DataCase> dataCaseChannelIds = createChannelsForDataCase();

+

+		writeValuesAllSequenceRepresentations(channelGroupId, dataCaseChannelIds);

+

+		// read MeasuredValues

+		Mdm.ReadRequest readRequest = Mdm.ReadRequest.newBuilder().setChannelGroupId(channelGroupId).build();

+

+		ExtractableResponse<io.restassured.response.Response> response = given()

+				.contentType(MIMETYPE_APPLICATION_PROTOBUF).body(readRequest.toByteArray()).post("/values/read").then()

+				.log().ifError().contentType(MIMETYPE_APPLICATION_PROTOBUF).statusCode(200).extract();

+

+		Mdm.MeasuredValuesList mvl = Mdm.MeasuredValuesList.parseFrom(response.asByteArray());

+

+		SoftAssertions softly = new SoftAssertions();

+		assertExplicit(softly, mvl);

+		assertImplicitConstant(softly, mvl);

+		assertImplicitLinear(softly, mvl);

+		assertImplicitSaw(softly, mvl);

+		assertRawLinear(softly, mvl);

+		assertRawPolynomial(softly, mvl);

+		assertRawLinearCalibrated(softly, mvl);

+		softly.assertAll();

+

+		// read preview values

+		int chunkSize = 2;

+

+		Mdm.PreviewRequest previewRequest = Mdm.PreviewRequest.newBuilder()

+				.setReadRequest(Mdm.ReadRequest.newBuilder().setChannelGroupId(channelGroupId))

+				.setNumberOfChunks(chunkSize).build();

+

+		ExtractableResponse<io.restassured.response.Response> previewResponse = given()

+				.contentType(MIMETYPE_APPLICATION_PROTOBUF).body(previewRequest.toByteArray()).post("/values/preview")

+				.then().log().ifError().contentType(MIMETYPE_APPLICATION_PROTOBUF).statusCode(200).extract();

+

+		Mdm.PreviewValuesList pvl = Mdm.PreviewValuesList.parseFrom(previewResponse.asByteArray());

+

+		List<String> channelNames = Arrays.asList("Channel_EXPLICIT", "Channel_IMPLICIT_CONSTANT",

+				"Channel_IMPLICIT_LINEAR", "Channel_IMPLICIT_SAW", "Channel_RAW_LINEAR",

+				"Channel_RAW_LINEAR_CALIBRATED", "Channel_RAW_POLYNOMIAL");

+

+		SoftAssertions softly2 = new SoftAssertions();

+		softly2.assertThat(pvl.getAvgList()).extracting(MeasuredValues::getName).containsAll(channelNames);

+		softly2.assertThat(pvl.getMinList()).extracting(MeasuredValues::getName).containsAll(channelNames);

+		softly2.assertThat(pvl.getMaxList()).extracting(MeasuredValues::getName).containsAll(channelNames);

+

+		softly2.assertThat(pvl.getAvgList()).extracting(mv -> mv.getDoubleArray().getValuesCount())

+				.containsOnly(chunkSize);

+		softly2.assertThat(pvl.getMinList()).extracting(mv -> mv.getDoubleArray().getValuesCount())

+				.containsOnly(chunkSize);

+		softly2.assertThat(pvl.getMaxList()).extracting(mv -> mv.getDoubleArray().getValuesCount())

+				.containsOnly(chunkSize);

+		softly2.assertAll();

+	}

+

+	@Test

+	public void testAllScalarTypes() throws InvalidProtocolBufferException {

+

+		String channelGroupId = createChannelGroup();

+

+		Map<String, ScalarType> scalarTypeChannelIds = createChannelsForScalarTypes();

+

+		writeValuesAllScalarTypes(channelGroupId, scalarTypeChannelIds);

+

+		// read MeasuredValues

+		Mdm.ReadRequest readRequest = Mdm.ReadRequest.newBuilder().setChannelGroupId(channelGroupId).build();

+

+		ExtractableResponse<io.restassured.response.Response> response = given()

+				.contentType(MIMETYPE_APPLICATION_PROTOBUF).body(readRequest.toByteArray()).post("/values/read").then()

+				.log().ifError().contentType(MIMETYPE_APPLICATION_PROTOBUF).statusCode(200).extract();

+

+		Mdm.MeasuredValuesList mvl = Mdm.MeasuredValuesList.parseFrom(response.asByteArray());

+

+		SoftAssertions softly = new SoftAssertions();

+		assertBoolean(softly, mvl);

+		assertByte(softly, mvl);

+		assertShort(softly, mvl);

+		assertInteger(softly, mvl);

+		assertLong(softly, mvl);

+		assertFloat(softly, mvl);

+		assertDouble(softly, mvl);

+		assertFloatComplex(softly, mvl);

+		assertDoubleComplex(softly, mvl);

+		assertByteStream(softly, mvl);

+		assertString(softly, mvl);

+		assertDate(softly, mvl);

+		softly.assertAll();

+

+		// read preview values

+		int chunkSize = 2;

+

+		Mdm.PreviewRequest previewRequest = Mdm.PreviewRequest.newBuilder()

+				.setReadRequest(Mdm.ReadRequest.newBuilder().setChannelGroupId(channelGroupId))

+				.setNumberOfChunks(chunkSize).build();

+

+		ExtractableResponse<io.restassured.response.Response> previewResponse = given()

+				.contentType(MIMETYPE_APPLICATION_PROTOBUF).body(previewRequest.toByteArray()).post("/values/preview")

+				.then().log().ifError().contentType(MIMETYPE_APPLICATION_PROTOBUF).statusCode(200).extract();

+

+		Mdm.PreviewValuesList pvl = Mdm.PreviewValuesList.parseFrom(previewResponse.asByteArray());

+

+		Tuple[] previewChannelNames = new Tuple[] { tuple("Channel_BYTE", 2), tuple("Channel_SHORT", 2),

+				tuple("Channel_INTEGER", 2), tuple("Channel_LONG", 2), tuple("Channel_FLOAT", 2),

+				tuple("Channel_DOUBLE", 2), tuple("Channel_FLOAT_COMPLEX", 0), tuple("Channel_DOUBLE_COMPLEX", 0),

+				tuple("Channel_BOOLEAN", 0), tuple("Channel_STRING", 0), tuple("Channel_BYTE_STREAM", 0),

+				tuple("Channel_DATE", 0) };

+

+		SoftAssertions softly2 = new SoftAssertions();

+		softly2.assertThat(pvl.getAvgList()).extracting(mv -> tuple(mv.getName(), mv.getDoubleArray().getValuesCount()))

+				.containsOnly(previewChannelNames);

+		softly2.assertThat(pvl.getMinList()).extracting(mv -> tuple(mv.getName(), mv.getDoubleArray().getValuesCount()))

+				.containsOnly(previewChannelNames);

+		softly2.assertThat(pvl.getMaxList()).extracting(mv -> tuple(mv.getName(), mv.getDoubleArray().getValuesCount()))

+				.containsOnly(previewChannelNames);

+

+		// Date will return a DateArray instead of a DoubleArray

+		softly2.assertThat(pvl.getAvgList()).extracting(mv -> tuple(mv.getName(), mv.getDateArray().getValuesCount()))

+				.contains(tuple("Channel_DATE", 2));

+		softly2.assertThat(pvl.getMinList()).extracting(mv -> tuple(mv.getName(), mv.getDateArray().getValuesCount()))

+				.contains(tuple("Channel_DATE", 2));

+		softly2.assertThat(pvl.getMaxList()).extracting(mv -> tuple(mv.getName(), mv.getDateArray().getValuesCount()))

+				.contains(tuple("Channel_DATE", 2));

+

+		softly2.assertAll();

+	}

+

+	private void writeValuesAllSequenceRepresentations(String channelGroupId, Map<String, DataCase> channelIds) {

+		// write MeasuredValues

+		WriteRequestList.Builder writeRequestList = WriteRequestList.newBuilder();

+

+		for (Map.Entry<String, DataCase> entry : channelIds.entrySet()) {

+			WriteRequest.Builder builder = WriteRequest.newBuilder().setChannelGroupId(channelGroupId)

+					.setChannelId(entry.getKey()).setAxisTypeValue(AxisType.XY_AXIS_VALUE).setIndependent(false);

+			switch (entry.getValue()) {

+			case EXPLICIT:

+				builder.setExplicit(INT_DATA);

+				break;

+			case IMPLICIT_CONSTANT:

+				builder.setImplicitConstant(

+						ImplicitConstant.newBuilder().setScalarType(ScalarType.INTEGER).setOffset(12));

+				break;

+			case IMPLICIT_LINEAR:

+				builder.setImplicitLinear(

+						ImplicitLinear.newBuilder().setScalarType(ScalarType.INTEGER).setStart(1).setIncrement(1));

+				break;

+			case IMPLICIT_SAW:

+				builder.setImplicitSaw(ImplicitSaw.newBuilder().setScalarType(ScalarType.INTEGER).setStart(1)

+						.setIncrement(1).setStop(5));

+				break;

+			case RAW_LINEAR:

+				builder.setRawLinear(RawLinear.newBuilder().setScalarType(ScalarType.DOUBLE).setFactor(2).setOffset(10)

+						.setValues(DOUBLE_DATA));

+				break;

+			case RAW_LINEAR_CALIBRATED:

+				builder.setRawLinearCalibrated(RawLinearCalibrated.newBuilder().setScalarType(ScalarType.DOUBLE)

+						.setOffset(1).setFactor(2).setCalibration(3).setValues(DOUBLE_DATA));

+				break;

+			case RAW_POLYNOMIAL:

+				builder.setRawPolynomial(RawPolynomial.newBuilder().setScalarType(ScalarType.DOUBLE).addCoefficients(1)

+						.addCoefficients(2).addCoefficients(3).setValues(DOUBLE_DATA));

+				break;

+			default:

+				break;

+			}

+

+			writeRequestList.addValues(builder);

+		}

+

+		given().contentType(MIMETYPE_APPLICATION_PROTOBUF).body(writeRequestList.build().toByteArray())

+				.post("/values/write").then().log().ifError().assertThat()

+				.statusCode(Status.NO_CONTENT.getStatusCode());

+	}

+

+	private void writeValuesAllScalarTypes(String channelGroupId, Map<String, ScalarType> channelIds) {

+		WriteRequestList.Builder writeRequestList = WriteRequestList.newBuilder();

+

+		for (Entry<String, ScalarType> entry : channelIds.entrySet()) {

+			WriteRequest.Builder builder = WriteRequest.newBuilder().setChannelGroupId(channelGroupId)

+					.setChannelId(entry.getKey()).setAxisTypeValue(AxisType.XY_AXIS_VALUE).setIndependent(false);

+			switch (entry.getValue()) {

+			case STRING:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setStringArray(StringArray.newBuilder().addAllValues(SCALARTYPE_STRING)));

+				break;

+			case DATE:

+				builder = builder.setExplicit(

+						ExplicitData.newBuilder().setDateArray(DateArray.newBuilder().addAllValues(SCALARTYPE_DATE)));

+				break;

+			case BOOLEAN:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setBooleanArray(BooleanArray.newBuilder().addAllValues(SCALARTYPE_BOOLEAN)));

+				break;

+			case BYTE:

+				builder = builder.setExplicit(

+						ExplicitData.newBuilder().setByteArray(ByteArray.newBuilder().setValues(SCALARTYPE_BYTES)));

+				break;

+			case SHORT:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setShortArray(ShortArray.newBuilder().addAllValues(SCALARTYPE_SHORTS)));

+				break;

+			case INTEGER:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setIntegerArray(IntegerArray.newBuilder().addAllValues(SCALARTYPE_INTEGER)));

+				break;

+			case LONG:

+				builder = builder.setExplicit(

+						ExplicitData.newBuilder().setLongArray(LongArray.newBuilder().addAllValues(SCALARTYPE_LONG)));

+				break;

+			case FLOAT:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setFloatArray(FloatArray.newBuilder().addAllValues(SCALARTYPE_FLOAT)));

+				break;

+			case DOUBLE:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setDoubleArray(DoubleArray.newBuilder().addAllValues(SCALARTYPE_DOUBLE)));

+				break;

+			case BYTE_STREAM:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setByteStreamArray(ByteStreamArray.newBuilder().addAllValues(SCALARTYPE_BYTE_STREAM)));

+				break;

+			case FLOAT_COMPLEX:

+				builder = builder.setExplicit(ExplicitData.newBuilder()

+						.setFloatComplexArray(FloatComplexArray.newBuilder().addAllValues(SCALARTYPE_FLOAT_COMPLEX)));

+				break;

+			case DOUBLE_COMPLEX:

+				builder = builder.setExplicit(ExplicitData.newBuilder().setDoubleComplexArray(

+						DoubleComplexArray.newBuilder().addAllValues(SCALARTYPE_DOUBLE_COMPLEX)));

+				break;

+			default:

+				throw new RuntimeException("The ScalarType " + entry.getValue() + " is not supported!");

+			}

+

+			writeRequestList.addValues(builder);

+		}

+

+		given().contentType(MIMETYPE_APPLICATION_PROTOBUF).body(writeRequestList.build().toByteArray())

+				.post("/values/write").then().log().ifError().assertThat()

+				.statusCode(Status.NO_CONTENT.getStatusCode());

+	}

+

+	private void assertBoolean(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_BOOLEAN".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_BOOLEAN")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_BOOLEAN.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.BOOLEAN)

+						.setBooleanArray(BooleanArray.newBuilder().addAllValues(SCALARTYPE_BOOLEAN))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+

+	}

+

+	private void assertByte(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_BYTE".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv).contains(Mdm.MeasuredValues.newBuilder().setName("Channel_BYTE")

+				.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+				.setLength(SCALARTYPE_BYTES.size()).setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.BYTE)

+				.setByteArray(ByteArray.newBuilder().setValues(SCALARTYPE_BYTES)).addAllFlags(SCALARTYPE_FLAGS)

+				.build());

+

+	}

+

+	private void assertShort(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_SHORT".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_SHORT")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_SHORTS.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.SHORT)

+						.setShortArray(ShortArray.newBuilder().addAllValues(SCALARTYPE_SHORTS))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertInteger(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_INTEGER".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_INTEGER")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_INTEGER.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.INTEGER)

+						.setIntegerArray(IntegerArray.newBuilder().addAllValues(SCALARTYPE_INTEGER))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertLong(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_LONG".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv).contains(Mdm.MeasuredValues.newBuilder().setName("Channel_LONG")

+				.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+				.setLength(SCALARTYPE_LONG.size()).setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.LONG)

+				.setLongArray(LongArray.newBuilder().addAllValues(SCALARTYPE_LONG)).addAllFlags(SCALARTYPE_FLAGS)

+				.build());

+	}

+

+	private void assertFloat(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_FLOAT".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_FLOAT")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_FLOAT.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.FLOAT)

+						.setFloatArray(FloatArray.newBuilder().addAllValues(SCALARTYPE_FLOAT))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertDouble(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_DOUBLE".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_DOUBLE")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_DOUBLE.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.DOUBLE)

+						.setDoubleArray(DoubleArray.newBuilder().addAllValues(SCALARTYPE_DOUBLE))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertFloatComplex(SoftAssertions softly, MeasuredValuesList mvl)

+			throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_FLOAT_COMPLEX".equals(m.getName())).findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_FLOAT_COMPLEX")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_FLOAT.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.FLOAT_COMPLEX)

+						.setFloatComplexArray(FloatComplexArray.newBuilder().addAllValues(SCALARTYPE_FLOAT_COMPLEX))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertDoubleComplex(SoftAssertions softly, MeasuredValuesList mvl)

+			throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_DOUBLE_COMPLEX".equals(m.getName())).findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_DOUBLE_COMPLEX")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_DOUBLE.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.DOUBLE_COMPLEX)

+						.setDoubleComplexArray(DoubleComplexArray.newBuilder().addAllValues(SCALARTYPE_DOUBLE_COMPLEX))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertByteStream(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_BYTE_STREAM".equals(m.getName())).findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_BYTE_STREAM")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_DOUBLE.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.BYTE_STREAM)

+						.setByteStreamArray(ByteStreamArray.newBuilder().addAllValues(SCALARTYPE_BYTE_STREAM))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertString(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_STRING".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_STRING")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(SCALARTYPE_STRING.size()).setAxisType(Mdm.AxisType.XY_AXIS)

+						.setScalarType(Mdm.ScalarType.STRING)

+						.setStringArray(StringArray.newBuilder().addAllValues(SCALARTYPE_STRING))

+						.addAllFlags(SCALARTYPE_FLAGS).build());

+	}

+

+	private void assertDate(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_DATE".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv).contains(Mdm.MeasuredValues.newBuilder().setName("Channel_DATE")

+				.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+				.setLength(SCALARTYPE_DATE.size()).setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.DATE)

+				.setDateArray(DateArray.newBuilder().addAllValues(SCALARTYPE_DATE)).addAllFlags(SCALARTYPE_FLAGS)

+				.build());

+	}

+

+	private void assertExplicit(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_EXPLICIT".equals(m.getName()))

+				.findFirst();

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_EXPLICIT")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(LENGTH).setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.INTEGER)

+						.setIntegerArray(IntegerArray.newBuilder().addAllValues(INTS)).addAllFlags(FLAGS).build());

+

+	}

+

+	private void assertImplicitConstant(SoftAssertions softly, MeasuredValuesList mvl)

+			throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_IMPLICIT_CONSTANT".equals(m.getName())).findFirst();

+

+		List<Integer> constantValues = IntStream.range(0, LENGTH).map(i -> 12).boxed().collect(Collectors.toList());

+

+		softly.assertThat(mv).contains(Mdm.MeasuredValues.newBuilder().setName("Channel_IMPLICIT_CONSTANT")

+				.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)).setLength(LENGTH)

+				.setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.INTEGER)

+				.setIntegerArray(IntegerArray.newBuilder().addAllValues(constantValues)).addAllFlags(FLAGS).build());

+

+	}

+

+	private void assertImplicitLinear(SoftAssertions softly, MeasuredValuesList mvl)

+			throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_IMPLICIT_LINEAR".equals(m.getName())).findFirst();

+

+		List<Integer> linearValues = IntStream.range(0, LENGTH).map(i -> i + 1).boxed().collect(Collectors.toList());

+

+		softly.assertThat(mv).contains(Mdm.MeasuredValues.newBuilder().setName("Channel_IMPLICIT_LINEAR")

+				.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)).setLength(LENGTH)

+				.setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.INTEGER)

+				.setIntegerArray(IntegerArray.newBuilder().addAllValues(linearValues)).addAllFlags(FLAGS).build());

+

+	}

+

+	private void assertImplicitSaw(SoftAssertions softly, MeasuredValuesList mvl)

+			throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_IMPLICIT_SAW".equals(m.getName())).findFirst();

+

+		List<Integer> sawValues = IntStream.range(0, LENGTH).map(i -> i % 4 + 1).boxed().collect(Collectors.toList());

+

+		softly.assertThat(mv)

+				.contains(Mdm.MeasuredValues.newBuilder().setName("Channel_IMPLICIT_SAW")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(LENGTH).setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.INTEGER)

+						.setIntegerArray(IntegerArray.newBuilder().addAllValues(sawValues)).addAllFlags(FLAGS).build());

+

+	}

+

+	private void assertRawLinear(SoftAssertions softly, MeasuredValuesList mvl) throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream().filter(m -> "Channel_RAW_LINEAR".equals(m.getName()))

+				.findFirst();

+

+		List<Double> rawLinearValues = DOUBLES.stream().mapToDouble(d -> 2 * d + 10).boxed()

+				.collect(Collectors.toList());

+

+		softly.assertThat(mv).contains(Mdm.MeasuredValues.newBuilder().setName("Channel_RAW_LINEAR")

+				.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME)).setLength(LENGTH)

+				.setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.DOUBLE)

+				.setDoubleArray(DoubleArray.newBuilder().addAllValues(rawLinearValues)).addAllFlags(FLAGS).build());

+	}

+

+	private void assertRawLinearCalibrated(SoftAssertions softly, MeasuredValuesList mvl)

+			throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_RAW_LINEAR_CALIBRATED".equals(m.getName())).findFirst();

+

+		List<Double> rawLinCalValues = DOUBLES.stream().mapToDouble(d -> (1 + 2 * d) * 3).boxed()

+				.collect(Collectors.toList());

+

+		softly.assertThat(mv.get())

+				.isEqualToIgnoringGivenFields(Mdm.MeasuredValues.newBuilder().setName("Channel_RAW_LINEAR_CALIBRATED")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(LENGTH).setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.DOUBLE)

+						.setDoubleArray(DoubleArray.newBuilder().addAllValues(rawLinCalValues)).addAllFlags(FLAGS)

+						.build(), "values", "values_", "memoizedIsInitialized");

+

+		softly.assertThat(mv.get().getDoubleArray().getValuesList()).usingElementComparator(DOUBLE_COMP)

+				.isEqualTo(rawLinCalValues);

+	}

+

+	private void assertRawPolynomial(SoftAssertions softly, MeasuredValuesList mvl)

+			throws InvalidProtocolBufferException {

+

+		Optional<MeasuredValues> mv = mvl.getValuesList().stream()

+				.filter(m -> "Channel_RAW_POLYNOMIAL".equals(m.getName())).findFirst();

+

+		List<Double> rawPolynomialValues = DOUBLES.stream().mapToDouble(d -> 1 + 2 * d + 3 * d * d).boxed()

+				.collect(Collectors.toList());

+

+		softly.assertThat(mv.get())

+				.isEqualToIgnoringGivenFields(Mdm.MeasuredValues.newBuilder().setName("Channel_RAW_POLYNOMIAL")

+						.setUnit(getTestDataValue(UnitResourceIntegrationTest.class, TESTDATA_ENTITY_NAME))

+						.setLength(LENGTH).setAxisType(Mdm.AxisType.XY_AXIS).setScalarType(Mdm.ScalarType.DOUBLE)

+						.setDoubleArray(DoubleArray.newBuilder().addAllValues(rawPolynomialValues)).addAllFlags(FLAGS)

+						.build(), "values", "values_", "memoizedIsInitialized");

+

+		softly.assertThat(mv.get().getDoubleArray().getValuesList()).usingElementComparator(DOUBLE_COMP)

+				.isEqualTo(rawPolynomialValues);

+	}

+

+	private static Map<String, DataCase> createChannelsForDataCase() {

+		// Create channels

+		Map<String, DataCase> channelIds = new HashMap<>();

+		for (DataCase dataCase : WriteRequest.DataCase.values()) {

+			if (dataCase == DataCase.DATA_NOT_SET) {

+				continue;

+			}

+			JsonObject json = new JsonObject();

+			json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive("Channel_" + dataCase.name()));

+			json.add("Measurement",

+					new JsonPrimitive(getTestDataValue(MeasurementResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+			json.add("Quantity",

+					new JsonPrimitive(getTestDataValue(QuantityResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+

+			ExtractableResponse<io.restassured.response.Response> response = given().contentType(ContentType.JSON)

+					.body(json.toString()).post("/channels").then().log().ifError().contentType(ContentType.JSON)

+					.extract();

+

+			LOGGER.debug("Channel created " + response.asString());

+			channelIds.put(response.path("data.first().id"), dataCase);

+		}

+		return channelIds;

+	}

+

+	private static Map<String, ScalarType> createChannelsForScalarTypes() {

+		Map<String, ScalarType> channelIds = new HashMap<>();

+		for (ScalarType scalarType : scalarTypes) {

+			JsonObject json = new JsonObject();

+			json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive("Channel_" + scalarType.name()));

+			json.add("Measurement",

+					new JsonPrimitive(getTestDataValue(MeasurementResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+			json.add("Quantity",

+					new JsonPrimitive(getTestDataValue(QuantityResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+

+			ExtractableResponse<io.restassured.response.Response> response = given().contentType(ContentType.JSON)

+					.body(json.toString()).post("/channels").then().log().ifError().contentType(ContentType.JSON)

+					.extract();

+

+			LOGGER.debug("Channel created " + response.asString());

+			channelIds.put(response.path("data.first().id"), scalarType);

+		}

+		return channelIds;

+	}

+

+	private static String createChannelGroup() {

+		// Create channelGroup

+		JsonObject json = new JsonObject();

+		json.add(ResourceConstants.ENTITYATTRIBUTE_NAME, new JsonPrimitive("ChannelGroup1"));

+		json.add(TESTDATA_NUMBER_OF_VALUES, new JsonPrimitive(LENGTH));

+		json.add("Measurement",

+				new JsonPrimitive(getTestDataValue(MeasurementResourceIntegrationTest.class, TESTDATA_ENTITY_ID)));

+

+		ExtractableResponse<io.restassured.response.Response> response = given().contentType(ContentType.JSON)

+				.body(json.toString()).post("/channelgroups").then().log().ifError().contentType(ContentType.JSON)

+				// do not check for name equality as that might be created randomly

+				.and().body("data.first().type", equalTo("ChannelGroup")).extract();

+

+		LOGGER.debug("ChannelGroup created " + response.asString());

+

+		return response.path("data.first().id");

+	}

+

+	private static Comparator<Double> DOUBLE_COMP = new Comparator<Double>() {

+

+		private double precision = 1E-6;

+

+		@Override

+		public int compare(Double o1, Double o2) {

+			double diff = Math.abs(o1.doubleValue() - o2.doubleValue());

+			if (diff <= precision)

+				return 0;

+			return diff < 0.0 ? -1 : 1;

+		}

+

+	};

+

+	@AfterClass

+	public static void tearDownAfterClass() {

+		// call tearDownAfterClass() of parent entity

+		QuantityResourceIntegrationTest.tearDownAfterClass();

+		MeasurementResourceIntegrationTest.tearDownAfterClass();

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/FilterParserTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/FilterParserTest.java
new file mode 100644
index 0000000..8e56bfc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/FilterParserTest.java
@@ -0,0 +1,63 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.query.boundary.QueryServiceTest;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class FilterParserTest {
+
+	@Test
+	public void testParseFilterString() throws Exception {
+		EntityType test = QueryServiceTest.mockEntity("env2", "Test");
+		EntityType pool = QueryServiceTest.mockEntity("env2", "Pool");
+		when(test.getAttribute("Name").createValue(eq(""), any())).thenAnswer(new Answer<Value>() {
+
+			@Override
+			public Value answer(InvocationOnMock invocation) throws Throwable {
+				return ValueType.STRING.create("env2", invocation.getArgument(0), true, invocation.getArgument(1));
+			}
+		});
+
+		List<EntityType> possibleEntityTypes = Arrays.asList(test, pool);
+
+		Filter filter = FilterParser.parseFilterString(possibleEntityTypes, "Test.Name lk \"With\\\"quote\\\"\"");
+		assertThat(filter).isEqualTo(Filter.and().name(test, "With\"quote\""));
+
+		Filter filter2 = FilterParser.parseFilterString(possibleEntityTypes, "Test.Name lk 'With\"quote\"'");
+		assertThat(filter2).isEqualTo(Filter.and().name(test, "With\"quote\""));
+
+		Filter filter3 = FilterParser.parseFilterString(possibleEntityTypes, "Test.Name lk 'With\\'quote\\''");
+		assertThat(filter3).isEqualTo(Filter.and().name(test, "With'quote'"));
+
+		Filter filter4 = FilterParser.parseFilterString(possibleEntityTypes, "Test.Name lk \"With'quote'\"");
+		assertThat(filter4).isEqualTo(Filter.and().name(test, "With'quote'"));
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/context/ContextActivityMockHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/context/ContextActivityMockHelper.java
new file mode 100644
index 0000000..2a52552
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/context/ContextActivityMockHelper.java
@@ -0,0 +1,189 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.context;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.adapter.ChildrenStore;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.mockito.Mockito;
+
+public final class ContextActivityMockHelper {
+
+	public static final int ITEM_COUNT = 1;
+	public static final int CC_COUNT = 10;
+	public static final int CC_VALUE_COUNT = 10;
+
+	private ContextActivityMockHelper() {
+	}
+
+	public static ConnectorService createConnectorMock() throws Exception {
+
+		ConnectorService connectorBean = Mockito.mock(ConnectorService.class);
+
+		List<ApplicationContext> contextList = new ArrayList<>();
+		for (int i = 1; i <= ITEM_COUNT; i++) {
+			contextList.add(createContextMock("MDMENV_" + i));
+		}
+		when(connectorBean.getContexts()).thenReturn(contextList);
+		when(connectorBean.getContextByName(anyString())).thenReturn(contextList.get(0));
+		return connectorBean;
+	}
+
+	private static ApplicationContext createContextMock(String sourceName) throws Exception {
+
+		Environment env = createEntityMock(Environment.class, sourceName, sourceName, "1", null);
+
+		EntityManager em = Mockito.mock(EntityManager.class);
+
+		TestStep testStep = createEntityMock(TestStep.class, "TestStepWithContext", "MDM", "1", null);
+		Measurement measurement = createEntityMock(Measurement.class, "MeasurementWithContext", "MDM", "1", null);
+
+		when(em.loadEnvironment()).thenReturn(env);
+		when(em.load(TestStep.class, "1")).thenReturn(testStep);
+		when(em.load(Measurement.class, "1")).thenReturn(measurement);
+		when(em.loadParent(measurement, Measurement.PARENT_TYPE_TESTSTEP)).thenReturn(Optional.of(testStep));
+
+		List<Measurement> mList = new ArrayList<>();
+		mList.add(measurement);
+
+		when(em.loadChildren(testStep, TestStep.CHILD_TYPE_MEASUREMENT)).thenReturn(mList);
+
+		Map<ContextType, ContextRoot> orderedContext = createContext("ordered");
+		Map<ContextType, ContextRoot> measuredContext = createContext("measured");
+		when(em.loadContexts(testStep)).thenReturn(orderedContext);
+		when(em.loadContexts(measurement)).thenReturn(measuredContext);
+
+		ApplicationContext context = Mockito.mock(ApplicationContext.class);
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		return context;
+	}
+
+	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id,
+			ChildrenStore childrenStore) throws Exception {
+
+		HashMap<String, Value> map = new HashMap<String, Value>();
+		map.put("Name", ValueType.STRING.create("Name", name));
+
+		Core core = Mockito.mock(Core.class);
+		when(core.getSourceName()).thenReturn(sourceName);
+		when(core.getValues()).thenReturn(map);
+		when(core.getID()).thenReturn(id);
+		if (childrenStore != null) {
+			when(core.getChildrenStore()).thenReturn(childrenStore);
+		}
+
+		if (ContextRoot.class.equals(type)) {
+			if (name.contains("TSQ_")) {
+				when(core.getTypeName()).thenReturn("TestSequence");
+			} else if (name.contains("UUT")) {
+				when(core.getTypeName()).thenReturn("UnitUnderTest");
+			} else {
+				when(core.getTypeName()).thenReturn("TestEquipment");
+			}
+		}
+
+		Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
+		constructor.setAccessible(true);
+		T instance = constructor.newInstance(core);
+		constructor.setAccessible(false);
+		return instance;
+	}
+
+	private static ContextRoot createUUTContextRootMock(String type) throws Exception {
+
+		List<ContextComponent> ccList = createContextComponentMocks("UUT");
+
+		ChildrenStore childrenStore = new ChildrenStore();
+		for (ContextComponent cc : ccList) {
+			childrenStore.add(cc);
+		}
+
+		return createEntityMock(ContextRoot.class, "MessungUUT_" + type, "MDM", "1", childrenStore);
+	}
+
+	private static ContextRoot createTSQContextRootMock(String type) throws Exception {
+
+		List<ContextComponent> ccList = createContextComponentMocks("TSQ");
+
+		ChildrenStore childrenStore = new ChildrenStore();
+		for (ContextComponent cc : ccList) {
+			childrenStore.add(cc);
+		}
+
+		return createEntityMock(ContextRoot.class, "MessungTSQ_" + type, "MDM", "1", childrenStore);
+	}
+
+	private static ContextRoot createTEQContextRootMock(String type) throws Exception {
+
+		List<ContextComponent> ccList = createContextComponentMocks("TEQ");
+
+		ChildrenStore childrenStore = new ChildrenStore();
+		for (ContextComponent cc : ccList) {
+			childrenStore.add(cc);
+		}
+
+		return createEntityMock(ContextRoot.class, "MessungTEQ_" + type, "MDM", "1", childrenStore);
+	}
+
+	private static List<ContextComponent> createContextComponentMocks(String type) throws Exception {
+		List<ContextComponent> ccList = new ArrayList<>();
+		for (int i = 1; i <= CC_COUNT; i++) {
+			ContextComponent cc = createEntityMock(ContextComponent.class, type + "_ContextComponent_" + i, "MDM",
+					Integer.toString(i), null);
+			when(cc.getValues()).thenReturn(createValues(type));
+			ccList.add(cc);
+		}
+		return ccList;
+	}
+
+	private static Map<String, Value> createValues(String type) {
+		Map<String, Value> valueMap = new HashMap<>();
+		for (int i = 1; i <= CC_VALUE_COUNT; i++) {
+			String vName = type + "_ValueName_" + i;
+			valueMap.put(vName, ValueType.STRING.create(vName, type + "_Value_" + i));
+		}
+		return valueMap;
+	}
+
+	private static Map<ContextType, ContextRoot> createContext(String type) throws Exception {
+		Map<ContextType, ContextRoot> contextMap = new HashMap<>();
+		contextMap.put(ContextType.UNITUNDERTEST, createUUTContextRootMock(type));
+		contextMap.put(ContextType.TESTSEQUENCE, createTSQContextRootMock(type));
+		contextMap.put(ContextType.TESTEQUIPMENT, createTEQContextRootMock(type));
+		return contextMap;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/context/ContextActivityTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/context/ContextActivityTest.java
new file mode 100644
index 0000000..96dd15d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/context/ContextActivityTest.java
@@ -0,0 +1,95 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.context;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.businessobjects.control.ContextActivity;
+import org.junit.Test;
+
+public class ContextActivityTest {
+
+	@Test
+	public void testGetTestStepContext() throws Exception {
+
+		ContextActivity contextActitity = createMockedActivity();
+		Map<String, Map<ContextType, ContextRoot>> contextMap = contextActitity.getTestStepContext("MDM", "1");
+
+		assertNotNull("context should not be null", contextMap);
+		checkContextContent(contextMap);
+
+	}
+
+	@Test
+	public void testGetMeasurementContext() throws Exception {
+
+		ContextActivity contextActitity = createMockedActivity();
+		Map<String, Map<ContextType, ContextRoot>> contextMap = contextActitity.getMeasurementContext("MDM", "1");
+
+		assertNotNull("context should not be null", contextMap);
+		checkContextContent(contextMap);
+	}
+
+	private void checkContextContent(Map<String, Map<ContextType, ContextRoot>> contextMap) {
+
+		Map<ContextType, ContextRoot> orderedContext = contextMap.get(ContextActivity.CONTEXT_GROUP_ORDERED);
+		Set<Entry<ContextType, ContextRoot>> orderedEntrySet = orderedContext.entrySet();
+		assertEquals("size of entry set should be 3", 3, orderedEntrySet.size());
+
+		for (Entry<ContextType, ContextRoot> entry : orderedEntrySet) {
+			ContextRoot cr = entry.getValue();
+			List<ContextComponent> ccList = cr.getContextComponents();
+			assertEquals("size of context components should be 10", 10, ccList.size());
+			for (ContextComponent cc : ccList) {
+				Map<String, Value> values = cc.getValues();
+				assertEquals("size of value map should be 10", 10, values.size());
+			}
+		}
+
+		Map<ContextType, ContextRoot> measuredContext = contextMap.get(ContextActivity.CONTEXT_GROUP_MEASURED);
+		Set<Entry<ContextType, ContextRoot>> measuredEntrySet = measuredContext.entrySet();
+		assertEquals("size of entry set should be 3", 3, measuredEntrySet.size());
+
+		for (Entry<ContextType, ContextRoot> entry : measuredEntrySet) {
+			ContextRoot cr = entry.getValue();
+			List<ContextComponent> ccList = cr.getContextComponents();
+			assertEquals("size of context components should be 10", 10, ccList.size());
+			for (ContextComponent cc : ccList) {
+				Map<String, Value> values = cc.getValues();
+				assertEquals("size of value map should be 10", 10, values.size());
+			}
+		}
+	}
+
+	public ContextActivity createMockedActivity() throws Exception {
+		ContextActivity contextActivity = new ContextActivity();
+		Field field = contextActivity.getClass().getDeclaredField("connectorService");
+		field.setAccessible(true);
+		field.set(contextActivity, ContextActivityMockHelper.createConnectorMock());
+		field.setAccessible(false);
+		return contextActivity;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/i18n/I18NActivityMockHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/i18n/I18NActivityMockHelper.java
new file mode 100644
index 0000000..8d23dd2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/i18n/I18NActivityMockHelper.java
@@ -0,0 +1,160 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.i18n;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.mockito.Mockito;
+
+public final class I18NActivityMockHelper {
+
+	public static final int ITEM_COUNT = 3;
+	public static final int ATTRIBUTE_COUNT = 2;
+
+	private I18NActivityMockHelper() {
+	}
+
+	public static ConnectorService createConnectorMock() throws Exception {
+
+		ConnectorService connectorBean = Mockito.mock(ConnectorService.class);
+
+		List<ApplicationContext> emList = new ArrayList<>();
+		for (int i = 0; i < ITEM_COUNT; i++) {
+			emList.add(createContextMock("MDMENV_" + i));
+		}
+		when(connectorBean.getContexts()).thenReturn(emList);
+		when(connectorBean.getContextByName(anyString())).thenReturn(emList.get(0));
+		return connectorBean;
+	}
+
+	private static ApplicationContext createContextMock(String sourceName) throws Exception {
+
+		Environment env = createEntityMock(Environment.class, sourceName, sourceName, "1");
+
+		EntityManager em = Mockito.mock(EntityManager.class);
+
+		when(em.loadEnvironment()).thenReturn(env);
+
+		ModelManager modelManagerMock = createModelManagerMock();
+
+		ApplicationContext context = Mockito.mock(ApplicationContext.class);
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		when(context.getModelManager()).thenReturn(Optional.of(modelManagerMock));
+		return context;
+	}
+
+	private static ModelManager createModelManagerMock() throws Exception {
+
+		List<EntityType> etList = new ArrayList<>();
+
+		EntityType envET = Mockito.mock(EntityType.class);
+		List<Attribute> envAttrList = createAttributeList(Environment.class, ATTRIBUTE_COUNT);
+		when(envET.getName()).thenReturn("Environment");
+		when(envET.getAttributes()).thenReturn(envAttrList);
+		etList.add(envET);
+
+		EntityType testET = Mockito.mock(EntityType.class);
+		List<Attribute> testAttrList = createAttributeList(Test.class, ATTRIBUTE_COUNT);
+		when(testET.getName()).thenReturn("Test");
+		when(testET.getAttributes()).thenReturn(testAttrList);
+		etList.add(testET);
+
+		EntityType testStepET = Mockito.mock(EntityType.class);
+		List<Attribute> testStepAttrList = createAttributeList(TestStep.class, ATTRIBUTE_COUNT);
+		when(testStepET.getName()).thenReturn("TestStep");
+		when(testStepET.getAttributes()).thenReturn(testStepAttrList);
+		etList.add(testStepET);
+
+		EntityType measurementET = Mockito.mock(EntityType.class);
+		List<Attribute> measurementAttrList = createAttributeList(Measurement.class, ATTRIBUTE_COUNT);
+		when(measurementET.getName()).thenReturn("Measurement");
+		when(measurementET.getAttributes()).thenReturn(measurementAttrList);
+		etList.add(measurementET);
+
+		EntityType channelGroupET = Mockito.mock(EntityType.class);
+		List<Attribute> channelGroupAttrList = createAttributeList(ChannelGroup.class, ATTRIBUTE_COUNT);
+		when(channelGroupET.getName()).thenReturn("ChannelGroup");
+		when(channelGroupET.getAttributes()).thenReturn(channelGroupAttrList);
+		etList.add(channelGroupET);
+
+		EntityType channelET = Mockito.mock(EntityType.class);
+		List<Attribute> channelAttrList = createAttributeList(Channel.class, ATTRIBUTE_COUNT);
+		when(channelET.getName()).thenReturn("Channel");
+		when(channelET.getAttributes()).thenReturn(channelAttrList);
+		etList.add(channelET);
+
+		ModelManager modelManager = Mockito.mock(ModelManager.class);
+		when(modelManager.getEntityType(Environment.class)).thenReturn(envET);
+		when(modelManager.getEntityType(Test.class)).thenReturn(testET);
+		when(modelManager.getEntityType(TestStep.class)).thenReturn(testStepET);
+		when(modelManager.getEntityType(Measurement.class)).thenReturn(measurementET);
+		when(modelManager.getEntityType(ChannelGroup.class)).thenReturn(channelGroupET);
+		when(modelManager.getEntityType(Channel.class)).thenReturn(channelET);
+		when(modelManager.listEntityTypes()).thenReturn(etList);
+		return modelManager;
+	}
+
+	private static List<Attribute> createAttributeList(Class<? extends Entity> type, long count) {
+		List<Attribute> attributeList = new ArrayList<>();
+		for (int i = 0; i < count; i++) {
+			Attribute attribute = Mockito.mock(Attribute.class);
+			when(attribute.getName()).thenReturn(type.getSimpleName() + "_attribute_" + i);
+			attributeList.add(attribute);
+		}
+		return attributeList;
+	}
+
+	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id)
+			throws Exception {
+
+		HashMap<String, Value> map = new HashMap<String, Value>();
+		map.put("Name", ValueType.STRING.create("Name", name));
+
+		Core core = Mockito.mock(Core.class);
+		when(core.getSourceName()).thenReturn(sourceName);
+		when(core.getValues()).thenReturn(map);
+		when(core.getID()).thenReturn(id);
+
+		Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
+		constructor.setAccessible(true);
+		T instance = constructor.newInstance(core);
+		constructor.setAccessible(false);
+		return instance;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/i18n/I18NActivityTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/i18n/I18NActivityTest.java
new file mode 100644
index 0000000..5087905
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/i18n/I18NActivityTest.java
@@ -0,0 +1,131 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.i18n;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.businessobjects.control.I18NActivity;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.junit.Test;
+
+public class I18NActivityTest {
+
+	@Test
+	public void testLocalizeAttributes() throws Exception {
+
+		I18NActivity i18nActivity = createdMockedActivity();
+
+		Map<Attribute, String> locEnvironmentAttrs = i18nActivity.localizeAttributes("default", Environment.class);
+		Map<Attribute, String> locTestAttrs = i18nActivity.localizeAttributes("default",
+				org.eclipse.mdm.api.base.model.Test.class);
+		Map<Attribute, String> locTestStepAttrs = i18nActivity.localizeAttributes("default", TestStep.class);
+		Map<Attribute, String> locMeasurementAttrs = i18nActivity.localizeAttributes("default", Measurement.class);
+		Map<Attribute, String> locChannelGroupAttrs = i18nActivity.localizeAttributes("default", ChannelGroup.class);
+		Map<Attribute, String> locChannelAttrs = i18nActivity.localizeAttributes("default", Channel.class);
+
+		int expected = 2;
+		assertEquals("map of environment attributes should contain '" + expected + "' localized attributes", expected,
+				locEnvironmentAttrs.size());
+
+		assertEquals("map of test attributes should contain '" + expected + "' localized attributes", expected,
+				locTestAttrs.size());
+
+		assertEquals("map of test step attributes should contain '" + expected + "' localized attributes", expected,
+				locTestStepAttrs.size());
+
+		assertEquals("map of measurement attributes should contain '" + expected + "' localized attributes", expected,
+				locMeasurementAttrs.size());
+
+		assertEquals("map of channel group attributes should contain '" + expected + "' localized attributes", expected,
+				locChannelGroupAttrs.size());
+
+		assertEquals("map of channel attributes should contain '" + expected + "' localized attributes", expected,
+				locChannelAttrs.size());
+
+	}
+
+	@Test
+	public void testLocalizeType() throws Exception {
+		I18NActivity i18nActivity = createdMockedActivity();
+
+		Map<EntityType, String> locEnvironmentType = i18nActivity.localizeType("default", Environment.class);
+		Map<EntityType, String> locTestType = i18nActivity.localizeType("default",
+				org.eclipse.mdm.api.base.model.Test.class);
+		Map<EntityType, String> locTestStepType = i18nActivity.localizeType("default", TestStep.class);
+		Map<EntityType, String> locMeasurementType = i18nActivity.localizeType("default", Measurement.class);
+		Map<EntityType, String> locChannelGroupType = i18nActivity.localizeType("default", ChannelGroup.class);
+		Map<EntityType, String> locChannelType = i18nActivity.localizeType("default", Channel.class);
+
+		int expected = 1;
+		assertEquals("map of Environment types should contain '" + expected + "' localized type", expected,
+				locEnvironmentType.size());
+		assertEquals("map of Test types should contain '" + expected + "' localized type", expected,
+				locTestType.size());
+		assertEquals("map of TestStep types should contain '" + expected + "' localized type", expected,
+				locTestStepType.size());
+		assertEquals("map of Measurement types should contain '" + expected + "' localized type", expected,
+				locMeasurementType.size());
+		assertEquals("map of ChannelGroup types should contain '" + expected + "' localized type", expected,
+				locChannelGroupType.size());
+		assertEquals("map of Channel types should contain '" + expected + "' localized type", expected,
+				locChannelType.size());
+	}
+
+	@Test
+	public void testAllLocalizeAttributes() throws Exception {
+		I18NActivity i18nActivity = createdMockedActivity();
+
+		Map<Attribute, String> localizedMap = i18nActivity.localizeAllAttributes("default");
+
+		int expected = 12; // 6 types with 2 attributes
+
+		assertEquals("map of all attributes should contain '" + expected + "' localized attributes", expected,
+				localizedMap.size());
+	}
+
+	@Test
+	public void testLocalizeAllTypes() throws Exception {
+		I18NActivity i18nActivity = createdMockedActivity();
+
+		Map<EntityType, String> localizedMap = i18nActivity.localizeAllTypes("default");
+
+		int expected = 6;
+		assertEquals("map of all types should contain '" + expected + "' localized types", expected,
+				localizedMap.size());
+	}
+
+	private I18NActivity createdMockedActivity() throws Exception {
+
+		ConnectorService connectorBeanMock = I18NActivityMockHelper.createConnectorMock();
+
+		I18NActivity i18nActivity = new I18NActivity();
+		Field fieldConnector = i18nActivity.getClass().getDeclaredField("connectorService");
+		fieldConnector.setAccessible(true);
+		fieldConnector.set(i18nActivity, connectorBeanMock);
+		fieldConnector.setAccessible(false);
+
+		return i18nActivity;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/navigation/NavigationActivityMockHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/navigation/NavigationActivityMockHelper.java
new file mode 100644
index 0000000..48714f2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/navigation/NavigationActivityMockHelper.java
@@ -0,0 +1,198 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.navigation;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.businessobjects.boundary.EnvironmentService;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+
+import com.google.common.collect.ImmutableList;
+
+public final class NavigationActivityMockHelper {
+
+	public static final int ITEM_COUNT = 5;
+
+	private NavigationActivityMockHelper() {
+	}
+
+	public static ConnectorService createConnectorMock() throws Exception {
+
+		ConnectorService connectorBean = mock(ConnectorService.class);
+
+		List<ApplicationContext> contextList = new ArrayList<>();
+		for (int i = 1; i <= ITEM_COUNT; i++) {
+			contextList.add(createContextMock("MDMENV_" + i));
+		}
+		when(connectorBean.getContexts()).thenReturn(contextList);
+		when(connectorBean.getContextByName(anyString())).thenReturn(contextList.get(0));
+		return connectorBean;
+	}
+
+	private static ApplicationContext createContextMock(String sourceName) throws Exception {
+
+		Environment env = createEntityMock(Environment.class, sourceName, sourceName, "1");
+
+		EntityManager em = mock(EntityManager.class);
+
+		when(em.loadEnvironment()).thenReturn(env);
+
+		List<Test> testMocks = createTestMocks(ITEM_COUNT, sourceName);
+		when(em.loadAll(Test.class)).thenReturn(testMocks);
+
+		List<TestStep> testStepMocks = createTestStepMocks(ITEM_COUNT, sourceName);
+		when(em.loadChildren(any(), eq(TestStep.class))).thenReturn(testStepMocks);
+
+		List<Measurement> measurementMocks = createMeasurementMocks(ITEM_COUNT, sourceName);
+		when(em.loadChildren(any(), eq(Measurement.class))).thenReturn(measurementMocks);
+
+		List<ChannelGroup> channelGroupMocks = createChannelGroupMocks(ITEM_COUNT, sourceName);
+		when(em.loadChildren(any(), eq(ChannelGroup.class))).thenReturn(channelGroupMocks);
+
+		List<Channel> channelMocks = createChannelMocks(ITEM_COUNT, sourceName);
+		when(em.loadChildren(any(), eq(Channel.class))).thenReturn(channelMocks);
+
+		ModelManager modelManagerMock = createModelManagerMock();
+
+		ApplicationContext context = mock(ApplicationContext.class);
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		when(context.getModelManager()).thenReturn(Optional.of(modelManagerMock));
+		return context;
+	}
+
+	private static List<Test> createTestMocks(int count, String sourceName) throws Exception {
+		List<Test> list = new ArrayList<>();
+		for (int i = 1; i <= count; i++) {
+			list.add(createEntityMock(Test.class, "Test_" + count, sourceName, Integer.toString(count)));
+		}
+		return list;
+	}
+
+	private static List<TestStep> createTestStepMocks(int count, String sourceName) throws Exception {
+		List<TestStep> list = new ArrayList<>();
+		for (int i = 1; i <= count; i++) {
+			list.add(createEntityMock(TestStep.class, "TestStep_" + count, sourceName, Integer.toString(count)));
+		}
+		return list;
+	}
+
+	private static List<Measurement> createMeasurementMocks(int count, String sourceName) throws Exception {
+		List<Measurement> list = new ArrayList<>();
+		for (int i = 1; i <= count; i++) {
+			list.add(createEntityMock(Measurement.class, "Measurement_" + count, sourceName, Integer.toString(count)));
+		}
+		return list;
+	}
+
+	private static List<ChannelGroup> createChannelGroupMocks(int count, String sourceName) throws Exception {
+		List<ChannelGroup> list = new ArrayList<>();
+		for (int i = 1; i <= count; i++) {
+			list.add(
+					createEntityMock(ChannelGroup.class, "ChannelGroup_" + count, sourceName, Integer.toString(count)));
+		}
+		return list;
+	}
+
+	private static List<Channel> createChannelMocks(int count, String sourceName) throws Exception {
+		List<Channel> list = new ArrayList<>();
+		for (int i = 1; i <= count; i++) {
+			list.add(createEntityMock(Channel.class, "Channel_" + count, sourceName, Integer.toString(count)));
+		}
+		return list;
+	}
+
+	private static ModelManager createModelManagerMock() throws Exception {
+
+		EntityType envET = mock(EntityType.class);
+		when(envET.getName()).thenReturn("Environment");
+
+		EntityType testET = mock(EntityType.class);
+		when(testET.getName()).thenReturn("Test");
+
+		EntityType testStepET = mock(EntityType.class);
+		when(testStepET.getName()).thenReturn("TestStep");
+
+		EntityType measurementET = mock(EntityType.class);
+		when(measurementET.getName()).thenReturn("Measurement");
+
+		EntityType channelGroupET = mock(EntityType.class);
+		when(channelGroupET.getName()).thenReturn("ChannelGroup");
+
+		EntityType channelET = mock(EntityType.class);
+		when(channelET.getName()).thenReturn("Channel");
+
+		ModelManager modelManager = mock(ModelManager.class);
+		when(modelManager.getEntityType(Environment.class)).thenReturn(envET);
+		when(modelManager.getEntityType(Test.class)).thenReturn(testET);
+		when(modelManager.getEntityType(TestStep.class)).thenReturn(testStepET);
+		when(modelManager.getEntityType(Measurement.class)).thenReturn(measurementET);
+		when(modelManager.getEntityType(ChannelGroup.class)).thenReturn(channelGroupET);
+		when(modelManager.getEntityType(Channel.class)).thenReturn(channelET);
+
+		return modelManager;
+	}
+
+	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id)
+			throws Exception {
+
+		HashMap<String, Value> map = new HashMap<String, Value>();
+		map.put("Name", ValueType.STRING.create("Name", name));
+
+		Core core = mock(Core.class);
+		when(core.getSourceName()).thenReturn(sourceName);
+		when(core.getValues()).thenReturn(map);
+		when(core.getID()).thenReturn(id);
+
+		Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
+		constructor.setAccessible(true);
+		T instance = constructor.newInstance(core);
+		constructor.setAccessible(false);
+		return instance;
+	}
+
+	public static EnvironmentService createEnvironmentMock() {
+		EnvironmentService environmentService = mock(EnvironmentService.class);
+		Environment env = mock(Environment.class);
+
+		when(env.getSourceName()).thenReturn("MDMENV_1");
+		when(environmentService.getEnvironments()).thenReturn(ImmutableList.of(env));
+
+		return environmentService;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/navigation/NavigatorActivityTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/navigation/NavigatorActivityTest.java
new file mode 100644
index 0000000..5b074f0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/navigation/NavigatorActivityTest.java
@@ -0,0 +1,119 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.navigation;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.businessobjects.control.NavigationActivity;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NavigatorActivityTest {
+
+	private NavigationActivity navigationActivity;
+	private String sourceName = "MDMENV_1";
+
+	@Before
+	public void setup() throws Exception {
+		navigationActivity = new NavigationActivity(NavigationActivityMockHelper.createConnectorMock());
+	}
+
+	@Test
+	public void testGetEnvironments() throws Exception {
+
+		List<Environment> envList = navigationActivity.getEnvironments();
+
+		assertNotNull("environment list should be not null", envList);
+		assertThat(envList.size(), is(5));
+	}
+
+	@Test
+	public void testGetTests() throws Exception {
+		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
+
+		assertNotNull("test list should be not null", testList);
+		assertEquals("test list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
+				NavigationActivityMockHelper.ITEM_COUNT, testList.size());
+	}
+
+	@Test
+	public void testGetTestSteps() throws Exception {
+		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
+		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
+		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());
+
+		assertNotNull("teststep list should be not null", testStepList);
+		assertEquals("teststep list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
+				NavigationActivityMockHelper.ITEM_COUNT, testStepList.size());
+	}
+
+	@Test
+	public void testGetMeasurements() throws Exception {
+		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
+		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
+		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());
+		TestStep testStep = testStepList.get(0);
+		List<Measurement> measurementList = navigationActivity.getMeasurements(sourceName, testStep.getID());
+
+		assertNotNull("measurement list should be not null", measurementList);
+		assertEquals("measurement list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
+				NavigationActivityMockHelper.ITEM_COUNT, measurementList.size());
+
+	}
+
+	@Test
+	public void testGetChannelGroups() throws Exception {
+		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
+		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
+		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());
+		TestStep testStep = testStepList.get(0);
+		List<Measurement> measurementList = navigationActivity.getMeasurements(sourceName, testStep.getID());
+		Measurement measurement = measurementList.get(0);
+		List<ChannelGroup> channelGroupList = navigationActivity.getChannelGroups(sourceName, measurement.getID());
+
+		assertNotNull("channel group list should be not null", channelGroupList);
+		assertEquals("channel group list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
+				NavigationActivityMockHelper.ITEM_COUNT, channelGroupList.size());
+	}
+
+	@Test
+	public void testGetChannels() throws Exception {
+		List<org.eclipse.mdm.api.base.model.Test> testList = navigationActivity.getTests(sourceName);
+		org.eclipse.mdm.api.base.model.Test test = testList.get(0);
+		List<TestStep> testStepList = navigationActivity.getTestSteps(sourceName, test.getID());
+		TestStep testStep = testStepList.get(0);
+		List<Measurement> measurementList = navigationActivity.getMeasurements(sourceName, testStep.getID());
+		Measurement measurement = measurementList.get(0);
+		List<ChannelGroup> channelGroupList = navigationActivity.getChannelGroups(sourceName, measurement.getID());
+		ChannelGroup channelGroup = channelGroupList.get(0);
+		List<Channel> channelList = navigationActivity.getChannels(sourceName, channelGroup.getID());
+
+		assertNotNull("channel list should be not null", channelList);
+		assertEquals("channel list size should be " + NavigationActivityMockHelper.ITEM_COUNT,
+				NavigationActivityMockHelper.ITEM_COUNT, channelList.size());
+
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/FilterParserTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/FilterParserTest.java
new file mode 100644
index 0000000..8268f5d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/FilterParserTest.java
@@ -0,0 +1,694 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.search;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.BETWEEN;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_GREATER_THAN;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_GREATER_THAN_OR_EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_IN_SET;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_LESS_THAN;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_LESS_THAN_OR_EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_LIKE;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_NOT_EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_NOT_IN_SET;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.CASE_INSENSITIVE_NOT_LIKE;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.GREATER_THAN;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.GREATER_THAN_OR_EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.IN_SET;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.IS_NOT_NULL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.IS_NULL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.LESS_THAN;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.LESS_THAN_OR_EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.LIKE;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.NOT_EQUAL;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.NOT_IN_SET;
+import static org.eclipse.mdm.api.base.query.ComparisonOperator.NOT_LIKE;
+import static org.eclipse.mdm.businessobjects.control.FilterParser.parseFilterString;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.assertj.core.api.SoftAssertions;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.junit.Test;
+
+public class FilterParserTest {
+	private List<EntityType> entities = SearchMockHelper.createETListMock();
+	private Map<String, EntityType> map = entities.stream().collect(Collectors.toMap(EntityType::getName, e -> e));
+
+	@Test
+	public void testEmpty() throws Exception {
+		assertThat(parseFilterString(entities, "").isEmtpty()).isTrue();
+	}
+
+	@Test
+	public void testNull() throws Exception {
+		assertThat(parseFilterString(entities, null).isEmtpty()).isTrue();
+	}
+
+	@Test
+	public void testOperatorEqual() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test'";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorNotEqual() throws Exception {
+
+		String filterString = "TestStep.Name ne 'test'";
+
+		Filter expected = Filter.and().add(NOT_EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorLessThan() throws Exception {
+
+		String filterString = "TestStep.LongAttribute lt 10";
+
+		Filter expected = Filter.and().add(LESS_THAN.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorLessThanOrEqual() throws Exception {
+
+		String filterString = "TestStep.LongAttribute le 10";
+
+		Filter expected = Filter.and()
+				.add(LESS_THAN_OR_EQUAL.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorGreaterThan() throws Exception {
+
+		String filterString = "TestStep.LongAttribute gt 10";
+
+		Filter expected = Filter.and().add(GREATER_THAN.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorGreaterThanOrEqual() throws Exception {
+
+		String filterString = "TestStep.LongAttribute ge 10";
+
+		Filter expected = Filter.and()
+				.add(GREATER_THAN_OR_EQUAL.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorNotInSet() throws Exception {
+
+		String filterString = "TestStep.Name not_in ('test', 'measurement', 'crash')";
+
+		Filter expected = Filter.and().add(NOT_IN_SET.create(map.get("TestStep").getAttribute("Name"),
+				new String[] { "test", "measurement", "crash" }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorLike() throws Exception {
+
+		String filterString = "TestStep.Name lk 'test*'";
+
+		Filter expected = Filter.and().add(LIKE.create(map.get("TestStep").getAttribute("Name"), "test*"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorNotLike() throws Exception {
+
+		String filterString = "TestStep.Name not_lk 'test*'";
+
+		Filter expected = Filter.and().add(NOT_LIKE.create(map.get("TestStep").getAttribute("Name"), "test*"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCIEqual() throws Exception {
+
+		String filterString = "TestStep.Name ci_eq 'test'";
+
+		Filter expected = Filter.and()
+				.add(CASE_INSENSITIVE_EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCINotEqual() throws Exception {
+
+		String filterString = "TestStep.Name ci_ne 'test'";
+
+		Filter expected = Filter.and()
+				.add(CASE_INSENSITIVE_NOT_EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCILessThan() throws Exception {
+
+		String filterString = "TestStep.LongAttribute ci_lt 10";
+
+		Filter expected = Filter.and()
+				.add(CASE_INSENSITIVE_LESS_THAN.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCILessThanOrEqual() throws Exception {
+
+		String filterString = "TestStep.LongAttribute ci_le 10";
+
+		Filter expected = Filter.and().add(
+				CASE_INSENSITIVE_LESS_THAN_OR_EQUAL.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCIGreaterThan() throws Exception {
+
+		String filterString = "TestStep.LongAttribute ci_gt 10";
+
+		Filter expected = Filter.and()
+				.add(CASE_INSENSITIVE_GREATER_THAN.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCIGreaterThanOrEqual() throws Exception {
+
+		String filterString = "TestStep.LongAttribute ci_ge 10";
+
+		Filter expected = Filter.and().add(
+				CASE_INSENSITIVE_GREATER_THAN_OR_EQUAL.create(map.get("TestStep").getAttribute("LongAttribute"), 10L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCIInSet() throws Exception {
+
+		String filterString = "TestStep.Name ci_in ('test', 'measurement', 'crash')";
+
+		Filter expected = Filter.and().add(CASE_INSENSITIVE_IN_SET.create(map.get("TestStep").getAttribute("Name"),
+				new String[] { "test", "measurement", "crash" }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCINotInSet() throws Exception {
+
+		String filterString = "TestStep.Name ci_not_in ('test', 'measurement', 'crash')";
+
+		Filter expected = Filter.and().add(CASE_INSENSITIVE_NOT_IN_SET.create(map.get("TestStep").getAttribute("Name"),
+				new String[] { "test", "measurement", "crash" }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCILike() throws Exception {
+
+		String filterString = "TestStep.Name ci_lk 'test*'";
+
+		Filter expected = Filter.and()
+				.add(CASE_INSENSITIVE_LIKE.create(map.get("TestStep").getAttribute("Name"), "test*"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorCINotLike() throws Exception {
+
+		String filterString = "TestStep.Name ci_not_lk 'test*'";
+
+		Filter expected = Filter.and()
+				.add(CASE_INSENSITIVE_NOT_LIKE.create(map.get("TestStep").getAttribute("Name"), "test*"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorIsNull() throws Exception {
+
+		String filterString = "TestStep.Name is_null";
+
+		Filter expected = Filter.and().add(IS_NULL.create(map.get("TestStep").getAttribute("Name"), null));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorIsNotNull() throws Exception {
+
+		String filterString = "TestStep.Name is_not_null";
+
+		Filter expected = Filter.and().add(IS_NOT_NULL.create(map.get("TestStep").getAttribute("Name"), null));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOperatorBetween() throws Exception {
+
+		String filterString = "TestStep.LongAttribute bw (100, 1000)";
+
+		Filter expected = Filter.and()
+				.add(BETWEEN.create(map.get("TestStep").getAttribute("LongAttribute"), new long[] { 100, 1000 }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testInSetWithImplicitToStringConversion() throws Exception {
+
+		String filterString = "TestStep.Name in (12.2, 'test', 1)";
+
+		Filter expected = Filter.and()
+				.add(IN_SET.create(map.get("TestStep").getAttribute("Name"), new String[] { "12.2", "test", "1" }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test(expected = NumberFormatException.class)
+	public void testInSetWithStringForDoubleAttribute() throws Exception {
+
+		String filterString = "TestStep.DoubleAttribute in (12.2, 'Test', 1)";
+
+		Filter expected = Filter.and()
+				.add(IN_SET.create(map.get("TestStep").getAttribute("DoubleAttribute"), new double[] { 12.2 }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testInSetWithNumericDataTypes() throws Exception {
+
+		String filterString = "TestStep.DoubleAttribute in (12.2, -1.0, 0.006022)";
+
+		Filter expected = Filter.and().add(IN_SET.create(map.get("TestStep").getAttribute("DoubleAttribute"),
+				new double[] { 12.2, -1.0, 0.006022 }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testSimple() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test'";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testSimpleWithBrackets() throws Exception {
+
+		String filterString = "(TestStep.Name eq 'test')";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testOr() throws Exception {
+
+		String filterString = "(TestStep.Name eq 'test') or (Test.LongAttribute gt 1)";
+
+		Filter expected = Filter.or()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+				.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testAnd() throws Exception {
+
+		String filterString = "(TestStep.Name eq 'test') and (Test.LongAttribute gt 1)";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+				.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testAnd2() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test' and Test.LongAttribute gt 1";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+				.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testSimpleNot() throws Exception {
+
+		String filterString = "not(TestStep.Name eq 'test')";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test")).invert();
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testNot() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test' and not(Test.LongAttribute gt 1)";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+				.merge(Filter.or()
+						.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L))
+						.invert());
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testNested() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test' and (Test.LongAttribute gt 1 or Test.IntegerAttribute lt 10)";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+				.merge(Filter.or()
+						.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L))
+						.add(ComparisonOperator.LESS_THAN.create(map.get("Test").getAttribute("IntegerAttribute"),
+								10)));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testCaseOfKeywordsIsIgnored() throws Exception {
+
+		String filterString = "TestStep.Name Eq 'test' AND (Test.LongAttribute gt 1 oR Test.IntegerAttribute LT 10)";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+				.merge(Filter.or()
+						.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L))
+						.add(ComparisonOperator.LESS_THAN.create(map.get("Test").getAttribute("IntegerAttribute"),
+								10)));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testAndPrecedence() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test' and Test.LongAttribute gt 1 or Test.IntegerAttribute lt 10";
+
+		Filter expected = Filter.or().merge(
+				Filter.and().add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+						.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L)),
+				Filter.and().add(
+						ComparisonOperator.LESS_THAN.create(map.get("Test").getAttribute("IntegerAttribute"), 10)));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testAndPrecedence2() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test' or Test.LongAttribute gt 1 and Test.IntegerAttribute lt 10";
+
+		Filter expected = Filter.or().merge(
+				Filter.and().add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test")),
+				Filter.and()
+						.add(ComparisonOperator.GREATER_THAN.create(map.get("Test").getAttribute("LongAttribute"), 1L))
+						.add(ComparisonOperator.LESS_THAN.create(map.get("Test").getAttribute("IntegerAttribute"),
+								10)));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testComplexFilter() throws Exception {
+
+		String filterString = "TestStep.Name eq 'test' and (Test.LongAttribute gt 1 or Test.DoubleAttribute lt 12.3 or Test.IntegerAttribute eq 2) "
+				+ " and not(TestStep.FloatAttribute gt 3.14 or TestStep.BooleanAttribute eq true) or TestStep.DateAttribute gt '2017-01-02T01:02:03'";
+
+		Filter expected = Filter
+				.or().merge(
+						Filter.and()
+								.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "test"))
+								.merge(Filter.or()
+										.add(ComparisonOperator.GREATER_THAN
+												.create(map.get("Test").getAttribute("LongAttribute"), 1L))
+										.add(ComparisonOperator.LESS_THAN
+												.create(map.get("Test").getAttribute("DoubleAttribute"), 12.3))
+										.add(ComparisonOperator.EQUAL
+												.create(map.get("Test").getAttribute("IntegerAttribute"), 2)),
+										Filter.or()
+												.add(ComparisonOperator.GREATER_THAN.create(
+														map.get("TestStep").getAttribute("FloatAttribute"), 3.14f))
+												.add(ComparisonOperator.EQUAL.create(
+														map.get("TestStep").getAttribute("BooleanAttribute"), true))
+												.invert()),
+						Filter.and()
+								.add(ComparisonOperator.GREATER_THAN.create(
+										map.get("TestStep").getAttribute("DateAttribute"),
+										LocalDateTime.parse("2017-01-02T01:02:03"))));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeString() throws Exception {
+		String filterString = "TestStep.Name eq 'Test'";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("Name"), "Test"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeDate() throws Exception {
+		String filterString = "TestStep.DateAttribute gt '2017-09-28T12:13:14'";
+
+		Filter expected = Filter.and().add(ComparisonOperator.GREATER_THAN
+				.create(map.get("TestStep").getAttribute("DateAttribute"), LocalDateTime.parse("2017-09-28T12:13:14")));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeDateWithMillies() throws Exception {
+		String filterString = "TestStep.DateAttribute gt '2017-09-29T12:13:14.123456'";
+
+		Filter expected = Filter.and().add(ComparisonOperator.GREATER_THAN.create(
+				map.get("TestStep").getAttribute("DateAttribute"), LocalDateTime.parse("2017-09-29T12:13:14.123456")));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeDateSequence() throws Exception {
+		String filterString = "TestStep.DateAttribute bw ('2017-09-28T12:13:14', '2017-09-29T17:18:19')";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.BETWEEN.create(map.get("TestStep").getAttribute("DateAttribute"),
+						new LocalDateTime[] { LocalDateTime.parse("2017-09-28T12:13:14"),
+								LocalDateTime.parse("2017-09-29T17:18:19") }));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeBoolean() throws Exception {
+		String filterString = "TestStep.BooleanAttribute eq true";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("BooleanAttribute"), true));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeByte() throws Exception {
+		String filterString = "TestStep.ByteAttribute eq 127";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("ByteAttribute"), (byte) 127));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeShort() throws Exception {
+		String filterString = "TestStep.ShortAttribute eq 1024";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("ShortAttribute"), (short) 1024));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeInteger() throws Exception {
+		String filterString = "TestStep.IntegerAttribute eq " + Integer.MAX_VALUE;
+
+		Filter expected = Filter.and().add(ComparisonOperator.EQUAL
+				.create(map.get("TestStep").getAttribute("IntegerAttribute"), Integer.MAX_VALUE));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeLong() throws Exception {
+		String filterString = "TestStep.LongAttribute eq " + Long.MAX_VALUE;
+
+		Filter expected = Filter.and().add(
+				ComparisonOperator.EQUAL.create(map.get("TestStep").getAttribute("LongAttribute"), Long.MAX_VALUE));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeFloat() throws Exception {
+		String filterString = "TestStep.FloatAttribute gt 12.3";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.GREATER_THAN.create(map.get("TestStep").getAttribute("FloatAttribute"), 12.3f));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testDataTypeDouble() throws Exception {
+		String filterString = "TestStep.DoubleAttribute gt 12.2";
+
+		Filter expected = Filter.and()
+				.add(ComparisonOperator.GREATER_THAN.create(map.get("TestStep").getAttribute("DoubleAttribute"), 12.2));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testKeywordsInValue() throws Exception {
+		String filterString = "Test.Name eq 'y eq z and not(x)'";
+
+		Filter expected = Filter.and().add(EQUAL.create(map.get("Test").getAttribute("Name"), "y eq z and not(x)"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testEscapedQuotesInValue() throws Exception {
+		String filterString = "Test.Name eq 'Test \\'abc\\' 2'";
+
+		Filter expected = Filter.and().add(EQUAL.create(map.get("Test").getAttribute("Name"), "Test 'abc' 2"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testEscapedDoubleQuotesInValue() throws Exception {
+		String filterString = "Test.Name eq 'Test \"abc\"'";
+
+		Filter expected = Filter.and().add(EQUAL.create(map.get("Test").getAttribute("Name"), "Test \"abc\""));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testBackslashInValue() throws Exception {
+		String filterString = "Test.Name eq 'c:\\Temp'";
+
+		Filter expected = Filter.and().add(EQUAL.create(map.get("Test").getAttribute("Name"), "c:\\Temp"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testNewlineInValue() throws Exception {
+		String filterString = "Test.Name eq 'new\nline'";
+
+		Filter expected = Filter.and().add(EQUAL.create(map.get("Test").getAttribute("Name"), "new\nline"));
+
+		assertThat(parseFilterString(entities, filterString)).isEqualTo(expected);
+	}
+
+	@Test
+	public void testInvalidFilterStrings() {
+		SoftAssertions softly = new SoftAssertions();
+
+		softly.assertThatThrownBy(() -> parseFilterString(entities, "xyz")).isInstanceOf(IllegalArgumentException.class)
+				.hasMessageStartingWith("Could not parse filter string");
+
+		softly.assertThatThrownBy(() -> parseFilterString(entities, "and")).isInstanceOf(IllegalArgumentException.class)
+				.hasMessageStartingWith("Could not parse filter string");
+
+		softly.assertThatThrownBy(() -> parseFilterString(entities, "x eq y"))
+				.isInstanceOf(IllegalArgumentException.class).hasMessageStartingWith("Could not parse filter string");
+
+		softly.assertThatThrownBy(() -> parseFilterString(entities, "Test.Name eq y"))
+				.isInstanceOf(IllegalArgumentException.class).hasMessageStartingWith("Could not parse filter string");
+
+		softly.assertThatThrownBy(() -> parseFilterString(entities, "((Test.Name eq 'y')"))
+				.isInstanceOf(IllegalArgumentException.class).hasMessageStartingWith("Could not parse filter string");
+
+		softly.assertThatThrownBy(() -> parseFilterString(entities, "Test.Name eq 'y' and Test.Name lt 'x')"))
+				.isInstanceOf(IllegalArgumentException.class).hasMessageStartingWith("Could not parse filter string");
+
+		softly.assertThatThrownBy(() -> parseFilterString(entities, "x.y eq 'z'"))
+				.isInstanceOf(IllegalArgumentException.class)
+				.hasMessageStartingWith("Entity x not found in data source");
+
+		softly.assertAll();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/SearchActivityTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/SearchActivityTest.java
new file mode 100644
index 0000000..34a48c2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/SearchActivityTest.java
@@ -0,0 +1,49 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.search;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.businessobjects.control.SearchActivity;
+import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
+import org.junit.Test;
+
+public class SearchActivityTest {
+
+	@Test
+	public void testSearch() throws Exception {
+		SearchActivity activity = new SearchActivity();
+		List<TestStep> searchResult = activity.search(SearchMockHelper.createContextMock(), TestStep.class,
+				"TestStep.Name eq '*' ");
+		assertNotNull("search result list should not be null", searchResult);
+		assertEquals("The size of the search result list should be " + SearchMockHelper.ITEM_COUNT,
+				SearchMockHelper.ITEM_COUNT, searchResult.size());
+	}
+
+	@Test
+	public void listAvailableAttributes() throws Exception {
+		SearchActivity activity = new SearchActivity();
+		List<SearchAttribute> attributes = activity.listAvailableAttributes(SearchMockHelper.createContextMock(),
+				TestStep.class);
+		assertNotNull("test list should be not null", attributes);
+		assertEquals("The attributes list size should be " + SearchMockHelper.ITEM_COUNT, SearchMockHelper.ITEM_COUNT,
+				attributes.size());
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/SearchMockHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/SearchMockHelper.java
new file mode 100644
index 0000000..7be6ef8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/control/search/SearchMockHelper.java
@@ -0,0 +1,164 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.control.search;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.EnumRegistry;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+
+public class SearchMockHelper {
+
+	public static final int ITEM_COUNT = 27;
+
+	private SearchMockHelper() {
+	}
+
+	public static ApplicationContext createContextMock() throws Exception {
+		ApplicationContext context = Mockito.mock(ApplicationContext.class);
+		List<EntityType> etResultMock = createETListMock();
+		Optional<SearchService> mockedSearchService = createSearchServiceMock(etResultMock);
+		when(context.getSearchService()).thenReturn(mockedSearchService);
+		Optional<ModelManager> mockedModelManager = createModelManagerMock(etResultMock);
+		when(context.getModelManager()).thenReturn(mockedModelManager);
+
+		return context;
+	}
+
+	public static Optional<ModelManager> createModelManagerMock(List<EntityType> etResultMock) {
+		ModelManager modelManager = Mockito.mock(ModelManager.class);
+
+		when(modelManager.getEntityType("Test")).thenReturn(etResultMock.get(0));
+		when(modelManager.getEntityType("TestStep")).thenReturn(etResultMock.get(1));
+		when(modelManager.getEntityType("Measurement")).thenReturn(etResultMock.get(2));
+
+		return Optional.of(modelManager);
+	}
+
+	public static Optional<SearchService> createSearchServiceMock(List<EntityType> etResultMock) throws Exception {
+		SearchService searchService = Mockito.mock(SearchService.class);
+		when(searchService.listEntityTypes(TestStep.class)).thenReturn(etResultMock);
+		List<Attribute> attrList = new ArrayList<>();
+		attrList.add(Mockito.mock(Attribute.class));
+		List<Entity> mockedSearchResult = createMockedSearchRes(TestStep.class, "TestStep");
+		when(searchService.fetch(any(), anyList(), any(Filter.class))).thenReturn(mockedSearchResult);
+
+		return Optional.of(searchService);
+	}
+
+	public static <T extends Entity> List<Entity> createMockedSearchRes(Class<T> clazz, String entityTypeName)
+			throws Exception {
+
+		List<Entity> mockedRes = new ArrayList<>();
+
+		for (int i = 1; i <= ITEM_COUNT; i++) {
+			T etMock = createEntityMock(clazz, entityTypeName + "_" + i, "Environment", Integer.toString(i));
+			mockedRes.add(etMock);
+		}
+
+		return mockedRes;
+	}
+
+	public static List<EntityType> createETListMock() {
+		List<EntityType> mockedEntityList = new ArrayList<>();
+		EntityType mockedETTest = createEntityTypeMock("Test");
+		EntityType mockedETTestStep = createEntityTypeMock("TestStep");
+		EntityType mockedETMeasurement = createEntityTypeMock("Measurement");
+		mockedEntityList.add(mockedETTest);
+		mockedEntityList.add(mockedETTestStep);
+		mockedEntityList.add(mockedETMeasurement);
+
+		return mockedEntityList;
+	}
+
+	private static EntityType createEntityTypeMock(String entityName) {
+		EntityType mockedETTest = Mockito.mock(EntityType.class);
+		List<Attribute> mockedAttributes = new ArrayList<>();
+
+		// Initialize enums or else ValueType.name() returns null
+		EnumRegistry.getInstance();
+
+		mockedAttributes.add(createAttributeMock(mockedETTest, "Name", ValueType.STRING));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "DateAttribute", ValueType.DATE));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "BooleanAttribute", ValueType.BOOLEAN));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "ByteAttribute", ValueType.BYTE));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "ShortAttribute", ValueType.SHORT));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "IntegerAttribute", ValueType.INTEGER));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "LongAttribute", ValueType.LONG));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "FloatAttribute", ValueType.FLOAT));
+		mockedAttributes.add(createAttributeMock(mockedETTest, "DoubleAttribute", ValueType.DOUBLE));
+
+		when(mockedETTest.getName()).thenReturn(entityName);
+		when(mockedETTest.getAttributes()).thenReturn(mockedAttributes);
+		when(mockedETTest.getAttribute(any())).thenAnswer((InvocationOnMock invocation) -> (Attribute) mockedAttributes
+				.stream().filter(a -> a.getName().equals(invocation.getArgument(0))).findAny().get());
+
+		return mockedETTest;
+	}
+
+	private static Attribute createAttributeMock(EntityType entity, String attributeName, ValueType<?> valueType) {
+		Attribute attributeMock = Mockito.mock(Attribute.class);
+		when(attributeMock.getName()).thenReturn(attributeName);
+		when(attributeMock.getValueType()).thenReturn(valueType);
+		when(attributeMock.createValue(any())).thenCallRealMethod();
+		when(attributeMock.createValue(any(), any())).thenCallRealMethod();
+		when(attributeMock.createValue(any(), anyBoolean(), any())).thenCallRealMethod();
+		when(attributeMock.createValueSeq(any(), any())).thenCallRealMethod();
+		when(attributeMock.getEntityType()).thenReturn(entity);
+
+		return attributeMock;
+	}
+
+	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id)
+			throws Exception {
+
+		HashMap<String, Value> map = new HashMap<String, Value>();
+		map.put("Name", ValueType.STRING.create("Name", name));
+
+		Core core = Mockito.mock(Core.class);
+		when(core.getSourceName()).thenReturn(sourceName);
+		when(core.getValues()).thenReturn(map);
+		when(core.getID()).thenReturn(id);
+
+		Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
+		constructor.setAccessible(true);
+		T instance = constructor.newInstance(core);
+		constructor.setAccessible(false);
+
+		return instance;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/service/EntityServiceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/service/EntityServiceTest.java
new file mode 100644
index 0000000..7eb19f6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/service/EntityServiceTest.java
@@ -0,0 +1,89 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.businessobjects.service;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.junit.Test;
+
+import io.vavr.collection.List;
+
+public class EntityServiceTest {
+
+	@Test
+	public void testSatisfiesParameters() throws Exception {
+		EntityService entityService = new EntityService();
+
+		Class<?>[] parameter = new Class[] { java.util.List.class, ContextRoot.class };
+		List<Class<?>> required = List.of(ArrayList.class, ContextRoot.class);
+
+		assertThat(entityService.satisfiesParameters(parameter, required)).isTrue();
+	}
+
+	@Test
+	public void testSatisfiesParametersNotSubClassSuperClass() throws Exception {
+		EntityService entityService = new EntityService();
+
+		Class<?>[] parameter = new Class[] { ArrayList.class, ContextRoot.class };
+		List<Class<?>> required = List.of(java.util.List.class, ContextRoot.class);
+
+		assertThat(entityService.satisfiesParameters(parameter, required)).isFalse();
+	}
+
+	@Test
+	public void testSatisfiesParametersNot() throws Exception {
+		EntityService entityService = new EntityService();
+
+		Class<?>[] parameter = new Class[] { HashMap.class, ContextRoot.class };
+		List<Class<? extends Object>> required = List.of(java.util.List.class, ContextRoot.class);
+
+		assertThat(entityService.satisfiesParameters(parameter, required)).isFalse();
+	}
+
+	@Test
+	public void testSatisfiesParametersAutoBoxing() throws Exception {
+		EntityService entityService = new EntityService();
+
+		Class<?>[] parameter = new Class[] { boolean.class, ContextRoot.class };
+		List<Class<?>> required = List.of(Boolean.class, ContextRoot.class);
+
+		assertThat(entityService.satisfiesParameters(parameter, required)).isTrue();
+	}
+
+	@Test
+	public void testSatisfiesParametersAutoUnboxing() throws Exception {
+		EntityService entityService = new EntityService();
+
+		Class<?>[] parameter = new Class[] { Boolean.class, ContextRoot.class };
+		List<Class<?>> required = List.of(boolean.class, ContextRoot.class);
+
+		assertThat(entityService.satisfiesParameters(parameter, required)).isTrue();
+	}
+
+	@Test
+	public void testSatisfiesParametersNotLength() throws Exception {
+		EntityService entityService = new EntityService();
+
+		Class<?>[] parameter = new Class[] { Boolean.class, ContextRoot.class, boolean.class };
+		List<Class<?>> required = List.of(boolean.class, ContextRoot.class);
+
+		assertThat(entityService.satisfiesParameters(parameter, required)).isFalse();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/PreviewHelperTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/PreviewHelperTest.java
new file mode 100644
index 0000000..d88b61b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/PreviewHelperTest.java
@@ -0,0 +1,274 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.utils;

+

+import static org.assertj.core.api.Assertions.assertThat;

+import static org.assertj.core.api.Assertions.assertThatThrownBy;

+

+import java.time.Instant;

+import java.time.LocalDateTime;

+import java.time.ZoneOffset;

+import java.util.Arrays;

+import java.util.List;

+

+import org.assertj.core.util.DoubleComparator;

+import org.eclipse.mdm.protobuf.Mdm.ByteArray;

+import org.eclipse.mdm.protobuf.Mdm.DateArray;

+import org.eclipse.mdm.protobuf.Mdm.DoubleArray;

+import org.eclipse.mdm.protobuf.Mdm.FloatArray;

+import org.eclipse.mdm.protobuf.Mdm.IntegerArray;

+import org.eclipse.mdm.protobuf.Mdm.LongArray;

+import org.eclipse.mdm.protobuf.Mdm.MeasuredValues;

+import org.eclipse.mdm.protobuf.Mdm.PreviewValuesList;

+import org.eclipse.mdm.protobuf.Mdm.ScalarType;

+import org.eclipse.mdm.protobuf.Mdm.ShortArray;

+import org.eclipse.mdm.protobuf.Mdm.StringArray;

+import org.junit.Test;

+

+import com.google.common.primitives.Doubles;

+import com.google.common.primitives.Floats;

+import com.google.common.primitives.Ints;

+import com.google.common.primitives.Longs;

+import com.google.protobuf.ByteString;

+import com.google.protobuf.Timestamp;

+

+public class PreviewHelperTest {

+

+	private static final DoubleComparator COMP = new DoubleComparator(1.0E-6);

+

+	private PreviewHelper helper = new PreviewHelper();

+

+	private final List<String> stringValues = Arrays.asList("one", "two", "three", "four", "five", "six");

+	private final MeasuredValues mv6Strings = MeasuredValues.newBuilder()

+			.setStringArray(StringArray.newBuilder().addAllValues(stringValues)).setLength(stringValues.size()).build();

+

+	private final ByteString byteValues = ByteString

+			.copyFrom(new byte[] { (byte) 1, (byte) 2, (byte) 3, (byte) 1, (byte) 4, (byte) 2 });

+	private final MeasuredValues mv6Bytes = MeasuredValues.newBuilder()

+			.setByteArray(ByteArray.newBuilder().setValues(byteValues)).setLength(byteValues.size()).build();

+

+	private final List<Integer> shortValues = Ints.asList(1, 2, 3, 1, 4, 2);

+	private final MeasuredValues mv6Shorts = MeasuredValues.newBuilder()

+			.setShortArray(ShortArray.newBuilder().addAllValues(shortValues)).setLength(shortValues.size()).build();

+

+	private final List<Integer> intValues = Ints.asList(1, 2, 3, 1, 4, 2);

+	private final MeasuredValues mv6Ints = MeasuredValues.newBuilder()

+			.setIntegerArray(IntegerArray.newBuilder().addAllValues(intValues)).setLength(intValues.size()).build();

+

+	private final List<Long> longValues = Longs.asList(1L, 2L, 3L, 1L, 4L, 2L);

+	private final MeasuredValues mv6Longs = MeasuredValues.newBuilder()

+			.setLongArray(LongArray.newBuilder().addAllValues(longValues)).setLength(longValues.size()).build();

+

+	private final List<Float> floatValues = Floats.asList(1.0f, 2.0f, 3.0f, 1.1f, 4.4f, 2.2f);

+	private final MeasuredValues mv6Floats = MeasuredValues.newBuilder()

+			.setFloatArray(FloatArray.newBuilder().addAllValues(floatValues)).setLength(floatValues.size()).build();

+

+	private final List<Double> doubleValues = Doubles.asList(1.0, 2.0, 3.0, 1.1, 4.4, 2.2);

+	private final MeasuredValues mv6Doubles = MeasuredValues.newBuilder()

+			.setDoubleArray(DoubleArray.newBuilder().addAllValues(doubleValues)).setLength(doubleValues.size()).build();

+

+	@Test

+	public void testInvalidNumberOfChunks() {

+

+		assertThatThrownBy(() -> helper.calculatePreview(mv6Doubles, 0)).isInstanceOf(PreviewException.class)

+				.hasMessage("Number of chunks requested must be positive!");

+

+		assertThatThrownBy(() -> helper.calculatePreview(mv6Doubles, -1)).isInstanceOf(PreviewException.class)

+				.hasMessage("Number of chunks requested must be positive!");

+	}

+

+	@Test

+	public void testChunkSizeInteger() {

+		PreviewValuesList pv = helper.calculatePreview(mv6Doubles, 2).build();

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+		assertThat(pv.getAvg(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				2.56666666666);

+	}

+

+	@Test

+	public void testChunkSizeFloat() {

+		PreviewValuesList pv = helper.calculatePreview(mv6Doubles, 4).build();

+

+		assertThat(pv.getMinCount()).isEqualTo(1);

+		assertThat(pv.getMaxCount()).isEqualTo(1);

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+

+		assertThat(pv.getMin(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0, 3.0,

+				1.1, 2.2);

+		assertThat(pv.getMax(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0, 3.0,

+				4.4, 2.2);

+		assertThat(pv.getAvg(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.5, 3.0,

+				2.75, 2.2);

+	}

+

+	@Test

+	public void testChunkSizeFloat2() {

+		PreviewValuesList pv = helper.calculatePreview(mv6Doubles, 5).build();

+

+		assertThat(pv.getMinCount()).isEqualTo(1);

+		assertThat(pv.getMaxCount()).isEqualTo(1);

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+

+		assertThat(pv.getMin(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0, 2.0,

+				1.1, 4.4, 2.2);

+		assertThat(pv.getMax(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0, 2.0,

+				3.0, 4.4, 2.2);

+		assertThat(pv.getAvg(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0, 2.0,

+				2.05, 4.4, 2.2);

+	}

+

+	@Test

+	public void testNumberOfChunksEqualsNumberOfValues() {

+		PreviewValuesList pv = helper.calculatePreview(mv6Doubles, 6).build();

+

+		assertThat(pv.getMinCount()).isEqualTo(1);

+		assertThat(pv.getMaxCount()).isEqualTo(1);

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+

+		assertThat(pv.getMin(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).isEqualTo(doubleValues);

+		assertThat(pv.getMax(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).isEqualTo(doubleValues);

+		assertThat(pv.getAvg(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).isEqualTo(doubleValues);

+	}

+

+	@Test

+	public void testNumberOfChunksLargerThanNumberOfValues() {

+		PreviewValuesList pv = helper.calculatePreview(mv6Doubles, 7).build();

+

+		assertThat(pv.getMinCount()).isEqualTo(1);

+		assertThat(pv.getMaxCount()).isEqualTo(1);

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+

+		assertThat(pv.getMin(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).isEqualTo(doubleValues);

+		assertThat(pv.getMax(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).isEqualTo(doubleValues);

+		assertThat(pv.getAvg(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).isEqualTo(doubleValues);

+	}

+

+	@Test

+	public void testMultipleChannels() {

+		PreviewValuesList pv = helper.calculatePreview(

+				Arrays.asList(mv6Bytes, mv6Shorts, mv6Ints, mv6Longs, mv6Floats, mv6Doubles, mv6Strings), 2);

+

+		assertThat(pv.getMinCount()).isEqualTo(7);

+		assertThat(pv.getMaxCount()).isEqualTo(7);

+		assertThat(pv.getAvgCount()).isEqualTo(7);

+

+		assertThat(pv.getMin(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0,

+				1.0);

+		assertThat(pv.getMax(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(3.0,

+				4.0);

+		assertThat(pv.getAvg(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				2.33333333333);

+

+		assertThat(pv.getMin(1).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0,

+				1.0);

+		assertThat(pv.getMax(1).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(3.0,

+				4.0);

+		assertThat(pv.getAvg(1).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				2.33333333333);

+

+		assertThat(pv.getMin(2).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0,

+				1.0);

+		assertThat(pv.getMax(2).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(3.0,

+				4.0);

+		assertThat(pv.getAvg(2).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				2.33333333333);

+

+		assertThat(pv.getMin(3).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0,

+				1.0);

+		assertThat(pv.getMax(3).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(3.0,

+				4.0);

+		assertThat(pv.getAvg(3).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				2.33333333333);

+

+		assertThat(pv.getMin(4).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0,

+				1.1);

+		assertThat(pv.getMax(4).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(3.0,

+				4.4);

+		assertThat(pv.getAvg(4).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				2.56666666666);

+

+		assertThat(pv.getMin(5).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(1.0,

+				1.1);

+		assertThat(pv.getMax(5).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(3.0,

+				4.4);

+		assertThat(pv.getAvg(5).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				2.56666666666);

+

+		assertThat(pv.getMin(6)).isEqualTo(MeasuredValues.newBuilder().setScalarType(ScalarType.DOUBLE).build());

+		assertThat(pv.getMax(6)).isEqualTo(MeasuredValues.newBuilder().setScalarType(ScalarType.DOUBLE).build());

+		assertThat(pv.getAvg(6)).isEqualTo(MeasuredValues.newBuilder().setScalarType(ScalarType.DOUBLE).build());

+	}

+

+	@Test

+	public void testFlags() {

+		MeasuredValues mv6IntsWithFlags = mv6Ints.toBuilder()

+				.addAllFlags(Arrays.asList(false, true, true, true, false, false)).build();

+

+		// 1, 2, 3, 1, 4, 2

+		PreviewValuesList pv = helper.calculatePreview(mv6IntsWithFlags, 2).build();

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+		assertThat(pv.getAvg(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.5,

+				1.0);

+		assertThat(pv.getMin(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(2.0,

+				1.0);

+		assertThat(pv.getMax(0).getDoubleArray().getValuesList()).usingElementComparator(COMP).containsExactly(3.0,

+				1.0);

+	}

+

+	@Test

+	public void testTimestamps() {

+

+		final List<Timestamp> dateValues = Arrays.asList(toTimestamp("2019-02-01T06:30:00.500"),

+				toTimestamp("2019-02-02T06:30:00.500"), toTimestamp("2019-02-03T06:30:00.500"),

+				toTimestamp("2019-04-01T06:10:00.100"), toTimestamp("2019-04-01T07:40:00.200"),

+				toTimestamp("2019-04-01T09:10:00.300"));

+		final MeasuredValues mv6Dates = MeasuredValues.newBuilder()

+				.setDateArray(DateArray.newBuilder().addAllValues(dateValues)).setLength(dateValues.size()).build();

+

+		PreviewValuesList pv = helper.calculatePreview(mv6Dates, 2).build();

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+		assertThat(pv.getMin(0).getDateArray().getValuesList()).containsExactly(toTimestamp("2019-02-01T06:30:00.500"),

+				toTimestamp("2019-04-01T06:10:00.100"));

+		assertThat(pv.getMax(0).getDateArray().getValuesList()).containsExactly(toTimestamp("2019-02-03T06:30:00.500"),

+				toTimestamp("2019-04-01T09:10:00.300"));

+		assertThat(pv.getAvg(0).getDateArray().getValuesList()).containsExactly(toTimestamp("2019-02-02T06:30:00.500"),

+				toTimestamp("2019-04-01T07:40:00.200"));

+	}

+

+	@Test

+	public void testTimestampFlags() {

+		final List<Timestamp> dateValues = Arrays.asList(toTimestamp("2019-02-01T06:30:00.500"),

+				toTimestamp("2019-02-02T06:30:00.500"), toTimestamp("2019-02-03T06:30:00.500"),

+				toTimestamp("2019-04-01T06:10:00.100"), toTimestamp("2019-04-01T07:40:00.200"),

+				toTimestamp("2019-04-01T09:10:00.300"));

+		final MeasuredValues mv6Dates = MeasuredValues.newBuilder()

+				.setDateArray(DateArray.newBuilder().addAllValues(dateValues)).setLength(dateValues.size())

+				.addAllFlags(Arrays.asList(false, true, true, true, false, false)).build();

+

+		PreviewValuesList pv = helper.calculatePreview(mv6Dates, 2).build();

+		assertThat(pv.getAvgCount()).isEqualTo(1);

+		assertThat(pv.getMin(0).getDateArray().getValuesList()).containsExactly(toTimestamp("2019-02-02T06:30:00.500"),

+				toTimestamp("2019-04-01T06:10:00.100"));

+		assertThat(pv.getMax(0).getDateArray().getValuesList()).containsExactly(toTimestamp("2019-02-03T06:30:00.500"),

+				toTimestamp("2019-04-01T06:10:00.100"));

+		assertThat(pv.getAvg(0).getDateArray().getValuesList()).containsExactly(toTimestamp("2019-02-02T18:30:00.500"),

+				toTimestamp("2019-04-01T06:10:00.100"));

+	}

+

+	private Timestamp toTimestamp(String datetime) {

+		Instant instant = LocalDateTime.parse(datetime).toInstant(ZoneOffset.UTC);

+

+		return Timestamp.newBuilder().setSeconds(instant.getEpochSecond()).setNanos(instant.getNano()).build();

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/ProtobufConverterTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/ProtobufConverterTest.java
new file mode 100644
index 0000000..9d8c3b7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/ProtobufConverterTest.java
@@ -0,0 +1,152 @@
+/********************************************************************************

+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/
+

+package org.eclipse.mdm.businessobjects.utils;

+

+import static org.assertj.core.api.Assertions.assertThat;

+import static org.mockito.ArgumentMatchers.anyList;

+import static org.mockito.ArgumentMatchers.anyString;

+import static org.mockito.ArgumentMatchers.eq;

+import static org.mockito.Mockito.mock;

+import static org.mockito.Mockito.when;

+

+import java.util.Arrays;

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.Map;

+import java.util.Optional;

+

+import org.eclipse.mdm.api.base.massdata.ReadRequest;

+import org.eclipse.mdm.api.base.model.Channel;

+import org.eclipse.mdm.api.base.model.ChannelGroup;

+import org.eclipse.mdm.api.base.model.Unit;

+import org.eclipse.mdm.api.dflt.ApplicationContext;

+import org.eclipse.mdm.api.dflt.EntityManager;

+import org.eclipse.mdm.protobuf.Mdm;

+import org.junit.Before;

+import org.junit.Test;

+

+public class ProtobufConverterTest {

+

+	ChannelGroup channelGroup = mock(ChannelGroup.class);

+	Channel channel1 = mock(Channel.class);

+	Channel channel2 = mock(Channel.class);

+	Unit unit1 = mock(Unit.class);

+	Unit unit2 = mock(Unit.class);

+	EntityManager em = mock(EntityManager.class);

+	ApplicationContext context = mock(ApplicationContext.class);

+

+	@Before

+	public void init() {

+		when(channelGroup.getID()).thenReturn("1");

+		when(unit1.getID()).thenReturn("1");

+		when(unit2.getID()).thenReturn("2");

+		when(channel1.getID()).thenReturn("1");

+		when(channel1.getUnit()).thenReturn(unit1);

+		when(channel2.getID()).thenReturn("2");

+		when(channel2.getUnit()).thenReturn(unit2);

+

+		when(em.load(eq(ChannelGroup.class), anyString())).thenReturn(channelGroup);

+		when(em.load(eq(Channel.class), anyList())).thenReturn(Arrays.asList(channel1, channel2));

+		when(em.load(eq(Unit.class), anyList())).thenReturn(Arrays.asList(unit1, unit2));

+

+		when(context.getEntityManager()).thenReturn(Optional.of(em));

+	}

+

+	@Test

+	public void testRequestChannelWithDefaultUnit() {

+		ReadRequest readRequest = ProtobufConverter.convert(context,

+				Mdm.ReadRequest.newBuilder().setChannelGroupId("1").addChannelIds("1").build());

+

+		Map<Channel, Unit> channels = new HashMap<>();

+		channels.put(channel1, unit1);

+		assertThat(readRequest).hasFieldOrPropertyWithValue("channelGroup", channelGroup)

+				.hasFieldOrPropertyWithValue("channels", channels)

+				.hasFieldOrPropertyWithValue("loadAllChannels", false);

+	}

+

+	@Test

+	public void testRequestChannelWithExplicitUnit() {

+		ReadRequest channelWithUnit = ProtobufConverter.convert(context,

+				Mdm.ReadRequest.newBuilder().setChannelGroupId("1").addChannelIds("1").addUnitIds("1").build());

+

+		Map<Channel, Unit> channels = new HashMap<>();

+		channels.put(channel1, unit1);

+		assertThat(channelWithUnit).hasFieldOrPropertyWithValue("channelGroup", channelGroup)

+				.hasFieldOrPropertyWithValue("channels", channels)

+				.hasFieldOrPropertyWithValue("loadAllChannels", false);

+	}

+

+	@Test

+	public void testRequestAllChannelsWithDefaultUnits() {

+		ReadRequest allChannelWithoutUnits = ProtobufConverter.convert(context,

+				Mdm.ReadRequest.newBuilder().setChannelGroupId("1").build());

+

+		assertThat(allChannelWithoutUnits).hasFieldOrPropertyWithValue("channelGroup", channelGroup)

+				.hasFieldOrPropertyWithValue("channels", Collections.emptyMap())

+				.hasFieldOrPropertyWithValue("loadAllChannels", true);

+	}

+

+	@Test

+	public void testRequestAllChannelsWithExplicitUnits() {

+		ReadRequest allChannelWithUnits = ProtobufConverter.convert(context, Mdm.ReadRequest.newBuilder()

+				.setChannelGroupId("1").addChannelIds("1").addChannelIds("2").addUnitIds("2").addUnitIds("1").build());

+

+		Map<Channel, Unit> channels = new HashMap<>();

+		channels.put(channel1, unit2);

+		channels.put(channel2, unit1);

+		assertThat(allChannelWithUnits).hasFieldOrPropertyWithValue("channelGroup", channelGroup)

+				.hasFieldOrPropertyWithValue("channels", channels)

+				.hasFieldOrPropertyWithValue("loadAllChannels", false);

+	}

+

+	@Test

+	public void testSuperfluousUnitsAreIgnored() {

+		ReadRequest allChannelWithUnits = ProtobufConverter.convert(context, Mdm.ReadRequest.newBuilder()

+				.setChannelGroupId("1").addChannelIds("1").addUnitIds("2").addUnitIds("1").build());

+

+		Map<Channel, Unit> channels = new HashMap<>();

+		channels.put(channel1, unit2);

+		assertThat(allChannelWithUnits).hasFieldOrPropertyWithValue("channelGroup", channelGroup)

+				.hasFieldOrPropertyWithValue("channels", channels)

+				.hasFieldOrPropertyWithValue("loadAllChannels", false);

+	}

+

+	@Test

+	public void testLessUnitsThenChannels() {

+		ReadRequest allChannelWithUnits = ProtobufConverter.convert(context, Mdm.ReadRequest.newBuilder()

+				.setChannelGroupId("1").addChannelIds("1").addChannelIds("2").addUnitIds("2").build());

+

+		Map<Channel, Unit> channels = new HashMap<>();

+		channels.put(channel1, unit2);

+		channels.put(channel2, unit2); // no unitId was supplied -> default unit

+		assertThat(allChannelWithUnits).hasFieldOrPropertyWithValue("channelGroup", channelGroup)

+				.hasFieldOrPropertyWithValue("channels", channels)

+				.hasFieldOrPropertyWithValue("loadAllChannels", false);

+	}

+

+	@Test

+	public void testEmptyStringAsUnitIdIsInterpretedAsDefaultUnit() {

+		ReadRequest allChannelWithUnits = ProtobufConverter.convert(context, Mdm.ReadRequest.newBuilder()

+				.setChannelGroupId("1").addChannelIds("1").addChannelIds("2").addUnitIds("").addUnitIds("1").build());

+

+		Map<Channel, Unit> channels = new HashMap<>();

+		channels.put(channel1, unit1); // empty unitId was supplied -> default unit

+		channels.put(channel2, unit1);

+		assertThat(allChannelWithUnits).hasFieldOrPropertyWithValue("channelGroup", channelGroup)

+				.hasFieldOrPropertyWithValue("channels", channels)

+				.hasFieldOrPropertyWithValue("loadAllChannels", false);

+	}

+

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/ReflectUtilTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/ReflectUtilTest.java
new file mode 100644
index 0000000..3204c8d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/ReflectUtilTest.java
@@ -0,0 +1,117 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.utils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class ReflectUtilTest {
+
+	@Test
+	public void testApplyValueBoolean() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Boolean.class, boolean.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(boolean.class, Boolean.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(boolean.class, boolean.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Boolean.class, Boolean.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Boolean.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Boolean.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(boolean.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, boolean.class)).isFalse();
+	}
+
+	@Test
+	public void testApplyValueByte() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Byte.class, byte.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(byte.class, Byte.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(byte.class, byte.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Byte.class, Byte.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Byte.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Byte.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(byte.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, byte.class)).isFalse();
+	}
+
+	@Test
+	public void testApplyValueShort() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Short.class, short.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(short.class, Short.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(short.class, short.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Short.class, Short.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Short.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Short.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(short.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, short.class)).isFalse();
+	}
+
+	@Test
+	public void testApplyValueInt() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Integer.class, int.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(int.class, Integer.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(int.class, int.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Integer.class, Integer.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Integer.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Integer.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(int.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, int.class)).isFalse();
+	}
+
+	@Test
+	public void testApplyValueLong() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Long.class, long.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(long.class, Long.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(long.class, long.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Long.class, Long.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Long.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Long.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(long.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, long.class)).isFalse();
+	}
+
+	@Test
+	public void testApplyValueFloat() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Float.class, float.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(float.class, Float.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(float.class, float.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Float.class, Float.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Float.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Float.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(float.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, float.class)).isFalse();
+	}
+
+	@Test
+	public void testApplyValueDouble() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Double.class, double.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(double.class, Double.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(double.class, double.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Double.class, Double.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Double.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Double.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(double.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, double.class)).isFalse();
+	}
+
+	@Test
+	public void testApplyValueChar() throws Exception {
+		assertThat(ReflectUtil.isAssignableTo(Character.class, char.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(char.class, Character.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(char.class, char.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(Character.class, Character.class)).isTrue();
+		assertThat(ReflectUtil.isAssignableTo(String.class, Character.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(Character.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(char.class, String.class)).isFalse();
+		assertThat(ReflectUtil.isAssignableTo(String.class, char.class)).isFalse();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/SerializerTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/SerializerTest.java
new file mode 100644
index 0000000..64516aa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/businessobjects/utils/SerializerTest.java
@@ -0,0 +1,126 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.businessobjects.utils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.MimeType;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+public class SerializerTest {
+
+	@Test
+	public void testApplyValueBoolean() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.BOOLEAN, "1")).isEqualTo(Boolean.TRUE);
+		assertThat(Serializer.deserializeValue(ValueType.BOOLEAN, 1)).isEqualTo(Boolean.TRUE);
+		assertThat(Serializer.deserializeValue(ValueType.BOOLEAN, "0")).isEqualTo(Boolean.FALSE);
+		assertThat(Serializer.deserializeValue(ValueType.BOOLEAN, 0)).isEqualTo(Boolean.FALSE);
+		assertThat(Serializer.deserializeValue(ValueType.BOOLEAN, "2")).isEqualTo(Boolean.FALSE);
+		assertThat(Serializer.deserializeValue(ValueType.BOOLEAN, 2)).isEqualTo(Boolean.FALSE);
+	}
+
+	@Test
+	public void testApplyValueByte() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.BYTE, "42")).isEqualTo((byte) 42);
+		assertThat(Serializer.deserializeValue(ValueType.BYTE, 42)).isEqualTo((byte) 42);
+		assertThat(Serializer.deserializeValue(ValueType.BYTE, (byte) 42)).isEqualTo((byte) 42);
+	}
+
+	@Test
+	public void testApplyValueShort() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.SHORT, "42")).isEqualTo((short) 42);
+		assertThat(Serializer.deserializeValue(ValueType.SHORT, 42)).isEqualTo((short) 42);
+		assertThat(Serializer.deserializeValue(ValueType.SHORT, (short) 42)).isEqualTo((short) 42);
+	}
+
+	@Test
+	public void testApplyValueInt() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.INTEGER, "42")).isEqualTo(42);
+		assertThat(Serializer.deserializeValue(ValueType.INTEGER, 42)).isEqualTo(42);
+		assertThat(Serializer.deserializeValue(ValueType.INTEGER, 42)).isEqualTo(42);
+	}
+
+	@Test
+	public void testApplyValueLong() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.LONG, "42")).isEqualTo(42L);
+		assertThat(Serializer.deserializeValue(ValueType.LONG, 42)).isEqualTo(42L);
+		assertThat(Serializer.deserializeValue(ValueType.LONG, 42L)).isEqualTo(42L);
+	}
+
+	@Test
+	public void testApplyValueFloat() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.FLOAT, "42.1")).isEqualTo(42.1f);
+		assertThat(Serializer.deserializeValue(ValueType.FLOAT, 42.1)).isEqualTo(42.1f);
+		assertThat(Serializer.deserializeValue(ValueType.FLOAT, 42)).isEqualTo(42.0f);
+	}
+
+	@Test
+	public void testApplyValueDouble() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.DOUBLE, "42.1")).isEqualTo(42.1);
+		assertThat(Serializer.deserializeValue(ValueType.DOUBLE, 42.1)).isEqualTo(42.1);
+		assertThat(Serializer.deserializeValue(ValueType.DOUBLE, 42)).isEqualTo(42.0);
+	}
+
+	@Test
+	public void testApplyValueDate() throws Exception {
+
+		assertThat(Serializer.deserializeValue(ValueType.DATE, "2018-01-02T12:13:14Z"))
+				.isEqualTo(LocalDateTime.of(2018, 01, 02, 12, 13, 14));
+		assertThat(Serializer.deserializeValue(ValueType.DATE, 123456789L))
+				.isEqualTo(LocalDateTime.ofEpochSecond(123456789L, 0, ZoneOffset.UTC));
+	}
+
+	@Test
+	public void testDeserializeFileLink() throws Exception {
+
+		FileLink link1 = FileLink.newRemote("root/fileLink.pdf", new MimeType("application/pdf"), "desc");
+
+		Map<String, String> map = ImmutableMap.of("remotePath", "root/fileLink.pdf", "mimeType", "application/pdf",
+				"description", "desc");
+
+		assertThat(Serializer.deserializeValue(ValueType.FILE_LINK, map)).isEqualTo(link1);
+	}
+
+	@Test
+	public void testDeserializeFileLinkSequence() throws Exception {
+
+		FileLink link1 = FileLink.newRemote("root/fileLink1.pdf", new MimeType("application/pdf"), "desc1");
+		FileLink link2 = FileLink.newRemote("root/image.jpeg", new MimeType("application/jpeg"), "desc2");
+
+		Map<String, String> map1 = ImmutableMap.of("remotePath", "root/fileLink1.pdf", "mimeType", "application/pdf",
+				"description", "desc1");
+
+		Map<String, String> map2 = ImmutableMap.of("remotePath", "root/image.jpeg", "mimeType", "application/jpeg",
+				"description", "desc2");
+
+		assertThat((FileLink[]) Serializer.deserializeValue(ValueType.FILE_LINK_SEQUENCE, Arrays.asList(map1, map2)))
+				.containsExactly(link1, link2);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/query/boundary/QueryServiceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/query/boundary/QueryServiceTest.java
new file mode 100644
index 0000000..d61b38b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/query/boundary/QueryServiceTest.java
@@ -0,0 +1,307 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.boundary;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import org.assertj.core.groups.Tuple;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.connector.boundary.ConnectorServiceException;
+import org.eclipse.mdm.query.entity.Column;
+import org.eclipse.mdm.query.entity.QueryRequest;
+import org.eclipse.mdm.query.entity.Row;
+import org.eclipse.mdm.query.entity.SourceFilter;
+import org.eclipse.mdm.query.entity.SuggestionRequest;
+import org.mockito.Mockito;
+
+public class QueryServiceTest {
+
+	@org.junit.Test
+	public void testQuery() throws DataAccessException {
+
+		ApplicationContext context = mockContext();
+		ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+		when(connectorService.getContextByName("env1")).thenReturn(context);
+
+		QueryService queryService = new QueryService();
+		queryService.connectorService = connectorService;
+
+		SourceFilter filter = new SourceFilter();
+		filter.setSourceName("env1");
+		filter.setFilter("Test.Name lk \"*\"");
+
+		QueryRequest request = new QueryRequest();
+		request.setResultType("Test");
+		request.setColumns(Arrays.asList("Test.Id", "Test.Name"));
+		request.setFilters(Arrays.asList(filter));
+
+		Row expectedRow = new Row();
+		expectedRow.setSource("env1");
+		expectedRow.setType("Test");
+		expectedRow.setId("id1");
+		expectedRow.addColumns(
+				Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
+
+		assertThat(queryService.queryRows(request)).contains(expectedRow);
+	}
+
+	@org.junit.Test
+	public void testQuerySingleQuote() throws DataAccessException {
+
+		ApplicationContext context = mockContext();
+		ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+		when(connectorService.getContextByName("env1")).thenReturn(context);
+
+		QueryService queryService = new QueryService();
+		queryService.connectorService = connectorService;
+
+		SourceFilter filter = new SourceFilter();
+		filter.setSourceName("env1");
+		filter.setFilter("Test.Name lk '*'");
+
+		QueryRequest request = new QueryRequest();
+		request.setResultType("Test");
+		request.setColumns(Arrays.asList("Test.Id", "Test.Name"));
+		request.setFilters(Arrays.asList(filter));
+
+		Row expectedRow = new Row();
+		expectedRow.setSource("env1");
+		expectedRow.setType("Test");
+		expectedRow.setId("id1");
+		expectedRow.addColumns(
+				Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
+
+		assertThat(queryService.queryRows(request)).contains(expectedRow);
+	}
+
+	@org.junit.Test
+	public void testQueryMissingEnvironmentShouldByIgnored() throws DataAccessException {
+
+		ApplicationContext context = mockContext();
+		ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+		when(connectorService.getContextByName("env1")).thenReturn(context);
+		doThrow(ConnectorServiceException.class).when(connectorService).getContextByName("env2");
+
+		QueryService queryService = new QueryService();
+		queryService.connectorService = connectorService;
+
+		SourceFilter filterEnv1 = new SourceFilter();
+		filterEnv1.setSourceName("env1");
+		filterEnv1.setFilter("Test.Name lk '*'");
+
+		SourceFilter filterEnv2 = new SourceFilter();
+		filterEnv2.setSourceName("env2");
+		filterEnv2.setFilter("Test.Name lk '*'");
+
+		QueryRequest request = new QueryRequest();
+		request.setResultType("Test");
+		request.setColumns(Arrays.asList("Test.Id", "Test.Name", "Pool.Name"));
+		request.setFilters(Arrays.asList(filterEnv1, filterEnv2));
+
+		Row expectedRow = new Row();
+		expectedRow.setSource("env1");
+		expectedRow.setType("Test");
+		expectedRow.setId("id1");
+		expectedRow.addColumns(
+				Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
+
+		assertThat(queryService.queryRows(request)).contains(expectedRow);
+	}
+
+	@org.junit.Test
+	public void testQueryMissingEntitiesShouldBeIgnored() throws DataAccessException {
+
+		ApplicationContext context1 = mockContext();
+		ApplicationContext context2 = mockContext();
+		ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+		when(connectorService.getContextByName("env1")).thenReturn(context1);
+		when(connectorService.getContextByName("env2")).thenReturn(context2);
+
+		EntityType type = mockEntity("env2", "Test");
+		EntityType pool = mockEntity("env2", "Pool");
+
+		when(context2.getModelManager().get().getEntityType(Test.class)).thenReturn(type);
+		when(context2.getModelManager().get().getEntityType("Test")).thenReturn(type);
+		when(context2.getModelManager().get().getEntityType(Pool.class)).thenReturn(pool);
+		when(context2.getModelManager().get().getEntityType("Pool")).thenReturn(pool);
+
+		SearchService ss = mock(SearchService.class);
+		EntityType test = context2.getModelManager().get().getEntityType(Test.class);
+		when(ss.listEntityTypes(Mockito.eq(Test.class))).thenReturn(Arrays.asList(test, pool));
+		when(ss.listSearchableTypes()).thenReturn(Arrays.asList(Test.class));
+
+		Record recordTest = new Record(context2.getModelManager().get().getEntityType(Test.class));
+		recordTest.addValue(ValueType.STRING.create("Id", "id1"));
+		recordTest.addValue(ValueType.STRING.create("Name", "Test-Name"));
+
+		Record recordPool = new Record(context2.getModelManager().get().getEntityType(Pool.class));
+		recordPool.addValue(ValueType.STRING.create("Name", "Pool-Name"));
+		Result result = new Result();
+		result.addRecord(recordPool);
+		result.addRecord(recordTest);
+		when(context2.getSearchService().get().fetchResults(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
+				.thenReturn(Arrays.asList(result));
+
+		QueryService queryService = new QueryService();
+		queryService.connectorService = connectorService;
+
+		SourceFilter filterEnv1 = new SourceFilter();
+		filterEnv1.setSourceName("env1");
+		filterEnv1.setFilter("Test.Name lk '*'");
+
+		SourceFilter filterEnv2 = new SourceFilter();
+		filterEnv2.setSourceName("env2");
+		filterEnv2.setFilter("Test.Name lk '*'");
+
+		QueryRequest request = new QueryRequest();
+		request.setResultType("Test");
+		request.setColumns(Arrays.asList("Test.Id", "Test.Name", "Pool.Name"));
+		request.setFilters(Arrays.asList(filterEnv1, filterEnv2));
+
+		Row expectedRowEnv1 = new Row();
+		expectedRowEnv1.setSource("env1");
+		expectedRowEnv1.setType("Test");
+		expectedRowEnv1.setId("id1");
+		expectedRowEnv1.addColumns(
+				Arrays.asList(new Column("Test", "Id", "id1", null), new Column("Test", "Name", "Test-Name", null)));
+
+		Row expectedRowEnv2 = new Row();
+		expectedRowEnv2.setSource("env2");
+		expectedRowEnv2.setType("Test");
+		expectedRowEnv2.setId("id1");
+		expectedRowEnv2.addColumns(Arrays.asList(new Column("Test", "Id", "id1", null),
+				new Column("Test", "Name", "Test-Name", null), new Column("Pool", "Name", "Pool-Name", null)));
+
+		List<Row> list = queryService.queryRows(request);
+
+		assertThat(list).extracting("source", "type", "id").containsOnly(new Tuple("env1", "Test", "id1"),
+				new Tuple("env2", "Test", "id1"));
+
+		assertThat(list.get(0).getColumns()).containsOnlyElementsOf(expectedRowEnv1.getColumns());
+
+		assertThat(list.get(1).getColumns()).containsOnlyElementsOf(expectedRowEnv2.getColumns());
+
+	}
+
+	public static EntityType mockEntity(String sourceName, String name) {
+		Attribute attrId = mock(Attribute.class);
+		when(attrId.getName()).thenReturn("Id");
+		when(attrId.getValueType()).thenReturn(ValueType.LONG);
+
+		Attribute attrName = mock(Attribute.class);
+		when(attrName.getName()).thenReturn("Name");
+		when(attrName.getValueType()).thenReturn(ValueType.STRING);
+
+		EntityType entity = mock(EntityType.class);
+		when(entity.getSourceName()).thenReturn(sourceName);
+		when(entity.getName()).thenReturn(name);
+		when(entity.getAttributes()).thenReturn(Arrays.asList(attrId, attrName));
+		when(entity.getAttribute("Name")).thenReturn(attrName);
+		when(entity.getNameAttribute()).thenReturn(attrName);
+		when(entity.getIDAttribute()).thenReturn(attrId);
+
+		when(attrId.getEntityType()).thenReturn(entity);
+		when(attrName.getEntityType()).thenReturn(entity);
+
+		return entity;
+	}
+
+	public static ApplicationContext mockContext() {
+		ModelManager mm = mockModelManager();
+		EntityManager em = Mockito.mock(EntityManager.class);
+
+		SearchService ss = mock(SearchService.class);
+		EntityType type = mm.getEntityType(Test.class);
+		when(ss.listEntityTypes(Mockito.eq(Test.class))).thenReturn(Arrays.asList(type));
+		when(ss.listSearchableTypes()).thenReturn(Arrays.asList(Test.class));
+
+		Record record = new Record(mm.getEntityType(Test.class));
+		record.addValue(ValueType.STRING.create("Id", "id1"));
+		record.addValue(ValueType.STRING.create("Name", "Test-Name"));
+		Result result = new Result();
+		result.addRecord(record);
+		when(ss.fetchResults(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
+				.thenReturn(Arrays.asList(result));
+
+		ApplicationContext context = Mockito.mock(ApplicationContext.class);
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		when(context.getModelManager()).thenReturn(Optional.of(mm));
+		when(context.getSearchService()).thenReturn(Optional.of(ss));
+		return context;
+	}
+
+	public static ModelManager mockModelManager() {
+		EntityType type = mockEntity("env1", "Test");
+
+		ModelManager mm = mock(ModelManager.class);
+		when(mm.getEntityType(Test.class)).thenReturn(type);
+		when(mm.getEntityType("Test")).thenReturn(type);
+
+		return mm;
+	}
+
+	@org.junit.Test
+	public void testGetSuggestions() throws Exception {
+		ApplicationContext context = mockContext();
+
+		Record record = new Record(context.getModelManager().get().getEntityType(Test.class));
+		record.addValue(ValueType.LONG.create("Id", 1L));
+		record.addValue(ValueType.STRING.create("Name", "Test-Name"));
+		Result result = new Result();
+		result.addRecord(record);
+
+		Query query = mock(Query.class);
+		when(query.select(Mockito.any(Attribute.class))).thenReturn(query);
+		when(query.group(Mockito.any(Attribute.class))).thenReturn(query);
+		when(query.fetch()).thenReturn(Arrays.asList(result));
+
+		org.eclipse.mdm.api.base.query.QueryService qs = mock(org.eclipse.mdm.api.base.query.QueryService.class);
+		when(qs.createQuery()).thenReturn(query);
+		when(context.getQueryService()).thenReturn(Optional.of(qs));
+
+		ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+		when(connectorService.getContextByName("env1")).thenReturn(context);
+
+		QueryService queryService = new QueryService();
+		queryService.connectorService = connectorService;
+
+		SuggestionRequest request = new SuggestionRequest();
+		request.setSourceNames(Arrays.asList("env1"));
+		request.setType("Test");
+		request.setAttrName("Name");
+
+		assertThat(queryService.getSuggestions(request)).contains("Test-Name");
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/query/boundary/QueryTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/query/boundary/QueryTest.java
new file mode 100644
index 0000000..6bac3ba
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/query/boundary/QueryTest.java
@@ -0,0 +1,134 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.query.boundary;
+
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_PASSWORD;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_SERVICENAME;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_USER;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.odsadapter.ODSContextFactory;
+import org.eclipse.mdm.query.entity.Column;
+import org.eclipse.mdm.query.entity.Row;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.google.common.base.Strings;
+
+public class QueryTest {
+
+	/*
+	 * ATTENTION: ==========
+	 *
+	 * To run this test make sure the target service is running a MDM default model
+	 * and any database constraint which enforces a relation of Test to a parent
+	 * entity is deactivated!
+	 */
+
+	private static final String NAME_SERVICE = "corbaloc::1.2@%s:%s/NameService";
+
+	private static final String USER = "sa";
+	private static final String PASSWORD = "sa";
+
+	private static ApplicationContext context;
+	private static ModelManager modelManager;
+	private static org.eclipse.mdm.api.base.query.QueryService queryService;
+
+	@BeforeClass
+	public static void setUpBeforeClass() throws ConnectionException {
+		String nameServiceHost = System.getProperty("host");
+		String nameServicePort = System.getProperty("port");
+		String serviceName = System.getProperty("service");
+
+		if (nameServiceHost == null || nameServiceHost.isEmpty()) {
+			throw new IllegalArgumentException("name service host is unknown: define system property 'host'");
+		}
+
+		nameServicePort = nameServicePort == null || nameServicePort.isEmpty() ? String.valueOf(2809) : nameServicePort;
+		if (nameServicePort == null || nameServicePort.isEmpty()) {
+			throw new IllegalArgumentException("name service port is unknown: define system property 'port'");
+		}
+
+		if (serviceName == null || serviceName.isEmpty()) {
+			throw new IllegalArgumentException("service name is unknown: define system property 'service'");
+		}
+
+		Map<String, String> connectionParameters = new HashMap<>();
+		connectionParameters.put(PARAM_NAMESERVICE, String.format(NAME_SERVICE, nameServiceHost, nameServicePort));
+		connectionParameters.put(PARAM_SERVICENAME, serviceName + ".ASAM-ODS");
+		connectionParameters.put(PARAM_USER, USER);
+		connectionParameters.put(PARAM_PASSWORD, PASSWORD);
+
+		context = new ODSContextFactory().connect(connectionParameters);
+		modelManager = context.getModelManager().orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+		queryService = context.getQueryService().orElseThrow(() -> new ServiceNotProvidedException(QueryService.class));
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws ConnectionException {
+		if (context != null) {
+			context.close();
+		}
+	}
+
+	@org.junit.Test
+	@Ignore
+	public void test() throws DataAccessException, JsonGenerationException, JsonMappingException, IOException {
+
+		List<Result> result = queryService.createQuery().select(modelManager.getEntityType("Test").getAttribute("Id"))
+				.select(modelManager.getEntityType("Test").getAttribute("Name"))
+				.select(modelManager.getEntityType("TestStep").getAttribute("Id"))
+				.select(modelManager.getEntityType("TestStep").getAttribute("Name")).fetch();
+
+		List<Row> rows = new ArrayList<>();
+
+		for (Result r : result) {
+			Row row = new Row();
+			for (Record record : r) {
+				for (Value value : record.getValues().values()) {
+					row.addColumn(new Column(record.getEntityType().getName(), value.getName(),
+							Strings.emptyToNull(Objects.toString(value.extract())),
+							Strings.emptyToNull(value.getUnit())));
+				}
+			}
+			rows.add(row);
+		}
+
+		ObjectMapper mapper = new ObjectMapper();
+		mapper.enable(SerializationFeature.INDENT_OUTPUT);
+		mapper.writeValue(System.out, rows);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/shoppingbasket/boundary/ShoppingBasketResourceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/shoppingbasket/boundary/ShoppingBasketResourceTest.java
new file mode 100644
index 0000000..ed7c7b3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/java/org/eclipse/mdm/shoppingbasket/boundary/ShoppingBasketResourceTest.java
@@ -0,0 +1,173 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.shoppingbasket.boundary;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+import static org.mockito.Mockito.when;
+
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Optional;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.UriBuilder;
+import javax.xml.XMLConstants;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+
+import org.assertj.core.groups.Tuple;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.shoppingbasket.entity.MDMItem;
+import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasket;
+import org.eclipse.mdm.shoppingbasket.entity.ShoppingBasketRequest;
+import org.glassfish.hk2.api.Factory;
+import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import org.glassfish.jersey.jackson.JacksonFeature;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseyTest;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import com.google.common.collect.ImmutableMap;
+
+public class ShoppingBasketResourceTest extends JerseyTest {
+
+	private static ApplicationContext context = Mockito.mock(ApplicationContext.class);
+	private static EntityManager em = Mockito.mock(EntityManager.class);
+	private static ConnectorService connectorService = Mockito.mock(ConnectorService.class);
+
+	private static TestStep testStep = Mockito.mock(TestStep.class);
+	private static Measurement measurement = Mockito.mock(Measurement.class);
+
+	public static class ConnectorServiceFactory implements Factory<ConnectorService> {
+		@Override
+		public void dispose(ConnectorService connectorService) {
+			// nothing to do here
+		}
+
+		@Override
+		public ConnectorService provide() {
+			return connectorService;
+		}
+	}
+
+	@Override
+	public Application configure() {
+		ResourceConfig config = new ResourceConfig();
+
+		config.register(new AbstractBinder() {
+			@Override
+			protected void configure() {
+				bindFactory(ConnectorServiceFactory.class).to(ConnectorService.class);
+			}
+		});
+
+		config.register(ShoppingBasketResource.class);
+		config.register(JacksonFeature.class);
+		return config;
+	}
+
+	@Before
+	public void init() {
+
+		when(testStep.getSourceName()).thenReturn("MDMTEST");
+		when(testStep.getTypeName()).thenReturn("TestStep");
+		when(testStep.getID()).thenReturn("1");
+
+		when(measurement.getSourceName()).thenReturn("MDMTEST");
+		when(measurement.getTypeName()).thenReturn("Measurement");
+		when(measurement.getID()).thenReturn("2");
+
+		when(connectorService.getContextByName("MDMTEST")).thenReturn(context);
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		when(em.load(TestStep.class, "1")).thenReturn(testStep);
+		when(context.getAdapterType()).thenReturn("ods");
+		when(em.getLinks(Mockito.anyList())).thenReturn(ImmutableMap.of(testStep, "servicename/asampath"));
+	}
+
+	@Test
+	public void testEmptyShoppingBasketRequest() {
+		ShoppingBasketRequest request = new ShoppingBasketRequest();
+
+		ShoppingBasket basket = target("shoppingbasket").request().post(Entity.json(request), ShoppingBasket.class);
+		assertThat(basket.getItems()).isEmpty();
+	}
+
+	@Test
+	public void testShoppingBasket() throws DataAccessException, URISyntaxException {
+		when(em.getLinks(Mockito.anyList())).thenReturn(ImmutableMap.of(testStep, "servicename/asampath/testStep",
+				measurement, "servicename/asampath/measurement"));
+
+		ShoppingBasket basket = target("shoppingbasket").request().post(Entity.json(getShoppingBasketRequest()),
+				ShoppingBasket.class);
+
+		assertThat(basket.getName()).isEqualTo("my shopping basket (<äöüß\\/>)");
+		assertThat(basket.getItems()).extracting(i -> Tuple.tuple(i.getSource(), i.getLink(), i.getRestURI()))
+				.containsExactly(
+						Tuple.tuple("ods", "servicename/asampath/testStep",
+								UriBuilder.fromUri(this.getBaseUri()).path("/environments/MDMTEST/teststeps/1")
+										.build()),
+						Tuple.tuple("ods", "servicename/asampath/measurement", UriBuilder.fromUri(this.getBaseUri())
+								.path("/environments/MDMTEST/measurements/2").build()));
+	}
+
+	@Test
+	public void testValidateShoppingBasketXml() {
+		String xml = target("shoppingbasket").request().post(Entity.json(getShoppingBasketRequest()), String.class);
+		validateAgainstXSD(xml, ShoppingBasketResourceTest.class.getResourceAsStream("/shoppingbasket1.0.xsd"));
+		System.out.println(xml);
+	}
+
+	private ShoppingBasketRequest getShoppingBasketRequest() {
+		MDMItem item1 = new MDMItem();
+		item1.setSource("MDMTEST");
+		item1.setType("TestStep");
+		item1.setId("1");
+
+		MDMItem item2 = new MDMItem();
+		item2.setSource("MDMTEST");
+		item2.setType("Measurement");
+		item2.setId("2");
+
+		ShoppingBasketRequest request = new ShoppingBasketRequest();
+		request.setName("my shopping basket (<äöüß\\/>)");
+		request.setItems(Arrays.asList(item1, item2));
+		return request;
+	}
+
+	private void validateAgainstXSD(String xml, InputStream xsd) {
+		try {
+			SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+			Schema schema = factory.newSchema(new StreamSource(xsd));
+			Validator validator = schema.newValidator();
+			validator.validate(new StreamSource(new StringReader(xml)));
+		} catch (Exception ex) {
+			fail("XML could not be validated: " + xml, ex);
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/resources/logback-test.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..07612dd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/src/test/resources/logback-test.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<configuration debug="false" scan="true">

+

+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

+    <!-- encoders are assigned the type

+         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->

+    <encoder>

+      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

+    </encoder>

+  </appender>

+

+  <logger name="org.eclipse.mdm" level="DEBUG" />

+  

+  <root level="INFO">

+    <appender-ref ref="STDOUT" />

+  </root>

+</configuration>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/target/generated-sources/antlr4/org/eclipse/mdm/businessobjects/filter/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/target/generated-sources/antlr4/org/eclipse/mdm/businessobjects/filter/.gitignore
new file mode 100644
index 0000000..651663d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.businessobjects/target/generated-sources/antlr4/org/eclipse/mdm/businessobjects/filter/.gitignore
@@ -0,0 +1,8 @@
+/FilterGrammar.tokens
+/FilterGrammarBaseListener.java
+/FilterGrammarBaseVisitor.java
+/FilterGrammarLexer.java
+/FilterGrammarLexer.tokens
+/FilterGrammarListener.java
+/FilterGrammarParser.java
+/FilterGrammarVisitor.java
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/build.gradle
new file mode 100644
index 0000000..0664b25
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/build.gradle
@@ -0,0 +1,31 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+description = 'MDM Connector'
+
+dependencies {
+	compile "org.eclipse.mdm:org.eclipse.mdm.api.default:${version}"
+	compile project(':org.eclipse.mdm.property')
+	compile group: 'com.google.guava', name: 'guava', version: "25.0-jre"
+
+	compile group: 'org.apache.commons', name: 'commons-text', version: '1.6'
+
+	compileOnly 'javax:javaee-api:7.0'
+}
+
+jar {
+	metaInf { from '../NOTICE.txt' }
+	metaInf { from '../LICENSE.txt' }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/configuration/service.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/configuration/service.xml
new file mode 100644
index 0000000..feeecfa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/configuration/service.xml
@@ -0,0 +1,46 @@
+<!-- 
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ -->
+
+<services>
+	<service entityManagerFactoryClass="org.eclipse.mdm.api.odsadapter.ODSContextFactory">
+		<param name="nameservice">corbaloc::1.2@YOUR_HOST1:2809/NameService</param>
+		<param name="servicename">YOUR_SERVICE1.ASAM-ODS</param>
+	</service>
+	<service entityManagerFactoryClass="org.eclipse.mdm.api.odsadapter.ODSContextFactory">
+		<param name="nameservice">corbaloc::1.2@YOUR_HOST2:2809/NameService</param>
+		<param name="servicename">YOUR_SERVICE2.ASAM-ODS</param>
+		
+		<!-- Specify the credentials of the technical user which opens sessions on behalf of the login user -->
+		<param name="user">sa</param>
+		<!-- param values can contain lookups. For example ${sys:odsPassword} will be replaced with the contents of the system variable 'odsPassword' -->
+		<param name="password">sa</param>
+		
+		<!--Activeate indexing on Peak ODS Server -->
+		<param name="freetext.active">true</param>
+		<param name="freetext.notificationType">peak</param>
+		<param name="freetext.notificationUrl">http://YOUR_HOST2:8089/api</param>
+	</service>
+	<service entityManagerFactoryClass="org.eclipse.mdm.api.odsadapter.ODSContextFactory">
+		<param name="nameservice">corbaloc::1.2@YOUR_HOST3:2809/NameService</param>
+		<param name="servicename">YOUR_SERVICE3.ASAM-ODS</param>
+		
+		<!-- Specify the credentials of the technical user which opens sessions on behalf of the login user -->
+		<param name="user">sa</param>
+		<param name="password">sa</param>
+		
+		<!--Activate indexing on a Avalon server -->
+		<param name="freetext.active">true</param>
+		<param name="freetext.notificationType">avalon</param>
+		<param name="freetext.pollingInterval">5000</param>
+	</service>
+</services>
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/boundary/ConnectorService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/boundary/ConnectorService.java
new file mode 100644
index 0000000..756ea6a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/boundary/ConnectorService.java
@@ -0,0 +1,236 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.connector.boundary;
+
+import java.io.Serializable;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.enterprise.context.SessionScoped;
+import javax.inject.Inject;
+import javax.security.auth.spi.LoginModule;
+
+import org.apache.commons.text.StringSubstitutor;
+import org.apache.commons.text.lookup.StringLookup;
+import org.apache.commons.text.lookup.StringLookupFactory;
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.ApplicationContextFactory;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.control.ServiceConfigurationActivity;
+import org.eclipse.mdm.connector.entity.ServiceConfiguration;
+import org.eclipse.mdm.property.GlobalProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+/**
+ * ConnectorServcie Bean implementation to create and close connections
+ *
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ * @author Canoo Engineering (removal of hardcoded ODS dependencies)
+ *
+ */
+@SessionScoped
+public class ConnectorService implements Serializable {
+
+	private static final long serialVersionUID = -5891142709182298531L;
+
+	private static final Logger LOG = LoggerFactory.getLogger(ConnectorService.class);
+	private static final String CONNECTION_PARAM_FOR_USER = "for_user";
+
+	@Inject
+	Principal principal;
+
+	@Inject
+	ServiceConfigurationActivity serviceConfigurationActivity;
+
+	@Inject
+	@GlobalProperty
+	private Map<String, String> globalProperties = Collections.emptyMap();
+
+	private List<ApplicationContext> contexts = Lists.newArrayList();
+
+	private Map<ApplicationContext, ServiceConfiguration> serviceConfigs = new ConcurrentHashMap<>();
+
+	private transient StringLookup stringLookup = StringLookupFactory.INSTANCE.interpolatorStringLookup();
+	private transient StringSubstitutor substitutor = new StringSubstitutor(stringLookup);
+
+	public ConnectorService() {
+		// empty constructor for CDI
+	}
+
+	/**
+	 * Creates a connector service for usage outside the session scope of CDI.
+	 * 
+	 * @param principal        Principal the connector service uses.
+	 * @param globalProperties global properties supplied the opened application
+	 *                         contexts.
+	 */
+	public ConnectorService(Principal principal, Map<String, String> globalProperties) {
+		super();
+		this.principal = principal;
+		this.serviceConfigurationActivity = new ServiceConfigurationActivity();
+		this.globalProperties = globalProperties;
+	}
+
+	/**
+	 * returns all available {@link ApplicationContext}s
+	 *
+	 * @return list of available {@link ApplicationContext}s
+	 */
+	public List<ApplicationContext> getContexts() {
+		return ImmutableList.copyOf(contexts);
+	}
+
+	/**
+	 * returns an {@link ApplicationContext} identified by the given name
+	 *
+	 * @param name source name (e.g. MDM {@link Environment} name)
+	 * @return the matching {@link ApplicationContext}
+	 */
+	public ApplicationContext getContextByName(String name) {
+		try {
+			for (ApplicationContext context : getContexts()) {
+				String sourceName = context.getEntityManager()
+						.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class)).loadEnvironment()
+						.getSourceName();
+
+				if (sourceName.equals(name)) {
+					return context;
+				}
+			}
+			String errorMessage = "no data source with environment name '" + name + "' connected!";
+			throw new ConnectorServiceException(errorMessage);
+
+		} catch (DataAccessException e) {
+			throw new ConnectorServiceException(e.getMessage(), e);
+		}
+
+	}
+
+	@PostConstruct
+	public void connect() {
+		LOG.info("connecting user with name '" + principal.getName() + "'");
+		this.contexts = serviceConfigurationActivity.readServiceConfigurations().stream().map(this::connectContexts)
+				.filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
+	}
+
+	/**
+	 * disconnect from all connected data sources This method is call from a
+	 * {@link LoginModule} at logout
+	 *
+	 * This method is call from a {@link LoginModule}
+	 *
+	 */
+	@PreDestroy
+	public void disconnect() {
+		for (ApplicationContext context : new ArrayList<>(contexts)) {
+			disconnectContext(context);
+		}
+		LOG.info("user with name '" + principal.getName() + "' has been disconnected!");
+	}
+
+	/**
+	 * Tries to close the given context and reconnect.
+	 * 
+	 * @param context ApplicationContext to reconnect
+	 * @return the reconnected context
+	 */
+	public Optional<ApplicationContext> reconnect(ApplicationContext context) {
+		try {
+			context.close();
+		} catch (Exception e) {
+			LOG.warn("Unable to close ApplicationContext!", e);
+		}
+		ServiceConfiguration serviceConfig = serviceConfigs.remove(context);
+		contexts.remove(context);
+
+		if (serviceConfig == null) {
+			LOG.warn("Could not reconnect ApplicationContext, because service configuration is null!");
+			return Optional.empty();
+		} else {
+			return connectContexts(serviceConfig);
+		}
+	}
+
+	private Optional<ApplicationContext> connectContexts(ServiceConfiguration source) {
+		try {
+
+			Class<? extends ApplicationContextFactory> contextFactoryClass = Thread.currentThread()
+					.getContextClassLoader().loadClass(source.getContextFactoryClass())
+					.asSubclass(ApplicationContextFactory.class);
+			ApplicationContextFactory contextFactory = contextFactoryClass.newInstance();
+
+			Map<String, String> connectionParameters = new HashMap<>();
+			connectionParameters.putAll(globalProperties);
+			connectionParameters.putAll(processLookups(source.getConnectionParameters()));
+			connectionParameters.put(CONNECTION_PARAM_FOR_USER, principal.getName());
+
+			ApplicationContext context = contextFactory.connect(connectionParameters);
+			serviceConfigs.put(context, source);
+			contexts.add(context);
+			return Optional.of(context);
+
+		} catch (ConnectionException e) {
+			LOG.warn("unable to logon user with name '" + principal.getName() + "' at data source '"
+					+ source.getContextFactoryClass() + "' (reason: " + e.getMessage() + ")");
+		} catch (Exception e) {
+			LOG.error("failed to initialize entity manager using factory '" + source.getContextFactoryClass()
+					+ "' (reason: " + e + ")", e);
+		}
+		return Optional.empty();
+	}
+
+	/**
+	 * Processes lookups on the values of the map
+	 * 
+	 * @param map
+	 * @return map with applied lookups
+	 */
+	protected Map<String, String> processLookups(Map<String, String> map) {
+		return map.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> substitutor.replace(e.getValue())));
+	}
+
+	private void disconnectContext(ApplicationContext context) {
+		try {
+			if (context != null) {
+				context.close();
+			}
+		} catch (ConnectionException e) {
+			LOG.error("unable to logout user from MDM datasource (reason: " + e.getMessage() + ")");
+			throw new ConnectorServiceException(e.getMessage(), e);
+		} finally {
+			serviceConfigs.remove(context);
+			contexts.remove(context);
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/boundary/ConnectorServiceException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/boundary/ConnectorServiceException.java
new file mode 100644
index 0000000..8ee13c4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/boundary/ConnectorServiceException.java
@@ -0,0 +1,29 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.connector.boundary;
+
+public class ConnectorServiceException extends RuntimeException {
+
+	private static final long serialVersionUID = 3491930665127242286L;
+
+	public ConnectorServiceException(String message) {
+		super(message);
+	}
+
+	public ConnectorServiceException(String message, Throwable t) {
+		super(message, t);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/control/ServiceConfigurationActivity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/control/ServiceConfigurationActivity.java
new file mode 100644
index 0000000..2dc8f08
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/control/ServiceConfigurationActivity.java
@@ -0,0 +1,139 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.connector.control;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Stateless;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.eclipse.mdm.connector.boundary.ConnectorServiceException;
+import org.eclipse.mdm.connector.entity.ServiceConfiguration;
+import org.eclipse.mdm.property.GlobalPropertyService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * ServiceConfigurationReader to read MDM Service configurations from a
+ * service.xml file
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ * @author Canoo Engineering AG (support for arbitrary entity manager factories
+ *         and connection parameters)
+ *
+ */
+@Stateless
+public class ServiceConfigurationActivity {
+
+	private static final Logger LOG = LoggerFactory.getLogger(ServiceConfigurationActivity.class);
+
+	private static final String COMPONENT_CONFIG_FOLDER = "org.eclipse.mdm.connector";
+	private static final String SERVICE_XML_FILE_NAME = "service.xml";
+
+	private static final String ROOT_ELEMENT_NAME = "services";
+	private static final String SERVICE_ELEMENT_NAME = "service";
+	private static final String PARAM_ELEMENT_NAME = "param";
+	private static final String EMFACTORYCLASS_ATTRIBUTE_NAME = "entityManagerFactoryClass";
+	private static final String NAME_ATTRIBUTE_NAME = "name";
+
+	public List<ServiceConfiguration> readServiceConfigurations() {
+
+		try (InputStream is = new BufferedInputStream(getServiceConfiguration())) {
+
+			DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			Document doc = db.parse(is);
+
+			Element root = doc.getDocumentElement();
+			if (!ROOT_ELEMENT_NAME.equals(root.getNodeName())) {
+				throw new ConnectorServiceException(
+						"unable to find root element with name '" + ROOT_ELEMENT_NAME + "'");
+			}
+
+			NodeList serviceElements = root.getElementsByTagName(SERVICE_ELEMENT_NAME);
+			List<ServiceConfiguration> parsedServiceElements = new ArrayList<>(serviceElements.getLength());
+			for (int i = 0, n = serviceElements.getLength(); i < n; i++) {
+				parsedServiceElements.add(parseServiceElement((Element) serviceElements.item(i)));
+			}
+
+			if (parsedServiceElements.isEmpty()) {
+				LOG.warn("No service connectors are configured. This is probably wrong!");
+				throw new IllegalStateException("No configured connectors!");
+			}
+			return parsedServiceElements;
+
+		} catch (ConnectorServiceException e) {
+			LOG.error("Could not create connector service", e);
+			throw e;
+		} catch (Exception e) {
+			LOG.error("Could not create connector service", e);
+			throw new ConnectorServiceException(e.toString(), e);
+		}
+	}
+
+	private static ServiceConfiguration parseServiceElement(Element serviceElement) {
+		String entityManagerFactoryClass = readElementAttribute(serviceElement, EMFACTORYCLASS_ATTRIBUTE_NAME);
+		NodeList paramElements = serviceElement.getElementsByTagName(PARAM_ELEMENT_NAME);
+		Map<String, String> connectionParameters = new LinkedHashMap<>(paramElements.getLength());
+		for (int i = 0, n = paramElements.getLength(); i < n; i++) {
+			Element paramElement = (Element) paramElements.item(i);
+			String paramName = readElementAttribute(paramElement, NAME_ATTRIBUTE_NAME);
+			String paramValue = paramElement.getTextContent();
+			if (paramValue != null && !(paramValue = paramValue.trim()).isEmpty()) {
+				connectionParameters.put(paramName, paramValue);
+			}
+		}
+		return new ServiceConfiguration(entityManagerFactoryClass, connectionParameters);
+	}
+
+	private static String readElementAttribute(Element element, String attrName) {
+		String value = element.getAttribute(attrName);
+		if (value.trim().isEmpty()) {
+			throw new ConnectorServiceException(
+					"mandatory attribute '" + attrName + "' of element '" + element.getNodeName() + "' is missing!");
+		}
+		return value;
+	}
+
+	private static InputStream getServiceConfiguration() throws FileNotFoundException {
+		String configRoot = System.getProperty(GlobalPropertyService.PROPERTY_CONFIG_PATH, ".");
+		LOG.info("found system property {} with value {}", GlobalPropertyService.PROPERTY_CONFIG_PATH, configRoot);
+
+		File file = new File(configRoot, COMPONENT_CONFIG_FOLDER);
+		if (!file.exists() || !file.isDirectory()) {
+			throw new ConnectorServiceException(
+					"mandatory configuration folder '" + file.getAbsolutePath() + "' does not exist!");
+		}
+		File serviceXML = new File(file, SERVICE_XML_FILE_NAME);
+		if (!file.exists()) {
+			throw new ConnectorServiceException(
+					"mandatory service configuration file at '" + serviceXML.getAbsolutePath() + "' does not exist!");
+		}
+
+		LOG.info("loading service configuration from file: {}", serviceXML);
+		return new FileInputStream(serviceXML);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/entity/ServiceConfiguration.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/entity/ServiceConfiguration.java
new file mode 100644
index 0000000..b1074e5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/main/java/org/eclipse/mdm/connector/entity/ServiceConfiguration.java
@@ -0,0 +1,90 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.connector.entity;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * ServiceConfiguration
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ * @author Canoo Engineering AG (support for arbitrary entity manager factories
+ *         and connection parameters)
+ *
+ */
+public class ServiceConfiguration {
+
+	/**
+	 * The fully qualified class name of the entity manager factory for this
+	 * backend, never null.
+	 */
+	private final String contextFactoryClass;
+
+	/**
+	 * An unmodifiable map holding the connection parameters for this backend; never
+	 * null, but possibly empty.
+	 */
+	private final Map<String, String> connectionParameters;
+
+	/**
+	 * Constructs a new instance with the specified properties. The specified
+	 * parameter map is copied by this constructor and no reference to the original
+	 * is retained.
+	 * 
+	 * @param entityManagerFactoryClass the fully qualified class name of the entity
+	 *                                  manager factory for this backend, must not
+	 *                                  be null
+	 * @param connectionParameters      a map holding the connection parameters for
+	 *                                  this backend, or null to use an empty map
+	 *                                  instead
+	 */
+	public ServiceConfiguration(String contextFactoryClass, Map<String, String> connectionParameters) {
+		this.contextFactoryClass = Objects.requireNonNull(contextFactoryClass,
+				"Null \"contextFactoryClass\" argument passed to ServiceConfiguration constructor");
+		this.connectionParameters = (connectionParameters == null ? Collections.emptyMap()
+				: Collections.unmodifiableMap(new LinkedHashMap<>(connectionParameters)));
+	}
+
+	/**
+	 * Returns the fully qualified class name of the entity manager factory for this
+	 * backend. The result is never null.
+	 * 
+	 * @return the entity manager factory class name passed to the constructor,
+	 *         never null
+	 */
+	public String getContextFactoryClass() {
+		return contextFactoryClass;
+	}
+
+	/**
+	 * Returns an unmodifiable map holding the connection parameters for this
+	 * backend. The result is never null, but may be empty.
+	 * 
+	 * @return an unmodifiable copy of the connection parameter map passed to the
+	 *         constructor; never null, but possibly empty
+	 */
+	public Map<String, String> getConnectionParameters() {
+		return connectionParameters;
+	}
+
+	@Override
+	public String toString() {
+		return this.contextFactoryClass + "#" + connectionParameters;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/test/java/org/eclipse/mdm/connector/boundary/ConnectorServiceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/test/java/org/eclipse/mdm/connector/boundary/ConnectorServiceTest.java
new file mode 100644
index 0000000..e9af581
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/test/java/org/eclipse/mdm/connector/boundary/ConnectorServiceTest.java
@@ -0,0 +1,196 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.connector.boundary;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Constructor;
+import java.security.Principal;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.ejb.SessionContext;
+
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.ApplicationContextFactory;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.control.ServiceConfigurationActivity;
+import org.eclipse.mdm.connector.entity.ServiceConfiguration;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * JUNIT Test for {@link ConnectorService}
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ * @author Canoo Engineering (more tests)
+ *
+ */
+@SuppressWarnings("javadoc")
+public class ConnectorServiceTest {
+
+	private final Principal testUser = new SimplePrincipal("testUser");
+	private static final String testSourceName = "testSource";
+	private final String differentSourceName = "differentSource";
+
+	@Test
+	public void testGetEntityManagers_happyFlow() throws Exception {
+		ConnectorService connectorService = createConnectorService(testUser);
+		connectorService.connect();
+		assertThat(connectorService.getContexts().size(), is(1));
+	}
+
+	@Test(expected = ConnectorServiceException.class)
+	public void testGetEntityManagerByName_differentSourceName() throws Exception {
+		ConnectorService connectorService = createConnectorService(testUser);
+		connectorService.connect();
+		connectorService.getContextByName(differentSourceName);
+	}
+
+	@Test
+	public void testGetEntityManagerByName_happyFlow() throws Exception {
+		ConnectorService connectorService = createConnectorService(testUser);
+		connectorService.connect();
+		assertNotNull(connectorService.getContextByName(testSourceName));
+	}
+
+	@Test
+	public void testDisconnect() throws Exception {
+		ConnectorService connectorService = createConnectorService(testUser);
+		connectorService.disconnect();
+	}
+
+	private static final class SimplePrincipal implements Principal {
+		private final String name;
+
+		SimplePrincipal(String name) {
+			this.name = Objects.requireNonNull(name);
+		}
+
+		@Override
+		public String getName() {
+			return name;
+		}
+
+		@Override
+		public boolean equals(Object obj) {
+			return (obj instanceof SimplePrincipal && ((SimplePrincipal) obj).name.equals(name));
+		}
+
+		@Override
+		public int hashCode() {
+			return name.hashCode();
+		}
+
+		@Override
+		public String toString() {
+			return name;
+		}
+
+	}
+
+	private static ConnectorService createConnectorService(Principal user) throws Exception {
+
+		SessionContext sessionContextMock = mock(SessionContext.class);
+		when(sessionContextMock.getCallerPrincipal()).thenReturn(user);
+
+		ServiceConfiguration serviceConfiguration = new ServiceConfiguration(TestContextFactory.class.getName(),
+				Collections.emptyMap());
+
+		ConnectorService connectorService = new ConnectorService();
+
+		connectorService.principal = user;
+
+		ServiceConfigurationActivity serviceConfigurationActivity = mock(ServiceConfigurationActivity.class);
+		when(serviceConfigurationActivity.readServiceConfigurations())
+				.thenReturn(Collections.singletonList(serviceConfiguration));
+		connectorService.serviceConfigurationActivity = serviceConfigurationActivity;
+
+		return connectorService;
+	}
+
+	public static final class TestContextFactory implements ApplicationContextFactory {
+
+		@Override
+		public ApplicationContext connect(Map<String, String> connectionParameters) throws ConnectionException {
+			return createContext(testSourceName);
+		}
+	}
+
+	private static ApplicationContext createContext(String sourceName) {
+		Environment env = createEntityMock(Environment.class, "MDMTest", sourceName, "1");
+
+		EntityManager em = mock(EntityManager.class);
+		when(em.loadEnvironment()).thenReturn(env);
+
+		ApplicationContext ctx = mock(ApplicationContext.class);
+		when(ctx.getEntityManager()).thenReturn(Optional.of(em));
+
+		return ctx;
+	}
+
+	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id) {
+
+		Map<String, Value> entityAttributes = new HashMap<>();
+		entityAttributes.put("Name", ValueType.STRING.create("Name", name));
+
+		Core core = mock(Core.class);
+		when(core.getSourceName()).thenReturn(sourceName);
+		when(core.getValues()).thenReturn(entityAttributes);
+		when(core.getID()).thenReturn(id);
+
+		try {
+			Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
+			constructor.setAccessible(true);
+			return constructor.newInstance(core);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	@Test
+	public void testProcessLookupsSys() throws Exception {
+		ConnectorService connectorService = createConnectorService(testUser);
+
+		System.setProperty("MY_PASSWORD", "s3cr3t");
+		assertThat(connectorService.processLookups(ImmutableMap.of("password", "${sys:MY_PASSWORD}")))
+				.containsEntry("password", "s3cr3t");
+		System.setProperty("MY_PASSWORD", "");
+	}
+
+	@Test
+	public void testProcessLookupsProperties() throws Exception {
+		ConnectorService connectorService = createConnectorService(testUser);
+
+		assertThat(connectorService.processLookups(
+				ImmutableMap.of("password", "${properties:src/test/resources/lookup.properties::MyPassword}")))
+						.containsEntry("password", "s4cr4t");
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/test/resources/lookup.properties b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/test/resources/lookup.properties
new file mode 100644
index 0000000..6340709
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.connector/src/test/resources/lookup.properties
@@ -0,0 +1 @@
+MyPassword=s4cr4t
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/build.gradle
new file mode 100644
index 0000000..d7aad6d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/build.gradle
@@ -0,0 +1,39 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+description = 'file release component'
+
+apply plugin: 'java'
+apply plugin: 'maven'
+apply plugin: 'eclipse'
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+
+repositories {
+	mavenLocal()
+	mavenCentral()
+}
+
+
+dependencies {
+	compile project (':org.eclipse.mdm.connector')
+	compile project (':org.eclipse.mdm.property')
+}
+
+jar {
+	metaInf { from '../NOTICE.txt' }
+	metaInf { from '../LICENSE.txt' }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/BESA/model.atfx.technical b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/BESA/model.atfx.technical
new file mode 100644
index 0000000..43ab7a0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/BESA/model.atfx.technical
@@ -0,0 +1,17 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+<?xml version="1.0" encoding="utf-8"?>
+
+<atfx_file xmlns="http://www.asam.net/ODS/5.1/Schema" version="atfx_file: V1.1.0" xmlns:ext="urn:schemas-microsoft-com:xslt" xmlns:rdb="http://www.muellerbbm-vas.de/ods/rdb" xmlns:utils="java:vas.xml.Util"><base_model_version>asam29</base_model_version><application_model><application_enumeration><name>axistype</name><item><name>Xaxis</name><value>0</value></item><item><name>Yaxis</name><value>1</value></item><item><name>Both</name><value>2</value></item></application_enumeration><application_enumeration><name>coordinate_system_types</name><item><name>Cartesian</name><value>0</value></item><item><name>Polar</name><value>1</value></item><item><name>Cylindric</name><value>2</value></item></application_enumeration><application_enumeration><name>location_modes</name><item><name>Fixed</name><value>0</value></item><item><name>Varying</name><value>1</value></item></application_enumeration><application_element><name>env</name><basetype>AoEnvironment</basetype><application_attribute><name>env_iid</name><base_attribute>id</base_attribute><rdb:column>ENV_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>skill</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>SKILL</rdb:column></application_attribute><application_attribute><name>id</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>ID</rdb:column></application_attribute><application_attribute><name>touched</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>TOUCHED</rdb:column></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute><length>4000</length><rdb:column>DESCR</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>VERSION</rdb:column></application_attribute><relation_attribute><name>prj_iid</name><ref_to>prj</ref_to><base_relation>tests</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>PROJECT__.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>ins_iid</name><ref_to>ins</ref_to><base_relation>equipments</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>SETUP_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>uuts</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>FREMDMOTOR_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>uuts</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>MOTOR_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messtext_iid</name><ref_to>messtext</ref_to><base_relation>sequences</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>MESSTEXT_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>randbedingung_iid</name><ref_to>randbedingung</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>RANDBEDINGUNG_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messzyklus_iid</name><ref_to>messzyklus</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>MESSZYKLUS_.ENV_IID IN (?)</rdb:join></relation_attribute><rdb:aid>1</rdb:aid><rdb:table>ENVIRONMENT_</rdb:table></application_element><application_element><name>dim</name><basetype>AoPhysicalDimension</basetype><application_attribute><name>dim_iid</name><base_attribute>id</base_attribute><rdb:column>DIM_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>meter_exp</name><base_attribute>length_exp</base_attribute><rdb:column>LEN</rdb:column></application_attribute><application_attribute><name>kilogramm_exp</name><base_attribute>mass_exp</base_attribute><rdb:column>MASS</rdb:column></application_attribute><application_attribute><name>second_exp</name><base_attribute>time_exp</base_attribute><rdb:column>TIM</rdb:column></application_attribute><application_attribute><name>ampere_exp</name><base_attribute>current_exp</base_attribute><rdb:column>CUR</rdb:column></application_attribute><application_attribute><name>kelvin_exp</name><base_attribute>temperature_exp</base_attribute><rdb:column>T</rdb:column></application_attribute><application_attribute><name>mol_exp</name><base_attribute>molar_amount_exp</base_attribute><rdb:column>PART</rdb:column></application_attribute><application_attribute><name>candela_exp</name><base_attribute>luminous_intensity_exp</base_attribute><rdb:column>LUM</rdb:column></application_attribute><application_attribute><name>angle</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>ANGLE</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>units</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dim_iid</inverse_name><rdb:join>UNIT_.DIM_IID IN (?)</rdb:join></relation_attribute><rdb:aid>2</rdb:aid><rdb:table>DIMENSION_</rdb:table></application_element><application_element><name>gru</name><basetype>AoUnitGroup</basetype><application_attribute><name>gru_iid</name><base_attribute>id</base_attribute><rdb:column>GRU_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>units</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>gru_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>UNIT_.UNT_IID=.UNT_IID AND .GRU_IID IN (?)</rdb:join></relation_attribute><rdb:aid>3</rdb:aid><rdb:table>UNITSYSTEM_</rdb:table></application_element><application_element><name>unt</name><basetype>AoUnit</basetype><application_attribute><name>unt_iid</name><base_attribute>id</base_attribute><rdb:column>UNT_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>offset</name><base_attribute>offset</base_attribute><rdb:column>OFFSET</rdb:column></application_attribute><application_attribute><name>factor</name><base_attribute>factor</base_attribute><rdb:column>FACTOR</rdb:column></application_attribute><application_attribute><name>dB</name><datatype>DT_SHORT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DBFLG</rdb:column></application_attribute><application_attribute><name>dB_reference_factor</name><datatype>DT_FLOAT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DBREF</rdb:column></application_attribute><relation_attribute><name>dim_iid</name><ref_to>dim</ref_to><base_relation>phys_dimension</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>unt_iid</inverse_name><rdb:column>DIM_IID</rdb:column><rdb:join>UNIT_.UNT_IID IN (?) AND UNIT_.DIM_IID=DIMENSION_.DIM_IID</rdb:join></relation_attribute><relation_attribute><name>quantity_iid</name><ref_to>quantity</ref_to><base_relation>quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:join>QUANTITY_.UNT_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:join>MEASURING QUANTITY_.UNT_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>par_iid</name><ref_to>par</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:join>PARAMETER_.UNT_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>gru_iid</name><ref_to>gru</ref_to><base_relation>groups</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>UNITSYSTEM_.GRU_IID=.GRU_IID AND .UNT_IID IN (?)</rdb:join></relation_attribute><rdb:aid>4</rdb:aid><rdb:table>UNIT_</rdb:table></application_element><application_element><name>grq</name><basetype>AoQuantityGroup</basetype><application_attribute><name>grq_iid</name><base_attribute>id</base_attribute><rdb:column>GRQ_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>quantity_iid</name><ref_to>quantity</ref_to><base_relation>quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>grq_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>QUANTITY_.QUANTITY_IID=.QUANTITY_IID AND .GRQ_IID IN (?)</rdb:join></relation_attribute><rdb:aid>5</rdb:aid><rdb:table>QUANTITYSYSTEM_</rdb:table></application_element><application_element><name>prj</name><basetype>AoTest</basetype><application_attribute><name>prj_iid</name><base_attribute>id</base_attribute><rdb:column>PRJ_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>prj_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>PROJECT__.PRJ_IID IN (?) AND PROJECT__.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>tstser_iid</name><ref_to>tstser</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>prj_iid</inverse_name><rdb:join>TEST_.PRJ_IID IN (?)</rdb:join></relation_attribute><rdb:aid>6</rdb:aid><rdb:table>PROJECT__</rdb:table></application_element><application_element><name>tstser</name><basetype>AoSubTest</basetype><application_attribute><name>tstser_iid</name><base_attribute>id</base_attribute><rdb:column>TSTSER_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>mime_type</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><relation_attribute><name>prj_iid</name><ref_to>prj</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>tstser_iid</inverse_name><rdb:column>PRJ_IID</rdb:column><rdb:join>TEST_.TSTSER_IID IN (?) AND TEST_.PRJ_IID=PROJECT__.PRJ_IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>tstser_iid</inverse_name><rdb:join>MEASUREMENT_.TSTSER_IID IN (?)</rdb:join></relation_attribute><rdb:aid>7</rdb:aid><rdb:table>TEST_</rdb:table></application_element><application_element><name>ins</name><basetype>AoTestEquipment</basetype><application_attribute><name>ins_iid</name><base_attribute>id</base_attribute><rdb:column>INS_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>setting</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>SETTING</rdb:column><rdb:sql>SELECT BLOB FROM SETUP_ WHERE INS_IID=?</rdb:sql></application_attribute><application_attribute><name>ramp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RAMP</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ins_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>SETUP_.INS_IID IN (?) AND SETUP_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>devchain_iid</name><ref_to>devchain</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ins_iid</inverse_name><rdb:join>MEAS.DEV.CHAIN_.INS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ins_iid</inverse_name><rdb:join>MEASUREMENT_.INS_IID IN (?)</rdb:join></relation_attribute><rdb:aid>8</rdb:aid><rdb:table>SETUP_</rdb:table></application_element><application_element><name>devchain</name><basetype>AoTestEquipmentPart</basetype><application_attribute><name>devofs</name><datatype>DT_FLOAT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DEVOFS</rdb:column></application_attribute><application_attribute><name>devchain_iid</name><base_attribute>id</base_attribute><rdb:column>DEVCHAIN_IID</rdb:column></application_attribute><application_attribute><name>smod1inp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1INP</rdb:column></application_attribute><application_attribute><name>smod2typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2TYP</rdb:column></application_attribute><application_attribute><name>smod2sno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2SNO</rdb:column></application_attribute><application_attribute><name>smod2pro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2PRO</rdb:column></application_attribute><application_attribute><name>smod2st</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2ST</rdb:column></application_attribute><application_attribute><name>smod2inp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2INP</rdb:column></application_attribute><application_attribute><name>imodinp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODINP</rdb:column></application_attribute><application_attribute><name>dev</name><datatype>DT_FLOAT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DEV</rdb:column></application_attribute><application_attribute><name>ctrltyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLTYP</rdb:column></application_attribute><application_attribute><name>ctrlsno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLSNO</rdb:column></application_attribute><application_attribute><name>ctrlpro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLPRO</rdb:column></application_attribute><application_attribute><name>ctrlst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLST</rdb:column></application_attribute><application_attribute><name>modtyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODTYP</rdb:column></application_attribute><application_attribute><name>modsno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODSNO</rdb:column></application_attribute><application_attribute><name>modpro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODPRO</rdb:column></application_attribute><application_attribute><name>modst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODST</rdb:column></application_attribute><application_attribute><name>imodtyp</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>IMODTYP</rdb:column></application_attribute><application_attribute><name>imodsno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODSNO</rdb:column></application_attribute><application_attribute><name>imodpro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODPRO</rdb:column></application_attribute><application_attribute><name>imodst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODST</rdb:column></application_attribute><application_attribute><name>imodswreva</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODSWREVA</rdb:column></application_attribute><application_attribute><name>imodswrevb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODSWREVB</rdb:column></application_attribute><application_attribute><name>smod1typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1TYP</rdb:column></application_attribute><application_attribute><name>smod1sno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1SNO</rdb:column></application_attribute><application_attribute><name>smod1pro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1PRO</rdb:column></application_attribute><application_attribute><name>smod1st</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1ST</rdb:column></application_attribute><application_attribute><name>senstyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSTYP</rdb:column></application_attribute><application_attribute><name>senssno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSSNO</rdb:column></application_attribute><application_attribute><name>senspro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSPRO</rdb:column></application_attribute><application_attribute><name>sensst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSST</rdb:column></application_attribute><relation_attribute><name>ins_iid</name><ref_to>ins</ref_to><base_relation>parent_equipment</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>devchain_iid</inverse_name><rdb:column>INS_IID</rdb:column><rdb:join>MEAS.DEV.CHAIN_.DEVCHAIN_IID IN (?) AND MEAS.DEV.CHAIN_.INS_IID=SETUP_.INS_IID</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>sen_iid</inverse_name><rdb:join>MEASURING QUANTITY_.SEN_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>measurement_locations</name><ref_to>measurement_location</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>devchain_iid</inverse_name></relation_attribute><rdb:aid>9</rdb:aid><rdb:table>MEAS.DEV.CHAIN_</rdb:table></application_element><application_element><name>dsk</name><basetype>AoAny</basetype><application_attribute><name>dsk_iid</name><base_attribute>id</base_attribute><rdb:column>DSK_IID</rdb:column></application_attribute><application_attribute><name>created</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CREATED</rdb:column></application_attribute><application_attribute><name>creator</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CREATOR</rdb:column></application_attribute><application_attribute><name>host</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>HOST</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dsk_iid</inverse_name><rdb:join>MEASUREMENT_.DSK_IID IN (?)</rdb:join></relation_attribute><rdb:aid>10</rdb:aid><rdb:table>DISKS_</rdb:table></application_element><application_element><name>fremdmotor</name><basetype>AoUnitUnderTest</basetype><application_attribute><name>fremdmotor_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>manuf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MANUF_</rdb:column></application_attribute><application_attribute><name>verbr_typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERBR_TYP_</rdb:column></application_attribute><application_attribute><name>zylzahl</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYLZAHL_</rdb:column></application_attribute><application_attribute><name>bauform</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BAUFORM_</rdb:column></application_attribute><application_attribute><name>besond</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BESOND_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>FREMDMOTOR_.FREMDMOTOR__IID IN (?) AND FREMDMOTOR_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.exhaustsystem_iid</name><ref_to>fremdmotor.exhaustsystem</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:join>FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.motoraufbau_iid</name><ref_to>fremdmotor.motoraufbau</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:join>FREMDMOTOR_MOTORAUFBAU.FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.additional_iid</name><ref_to>fremdmotor.additional</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:join>FREMDMOTOR_ADDITIONAL.FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><rdb:aid>11</rdb:aid><rdb:table>FREMDMOTOR_</rdb:table></application_element><application_element><name>fremdmotor.exhaustsystem</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>fremdmotor.exhaustsystem_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR_EXHAUSTSYSTEM_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>elbow</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ELBOW_</rdb:column></application_attribute><application_attribute><name>inlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>INLET_</rdb:column></application_attribute><application_attribute><name>mixing</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MIXING_</rdb:column></application_attribute><application_attribute><name>cat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CAT_</rdb:column></application_attribute><application_attribute><name>dpf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>DPF_</rdb:column></application_attribute><application_attribute><name>fr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>FR_MF_</rdb:column></application_attribute><application_attribute><name>tube2_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE2__</rdb:column></application_attribute><application_attribute><name>in_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IN_MF_</rdb:column></application_attribute><application_attribute><name>tube3_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE3__</rdb:column></application_attribute><application_attribute><name>rr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RR_MF_</rdb:column></application_attribute><application_attribute><name>outlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OUTLET_</rdb:column></application_attribute><application_attribute><name>mount</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOUNT_</rdb:column></application_attribute><application_attribute><name>absorb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSORB_</rdb:column></application_attribute><application_attribute><name>suspen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SUSPEN_</rdb:column></application_attribute><application_attribute><name>weitere</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>WEITERE_</rdb:column></application_attribute><application_attribute><name>tube1_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE1__</rdb:column></application_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor.exhaustsystem_iid</inverse_name><rdb:column>FREMDMOTOR__IID</rdb:column><rdb:join>FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR_EXHAUSTSYSTEM_IID IN (?) AND FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR__IID=FREMDMOTOR_.FREMDMOTOR__IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor.exhaustsystem_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .FREMDMOTOR_EXHAUSTSYSTEM_IID IN (?)</rdb:join></relation_attribute><rdb:aid>12</rdb:aid><rdb:table>FREMDMOTOR_EXHAUSTSYSTEM</rdb:table></application_element><application_element><name>motor</name><basetype>AoUnitUnderTest</basetype><application_attribute><name>motor_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>motbegkart</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>MOTBEGKART_</rdb:column><rdb:sql>SELECT BLOB FROM MOTOR_ WHERE MOTOR__IID=?</rdb:sql></application_attribute><application_attribute><name>mtyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MTYP_</rdb:column></application_attribute><application_attribute><name>mtnr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MTNR_</rdb:column></application_attribute><application_attribute><name>bauz</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BAUZ_</rdb:column></application_attribute><application_attribute><name>verbrenn</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERBRENN_</rdb:column></application_attribute><application_attribute><name>bauart</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BAUART_</rdb:column></application_attribute><application_attribute><name>fahrzeug</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>FAHRZEUG_</rdb:column></application_attribute><application_attribute><name>kennz</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KENNZ_</rdb:column></application_attribute><application_attribute><name>gtyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GTYP_</rdb:column></application_attribute><application_attribute><name>gnr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GNR_</rdb:column></application_attribute><application_attribute><name>riementr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RIEMENTR_</rdb:column></application_attribute><application_attribute><name>generator</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GENERATOR_</rdb:column></application_attribute><application_attribute><name>kmv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KMV_</rdb:column></application_attribute><application_attribute><name>lhp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LHP_</rdb:column></application_attribute><application_attribute><name>abcpumpe</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABCPUMPE_</rdb:column></application_attribute><application_attribute><name>aggrsonst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AGGRSONST_</rdb:column></application_attribute><application_attribute><name>besond</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BESOND_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>motor_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>MOTOR_.MOTOR__IID IN (?) AND MOTOR_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>motor.exhaustsystem_iid</name><ref_to>motor.exhaustsystem</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:join>MOTOR_EXHAUSTSYSTEM.MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor.motoraufbau_iid</name><ref_to>motor.motoraufbau</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:join>MOTOR_MOTORAUFBAU.MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor.additional_iid</name><ref_to>motor.additional</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:join>MOTOR_ADDITIONAL.MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .MOTOR__IID IN (?)</rdb:join></relation_attribute><rdb:aid>13</rdb:aid><rdb:table>MOTOR_</rdb:table></application_element><application_element><name>motor.exhaustsystem</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>motor.exhaustsystem_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR_EXHAUSTSYSTEM_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>elbow</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ELBOW_</rdb:column></application_attribute><application_attribute><name>suspen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SUSPEN_</rdb:column></application_attribute><application_attribute><name>inlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>INLET_</rdb:column></application_attribute><application_attribute><name>mixing</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MIXING_</rdb:column></application_attribute><application_attribute><name>cat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CAT_</rdb:column></application_attribute><application_attribute><name>dpf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>DPF_</rdb:column></application_attribute><application_attribute><name>tube1_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE1__</rdb:column></application_attribute><application_attribute><name>fr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>FR_MF_</rdb:column></application_attribute><application_attribute><name>tube2_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE2__</rdb:column></application_attribute><application_attribute><name>in_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IN_MF_</rdb:column></application_attribute><application_attribute><name>tube3_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE3__</rdb:column></application_attribute><application_attribute><name>rr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RR_MF_</rdb:column></application_attribute><application_attribute><name>outlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OUTLET_</rdb:column></application_attribute><application_attribute><name>mount</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOUNT_</rdb:column></application_attribute><application_attribute><name>absorb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSORB_</rdb:column></application_attribute><application_attribute><name>weitere</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>WEITERE_</rdb:column></application_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>motor.exhaustsystem_iid</inverse_name><rdb:column>MOTOR__IID</rdb:column><rdb:join>MOTOR_EXHAUSTSYSTEM.MOTOR_EXHAUSTSYSTEM_IID IN (?) AND MOTOR_EXHAUSTSYSTEM.MOTOR__IID=MOTOR_.MOTOR__IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor.exhaustsystem_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MOTOR_EXHAUSTSYSTEM_IID IN (?)</rdb:join></relation_attribute><rdb:aid>14</rdb:aid><rdb:table>MOTOR_EXHAUSTSYSTEM</rdb:table></application_element><application_element><name>messtext</name><basetype>AoTestSequence</basetype><application_attribute><name>messtext_iid</name><base_attribute>id</base_attribute><rdb:column>MESSTEXT__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>aufnehmer</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFNEHMER_</rdb:column><rdb:sql>SELECT BLOB FROM MESSTEXT_ WHERE MESSTEXT__IID=?</rdb:sql></application_attribute><application_attribute><name>t</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>T_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>messtext_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>MESSTEXT_.MESSTEXT__IID IN (?) AND MESSTEXT_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>messtext_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MESSTEXT__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>messtext_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .MESSTEXT__IID IN (?)</rdb:join></relation_attribute><rdb:aid>15</rdb:aid><rdb:table>MESSTEXT_</rdb:table></application_element><application_element><name>randbedingung</name><basetype>AoAny</basetype><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>randbedingung_iid</name><base_attribute>id</base_attribute><rdb:column>RANDBEDINGUNG__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>ftemp</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>FTEMP_</rdb:column></application_attribute><application_attribute><name>wgeschw</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>WGESCHW_</rdb:column></application_attribute><application_attribute><name>wricht</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>WRICHT_</rdb:column></application_attribute><application_attribute><name>mdat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MDAT_</rdb:column></application_attribute><application_attribute><name>mtim</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MTIM_</rdb:column></application_attribute><application_attribute><name>mort</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MORT_</rdb:column></application_attribute><application_attribute><name>prbes</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>PRBES_</rdb:column></application_attribute><application_attribute><name>ltemp</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>LTEMP_</rdb:column></application_attribute><application_attribute><name>ldruck</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>LDRUCK_</rdb:column></application_attribute><application_attribute><name>feuchte</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>FEUCHTE_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>randbedingung_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>RANDBEDINGUNG_.RANDBEDINGUNG__IID IN (?) AND RANDBEDINGUNG_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>mea-for-AnyId</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>AnyId</inverse_name><rdb:reftable/><rdb:refname>AnyId</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .RANDBEDINGUNG__IID IN (?)</rdb:join></relation_attribute><rdb:aid>16</rdb:aid><rdb:table>RANDBEDINGUNG_</rdb:table></application_element><application_element><name>messzyklus</name><basetype>AoAny</basetype><application_attribute><name>messzyklus_iid</name><base_attribute>id</base_attribute><rdb:column>MESSZYKLUS__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>zyklus</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYKLUS_</rdb:column></application_attribute><application_attribute><name>zykl_ber</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYKL_BER_</rdb:column></application_attribute><application_attribute><name>lastzust</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LASTZUST_</rdb:column></application_attribute><application_attribute><name>kueb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KUEB_</rdb:column></application_attribute><application_attribute><name>aufnehmer</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFNEHMER_</rdb:column><rdb:sql>SELECT BLOB FROM MESSZYKLUS_ WHERE MESSZYKLUS__IID=?</rdb:sql></application_attribute><application_attribute><name>gang</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GANG_</rdb:column></application_attribute><application_attribute><name>kmvkomm</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KMVKOMM_</rdb:column></application_attribute><application_attribute><name>lhp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LHP_</rdb:column></application_attribute><application_attribute><name>lhpkomm</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LHPKOMM_</rdb:column></application_attribute><application_attribute><name>lima</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LIMA_</rdb:column></application_attribute><application_attribute><name>limakomm</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LIMAKOMM_</rdb:column></application_attribute><application_attribute><name>measc</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MEASC_</rdb:column></application_attribute><application_attribute><name>kmv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KMV_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>messzyklus_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>MESSZYKLUS_.MESSZYKLUS__IID IN (?) AND MESSZYKLUS_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>mea-for-CycId</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CycId</inverse_name><rdb:reftable/><rdb:refname>CycId</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MESSZYKLUS__IID IN (?)</rdb:join></relation_attribute><rdb:aid>17</rdb:aid><rdb:table>MESSZYKLUS_</rdb:table></application_element><application_element><name>mea</name><basetype>AoSubTest</basetype><application_attribute><name>postproc</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>POSTPROC</rdb:column></application_attribute><application_attribute><name>touchdate</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>TOUCHDATE</rdb:column></application_attribute><application_attribute><name>cirevision</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CIREVISION</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>mea_iid</name><base_attribute>id</base_attribute><rdb:column>MEA_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><application_attribute><name>meastime</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MEASTIME</rdb:column></application_attribute><application_attribute><name>size</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>SPACE</rdb:column></application_attribute><application_attribute><name>swrevision</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWREVISION</rdb:column></application_attribute><application_attribute><name>prj</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>PRJ</rdb:column></application_attribute><application_attribute><name>tstser</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TSTSER</rdb:column></application_attribute><application_attribute><name>seq</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SEQ</rdb:column></application_attribute><application_attribute><name>ins</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>INS</rdb:column></application_attribute><application_attribute><name>uut</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>UUT</rdb:column></application_attribute><application_attribute><name>label</name><base_attribute>version</base_attribute><rdb:column>DSK_IID</rdb:column></application_attribute><application_attribute><name>measdate</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>MEASDATE</rdb:column></application_attribute><application_attribute><name>swstate</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWSTATE</rdb:column></application_attribute><application_attribute><name>state</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>STATE</rdb:column></application_attribute><application_attribute><name>cidate</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CIDATE</rdb:column></application_attribute><application_attribute><name>discpath</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>DISCPATH</rdb:column></application_attribute><application_attribute><name>typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TYP</rdb:column></application_attribute><application_attribute><name>tstsubject</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TSTSUBJECT_</rdb:column></application_attribute><application_attribute><name>tststand</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TSTSTAND_</rdb:column></application_attribute><application_attribute><name>expert</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>EXPERT_</rdb:column></application_attribute><application_attribute><name>expertdiv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>EXPERTDIV_</rdb:column></application_attribute><application_attribute><name>orderer</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ORDERER_</rdb:column></application_attribute><application_attribute><name>ordererdiv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ORDERERDIV_</rdb:column></application_attribute><application_attribute><name>auftrdat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AUFTRDAT_</rdb:column></application_attribute><application_attribute><name>ausfuehrdat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AUSFUEHRDAT_</rdb:column></application_attribute><application_attribute><name>kontierung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KONTIERUNG_</rdb:column></application_attribute><application_attribute><name>auftrnr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AUFTRNR_</rdb:column></application_attribute><relation_attribute><name>tstser_iid</name><ref_to>tstser</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>mea_iid</inverse_name><rdb:column>TSTSER_IID</rdb:column><rdb:join>MEASUREMENT_.MEA_IID IN (?) AND MEASUREMENT_.TSTSER_IID=TEST_.TSTSER_IID</rdb:join></relation_attribute><relation_attribute><name>ins_iid</name><ref_to>ins</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>mea_iid</inverse_name><rdb:column>INS_IID</rdb:column><rdb:join>MEASUREMENT_.MEA_IID IN (?) AND MEASUREMENT_.INS_IID=SETUP_.INS_IID</rdb:join></relation_attribute><relation_attribute><name>dsk_iid</name><ref_to>dsk</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>mea_iid</inverse_name><rdb:column>DSK_IID</rdb:column><rdb:join>MEASUREMENT_.MEA_IID IN (?) AND MEASUREMENT_.DSK_IID=DISKS_.DSK_IID</rdb:join></relation_attribute><application_attribute><name>attachments</name><datatype>DS_EXTERNALREFERENCE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>ATTACHMENTS</rdb:column><rdb:value>'NULL'</rdb:value><rdb:sql>N/A</rdb:sql></application_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:join>DATA-SET_.MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>FREMDMOTOR_.FREMDMOTOR__IID=.FREMDMOTOR__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.exhaustsystem_iid</name><ref_to>fremdmotor.exhaustsystem</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR_EXHAUSTSYSTEM_IID=.FREMDMOTOR_EXHAUSTSYSTEM_IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MOTOR_.MOTOR__IID=.MOTOR__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor.exhaustsystem_iid</name><ref_to>motor.exhaustsystem</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MOTOR_EXHAUSTSYSTEM.MOTOR_EXHAUSTSYSTEM_IID=.MOTOR_EXHAUSTSYSTEM_IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messtext_iid</name><ref_to>messtext</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MESSTEXT_.MESSTEXT__IID=.MESSTEXT__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>AnyId</name><ref_to>randbedingung</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea-for-AnyId</inverse_name><rdb:reftable/><rdb:refname>AnyId</rdb:refname><rdb:join>RANDBEDINGUNG_.RANDBEDINGUNG__IID=.RANDBEDINGUNG__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>CycId</name><ref_to>messzyklus</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea-for-CycId</inverse_name><rdb:reftable/><rdb:refname>CycId</rdb:refname><rdb:join>MESSZYKLUS_.MESSZYKLUS__IID=.MESSZYKLUS__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><rdb:aid>18</rdb:aid><rdb:table>MEASUREMENT_</rdb:table></application_element><application_element><name>pas</name><basetype>AoParameterSet</basetype><application_attribute><name>pas_iid</name><base_attribute>id</base_attribute><rdb:column>PAS_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute><length>4000</length><rdb:column>DESCR</rdb:column></application_attribute><relation_attribute><name>par_iid</name><ref_to>par</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pas_iid</inverse_name><rdb:join>PARAMETER_.PAS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pas_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASURING QUANTITY_.MEQ_IID=.MEQ_IID AND .PAS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pas_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .PAS_IID IN (?)</rdb:join></relation_attribute><rdb:aid>19</rdb:aid><rdb:table>PARAMETER-SET_</rdb:table></application_element><application_element><name>dts</name><basetype>AoMeasurement</basetype><application_attribute><name>dts_iid</name><base_attribute>id</base_attribute><rdb:column>DTS_IID</rdb:column></application_attribute><application_attribute><name>measbegin</name><base_attribute>measurement_begin</base_attribute><rdb:column>MEASBEGIN</rdb:column></application_attribute><application_attribute><name>measend</name><base_attribute>measurement_end</base_attribute><rdb:column>MEASEND</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><base_relation>test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>dts_iid</inverse_name><rdb:column>MEA_IID</rdb:column><rdb:join>DATA-SET_.DTS_IID IN (?) AND DATA-SET_.MEA_IID=MEASUREMENT_.MEA_IID</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:join>MEASURING QUANTITY_.DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>pas_iid</name><ref_to>pas</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>PARAMETER-SET_.PAS_IID=.PAS_IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>units_under_test</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>FREMDMOTOR_.FREMDMOTOR__IID=.FREMDMOTOR__IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>units_under_test</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MOTOR_.MOTOR__IID=.MOTOR__IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messtext_iid</name><ref_to>messtext</ref_to><base_relation>sequences</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MESSTEXT_.MESSTEXT__IID=.MESSTEXT__IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>sm_iid</name><ref_to>sm</ref_to><base_relation>submatrices</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name></relation_attribute><relation_attribute><name>geometry</name><ref_to>geometry</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>measurements_on_geometry</inverse_name></relation_attribute><rdb:aid>20</rdb:aid><rdb:table>DATA-SET_</rdb:table></application_element><application_element><name>quantity</name><basetype>AoQuantity</basetype><application_attribute><name>quantity_iid</name><base_attribute>id</base_attribute><rdb:column>QUANTITY_IID</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><application_attribute><name>def_name</name><base_attribute>default_mq_name</base_attribute><length>4000</length><rdb:column>DEF_NAME</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>default_unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>quantity_iid</inverse_name><rdb:column>UNT_IID</rdb:column><rdb:join>QUANTITY_.QUANTITY_IID IN (?) AND QUANTITY_.UNT_IID=UNIT_.UNT_IID</rdb:join></relation_attribute><relation_attribute><name>pred_iid</name><ref_to>quantity</ref_to><base_relation>predecessor</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>suc_iid</inverse_name><rdb:column>PRED_IID</rdb:column><rdb:join>QUANTITY_.QUANTITY_IID=(SELECT QUANTITY_.PRED_IID FROM QUANTITY_ WHERE QUANTITY_.QUANTITY_IID IN (?))</rdb:join></relation_attribute><relation_attribute><name>suc_iid</name><ref_to>quantity</ref_to><base_relation>successors</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pred_iid</inverse_name><rdb:join>QUANTITY_.PRED_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>quantity_iid</inverse_name><rdb:join>MEASURING QUANTITY_.QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>grq_iid</name><ref_to>grq</ref_to><base_relation>groups</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>quantity_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>QUANTITYSYSTEM_.GRQ_IID=.GRQ_IID AND .QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq-for-non_reference_channel_quantity</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>non_reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>non_reference_channel_quantity</rdb:refname><rdb:join>MEASURING QUANTITY_.MEQ_IID=.MEQ_IID AND .QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq-for-reference_channel_quantity</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>reference_channel_quantity</rdb:refname><rdb:join>MEASURING QUANTITY_.MEQ_IID=.MEQ_IID AND .QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>used_in_measurement_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>channel_quantity</inverse_name></relation_attribute><rdb:aid>21</rdb:aid><rdb:table>QUANTITY_</rdb:table></application_element><application_element><name>meq</name><basetype>AoMeasurementQuantity</basetype><application_attribute><name>meq_iid</name><base_attribute>id</base_attribute><rdb:column>MEQ_IID</rdb:column></application_attribute><application_attribute><name>aodt</name><base_attribute>datatype</base_attribute><rdb:column>AODT</rdb:column></application_attribute><application_attribute><name>non_reference_channel_name</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>NONREFCHN</rdb:column></application_attribute><application_attribute><name>reference_channel_name</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>REFCHN</rdb:column></application_attribute><application_attribute><name>min_val</name><base_attribute>minimum</base_attribute><rdb:column>MIN_VAL</rdb:column></application_attribute><application_attribute><name>max_val</name><base_attribute>maximum</base_attribute><rdb:column>MAX_VAL</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute><length>4000</length><rdb:column>DESCR</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>DTS_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.DTS_IID=DATA-SET_.DTS_IID</rdb:join></relation_attribute><relation_attribute><name>quantity_iid</name><ref_to>quantity</ref_to><base_relation>quantity</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>QUANTITY_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.QUANTITY_IID=QUANTITY_.QUANTITY_IID</rdb:join></relation_attribute><relation_attribute><name>sen_iid</name><ref_to>devchain</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>SEN_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.SEN_IID=MEAS.DEV.CHAIN_.DEVCHAIN_IID</rdb:join></relation_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>UNT_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.UNT_IID=UNIT_.UNT_IID</rdb:join></relation_attribute><relation_attribute><name>non_reference_channel_quantity</name><ref_to>quantity</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq-for-non_reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>non_reference_channel_quantity</rdb:refname><rdb:join>QUANTITY_.QUANTITY_IID=.QUANTITY_IID AND .MEQ_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>reference_channel_quantity</name><ref_to>quantity</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq-for-reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>reference_channel_quantity</rdb:refname><rdb:join>QUANTITY_.QUANTITY_IID=.QUANTITY_IID AND .MEQ_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>pas_iid</name><ref_to>pas</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>PARAMETER-SET_.PAS_IID=.PAS_IID AND .MEQ_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>lc_iid</name><ref_to>lc</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq_iid</inverse_name></relation_attribute><relation_attribute><name>non_reference_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>in_reference_location</inverse_name></relation_attribute><relation_attribute><name>reference_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>in_non_reference_location</inverse_name></relation_attribute><rdb:aid>22</rdb:aid><rdb:table>MEASURING QUANTITY_</rdb:table></application_element><application_element><name>par</name><basetype>AoParameter</basetype><application_attribute><name>par_iid</name><base_attribute>id</base_attribute><rdb:column>PAR_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>pval</name><base_attribute>pvalue</base_attribute><length>4000</length><rdb:column>PVAL</rdb:column></application_attribute><application_attribute><name>ptyp</name><base_attribute>parameter_datatype</base_attribute><rdb:column>PTYP</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>par_iid</inverse_name><rdb:column>UNT_IID</rdb:column><rdb:join>PARAMETER_.PAR_IID IN (?) AND PARAMETER_.UNT_IID=UNIT_.UNT_IID</rdb:join></relation_attribute><relation_attribute><name>pas_iid</name><ref_to>pas</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>par_iid</inverse_name><rdb:column>PAS_IID</rdb:column><rdb:join>PARAMETER_.PAR_IID IN (?) AND PARAMETER_.PAS_IID=PARAMETER-SET_.PAS_IID</rdb:join></relation_attribute><rdb:aid>26</rdb:aid><rdb:table>PARAMETER_</rdb:table></application_element><application_element><name>fremdmotor.motoraufbau</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>fremdmotor.motoraufbau_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR_MOTORAUFBAU_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>kurbelwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELWELLE_</rdb:column></application_attribute><application_attribute><name>kolben</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KOLBEN_</rdb:column></application_attribute><application_attribute><name>ladeluftkueh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTKUEH_</rdb:column></application_attribute><application_attribute><name>ladeluftleit</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTLEIT_</rdb:column></application_attribute><application_attribute><name>absblenden</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSBLENDEN_</rdb:column></application_attribute><application_attribute><name>kraftstoff</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KRAFTSTOFF_</rdb:column></application_attribute><application_attribute><name>klopfregelung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KLOPFREGELUNG_</rdb:column></application_attribute><application_attribute><name>gelenkwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GELENKWELLE_</rdb:column></application_attribute><application_attribute><name>sonst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SONST_</rdb:column></application_attribute><application_attribute><name>swstand</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWSTAND_</rdb:column></application_attribute><application_attribute><name>abdeckung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABDECKUNG_</rdb:column></application_attribute><application_attribute><name>rohlufthutzen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ROHLUFTHUTZEN_</rdb:column></application_attribute><application_attribute><name>luftfilter</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LUFTFILTER_</rdb:column></application_attribute><application_attribute><name>oelwanne</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OELWANNE_</rdb:column></application_attribute><application_attribute><name>motorlager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORLAGER_</rdb:column></application_attribute><application_attribute><name>motortraeger</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORTRAEGER_</rdb:column></application_attribute><application_attribute><name>getriebelager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GETRIEBELAGER_</rdb:column></application_attribute><application_attribute><name>torsdaempf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TORSDAEMPF_</rdb:column></application_attribute><application_attribute><name>kurbelgeh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELGEH_</rdb:column></application_attribute><application_attribute><name>zylkopf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYLKOPF_</rdb:column></application_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor.motoraufbau_iid</inverse_name><rdb:column>FREMDMOTOR__IID</rdb:column><rdb:join>FREMDMOTOR_MOTORAUFBAU.FREMDMOTOR_MOTORAUFBAU_IID IN (?) AND FREMDMOTOR_MOTORAUFBAU.FREMDMOTOR__IID=FREMDMOTOR_.FREMDMOTOR__IID</rdb:join></relation_attribute><rdb:aid>27</rdb:aid><rdb:table>FREMDMOTOR_MOTORAUFBAU</rdb:table></application_element><application_element><name>fremdmotor.additional</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>fremdmotor.additional_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR_ADDITIONAL_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>add</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ADD_</rdb:column></application_attribute><application_attribute><name>auftrag</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFTRAG_</rdb:column><rdb:sql>SELECT BLOB FROM FREMDMOTOR_ADDITIONAL WHERE FREMDMOTOR_ADDITIONAL_IID=?</rdb:sql></application_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor.additional_iid</inverse_name><rdb:column>FREMDMOTOR__IID</rdb:column><rdb:join>FREMDMOTOR_ADDITIONAL.FREMDMOTOR_ADDITIONAL_IID IN (?) AND FREMDMOTOR_ADDITIONAL.FREMDMOTOR__IID=FREMDMOTOR_.FREMDMOTOR__IID</rdb:join></relation_attribute><rdb:aid>28</rdb:aid><rdb:table>FREMDMOTOR_ADDITIONAL</rdb:table></application_element><application_element><name>motor.motoraufbau</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>motor.motoraufbau_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR_MOTORAUFBAU_IID</rdb:column></application_attribute><application_attribute><name>swstand</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWSTAND_</rdb:column></application_attribute><application_attribute><name>abdeckung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABDECKUNG_</rdb:column></application_attribute><application_attribute><name>rohlufthutzen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ROHLUFTHUTZEN_</rdb:column></application_attribute><application_attribute><name>luftfilter</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LUFTFILTER_</rdb:column></application_attribute><application_attribute><name>oelwanne</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OELWANNE_</rdb:column></application_attribute><application_attribute><name>motorlager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORLAGER_</rdb:column></application_attribute><application_attribute><name>motortraeger</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORTRAEGER_</rdb:column></application_attribute><application_attribute><name>getriebelager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GETRIEBELAGER_</rdb:column></application_attribute><application_attribute><name>torsdaempf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TORSDAEMPF_</rdb:column></application_attribute><application_attribute><name>zylkopf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYLKOPF_</rdb:column></application_attribute><application_attribute><name>kurbelgeh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELGEH_</rdb:column></application_attribute><application_attribute><name>kurbelwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELWELLE_</rdb:column></application_attribute><application_attribute><name>kolben</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KOLBEN_</rdb:column></application_attribute><application_attribute><name>ladeluftkueh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTKUEH_</rdb:column></application_attribute><application_attribute><name>ladeluftleit</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTLEIT_</rdb:column></application_attribute><application_attribute><name>absblenden</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSBLENDEN_</rdb:column></application_attribute><application_attribute><name>kraftstoff</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KRAFTSTOFF_</rdb:column></application_attribute><application_attribute><name>klopfregelung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KLOPFREGELUNG_</rdb:column></application_attribute><application_attribute><name>sonst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SONST_</rdb:column></application_attribute><application_attribute><name>gelenkwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GELENKWELLE_</rdb:column></application_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>motor.motoraufbau_iid</inverse_name><rdb:column>MOTOR__IID</rdb:column><rdb:join>MOTOR_MOTORAUFBAU.MOTOR_MOTORAUFBAU_IID IN (?) AND MOTOR_MOTORAUFBAU.MOTOR__IID=MOTOR_.MOTOR__IID</rdb:join></relation_attribute><rdb:aid>29</rdb:aid><rdb:table>MOTOR_MOTORAUFBAU</rdb:table></application_element><application_element><name>motor.additional</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>motor.additional_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR_ADDITIONAL_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>add</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ADD_</rdb:column></application_attribute><application_attribute><name>auftrag</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFTRAG_</rdb:column><rdb:sql>SELECT BLOB FROM MOTOR_ADDITIONAL WHERE MOTOR_ADDITIONAL_IID=?</rdb:sql></application_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>motor.additional_iid</inverse_name><rdb:column>MOTOR__IID</rdb:column><rdb:join>MOTOR_ADDITIONAL.MOTOR_ADDITIONAL_IID IN (?) AND MOTOR_ADDITIONAL.MOTOR__IID=MOTOR_.MOTOR__IID</rdb:join></relation_attribute><rdb:aid>30</rdb:aid><rdb:table>MOTOR_ADDITIONAL</rdb:table></application_element><application_element><name>sm</name><basetype>AoSubmatrix</basetype><application_attribute><name>sm_iid</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute></application_attribute><application_attribute><name>number_of_rows</name><base_attribute>number_of_rows</base_attribute></application_attribute><relation_attribute><name>lc_iid</name><ref_to>lc</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>sm_iid</inverse_name></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>sm_iid</inverse_name></relation_attribute><relation_attribute><name>x-axis-for-y-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-x-axis</inverse_name></relation_attribute><relation_attribute><name>z-axis-for-y-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-z-axis</inverse_name></relation_attribute><relation_attribute><name>y-axis-for-x-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>x-axis-for-y-axis</inverse_name></relation_attribute><relation_attribute><name>y-axis-for-z-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>z-axis-for-y-axis</inverse_name></relation_attribute><relation_attribute><name>geometry</name><ref_to>geometry</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>geometry_shapes</inverse_name></relation_attribute></application_element><application_element><name>lc</name><basetype>AoLocalColumn</basetype><application_attribute><name>lc_iid</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>independent</name><base_attribute>independent</base_attribute></application_attribute><application_attribute><name>values</name><base_attribute>values</base_attribute></application_attribute><application_attribute><name>sequence_representation</name><base_attribute>sequence_representation</base_attribute></application_attribute><application_attribute><name>generation_parameters</name><base_attribute>generation_parameters</base_attribute></application_attribute><application_attribute><name>raw_datatype</name><base_attribute>raw_datatype</base_attribute></application_attribute><application_attribute><name>axistype</name><datatype>DT_ENUM</datatype><enumeration_type>axistype</enumeration_type></application_attribute><application_attribute><name>global_flag</name><base_attribute>global_flag</base_attribute></application_attribute><application_attribute><name>flags</name><base_attribute>flags</base_attribute></application_attribute><relation_attribute><name>ec_iid</name><ref_to>ec</ref_to><base_relation>external_component</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>lc_iid</inverse_name></relation_attribute><relation_attribute><name>sm_iid</name><ref_to>sm</ref_to><base_relation>submatrix</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>lc_iid</inverse_name></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantity</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>lc_iid</inverse_name></relation_attribute></application_element><application_element><name>ec</name><basetype>AoExternalComponent</basetype><application_attribute><name>ec_iid</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute></application_attribute><application_attribute><name>ordinal_number</name><base_attribute>ordinal_number</base_attribute></application_attribute><application_attribute><name>component_length</name><base_attribute>component_length</base_attribute></application_attribute><application_attribute><name>filename_url</name><base_attribute>filename_url</base_attribute></application_attribute><application_attribute><name>value_type</name><base_attribute>value_type</base_attribute></application_attribute><application_attribute><name>start_offset</name><base_attribute>start_offset</base_attribute></application_attribute><application_attribute><name>block_size</name><base_attribute>block_size</base_attribute></application_attribute><application_attribute><name>valuesperblock</name><base_attribute>valuesperblock</base_attribute></application_attribute><application_attribute><name>value_offset</name><base_attribute>value_offset</base_attribute></application_attribute><relation_attribute><name>lc_iid</name><ref_to>lc</ref_to><base_relation>local_column</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ec_iid</inverse_name></relation_attribute></application_element><application_element><name>coordinate_system</name><basetype>AoAny</basetype><application_attribute><name>id</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>name</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute></application_attribute><application_attribute><name>coordinate_system_type</name><datatype>DT_ENUM</datatype><enumeration_type>coordinate_system_types</enumeration_type></application_attribute><application_attribute><name>origin_1</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>origin_2</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>origin_3</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>x_axis_1</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>x_axis_2</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>x_axis_3</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>xz_plane_1</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>xz_plane_2</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>xz_plane_3</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><relation_attribute><name>reference_system</name><ref_to>coordinate_system</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>locale_systems</inverse_name></relation_attribute><relation_attribute><name>locale_systems</name><ref_to>coordinate_system</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>reference_system</inverse_name></relation_attribute><relation_attribute><name>used_in_geometries</name><ref_to>geometry</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>coordinate_system</inverse_name></relation_attribute><relation_attribute><name>used_in_measurement_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>coordinate_system</inverse_name></relation_attribute></application_element><application_element><name>geometry</name><basetype>AoAny</basetype><application_attribute><name>id</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>name</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute></application_attribute><application_attribute><name>geometry_id</name><datatype>DT_LONG</datatype></application_attribute><relation_attribute><name>coordinate_system</name><ref_to>coordinate_system</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>used_in_geometries</inverse_name></relation_attribute><relation_attribute><name>sub_geometries</name><ref_to>geometry</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>parent_geometry</inverse_name></relation_attribute><relation_attribute><name>parent_geometry</name><ref_to>geometry</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>sub_geometries</inverse_name></relation_attribute><relation_attribute><name>measurements_on_geometry</name><ref_to>dts</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>geometry</inverse_name></relation_attribute><relation_attribute><name>geometry_shapes</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>geometry</inverse_name></relation_attribute></application_element><application_element><name>measurement_location</name><basetype>AoTestEquipmentPart</basetype><application_attribute><name>id</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>name</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>location_shape_id</name><datatype>DT_LONG</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>location_geometry_id</name><datatype>DT_LONG</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>location_mode</name><datatype>DT_ENUM</datatype><enumeration_type>location_modes</enumeration_type><obligatory>true</obligatory></application_attribute><application_attribute><name>channel_name</name><datatype>DT_STRING</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>channel_description</name><datatype>DT_STRING</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>u</name><datatype>DT_FLOAT</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>v</name><datatype>DT_FLOAT</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>w</name><datatype>DT_FLOAT</datatype><obligatory>true</obligatory></application_attribute><relation_attribute><name>coordinate_system</name><ref_to>coordinate_system</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>used_in_measurement_locations</inverse_name></relation_attribute><relation_attribute><name>channel_quantity</name><ref_to>quantity</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>used_in_measurement_locations</inverse_name></relation_attribute><relation_attribute><name>in_reference_location</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>reference_locations</inverse_name></relation_attribute><relation_attribute><name>in_non_reference_location</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>non_reference_locations</inverse_name></relation_attribute><relation_attribute><name>devchain_iid</name><ref_to>devchain</ref_to><base_relation>parent_equipment_part</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>measurement_locations</inverse_name></relation_attribute></application_element></application_model></atfx_file>
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/EXP/model.atfx.technical b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/EXP/model.atfx.technical
new file mode 100644
index 0000000..19c9e77
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/EXP/model.atfx.technical
@@ -0,0 +1,17 @@
+<!-- ********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ******************************************************************************** -->
+<?xml version="1.0" encoding="utf-8"?>
+
+<atfx_file xmlns="http://www.asam.net/ODS/5.1/Schema" version="atfx_file: V1.1.0" xmlns:ext="urn:schemas-microsoft-com:xslt" xmlns:rdb="http://www.muellerbbm-vas.de/ods/rdb" xmlns:utils="java:vas.xml.Util"><base_model_version>asam29</base_model_version><application_model><application_enumeration><name>axistype</name><item><name>Xaxis</name><value>0</value></item><item><name>Yaxis</name><value>1</value></item><item><name>Both</name><value>2</value></item></application_enumeration><application_enumeration><name>coordinate_system_types</name><item><name>Cartesian</name><value>0</value></item><item><name>Polar</name><value>1</value></item><item><name>Cylindric</name><value>2</value></item></application_enumeration><application_enumeration><name>location_modes</name><item><name>Fixed</name><value>0</value></item><item><name>Varying</name><value>1</value></item></application_enumeration><application_element><name>env</name><basetype>AoEnvironment</basetype><application_attribute><name>env_iid</name><base_attribute>id</base_attribute><rdb:column>ENV_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>skill</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>SKILL</rdb:column></application_attribute><application_attribute><name>id</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>ID</rdb:column></application_attribute><application_attribute><name>touched</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>TOUCHED</rdb:column></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute><length>4000</length><rdb:column>DESCR</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>VERSION</rdb:column></application_attribute><relation_attribute><name>prj_iid</name><ref_to>prj</ref_to><base_relation>tests</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>PROJECT__.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>ins_iid</name><ref_to>ins</ref_to><base_relation>equipments</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>SETUP_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>uuts</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>FREMDMOTOR_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>uuts</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>MOTOR_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messtext_iid</name><ref_to>messtext</ref_to><base_relation>sequences</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>MESSTEXT_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>randbedingung_iid</name><ref_to>randbedingung</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>RANDBEDINGUNG_.ENV_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messzyklus_iid</name><ref_to>messzyklus</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>env_iid</inverse_name><rdb:join>MESSZYKLUS_.ENV_IID IN (?)</rdb:join></relation_attribute><rdb:aid>1</rdb:aid><rdb:table>ENVIRONMENT_</rdb:table></application_element><application_element><name>dim</name><basetype>AoPhysicalDimension</basetype><application_attribute><name>dim_iid</name><base_attribute>id</base_attribute><rdb:column>DIM_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>meter_exp</name><base_attribute>length_exp</base_attribute><rdb:column>LEN</rdb:column></application_attribute><application_attribute><name>kilogramm_exp</name><base_attribute>mass_exp</base_attribute><rdb:column>MASS</rdb:column></application_attribute><application_attribute><name>second_exp</name><base_attribute>time_exp</base_attribute><rdb:column>TIM</rdb:column></application_attribute><application_attribute><name>ampere_exp</name><base_attribute>current_exp</base_attribute><rdb:column>CUR</rdb:column></application_attribute><application_attribute><name>kelvin_exp</name><base_attribute>temperature_exp</base_attribute><rdb:column>T</rdb:column></application_attribute><application_attribute><name>mol_exp</name><base_attribute>molar_amount_exp</base_attribute><rdb:column>PART</rdb:column></application_attribute><application_attribute><name>candela_exp</name><base_attribute>luminous_intensity_exp</base_attribute><rdb:column>LUM</rdb:column></application_attribute><application_attribute><name>angle</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>ANGLE</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>units</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dim_iid</inverse_name><rdb:join>UNIT_.DIM_IID IN (?)</rdb:join></relation_attribute><rdb:aid>2</rdb:aid><rdb:table>DIMENSION_</rdb:table></application_element><application_element><name>gru</name><basetype>AoUnitGroup</basetype><application_attribute><name>gru_iid</name><base_attribute>id</base_attribute><rdb:column>GRU_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>units</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>gru_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>UNIT_.UNT_IID=.UNT_IID AND .GRU_IID IN (?)</rdb:join></relation_attribute><rdb:aid>3</rdb:aid><rdb:table>UNITSYSTEM_</rdb:table></application_element><application_element><name>unt</name><basetype>AoUnit</basetype><application_attribute><name>unt_iid</name><base_attribute>id</base_attribute><rdb:column>UNT_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>offset</name><base_attribute>offset</base_attribute><rdb:column>OFFSET</rdb:column></application_attribute><application_attribute><name>factor</name><base_attribute>factor</base_attribute><rdb:column>FACTOR</rdb:column></application_attribute><application_attribute><name>dB</name><datatype>DT_SHORT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DBFLG</rdb:column></application_attribute><application_attribute><name>dB_reference_factor</name><datatype>DT_FLOAT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DBREF</rdb:column></application_attribute><relation_attribute><name>dim_iid</name><ref_to>dim</ref_to><base_relation>phys_dimension</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>unt_iid</inverse_name><rdb:column>DIM_IID</rdb:column><rdb:join>UNIT_.UNT_IID IN (?) AND UNIT_.DIM_IID=DIMENSION_.DIM_IID</rdb:join></relation_attribute><relation_attribute><name>quantity_iid</name><ref_to>quantity</ref_to><base_relation>quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:join>QUANTITY_.UNT_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:join>MEASURING QUANTITY_.UNT_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>par_iid</name><ref_to>par</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:join>PARAMETER_.UNT_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>gru_iid</name><ref_to>gru</ref_to><base_relation>groups</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>unt_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>UNITSYSTEM_.GRU_IID=.GRU_IID AND .UNT_IID IN (?)</rdb:join></relation_attribute><rdb:aid>4</rdb:aid><rdb:table>UNIT_</rdb:table></application_element><application_element><name>grq</name><basetype>AoQuantityGroup</basetype><application_attribute><name>grq_iid</name><base_attribute>id</base_attribute><rdb:column>GRQ_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>quantity_iid</name><ref_to>quantity</ref_to><base_relation>quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>grq_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>QUANTITY_.QUANTITY_IID=.QUANTITY_IID AND .GRQ_IID IN (?)</rdb:join></relation_attribute><rdb:aid>5</rdb:aid><rdb:table>QUANTITYSYSTEM_</rdb:table></application_element><application_element><name>prj</name><basetype>AoTest</basetype><application_attribute><name>prj_iid</name><base_attribute>id</base_attribute><rdb:column>PRJ_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>prj_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>PROJECT__.PRJ_IID IN (?) AND PROJECT__.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>tstser_iid</name><ref_to>tstser</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>prj_iid</inverse_name><rdb:join>TEST_.PRJ_IID IN (?)</rdb:join></relation_attribute><rdb:aid>6</rdb:aid><rdb:table>PROJECT__</rdb:table></application_element><application_element><name>tstser</name><basetype>AoSubTest</basetype><application_attribute><name>tstser_iid</name><base_attribute>id</base_attribute><rdb:column>TSTSER_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>mime_type</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><relation_attribute><name>prj_iid</name><ref_to>prj</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>tstser_iid</inverse_name><rdb:column>PRJ_IID</rdb:column><rdb:join>TEST_.TSTSER_IID IN (?) AND TEST_.PRJ_IID=PROJECT__.PRJ_IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>tstser_iid</inverse_name><rdb:join>MEASUREMENT_.TSTSER_IID IN (?)</rdb:join></relation_attribute><rdb:aid>7</rdb:aid><rdb:table>TEST_</rdb:table></application_element><application_element><name>ins</name><basetype>AoTestEquipment</basetype><application_attribute><name>ins_iid</name><base_attribute>id</base_attribute><rdb:column>INS_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>setting</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>SETTING</rdb:column><rdb:sql>SELECT BLOB FROM SETUP_ WHERE INS_IID=?</rdb:sql></application_attribute><application_attribute><name>ramp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RAMP</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>ins_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>SETUP_.INS_IID IN (?) AND SETUP_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>devchain_iid</name><ref_to>devchain</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ins_iid</inverse_name><rdb:join>MEAS.DEV.CHAIN_.INS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>ins_iid</inverse_name><rdb:join>MEASUREMENT_.INS_IID IN (?)</rdb:join></relation_attribute><rdb:aid>8</rdb:aid><rdb:table>SETUP_</rdb:table></application_element><application_element><name>devchain</name><basetype>AoTestEquipmentPart</basetype><application_attribute><name>devofs</name><datatype>DT_FLOAT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DEVOFS</rdb:column></application_attribute><application_attribute><name>devchain_iid</name><base_attribute>id</base_attribute><rdb:column>DEVCHAIN_IID</rdb:column></application_attribute><application_attribute><name>smod1inp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1INP</rdb:column></application_attribute><application_attribute><name>smod2typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2TYP</rdb:column></application_attribute><application_attribute><name>smod2sno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2SNO</rdb:column></application_attribute><application_attribute><name>smod2pro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2PRO</rdb:column></application_attribute><application_attribute><name>smod2st</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2ST</rdb:column></application_attribute><application_attribute><name>smod2inp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD2INP</rdb:column></application_attribute><application_attribute><name>imodinp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODINP</rdb:column></application_attribute><application_attribute><name>dev</name><datatype>DT_FLOAT</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>DEV</rdb:column></application_attribute><application_attribute><name>ctrltyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLTYP</rdb:column></application_attribute><application_attribute><name>ctrlsno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLSNO</rdb:column></application_attribute><application_attribute><name>ctrlpro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLPRO</rdb:column></application_attribute><application_attribute><name>ctrlst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CTRLST</rdb:column></application_attribute><application_attribute><name>modtyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODTYP</rdb:column></application_attribute><application_attribute><name>modsno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODSNO</rdb:column></application_attribute><application_attribute><name>modpro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODPRO</rdb:column></application_attribute><application_attribute><name>modst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MODST</rdb:column></application_attribute><application_attribute><name>imodtyp</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>IMODTYP</rdb:column></application_attribute><application_attribute><name>imodsno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODSNO</rdb:column></application_attribute><application_attribute><name>imodpro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODPRO</rdb:column></application_attribute><application_attribute><name>imodst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODST</rdb:column></application_attribute><application_attribute><name>imodswreva</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODSWREVA</rdb:column></application_attribute><application_attribute><name>imodswrevb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IMODSWREVB</rdb:column></application_attribute><application_attribute><name>smod1typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1TYP</rdb:column></application_attribute><application_attribute><name>smod1sno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1SNO</rdb:column></application_attribute><application_attribute><name>smod1pro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1PRO</rdb:column></application_attribute><application_attribute><name>smod1st</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SMOD1ST</rdb:column></application_attribute><application_attribute><name>senstyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSTYP</rdb:column></application_attribute><application_attribute><name>senssno</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSSNO</rdb:column></application_attribute><application_attribute><name>senspro</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSPRO</rdb:column></application_attribute><application_attribute><name>sensst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SENSST</rdb:column></application_attribute><relation_attribute><name>ins_iid</name><ref_to>ins</ref_to><base_relation>parent_equipment</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>devchain_iid</inverse_name><rdb:column>INS_IID</rdb:column><rdb:join>MEAS.DEV.CHAIN_.DEVCHAIN_IID IN (?) AND MEAS.DEV.CHAIN_.INS_IID=SETUP_.INS_IID</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>sen_iid</inverse_name><rdb:join>MEASURING QUANTITY_.SEN_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>measurement_locations</name><ref_to>measurement_location</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>devchain_iid</inverse_name></relation_attribute><rdb:aid>9</rdb:aid><rdb:table>MEAS.DEV.CHAIN_</rdb:table></application_element><application_element><name>dsk</name><basetype>AoAny</basetype><application_attribute><name>dsk_iid</name><base_attribute>id</base_attribute><rdb:column>DSK_IID</rdb:column></application_attribute><application_attribute><name>created</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CREATED</rdb:column></application_attribute><application_attribute><name>creator</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CREATOR</rdb:column></application_attribute><application_attribute><name>host</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>HOST</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dsk_iid</inverse_name><rdb:join>MEASUREMENT_.DSK_IID IN (?)</rdb:join></relation_attribute><rdb:aid>10</rdb:aid><rdb:table>DISKS_</rdb:table></application_element><application_element><name>fremdmotor</name><basetype>AoUnitUnderTest</basetype><application_attribute><name>fremdmotor_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>manuf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MANUF_</rdb:column></application_attribute><application_attribute><name>verbr_typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERBR_TYP_</rdb:column></application_attribute><application_attribute><name>zylzahl</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYLZAHL_</rdb:column></application_attribute><application_attribute><name>bauform</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BAUFORM_</rdb:column></application_attribute><application_attribute><name>besond</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BESOND_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>FREMDMOTOR_.FREMDMOTOR__IID IN (?) AND FREMDMOTOR_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.exhaustsystem_iid</name><ref_to>fremdmotor.exhaustsystem</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:join>FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.motoraufbau_iid</name><ref_to>fremdmotor.motoraufbau</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:join>FREMDMOTOR_MOTORAUFBAU.FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.additional_iid</name><ref_to>fremdmotor.additional</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:join>FREMDMOTOR_ADDITIONAL.FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .FREMDMOTOR__IID IN (?)</rdb:join></relation_attribute><rdb:aid>11</rdb:aid><rdb:table>FREMDMOTOR_</rdb:table></application_element><application_element><name>fremdmotor.exhaustsystem</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>fremdmotor.exhaustsystem_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR_EXHAUSTSYSTEM_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>elbow</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ELBOW_</rdb:column></application_attribute><application_attribute><name>inlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>INLET_</rdb:column></application_attribute><application_attribute><name>mixing</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MIXING_</rdb:column></application_attribute><application_attribute><name>cat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CAT_</rdb:column></application_attribute><application_attribute><name>dpf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>DPF_</rdb:column></application_attribute><application_attribute><name>fr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>FR_MF_</rdb:column></application_attribute><application_attribute><name>tube2_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE2__</rdb:column></application_attribute><application_attribute><name>in_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IN_MF_</rdb:column></application_attribute><application_attribute><name>tube3_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE3__</rdb:column></application_attribute><application_attribute><name>rr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RR_MF_</rdb:column></application_attribute><application_attribute><name>outlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OUTLET_</rdb:column></application_attribute><application_attribute><name>mount</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOUNT_</rdb:column></application_attribute><application_attribute><name>absorb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSORB_</rdb:column></application_attribute><application_attribute><name>suspen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SUSPEN_</rdb:column></application_attribute><application_attribute><name>weitere</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>WEITERE_</rdb:column></application_attribute><application_attribute><name>tube1_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE1__</rdb:column></application_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor.exhaustsystem_iid</inverse_name><rdb:column>FREMDMOTOR__IID</rdb:column><rdb:join>FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR_EXHAUSTSYSTEM_IID IN (?) AND FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR__IID=FREMDMOTOR_.FREMDMOTOR__IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>fremdmotor.exhaustsystem_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .FREMDMOTOR_EXHAUSTSYSTEM_IID IN (?)</rdb:join></relation_attribute><rdb:aid>12</rdb:aid><rdb:table>FREMDMOTOR_EXHAUSTSYSTEM</rdb:table></application_element><application_element><name>motor</name><basetype>AoUnitUnderTest</basetype><application_attribute><name>motor_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>motbegkart</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>MOTBEGKART_</rdb:column><rdb:sql>SELECT BLOB FROM MOTOR_ WHERE MOTOR__IID=?</rdb:sql></application_attribute><application_attribute><name>mtyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MTYP_</rdb:column></application_attribute><application_attribute><name>mtnr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MTNR_</rdb:column></application_attribute><application_attribute><name>bauz</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BAUZ_</rdb:column></application_attribute><application_attribute><name>verbrenn</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERBRENN_</rdb:column></application_attribute><application_attribute><name>bauart</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BAUART_</rdb:column></application_attribute><application_attribute><name>fahrzeug</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>FAHRZEUG_</rdb:column></application_attribute><application_attribute><name>kennz</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KENNZ_</rdb:column></application_attribute><application_attribute><name>gtyp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GTYP_</rdb:column></application_attribute><application_attribute><name>gnr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GNR_</rdb:column></application_attribute><application_attribute><name>riementr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RIEMENTR_</rdb:column></application_attribute><application_attribute><name>generator</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GENERATOR_</rdb:column></application_attribute><application_attribute><name>kmv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KMV_</rdb:column></application_attribute><application_attribute><name>lhp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LHP_</rdb:column></application_attribute><application_attribute><name>abcpumpe</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABCPUMPE_</rdb:column></application_attribute><application_attribute><name>aggrsonst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AGGRSONST_</rdb:column></application_attribute><application_attribute><name>besond</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>BESOND_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>motor_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>MOTOR_.MOTOR__IID IN (?) AND MOTOR_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>motor.exhaustsystem_iid</name><ref_to>motor.exhaustsystem</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:join>MOTOR_EXHAUSTSYSTEM.MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor.motoraufbau_iid</name><ref_to>motor.motoraufbau</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:join>MOTOR_MOTORAUFBAU.MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor.additional_iid</name><ref_to>motor.additional</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:join>MOTOR_ADDITIONAL.MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MOTOR__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .MOTOR__IID IN (?)</rdb:join></relation_attribute><rdb:aid>13</rdb:aid><rdb:table>MOTOR_</rdb:table></application_element><application_element><name>motor.exhaustsystem</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>motor.exhaustsystem_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR_EXHAUSTSYSTEM_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>elbow</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ELBOW_</rdb:column></application_attribute><application_attribute><name>suspen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SUSPEN_</rdb:column></application_attribute><application_attribute><name>inlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>INLET_</rdb:column></application_attribute><application_attribute><name>mixing</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MIXING_</rdb:column></application_attribute><application_attribute><name>cat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CAT_</rdb:column></application_attribute><application_attribute><name>dpf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>DPF_</rdb:column></application_attribute><application_attribute><name>tube1_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE1__</rdb:column></application_attribute><application_attribute><name>fr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>FR_MF_</rdb:column></application_attribute><application_attribute><name>tube2_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE2__</rdb:column></application_attribute><application_attribute><name>in_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>IN_MF_</rdb:column></application_attribute><application_attribute><name>tube3_</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TUBE3__</rdb:column></application_attribute><application_attribute><name>rr_mf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>RR_MF_</rdb:column></application_attribute><application_attribute><name>outlet</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OUTLET_</rdb:column></application_attribute><application_attribute><name>mount</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOUNT_</rdb:column></application_attribute><application_attribute><name>absorb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSORB_</rdb:column></application_attribute><application_attribute><name>weitere</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>WEITERE_</rdb:column></application_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>motor.exhaustsystem_iid</inverse_name><rdb:column>MOTOR__IID</rdb:column><rdb:join>MOTOR_EXHAUSTSYSTEM.MOTOR_EXHAUSTSYSTEM_IID IN (?) AND MOTOR_EXHAUSTSYSTEM.MOTOR__IID=MOTOR_.MOTOR__IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>motor.exhaustsystem_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MOTOR_EXHAUSTSYSTEM_IID IN (?)</rdb:join></relation_attribute><rdb:aid>14</rdb:aid><rdb:table>MOTOR_EXHAUSTSYSTEM</rdb:table></application_element><application_element><name>messtext</name><basetype>AoTestSequence</basetype><application_attribute><name>messtext_iid</name><base_attribute>id</base_attribute><rdb:column>MESSTEXT__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>aufnehmer</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFNEHMER_</rdb:column><rdb:sql>SELECT BLOB FROM MESSTEXT_ WHERE MESSTEXT__IID=?</rdb:sql></application_attribute><application_attribute><name>t</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>T_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><base_relation>environment</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>messtext_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>MESSTEXT_.MESSTEXT__IID IN (?) AND MESSTEXT_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>messtext_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MESSTEXT__IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>messtext_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .MESSTEXT__IID IN (?)</rdb:join></relation_attribute><rdb:aid>15</rdb:aid><rdb:table>MESSTEXT_</rdb:table></application_element><application_element><name>randbedingung</name><basetype>AoAny</basetype><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>randbedingung_iid</name><base_attribute>id</base_attribute><rdb:column>RANDBEDINGUNG__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>ftemp</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>FTEMP_</rdb:column></application_attribute><application_attribute><name>wgeschw</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>WGESCHW_</rdb:column></application_attribute><application_attribute><name>wricht</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>WRICHT_</rdb:column></application_attribute><application_attribute><name>mdat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MDAT_</rdb:column></application_attribute><application_attribute><name>mtim</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MTIM_</rdb:column></application_attribute><application_attribute><name>mort</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MORT_</rdb:column></application_attribute><application_attribute><name>prbes</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>PRBES_</rdb:column></application_attribute><application_attribute><name>ltemp</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>LTEMP_</rdb:column></application_attribute><application_attribute><name>ldruck</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>LDRUCK_</rdb:column></application_attribute><application_attribute><name>feuchte</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>FEUCHTE_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>randbedingung_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>RANDBEDINGUNG_.RANDBEDINGUNG__IID IN (?) AND RANDBEDINGUNG_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>mea-for-AnyId</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>AnyId</inverse_name><rdb:reftable/><rdb:refname>AnyId</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .RANDBEDINGUNG__IID IN (?)</rdb:join></relation_attribute><rdb:aid>16</rdb:aid><rdb:table>RANDBEDINGUNG_</rdb:table></application_element><application_element><name>messzyklus</name><basetype>AoAny</basetype><application_attribute><name>messzyklus_iid</name><base_attribute>id</base_attribute><rdb:column>MESSZYKLUS__IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>zyklus</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYKLUS_</rdb:column></application_attribute><application_attribute><name>zykl_ber</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYKL_BER_</rdb:column></application_attribute><application_attribute><name>lastzust</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LASTZUST_</rdb:column></application_attribute><application_attribute><name>kueb</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KUEB_</rdb:column></application_attribute><application_attribute><name>aufnehmer</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFNEHMER_</rdb:column><rdb:sql>SELECT BLOB FROM MESSZYKLUS_ WHERE MESSZYKLUS__IID=?</rdb:sql></application_attribute><application_attribute><name>gang</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GANG_</rdb:column></application_attribute><application_attribute><name>kmvkomm</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KMVKOMM_</rdb:column></application_attribute><application_attribute><name>lhp</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LHP_</rdb:column></application_attribute><application_attribute><name>lhpkomm</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LHPKOMM_</rdb:column></application_attribute><application_attribute><name>lima</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LIMA_</rdb:column></application_attribute><application_attribute><name>limakomm</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LIMAKOMM_</rdb:column></application_attribute><application_attribute><name>measc</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MEASC_</rdb:column></application_attribute><application_attribute><name>kmv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KMV_</rdb:column></application_attribute><relation_attribute><name>env_iid</name><ref_to>env</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>messzyklus_iid</inverse_name><rdb:column>ENV_IID</rdb:column><rdb:join>MESSZYKLUS_.MESSZYKLUS__IID IN (?) AND MESSZYKLUS_.ENV_IID=ENVIRONMENT_.ENV_IID</rdb:join></relation_attribute><relation_attribute><name>mea-for-CycId</name><ref_to>mea</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>CycId</inverse_name><rdb:reftable/><rdb:refname>CycId</rdb:refname><rdb:join>MEASUREMENT_.MEA_IID=.MEA_IID AND .MESSZYKLUS__IID IN (?)</rdb:join></relation_attribute><rdb:aid>17</rdb:aid><rdb:table>MESSZYKLUS_</rdb:table></application_element><application_element><name>mea</name><basetype>AoSubTest</basetype><application_attribute><name>postproc</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>POSTPROC</rdb:column></application_attribute><application_attribute><name>touchdate</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>TOUCHDATE</rdb:column></application_attribute><application_attribute><name>cirevision</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>CIREVISION</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>mea_iid</name><base_attribute>id</base_attribute><rdb:column>MEA_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><application_attribute><name>meastime</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MEASTIME</rdb:column></application_attribute><application_attribute><name>size</name><datatype>DT_LONG</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>SPACE</rdb:column></application_attribute><application_attribute><name>swrevision</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWREVISION</rdb:column></application_attribute><application_attribute><name>prj</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>PRJ</rdb:column></application_attribute><application_attribute><name>tstser</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TSTSER</rdb:column></application_attribute><application_attribute><name>seq</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SEQ</rdb:column></application_attribute><application_attribute><name>ins</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>INS</rdb:column></application_attribute><application_attribute><name>uut</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>UUT</rdb:column></application_attribute><application_attribute><name>label</name><base_attribute>version</base_attribute><rdb:column>DSK_IID</rdb:column></application_attribute><application_attribute><name>measdate</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>MEASDATE</rdb:column></application_attribute><application_attribute><name>swstate</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWSTATE</rdb:column></application_attribute><application_attribute><name>state</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>STATE</rdb:column></application_attribute><application_attribute><name>cidate</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CIDATE</rdb:column></application_attribute><application_attribute><name>discpath</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>DISCPATH</rdb:column></application_attribute><application_attribute><name>typ</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TYP</rdb:column></application_attribute><application_attribute><name>tstsubject</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TSTSUBJECT_</rdb:column></application_attribute><application_attribute><name>tststand</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TSTSTAND_</rdb:column></application_attribute><application_attribute><name>expert</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>EXPERT_</rdb:column></application_attribute><application_attribute><name>expertdiv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>EXPERTDIV_</rdb:column></application_attribute><application_attribute><name>orderer</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ORDERER_</rdb:column></application_attribute><application_attribute><name>ordererdiv</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ORDERERDIV_</rdb:column></application_attribute><application_attribute><name>auftrdat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AUFTRDAT_</rdb:column></application_attribute><application_attribute><name>ausfuehrdat</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AUSFUEHRDAT_</rdb:column></application_attribute><application_attribute><name>kontierung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KONTIERUNG_</rdb:column></application_attribute><application_attribute><name>auftrnr</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>AUFTRNR_</rdb:column></application_attribute><relation_attribute><name>tstser_iid</name><ref_to>tstser</ref_to><base_relation>parent_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>mea_iid</inverse_name><rdb:column>TSTSER_IID</rdb:column><rdb:join>MEASUREMENT_.MEA_IID IN (?) AND MEASUREMENT_.TSTSER_IID=TEST_.TSTSER_IID</rdb:join></relation_attribute><relation_attribute><name>ins_iid</name><ref_to>ins</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>mea_iid</inverse_name><rdb:column>INS_IID</rdb:column><rdb:join>MEASUREMENT_.MEA_IID IN (?) AND MEASUREMENT_.INS_IID=SETUP_.INS_IID</rdb:join></relation_attribute><relation_attribute><name>dsk_iid</name><ref_to>dsk</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>mea_iid</inverse_name><rdb:column>DSK_IID</rdb:column><rdb:join>MEASUREMENT_.MEA_IID IN (?) AND MEASUREMENT_.DSK_IID=DISKS_.DSK_IID</rdb:join></relation_attribute><application_attribute><name>attachments</name><datatype>DS_EXTERNALREFERENCE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>ATTACHMENTS</rdb:column><rdb:value>'NULL'</rdb:value><rdb:sql>N/A</rdb:sql></application_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:join>DATA-SET_.MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>FREMDMOTOR_.FREMDMOTOR__IID=.FREMDMOTOR__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor.exhaustsystem_iid</name><ref_to>fremdmotor.exhaustsystem</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>FREMDMOTOR_EXHAUSTSYSTEM.FREMDMOTOR_EXHAUSTSYSTEM_IID=.FREMDMOTOR_EXHAUSTSYSTEM_IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MOTOR_.MOTOR__IID=.MOTOR__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor.exhaustsystem_iid</name><ref_to>motor.exhaustsystem</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MOTOR_EXHAUSTSYSTEM.MOTOR_EXHAUSTSYSTEM_IID=.MOTOR_EXHAUSTSYSTEM_IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messtext_iid</name><ref_to>messtext</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MESSTEXT_.MESSTEXT__IID=.MESSTEXT__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>AnyId</name><ref_to>randbedingung</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea-for-AnyId</inverse_name><rdb:reftable/><rdb:refname>AnyId</rdb:refname><rdb:join>RANDBEDINGUNG_.RANDBEDINGUNG__IID=.RANDBEDINGUNG__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>CycId</name><ref_to>messzyklus</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>mea-for-CycId</inverse_name><rdb:reftable/><rdb:refname>CycId</rdb:refname><rdb:join>MESSZYKLUS_.MESSZYKLUS__IID=.MESSZYKLUS__IID AND .MEA_IID IN (?)</rdb:join></relation_attribute><rdb:aid>18</rdb:aid><rdb:table>MEASUREMENT_</rdb:table></application_element><application_element><name>pas</name><basetype>AoParameterSet</basetype><application_attribute><name>pas_iid</name><base_attribute>id</base_attribute><rdb:column>PAS_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute><length>4000</length><rdb:column>DESCR</rdb:column></application_attribute><relation_attribute><name>par_iid</name><ref_to>par</ref_to><base_relation>parameters</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pas_iid</inverse_name><rdb:join>PARAMETER_.PAS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pas_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MEASURING QUANTITY_.MEQ_IID=.MEQ_IID AND .PAS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pas_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>DATA-SET_.DTS_IID=.DTS_IID AND .PAS_IID IN (?)</rdb:join></relation_attribute><rdb:aid>19</rdb:aid><rdb:table>PARAMETER-SET_</rdb:table></application_element><application_element><name>dts</name><basetype>AoMeasurement</basetype><application_attribute><name>dts_iid</name><base_attribute>id</base_attribute><rdb:column>DTS_IID</rdb:column></application_attribute><application_attribute><name>measbegin</name><base_attribute>measurement_begin</base_attribute><rdb:column>MEASBEGIN</rdb:column></application_attribute><application_attribute><name>measend</name><base_attribute>measurement_end</base_attribute><rdb:column>MEASEND</rdb:column></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><relation_attribute><name>mea_iid</name><ref_to>mea</ref_to><base_relation>test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>dts_iid</inverse_name><rdb:column>MEA_IID</rdb:column><rdb:join>DATA-SET_.DTS_IID IN (?) AND DATA-SET_.MEA_IID=MEASUREMENT_.MEA_IID</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:join>MEASURING QUANTITY_.DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>pas_iid</name><ref_to>pas</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>PARAMETER-SET_.PAS_IID=.PAS_IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>units_under_test</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>FREMDMOTOR_.FREMDMOTOR__IID=.FREMDMOTOR__IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>units_under_test</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MOTOR_.MOTOR__IID=.MOTOR__IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>messtext_iid</name><ref_to>messtext</ref_to><base_relation>sequences</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>MESSTEXT_.MESSTEXT__IID=.MESSTEXT__IID AND .DTS_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>sm_iid</name><ref_to>sm</ref_to><base_relation>submatrices</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>dts_iid</inverse_name></relation_attribute><relation_attribute><name>geometry</name><ref_to>geometry</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>measurements_on_geometry</inverse_name></relation_attribute><rdb:aid>20</rdb:aid><rdb:table>DATA-SET_</rdb:table></application_element><application_element><name>quantity</name><basetype>AoQuantity</basetype><application_attribute><name>quantity_iid</name><base_attribute>id</base_attribute><rdb:column>QUANTITY_IID</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><application_attribute><name>def_name</name><base_attribute>default_mq_name</base_attribute><length>4000</length><rdb:column>DEF_NAME</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>default_unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>quantity_iid</inverse_name><rdb:column>UNT_IID</rdb:column><rdb:join>QUANTITY_.QUANTITY_IID IN (?) AND QUANTITY_.UNT_IID=UNIT_.UNT_IID</rdb:join></relation_attribute><relation_attribute><name>pred_iid</name><ref_to>quantity</ref_to><base_relation>predecessor</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>suc_iid</inverse_name><rdb:column>PRED_IID</rdb:column><rdb:join>QUANTITY_.QUANTITY_IID=(SELECT QUANTITY_.PRED_IID FROM QUANTITY_ WHERE QUANTITY_.QUANTITY_IID IN (?))</rdb:join></relation_attribute><relation_attribute><name>suc_iid</name><ref_to>quantity</ref_to><base_relation>successors</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>pred_iid</inverse_name><rdb:join>QUANTITY_.PRED_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantities</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>quantity_iid</inverse_name><rdb:join>MEASURING QUANTITY_.QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>grq_iid</name><ref_to>grq</ref_to><base_relation>groups</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>quantity_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>QUANTITYSYSTEM_.GRQ_IID=.GRQ_IID AND .QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq-for-non_reference_channel_quantity</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>non_reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>non_reference_channel_quantity</rdb:refname><rdb:join>MEASURING QUANTITY_.MEQ_IID=.MEQ_IID AND .QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>meq-for-reference_channel_quantity</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>reference_channel_quantity</rdb:refname><rdb:join>MEASURING QUANTITY_.MEQ_IID=.MEQ_IID AND .QUANTITY_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>used_in_measurement_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>channel_quantity</inverse_name></relation_attribute><rdb:aid>21</rdb:aid><rdb:table>QUANTITY_</rdb:table></application_element><application_element><name>meq</name><basetype>AoMeasurementQuantity</basetype><application_attribute><name>meq_iid</name><base_attribute>id</base_attribute><rdb:column>MEQ_IID</rdb:column></application_attribute><application_attribute><name>aodt</name><base_attribute>datatype</base_attribute><rdb:column>AODT</rdb:column></application_attribute><application_attribute><name>non_reference_channel_name</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>NONREFCHN</rdb:column></application_attribute><application_attribute><name>reference_channel_name</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>REFCHN</rdb:column></application_attribute><application_attribute><name>min_val</name><base_attribute>minimum</base_attribute><rdb:column>MIN_VAL</rdb:column></application_attribute><application_attribute><name>max_val</name><base_attribute>maximum</base_attribute><rdb:column>MAX_VAL</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute><length>4000</length><rdb:column>DESCR</rdb:column></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute><length>4000</length><rdb:column>MIME_TYPE</rdb:column></application_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>DTS_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.DTS_IID=DATA-SET_.DTS_IID</rdb:join></relation_attribute><relation_attribute><name>quantity_iid</name><ref_to>quantity</ref_to><base_relation>quantity</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>QUANTITY_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.QUANTITY_IID=QUANTITY_.QUANTITY_IID</rdb:join></relation_attribute><relation_attribute><name>sen_iid</name><ref_to>devchain</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>SEN_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.SEN_IID=MEAS.DEV.CHAIN_.DEVCHAIN_IID</rdb:join></relation_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>meq_iid</inverse_name><rdb:column>UNT_IID</rdb:column><rdb:join>MEASURING QUANTITY_.MEQ_IID IN (?) AND MEASURING QUANTITY_.UNT_IID=UNIT_.UNT_IID</rdb:join></relation_attribute><relation_attribute><name>non_reference_channel_quantity</name><ref_to>quantity</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq-for-non_reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>non_reference_channel_quantity</rdb:refname><rdb:join>QUANTITY_.QUANTITY_IID=.QUANTITY_IID AND .MEQ_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>reference_channel_quantity</name><ref_to>quantity</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq-for-reference_channel_quantity</inverse_name><rdb:reftable/><rdb:refname>reference_channel_quantity</rdb:refname><rdb:join>QUANTITY_.QUANTITY_IID=.QUANTITY_IID AND .MEQ_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>pas_iid</name><ref_to>pas</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq_iid</inverse_name><rdb:reftable/><rdb:refname>base</rdb:refname><rdb:join>PARAMETER-SET_.PAS_IID=.PAS_IID AND .MEQ_IID IN (?)</rdb:join></relation_attribute><relation_attribute><name>lc_iid</name><ref_to>lc</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>meq_iid</inverse_name></relation_attribute><relation_attribute><name>non_reference_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>in_reference_location</inverse_name></relation_attribute><relation_attribute><name>reference_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>in_non_reference_location</inverse_name></relation_attribute><rdb:aid>22</rdb:aid><rdb:table>MEASURING QUANTITY_</rdb:table></application_element><application_element><name>par</name><basetype>AoParameter</basetype><application_attribute><name>par_iid</name><base_attribute>id</base_attribute><rdb:column>PAR_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>pval</name><base_attribute>pvalue</base_attribute><length>4000</length><rdb:column>PVAL</rdb:column></application_attribute><application_attribute><name>ptyp</name><base_attribute>parameter_datatype</base_attribute><rdb:column>PTYP</rdb:column></application_attribute><relation_attribute><name>unt_iid</name><ref_to>unt</ref_to><base_relation>unit</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>par_iid</inverse_name><rdb:column>UNT_IID</rdb:column><rdb:join>PARAMETER_.PAR_IID IN (?) AND PARAMETER_.UNT_IID=UNIT_.UNT_IID</rdb:join></relation_attribute><relation_attribute><name>pas_iid</name><ref_to>pas</ref_to><base_relation>parameter_set</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>par_iid</inverse_name><rdb:column>PAS_IID</rdb:column><rdb:join>PARAMETER_.PAR_IID IN (?) AND PARAMETER_.PAS_IID=PARAMETER-SET_.PAS_IID</rdb:join></relation_attribute><rdb:aid>26</rdb:aid><rdb:table>PARAMETER_</rdb:table></application_element><application_element><name>fremdmotor.motoraufbau</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>fremdmotor.motoraufbau_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR_MOTORAUFBAU_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>kurbelwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELWELLE_</rdb:column></application_attribute><application_attribute><name>kolben</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KOLBEN_</rdb:column></application_attribute><application_attribute><name>ladeluftkueh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTKUEH_</rdb:column></application_attribute><application_attribute><name>ladeluftleit</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTLEIT_</rdb:column></application_attribute><application_attribute><name>absblenden</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSBLENDEN_</rdb:column></application_attribute><application_attribute><name>kraftstoff</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KRAFTSTOFF_</rdb:column></application_attribute><application_attribute><name>klopfregelung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KLOPFREGELUNG_</rdb:column></application_attribute><application_attribute><name>gelenkwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GELENKWELLE_</rdb:column></application_attribute><application_attribute><name>sonst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SONST_</rdb:column></application_attribute><application_attribute><name>swstand</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWSTAND_</rdb:column></application_attribute><application_attribute><name>abdeckung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABDECKUNG_</rdb:column></application_attribute><application_attribute><name>rohlufthutzen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ROHLUFTHUTZEN_</rdb:column></application_attribute><application_attribute><name>luftfilter</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LUFTFILTER_</rdb:column></application_attribute><application_attribute><name>oelwanne</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OELWANNE_</rdb:column></application_attribute><application_attribute><name>motorlager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORLAGER_</rdb:column></application_attribute><application_attribute><name>motortraeger</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORTRAEGER_</rdb:column></application_attribute><application_attribute><name>getriebelager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GETRIEBELAGER_</rdb:column></application_attribute><application_attribute><name>torsdaempf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TORSDAEMPF_</rdb:column></application_attribute><application_attribute><name>kurbelgeh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELGEH_</rdb:column></application_attribute><application_attribute><name>zylkopf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYLKOPF_</rdb:column></application_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor.motoraufbau_iid</inverse_name><rdb:column>FREMDMOTOR__IID</rdb:column><rdb:join>FREMDMOTOR_MOTORAUFBAU.FREMDMOTOR_MOTORAUFBAU_IID IN (?) AND FREMDMOTOR_MOTORAUFBAU.FREMDMOTOR__IID=FREMDMOTOR_.FREMDMOTOR__IID</rdb:join></relation_attribute><rdb:aid>27</rdb:aid><rdb:table>FREMDMOTOR_MOTORAUFBAU</rdb:table></application_element><application_element><name>fremdmotor.additional</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>fremdmotor.additional_iid</name><base_attribute>id</base_attribute><rdb:column>FREMDMOTOR_ADDITIONAL_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>add</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ADD_</rdb:column></application_attribute><application_attribute><name>auftrag</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFTRAG_</rdb:column><rdb:sql>SELECT BLOB FROM FREMDMOTOR_ADDITIONAL WHERE FREMDMOTOR_ADDITIONAL_IID=?</rdb:sql></application_attribute><relation_attribute><name>fremdmotor_iid</name><ref_to>fremdmotor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>fremdmotor.additional_iid</inverse_name><rdb:column>FREMDMOTOR__IID</rdb:column><rdb:join>FREMDMOTOR_ADDITIONAL.FREMDMOTOR_ADDITIONAL_IID IN (?) AND FREMDMOTOR_ADDITIONAL.FREMDMOTOR__IID=FREMDMOTOR_.FREMDMOTOR__IID</rdb:join></relation_attribute><rdb:aid>28</rdb:aid><rdb:table>FREMDMOTOR_ADDITIONAL</rdb:table></application_element><application_element><name>motor.motoraufbau</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>motor.motoraufbau_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR_MOTORAUFBAU_IID</rdb:column></application_attribute><application_attribute><name>swstand</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SWSTAND_</rdb:column></application_attribute><application_attribute><name>abdeckung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABDECKUNG_</rdb:column></application_attribute><application_attribute><name>rohlufthutzen</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ROHLUFTHUTZEN_</rdb:column></application_attribute><application_attribute><name>luftfilter</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LUFTFILTER_</rdb:column></application_attribute><application_attribute><name>oelwanne</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>OELWANNE_</rdb:column></application_attribute><application_attribute><name>motorlager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORLAGER_</rdb:column></application_attribute><application_attribute><name>motortraeger</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>MOTORTRAEGER_</rdb:column></application_attribute><application_attribute><name>getriebelager</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GETRIEBELAGER_</rdb:column></application_attribute><application_attribute><name>torsdaempf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>TORSDAEMPF_</rdb:column></application_attribute><application_attribute><name>zylkopf</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ZYLKOPF_</rdb:column></application_attribute><application_attribute><name>kurbelgeh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELGEH_</rdb:column></application_attribute><application_attribute><name>kurbelwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KURBELWELLE_</rdb:column></application_attribute><application_attribute><name>kolben</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KOLBEN_</rdb:column></application_attribute><application_attribute><name>ladeluftkueh</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTKUEH_</rdb:column></application_attribute><application_attribute><name>ladeluftleit</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>LADELUFTLEIT_</rdb:column></application_attribute><application_attribute><name>absblenden</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ABSBLENDEN_</rdb:column></application_attribute><application_attribute><name>kraftstoff</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KRAFTSTOFF_</rdb:column></application_attribute><application_attribute><name>klopfregelung</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>KLOPFREGELUNG_</rdb:column></application_attribute><application_attribute><name>sonst</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>SONST_</rdb:column></application_attribute><application_attribute><name>gelenkwelle</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>GELENKWELLE_</rdb:column></application_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>motor.motoraufbau_iid</inverse_name><rdb:column>MOTOR__IID</rdb:column><rdb:join>MOTOR_MOTORAUFBAU.MOTOR_MOTORAUFBAU_IID IN (?) AND MOTOR_MOTORAUFBAU.MOTOR__IID=MOTOR_.MOTOR__IID</rdb:join></relation_attribute><rdb:aid>29</rdb:aid><rdb:table>MOTOR_MOTORAUFBAU</rdb:table></application_element><application_element><name>motor.additional</name><basetype>AoUnitUnderTestPart</basetype><application_attribute><name>motor.additional_iid</name><base_attribute>id</base_attribute><rdb:column>MOTOR_ADDITIONAL_IID</rdb:column></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute><length>4000</length><rdb:column>INAME</rdb:column></application_attribute><application_attribute><name>changed</name><datatype>DT_DATE</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>CHANGED</rdb:column></application_attribute><application_attribute><name>version</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>VERS</rdb:column></application_attribute><application_attribute><name>add</name><datatype>DT_STRING</datatype><obligatory>false</obligatory><unique>false</unique><length>4000</length><rdb:column>ADD_</rdb:column></application_attribute><application_attribute><name>auftrag</name><datatype>DT_BLOB</datatype><obligatory>false</obligatory><unique>false</unique><rdb:column>AUFTRAG_</rdb:column><rdb:sql>SELECT BLOB FROM MOTOR_ADDITIONAL WHERE MOTOR_ADDITIONAL_IID=?</rdb:sql></application_attribute><relation_attribute><name>motor_iid</name><ref_to>motor</ref_to><base_relation>parent_unit_under_test</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>motor.additional_iid</inverse_name><rdb:column>MOTOR__IID</rdb:column><rdb:join>MOTOR_ADDITIONAL.MOTOR_ADDITIONAL_IID IN (?) AND MOTOR_ADDITIONAL.MOTOR__IID=MOTOR_.MOTOR__IID</rdb:join></relation_attribute><rdb:aid>30</rdb:aid><rdb:table>MOTOR_ADDITIONAL</rdb:table></application_element><application_element><name>sm</name><basetype>AoSubmatrix</basetype><application_attribute><name>sm_iid</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>mime_type</name><base_attribute>mime_type</base_attribute></application_attribute><application_attribute><name>number_of_rows</name><base_attribute>number_of_rows</base_attribute></application_attribute><relation_attribute><name>lc_iid</name><ref_to>lc</ref_to><base_relation>local_columns</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>sm_iid</inverse_name></relation_attribute><relation_attribute><name>dts_iid</name><ref_to>dts</ref_to><base_relation>measurement</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>sm_iid</inverse_name></relation_attribute><relation_attribute><name>x-axis-for-y-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-x-axis</inverse_name></relation_attribute><relation_attribute><name>z-axis-for-y-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>y-axis-for-z-axis</inverse_name></relation_attribute><relation_attribute><name>y-axis-for-x-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>x-axis-for-y-axis</inverse_name></relation_attribute><relation_attribute><name>y-axis-for-z-axis</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>z-axis-for-y-axis</inverse_name></relation_attribute><relation_attribute><name>geometry</name><ref_to>geometry</ref_to><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>geometry_shapes</inverse_name></relation_attribute></application_element><application_element><name>lc</name><basetype>AoLocalColumn</basetype><application_attribute><name>lc_iid</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>independent</name><base_attribute>independent</base_attribute></application_attribute><application_attribute><name>values</name><base_attribute>values</base_attribute></application_attribute><application_attribute><name>sequence_representation</name><base_attribute>sequence_representation</base_attribute></application_attribute><application_attribute><name>generation_parameters</name><base_attribute>generation_parameters</base_attribute></application_attribute><application_attribute><name>raw_datatype</name><base_attribute>raw_datatype</base_attribute></application_attribute><application_attribute><name>axistype</name><datatype>DT_ENUM</datatype><enumeration_type>axistype</enumeration_type></application_attribute><application_attribute><name>global_flag</name><base_attribute>global_flag</base_attribute></application_attribute><application_attribute><name>flags</name><base_attribute>flags</base_attribute></application_attribute><relation_attribute><name>ec_iid</name><ref_to>ec</ref_to><base_relation>external_component</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>lc_iid</inverse_name></relation_attribute><relation_attribute><name>sm_iid</name><ref_to>sm</ref_to><base_relation>submatrix</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>lc_iid</inverse_name></relation_attribute><relation_attribute><name>meq_iid</name><ref_to>meq</ref_to><base_relation>measurement_quantity</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>lc_iid</inverse_name></relation_attribute></application_element><application_element><name>ec</name><basetype>AoExternalComponent</basetype><application_attribute><name>ec_iid</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>iname</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>description</name><base_attribute>description</base_attribute></application_attribute><application_attribute><name>ordinal_number</name><base_attribute>ordinal_number</base_attribute></application_attribute><application_attribute><name>component_length</name><base_attribute>component_length</base_attribute></application_attribute><application_attribute><name>filename_url</name><base_attribute>filename_url</base_attribute></application_attribute><application_attribute><name>value_type</name><base_attribute>value_type</base_attribute></application_attribute><application_attribute><name>start_offset</name><base_attribute>start_offset</base_attribute></application_attribute><application_attribute><name>block_size</name><base_attribute>block_size</base_attribute></application_attribute><application_attribute><name>valuesperblock</name><base_attribute>valuesperblock</base_attribute></application_attribute><application_attribute><name>value_offset</name><base_attribute>value_offset</base_attribute></application_attribute><relation_attribute><name>lc_iid</name><ref_to>lc</ref_to><base_relation>local_column</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>ec_iid</inverse_name></relation_attribute></application_element><application_element><name>coordinate_system</name><basetype>AoAny</basetype><application_attribute><name>id</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>name</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute></application_attribute><application_attribute><name>coordinate_system_type</name><datatype>DT_ENUM</datatype><enumeration_type>coordinate_system_types</enumeration_type></application_attribute><application_attribute><name>origin_1</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>origin_2</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>origin_3</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>x_axis_1</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>x_axis_2</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>x_axis_3</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>xz_plane_1</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>xz_plane_2</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><application_attribute><name>xz_plane_3</name><datatype>DT_DOUBLE</datatype><obligatory>false</obligatory></application_attribute><relation_attribute><name>reference_system</name><ref_to>coordinate_system</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>1</max_occurs><inverse_name>locale_systems</inverse_name></relation_attribute><relation_attribute><name>locale_systems</name><ref_to>coordinate_system</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>reference_system</inverse_name></relation_attribute><relation_attribute><name>used_in_geometries</name><ref_to>geometry</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>coordinate_system</inverse_name></relation_attribute><relation_attribute><name>used_in_measurement_locations</name><ref_to>measurement_location</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>coordinate_system</inverse_name></relation_attribute></application_element><application_element><name>geometry</name><basetype>AoAny</basetype><application_attribute><name>id</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>name</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>version</name><base_attribute>version</base_attribute></application_attribute><application_attribute><name>geometry_id</name><datatype>DT_LONG</datatype></application_attribute><relation_attribute><name>coordinate_system</name><ref_to>coordinate_system</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>used_in_geometries</inverse_name></relation_attribute><relation_attribute><name>sub_geometries</name><ref_to>geometry</ref_to><base_relation>children</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>parent_geometry</inverse_name></relation_attribute><relation_attribute><name>parent_geometry</name><ref_to>geometry</ref_to><base_relation>parent</base_relation><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>sub_geometries</inverse_name></relation_attribute><relation_attribute><name>measurements_on_geometry</name><ref_to>dts</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>geometry</inverse_name></relation_attribute><relation_attribute><name>geometry_shapes</name><ref_to>sm</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>geometry</inverse_name></relation_attribute></application_element><application_element><name>measurement_location</name><basetype>AoTestEquipmentPart</basetype><application_attribute><name>id</name><base_attribute>id</base_attribute></application_attribute><application_attribute><name>name</name><base_attribute>name</base_attribute></application_attribute><application_attribute><name>location_shape_id</name><datatype>DT_LONG</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>location_geometry_id</name><datatype>DT_LONG</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>location_mode</name><datatype>DT_ENUM</datatype><enumeration_type>location_modes</enumeration_type><obligatory>true</obligatory></application_attribute><application_attribute><name>channel_name</name><datatype>DT_STRING</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>channel_description</name><datatype>DT_STRING</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>u</name><datatype>DT_FLOAT</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>v</name><datatype>DT_FLOAT</datatype><obligatory>true</obligatory></application_attribute><application_attribute><name>w</name><datatype>DT_FLOAT</datatype><obligatory>true</obligatory></application_attribute><relation_attribute><name>coordinate_system</name><ref_to>coordinate_system</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>used_in_measurement_locations</inverse_name></relation_attribute><relation_attribute><name>channel_quantity</name><ref_to>quantity</ref_to><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>used_in_measurement_locations</inverse_name></relation_attribute><relation_attribute><name>in_reference_location</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>reference_locations</inverse_name></relation_attribute><relation_attribute><name>in_non_reference_location</name><ref_to>meq</ref_to><min_occurs>0</min_occurs><max_occurs>Many</max_occurs><inverse_name>non_reference_locations</inverse_name></relation_attribute><relation_attribute><name>devchain_iid</name><ref_to>devchain</ref_to><base_relation>parent_equipment_part</base_relation><min_occurs>1</min_occurs><max_occurs>1</max_occurs><inverse_name>measurement_locations</inverse_name></relation_attribute></application_element></application_model></atfx_file>
+
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/TSA/model.atfx.technical b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/TSA/model.atfx.technical
new file mode 100644
index 0000000..5d5a5f4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/configuration/TSA/model.atfx.technical
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/boundary/FileReleaseResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/boundary/FileReleaseResource.java
new file mode 100644
index 0000000..452eda5
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/boundary/FileReleaseResource.java
@@ -0,0 +1,181 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.boundary;
+
+import java.util.List;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.filerelease.control.FileReleaseManager;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.eclipse.mdm.filerelease.entity.FileReleaseResponse;
+import org.eclipse.mdm.filerelease.utils.FileReleaseUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * {@link FileRelease} resource
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Tag(name = "FileReleases")
+@Path("/filereleases")
+public class FileReleaseResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(FileReleaseResource.class);
+
+	@EJB
+	private FileReleaseService fileReleaseService;
+
+	/**
+	 * 
+	 * delegates the request to the {@link FileReleaseService}
+	 * 
+	 * @param identifier The identifier of the {@link FileRelease}
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	@Path("/{IDENTIFIER}")
+	public Response getRelease(@PathParam("IDENTIFIER") String identifier) {
+		try {
+			FileRelease fileRelease = this.fileReleaseService.getRelease(identifier);
+			return FileReleaseUtils.toResponse(new FileReleaseResponse(fileRelease), Status.OK);
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link FileReleaseService}
+	 * 
+	 * @param state     The state of the {@link FileRelease}s to return
+	 * @param direction The file release direction (incoming or outgoing)
+	 * @return @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getReleases(@QueryParam("direction") String direction, @QueryParam("state") String state) {
+		try {
+
+			List<FileRelease> list = null;
+
+			if ((direction != null)
+					&& direction.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_DIRECTION_INCOMMING)) {
+				list = this.fileReleaseService.getIncommingReleases(state);
+			} else if ((direction != null)
+					&& direction.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_DIRECTION_OUTGOING)) {
+				list = this.fileReleaseService.getOutgoingReleases(state);
+			} else {
+				list = this.fileReleaseService.getReleases(state);
+			}
+
+			return FileReleaseUtils.toResponse(new FileReleaseResponse(list), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link FileReleaseService}
+	 * 
+	 * @param newFileRelease The {@link FileReleaseRequest} to create.
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response create(FileRelease newFileRelease) {
+		try {
+			FileRelease fileRelease = this.fileReleaseService.create(newFileRelease);
+			return FileReleaseUtils.toResponse(new FileReleaseResponse(fileRelease), Status.OK);
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link FileReleaseService}
+	 * 
+	 * @param identifier The identifier of the {@link FileRelease} to update.
+	 * @param The        {@link FileRelease} with updated state
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{IDENTIFIER}")
+	public Response update(@PathParam("IDENTIFIER") String identifier, FileRelease updatedFileRelease) {
+		try {
+
+			if (!identifier.equals(updatedFileRelease.identifier)) {
+				throw new WebApplicationException("illegal update post request (identifier is not matching)",
+						Status.FORBIDDEN);
+			}
+
+			if (updatedFileRelease.state.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_STATE_APPROVED)) {
+				FileRelease fr = this.fileReleaseService.approve(updatedFileRelease);
+				return FileReleaseUtils.toResponse(new FileReleaseResponse(fr), Status.OK);
+			} else if (updatedFileRelease.state.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_STATE_REJECTED)) {
+				FileRelease fr = this.fileReleaseService.reject(updatedFileRelease);
+				return FileReleaseUtils.toResponse(new FileReleaseResponse(fr), Status.OK);
+			}
+			String errorMessage = "permission denied: only state updates are allowd "
+					+ "(expected stats: RELEASE_APPROVED or RELEASE_REJECTED";
+			throw new WebApplicationException(errorMessage, Status.FORBIDDEN);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link FileReleaseService}
+	 * 
+	 * @param identifier The identifier of the {@link FileRelease} to delete.
+	 * @return the result of the delegated request as {@link Response} (only OK if
+	 *         {@link FileRelease} has been deleted)
+	 */
+	@DELETE
+	@Path("/{IDENTIFIER}")
+	public Response delete(@PathParam("IDENTIFIER") String identifier) {
+		try {
+			this.fileReleaseService.delete(identifier);
+			return Response.ok().build();
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/boundary/FileReleaseService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/boundary/FileReleaseService.java
new file mode 100644
index 0000000..56004ee
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/boundary/FileReleaseService.java
@@ -0,0 +1,247 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.boundary;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.filerelease.control.FileConvertJobManager;
+import org.eclipse.mdm.filerelease.control.FileReleaseException;
+import org.eclipse.mdm.filerelease.control.FileReleaseManager;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.eclipse.mdm.filerelease.utils.FileReleasePermissionUtils;
+import org.eclipse.mdm.filerelease.utils.FileReleaseUtils;
+import org.eclipse.mdm.property.GlobalProperty;
+
+/**
+ * FileReleaseService Bean implementation with available {@link FileRelease}
+ * operations
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class FileReleaseService {
+
+	@Inject
+	private ConnectorService connectorService;
+	@EJB
+	private FileReleaseManager manager;
+	@EJB
+	private FileConvertJobManager converter;
+
+	@Inject
+	@GlobalProperty("filerelease.converter.target.root.directory")
+	private String targetDirectoryPath = "";
+
+	/**
+	 * Returns the the {@link FileRelease} with the given identifier
+	 * 
+	 * @param identifier The identifier of the {@link FileRelease}
+	 * @return The {@link FileRelease}
+	 */
+	public FileRelease getRelease(String identifier) {
+		User user = FileReleaseUtils.getLoggedOnUser(this.connectorService);
+		return this.manager.getRelease(user.getName(), identifier);
+	}
+
+	/**
+	 * Returns all {@link FileRelease}s with the given state.
+	 * 
+	 * @param state The state of the {@link FileRelease}s to return (null means all
+	 *              releases in every state will be returned)
+	 * @return The {@link FileRelease}s in given state or all {@link FileRelease}s
+	 */
+	public List<FileRelease> getReleases(String state) {
+		Set<FileRelease> fileReleases = new HashSet<>();
+		fileReleases.addAll(getIncommingReleases(state));
+		fileReleases.addAll(getOutgoingReleases(state));
+		return new ArrayList<>(fileReleases);
+	}
+
+	/**
+	 * Returns all incoming {@link FileRelease}s with the given state.
+	 * 
+	 * @param state The state of the incoming {@link FileRelease}s to return (null
+	 *              means all incoming releases in every state will be returned)
+	 * @return The incoming {@link FileRelease} in given state or all incoming
+	 *         {@link FileRelease}s
+	 */
+	public List<FileRelease> getIncommingReleases(String state) {
+
+		User user = FileReleaseUtils.getLoggedOnUser(this.connectorService);
+		if (state == null || state.trim().length() <= 0) {
+			List<FileRelease> list = this.manager.getReleases(user.getName(),
+					FileReleaseManager.FILE_RELEASE_DIRECTION_INCOMMING);
+			return FileReleaseUtils.filterByConnectedSources(list, this.connectorService);
+		}
+		List<FileRelease> list = this.manager.getReleases(user.getName(),
+				FileReleaseManager.FILE_RELEASE_DIRECTION_INCOMMING, state);
+		return FileReleaseUtils.filterByConnectedSources(list, this.connectorService);
+	}
+
+	/**
+	 * Returns all outgoing {@link FileRelease}s with the given state.
+	 * 
+	 * @param state The state of the outgoing {@link FileRelease}s to return (null
+	 *              means all outgoing releases in every state will be returned)
+	 * @return The outgoing {@link FileRelease}s in given state or all outgoing
+	 *         {@link FileRelease}s
+	 */
+	public List<FileRelease> getOutgoingReleases(String state) {
+
+		User user = FileReleaseUtils.getLoggedOnUser(this.connectorService);
+		if (state == null || state.trim().length() <= 0) {
+			List<FileRelease> list = this.manager.getReleases(user.getName(),
+					FileReleaseManager.FILE_RELEASE_DIRECTION_OUTGOING);
+			return FileReleaseUtils.filterByConnectedSources(list, this.connectorService);
+		}
+		List<FileRelease> list = this.manager.getReleases(user.getName(),
+				FileReleaseManager.FILE_RELEASE_DIRECTION_OUTGOING, state);
+		return FileReleaseUtils.filterByConnectedSources(list, this.connectorService);
+	}
+
+	/**
+	 * Creates a new {@link FileRelease}. Approves the {@link FileRelease} directly
+	 * if the sender is equals the receiver of the {@link FileRelease}.
+	 * 
+	 * @param newFileRelease The given {@link FileRelease} that holds the
+	 *                       information to create a new {@link FileRelease}
+	 */
+	public FileRelease create(FileRelease newFileRelease) {
+		checkFileReleaseRequest(newFileRelease);
+		User user = FileReleaseUtils.getLoggedOnUser(this.connectorService);
+
+		List<FileRelease> list = this.manager.getReleases(user.getName(),
+				FileReleaseManager.FILE_RELEASE_DIRECTION_OUTGOING);
+		FileReleasePermissionUtils.canCreate(newFileRelease, user.getName(), list);
+
+		TestStep testStep = FileReleaseUtils.loadTestStep(connectorService, newFileRelease.sourceName,
+				newFileRelease.id);
+		User receiver = FileReleaseUtils.getResponsiblePerson(this.connectorService, testStep);
+
+		newFileRelease.identifier = UUID.randomUUID().toString();
+		newFileRelease.name = testStep.getName();
+		newFileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_ORDERED;
+		newFileRelease.sender = user.getName();
+		newFileRelease.receiver = receiver.getName();
+
+		this.manager.addFileRelease(newFileRelease);
+
+		if (newFileRelease.sender.equalsIgnoreCase(newFileRelease.receiver)) {
+			FileRelease fileRelease2Approve = new FileRelease();
+			fileRelease2Approve.identifier = newFileRelease.identifier;
+			fileRelease2Approve.state = FileReleaseManager.FILE_RELEASE_STATE_APPROVED;
+			approve(fileRelease2Approve);
+		}
+
+		return newFileRelease;
+	}
+
+	/**
+	 * Deletes the {@link FileRelease} with the given identifier.
+	 * 
+	 * @param identifier The identifier of the {@link FileRelease} to delete.
+	 */
+	public void delete(String identifier) {
+
+		User user = FileReleaseUtils.getLoggedOnUser(this.connectorService);
+		FileRelease fileRelease = this.manager.getRelease(user.getName(), identifier);
+
+		FileReleasePermissionUtils.canDelete(fileRelease, user.getName());
+		File targetDirectory = FileReleaseUtils.locateTargetDirectory(this.targetDirectoryPath);
+		File targetFile = new File(targetDirectory, fileRelease.fileLink);
+		if (this.manager.canDeleteFileLink(fileRelease.identifier, fileRelease.fileLink)) {
+			FileReleaseUtils.deleteFileLink(targetFile);
+		}
+
+		this.manager.removeFileRelease(fileRelease);
+	}
+
+	/**
+	 * Approves and Releases the {@link FileRelease}
+	 * 
+	 * @param updatedFileRelease The {@link FileRelease} to approve and release
+	 */
+	public FileRelease approve(FileRelease updatedFileRelease) {
+
+		User user = FileReleaseUtils.getLoggedOnUser(this.connectorService);
+		FileRelease fileRelease = this.manager.getRelease(user.getName(), updatedFileRelease.identifier);
+
+		FileReleasePermissionUtils.canApprove(fileRelease, user.getName());
+		fileRelease.state = updatedFileRelease.state;
+
+		FileReleasePermissionUtils.canRelease(fileRelease, user.getName());
+		this.converter.release(fileRelease, FileReleaseUtils.locateTargetDirectory(this.targetDirectoryPath));
+		return fileRelease;
+	}
+
+	/**
+	 * Rejects the {@link FileRelease} with the given identifier. Sets the given
+	 * message as reject message.
+	 * 
+	 * @param updatedFileRelease {@link FileRelease} to reject
+	 */
+	public FileRelease reject(FileRelease updatedFileRelease) {
+
+		User user = FileReleaseUtils.getLoggedOnUser(this.connectorService);
+		FileRelease fileRelease = this.manager.getRelease(user.getName(), updatedFileRelease.identifier);
+
+		FileReleasePermissionUtils.canReject(fileRelease, user.getName());
+		fileRelease.state = updatedFileRelease.state;
+		fileRelease.rejectMessage = updatedFileRelease.rejectMessage;
+		return fileRelease;
+	}
+
+	private void checkFileReleaseRequest(FileRelease newFileRelease) {
+		if (newFileRelease.sourceName == null || newFileRelease.sourceName.trim().length() < 1) {
+			throw new FileReleaseException("source name for new FileRelease is missing!");
+		}
+
+		if (newFileRelease.typeName == null || newFileRelease.typeName.trim().length() < 1) {
+			throw new FileReleaseException("type name for new FileRelease is missing!");
+		}
+
+		if (newFileRelease.id == null || newFileRelease.id.isEmpty()) {
+			throw new FileReleaseException("is is not valid for new FileRelease");
+		}
+
+		if (newFileRelease.validity <= 0) {
+			throw new FileReleaseException("validity [days] is not set for new FileRelease");
+		}
+
+		if (newFileRelease.format == null || newFileRelease.format.trim().length() <= 0) {
+			throw new FileReleaseException("output format for new FileRelease is missing!");
+		}
+
+		if (!FileReleaseUtils.isFormatValid(newFileRelease.format)) {
+			throw new FileReleaseException(
+					"unsupported file output format '" + newFileRelease.format + "' was defined for new FileRelease");
+		}
+
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileConvertJob.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileConvertJob.java
new file mode 100644
index 0000000..10adca8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileConvertJob.java
@@ -0,0 +1,97 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control;
+
+import java.io.File;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.filerelease.control.converter.FileConverterException;
+import org.eclipse.mdm.filerelease.control.converter.IFileConverter;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Job for converting files.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class FileConvertJob implements Runnable {
+
+	private static final Logger LOG = LoggerFactory.getLogger(FileConvertJob.class);
+
+	private final IFileConverter fileConverter;
+	private final FileRelease fileRelease;
+	private final TestStep testStep;
+	private final ApplicationContext context;
+	private final File targetDirectory;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param fileRelease     The {@link FileRelease} that contains the link to the
+	 *                        file to convert
+	 * @param fileConverter   The {@link IFileConverter} to use for the conversion
+	 * @param testStep        The {@link TestStep}
+	 * @param em              The {@link EntityManager}
+	 * @param targetDirectory target output directory for the generated files
+	 */
+	public FileConvertJob(FileRelease fileRelease, IFileConverter fileConverter, TestStep testStep,
+			ApplicationContext context, File targetDirectory) {
+
+		this.fileRelease = fileRelease;
+		this.fileConverter = fileConverter;
+		this.testStep = testStep;
+		this.context = context;
+		this.targetDirectory = targetDirectory;
+	}
+
+	/**
+	 * Executes the file conversion.
+	 */
+	@Override
+	public void run() {
+		try {
+			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING;
+
+			this.fileConverter.execute(this.fileRelease, this.testStep, this.context, this.targetDirectory);
+
+			this.fileRelease.expire = calculateExpireDate(this.fileRelease.validity);
+			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_RELEASED;
+
+		} catch (FileConverterException e) {
+			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING_ERROR;
+			this.fileRelease.errorMessage = e.getMessage();
+			LOG.error(e.getMessage(), e);
+		} catch (Exception e) {
+			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING_ERROR;
+			this.fileRelease.errorMessage = e.getMessage();
+			LOG.error(e.getMessage(), e);
+		}
+	}
+
+	private long calculateExpireDate(int validity) {
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(new Date());
+		calendar.add(Calendar.DAY_OF_MONTH, validity);
+		return calendar.getTimeInMillis();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileConvertJobManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileConvertJobManager.java
new file mode 100644
index 0000000..7c03439
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileConvertJobManager.java
@@ -0,0 +1,100 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control;
+
+import java.io.File;
+import java.util.concurrent.Executor;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.filerelease.control.converter.FileConverterPAK2ATFX;
+import org.eclipse.mdm.filerelease.control.converter.FileConverterPAK2RAW;
+import org.eclipse.mdm.filerelease.control.converter.IFileConverter;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * FileConvertJobManager Bean implementation.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class FileConvertJobManager {
+
+	private static final Logger LOG = LoggerFactory.getLogger(FileConvertJobManager.class);
+
+	@Inject
+	Executor executor;
+
+	@Inject
+	private ConnectorService connectorService;
+
+	@Inject
+	private FileConverterPAK2RAW fileConverterPAK2RAW;
+	@Inject
+	private FileConverterPAK2ATFX fileConverterPAK2ATFX;
+
+	/**
+	 * releases the given {@link FileRelease} (generates the file in the specified
+	 * format)
+	 * 
+	 * @param fileRelease     {@link FileRelease} to release
+	 * @param targetDirectory target output directory of the generated file
+	 */
+	public void release(FileRelease fileRelease, File targetDirectory) {
+
+		try {
+			ApplicationContext context = this.connectorService.getContextByName(fileRelease.sourceName);
+			EntityManager em = context.getEntityManager()
+					.orElseThrow(() -> new FileReleaseException("Entity manager not present!"));
+
+			TestStep testStep = em.load(TestStep.class, fileRelease.id);
+
+			IFileConverter converter = getFileConverterByFormat(fileRelease);
+			String identifier = fileRelease.identifier;
+
+			LOG.info("starting file release process for FileRelease with identifier '" + identifier + "' (with '"
+					+ converter.getConverterName() + "') ...");
+
+			Runnable runnable = new FileConvertJob(fileRelease, converter, testStep, context, targetDirectory);
+			this.executor.execute(runnable);
+		} catch (DataAccessException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+
+	}
+
+	private IFileConverter getFileConverterByFormat(FileRelease fileRelease) {
+		if (fileRelease.format.equalsIgnoreCase(FileReleaseManager.CONVERTER_FORMAT_PAK2RAW)) {
+			return this.fileConverterPAK2RAW;
+
+		} else if (fileRelease.format.equalsIgnoreCase(FileReleaseManager.CONVERTER_FORMAT_PAK2ATFX)) {
+			return this.fileConverterPAK2ATFX;
+		}
+
+		throw new FileReleaseException("no FileConverter found for format '" + fileRelease.format
+				+ "' on executing FileRelease with identifier '" + fileRelease.identifier + "'!");
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseException.java
new file mode 100644
index 0000000..cbba57f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseException.java
@@ -0,0 +1,45 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control;
+
+/**
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class FileReleaseException extends RuntimeException {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param message The error message.
+	 */
+	public FileReleaseException(String message) {
+		super(message);
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param message The error message
+	 * @param t       The {@link Throwable} that caused the exception
+	 */
+	public FileReleaseException(String message, Throwable t) {
+		super(message, t);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseExecutor.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseExecutor.java
new file mode 100644
index 0000000..efca858
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseExecutor.java
@@ -0,0 +1,38 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control;
+
+import java.util.concurrent.Executor;
+
+import javax.ejb.Asynchronous;
+import javax.ejb.Stateless;
+
+/**
+ * 
+ * {@link Executor} implementation.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class FileReleaseExecutor implements Executor {
+
+	@Override
+	@Asynchronous
+	public void execute(Runnable command) {
+		command.run();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseManager.java
new file mode 100644
index 0000000..ae5afd1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleaseManager.java
@@ -0,0 +1,244 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.ejb.EJB;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * FileReleaseManager bean implementation.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Startup
+@Singleton
+public class FileReleaseManager {
+
+	private static final Logger LOG = LoggerFactory.getLogger(FileReleaseManager.class);
+
+	public static final String FILE_RELEASE_STATE_ORDERED = "RELEASE_ORDERED";
+	public static final String FILE_RELEASE_STATE_REJECTED = "RELEASE_REJECTED";
+	public static final String FILE_RELEASE_STATE_APPROVED = "RELEASE_APPROVED";
+	public static final String FILE_RELEASE_STATE_PROGRESSING = "RELEASE_PROGRESSING";
+	public static final String FILE_RELEASE_STATE_PROGRESSING_ERROR = "RELEASE_PROGRESSING_ERROR";
+	public static final String FILE_RELEASE_STATE_RELEASED = "RELEASE_RELEASED";
+	public static final String FILE_RELEASE_STATE_EXPIRED = "RELEASE_EXPIRED";
+
+	public static final String FILE_RELEASE_DIRECTION_INCOMMING = "INCOMMING";
+	public static final String FILE_RELEASE_DIRECTION_OUTGOING = "OUTGOING";
+
+	public static final String CONVERTER_FORMAT_PAK2RAW = "PAK2RAW";
+	public static final String CONVERTER_FORMAT_PAK2ATFX = "PAK2ATFX";
+
+	private Map<String, FileRelease> releaseMap;
+
+	@EJB
+	private FileReleasePersistance releasePersistance;
+
+	/**
+	 * Returns the {@link FileRelease} for the given user with the given identifier.
+	 * 
+	 * @param userName   The name of the user to locate the {@link FileRelease}
+	 * @param identifier The identifier of the {@link FileRelease}
+	 * @return The found {@link FileRelease}
+	 */
+	public FileRelease getRelease(String userName, String identifier) {
+
+		if (!this.releaseMap.containsKey(identifier)) {
+			throw new FileReleaseException("unable to find FileRelease with identifier '" + identifier + "'!");
+		}
+
+		FileRelease fileRelease = this.releaseMap.get(identifier);
+
+		if (fileRelease.sender.equalsIgnoreCase(userName) || fileRelease.receiver.equalsIgnoreCase(userName)) {
+			updateExpired(fileRelease);
+			return fileRelease;
+		}
+
+		throw new FileReleaseException("unable to find FileRelease with identifier '" + identifier
+				+ "' for user with name '" + userName + "'!");
+
+	}
+
+	/**
+	 * 
+	 * Returns all {@link FileRelease}s for the given user in the given direction
+	 * ({@link FileReleaseManager#FILE_RELEASE_DIRECTION_INCOMMING} or
+	 * ({@link FileReleaseManager#FILE_RELEASE_DIRECTION_OUTGOING}).
+	 * 
+	 * @param userName  The name of the user
+	 * @param direction The direction (
+	 *                  {@link FileReleaseManager#FILE_RELEASE_DIRECTION_INCOMMING}
+	 *                  or
+	 *                  {@link FileReleaseManager#FILE_RELEASE_DIRECTION_OUTGOING})
+	 * @return A list with the {@link FileRelease}s
+	 */
+	public List<FileRelease> getReleases(String userName, String direction) {
+
+		Collection<FileRelease> releases = this.releaseMap.values();
+
+		if (direction.equalsIgnoreCase(FILE_RELEASE_DIRECTION_INCOMMING)) {
+			return extractIncommingReleases(userName, releases);
+		}
+
+		if (direction.equalsIgnoreCase(FILE_RELEASE_DIRECTION_OUTGOING)) {
+			return extractOutgoingReleases(userName, releases);
+		}
+
+		LOG.debug("unknown file request direction value '" + direction + "'. Returing empty file request list");
+		return Collections.emptyList();
+	}
+
+	/**
+	 * Returns all {@link FileRelease}s for a given user, in the given direction,
+	 * with the given state.
+	 * 
+	 * @param userName  The user name.
+	 * @param direction The direction (
+	 *                  {@link FileReleaseManager#FILE_RELEASE_DIRECTION_INCOMMING}
+	 *                  or
+	 *                  {@link FileReleaseManager#FILE_RELEASE_DIRECTION_OUTGOING})
+	 * @param state     The state of the {@link FileRelease}s to return
+	 * @return A list with the {@link FileRelease}s
+	 */
+	public List<FileRelease> getReleases(String userName, String direction, String state) {
+		List<FileRelease> list = getReleases(userName, direction);
+		return extractReleasesByState(state, list);
+	}
+
+	/**
+	 * Adds a new {@link FileRelease}.
+	 * 
+	 * @param fileRelease The {@link FileRelease} to add.
+	 */
+	public void addFileRelease(FileRelease fileRelease) {
+		if (this.releaseMap.containsKey(fileRelease.identifier)) {
+			throw new FileReleaseException(
+					"FileRelease with identifier '" + fileRelease.identifier + "' already exists!");
+		}
+		this.releaseMap.put(fileRelease.identifier, fileRelease);
+	}
+
+	/**
+	 * 
+	 * Removes a {@link FileRelease}
+	 * 
+	 * @param fileRelease The {@link FileRelease} the remove.
+	 */
+	public void removeFileRelease(FileRelease fileRelease) {
+		if (!this.releaseMap.containsKey(fileRelease.identifier)) {
+			throw new FileReleaseException(
+					"FileRelease with identifier '" + fileRelease.identifier + "' does not exist!");
+		}
+		this.releaseMap.remove(fileRelease.identifier);
+	}
+
+	/**
+	 * 
+	 * Checks if the given file link can be deleted
+	 * 
+	 * @param fileLink The file link to check
+	 * @return TRUE if the file link can be deleted. Otherwise FALSE.
+	 */
+	public boolean canDeleteFileLink(String identfier, String fileLink) {
+
+		if (fileLink == null || fileLink.trim().length() <= 0) {
+			return false;
+		}
+
+		for (FileRelease fileRelease : this.releaseMap.values()) {
+
+			// skipping fileRelease to delete
+			if (fileRelease.identifier.equalsIgnoreCase(identfier)) {
+				continue;
+			}
+
+			if (fileRelease.fileLink.equalsIgnoreCase(fileLink)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	@PostConstruct
+	private void onInitialize() {
+		this.releaseMap = this.releasePersistance.load();
+	}
+
+	@PreDestroy
+	private void onDestroy() {
+		this.releasePersistance.save(this.releaseMap);
+	}
+
+	private List<FileRelease> extractIncommingReleases(String receiverName, Collection<FileRelease> releases) {
+		List<FileRelease> incommingList = new ArrayList<>();
+		for (FileRelease fileRelease : releases) {
+			if (fileRelease.receiver.equalsIgnoreCase(receiverName)) {
+				updateExpired(fileRelease);
+				incommingList.add(fileRelease);
+			}
+		}
+		return incommingList;
+	}
+
+	private List<FileRelease> extractOutgoingReleases(String senderName, Collection<FileRelease> releases) {
+		List<FileRelease> outgoingList = new ArrayList<>();
+		for (FileRelease fileRelease : releases) {
+			if (fileRelease.sender.equalsIgnoreCase(senderName)) {
+				updateExpired(fileRelease);
+				outgoingList.add(fileRelease);
+			}
+		}
+		return outgoingList;
+	}
+
+	private List<FileRelease> extractReleasesByState(String state, List<FileRelease> list) {
+		List<FileRelease> statedList = new ArrayList<>();
+		for (FileRelease fileRelease : list) {
+			if (fileRelease.state.equalsIgnoreCase(state)) {
+				statedList.add(fileRelease);
+			}
+		}
+		return statedList;
+	}
+
+	private void updateExpired(FileRelease fileRelease) {
+		long current = System.currentTimeMillis();
+
+		if (!fileRelease.state.equalsIgnoreCase(FILE_RELEASE_STATE_RELEASED)) {
+			return;
+		}
+
+		if (fileRelease.expire <= current) {
+			fileRelease.state = FILE_RELEASE_STATE_EXPIRED;
+		}
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleasePersistance.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleasePersistance.java
new file mode 100644
index 0000000..566b587
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/FileReleasePersistance.java
@@ -0,0 +1,126 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ejb.Stateless;
+
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * FileReleasePersistance bean implementation.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Stateless
+public class FileReleasePersistance {
+
+	private static final Logger LOG = LoggerFactory.getLogger(FileReleasePersistance.class);
+
+	private static final String TARGET_FILE_NAME = "mdm_filerelease_storage.sav";
+
+	/**
+	 * Persists the given file release map.
+	 * 
+	 * @param map The map to persist.
+	 */
+	public void save(Map<String, FileRelease> map) {
+
+		String userHomePath = System.getProperty("user.home");
+		File directory = new File(userHomePath);
+
+		File targetFile = new File(directory, TARGET_FILE_NAME);
+		writeFile(targetFile, map);
+	}
+
+	/**
+	 * 
+	 * Loads the {@link FileRelease} into a map.
+	 * 
+	 * @return The map that contains the {@link FileRelease}s
+	 */
+	public Map<String, FileRelease> load() {
+
+		String userHomePath = System.getProperty("user.home");
+		File directory = new File(userHomePath);
+
+		File targetFile = new File(directory, TARGET_FILE_NAME);
+
+		return loadFile(targetFile);
+	}
+
+	private void writeFile(File targetFile, Map<String, FileRelease> map) {
+
+		LOG.debug("Writing FileRelease storage file to '" + targetFile.getAbsolutePath() + "'");
+
+		try {
+			if (targetFile.exists()) {
+				deleteFile(targetFile);
+			}
+
+			try (ObjectOutputStream oos = new ObjectOutputStream(
+					new BufferedOutputStream(new FileOutputStream(targetFile)))) {
+				oos.writeObject(map);
+			}
+		} catch (IOException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	private Map<String, FileRelease> loadFile(File targetFile) {
+
+		LOG.debug("Loading FileRelease storage file from '" + targetFile.getAbsolutePath() + "'");
+
+		try {
+			if (!targetFile.exists()) {
+				LOG.warn("Storage file does not exist at '" + targetFile.getAbsolutePath()
+						+ "'. Using an empty FileRelease pool");
+				return new HashMap<String, FileRelease>();
+			}
+
+			try (ObjectInputStream ois = new ObjectInputStream(
+					new BufferedInputStream(new FileInputStream(targetFile)))) {
+				return (Map<String, FileRelease>) ois.readObject();
+			}
+		} catch (IOException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		} catch (ClassNotFoundException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+	}
+
+	private void deleteFile(File targetFile) {
+		boolean deleted = targetFile.delete();
+		if (!deleted) {
+			throw new FileReleaseException(
+					"Unable to delete FileRelease storage file at '" + targetFile.getAbsolutePath() + "'");
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/AbstractFileConverter.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/AbstractFileConverter.java
new file mode 100644
index 0000000..714e480
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/AbstractFileConverter.java
@@ -0,0 +1,259 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control.converter;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.filerelease.control.FileReleaseException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * Abstract implementation of {@link IFileConverter}. Provides some utility
+ * methods for further {@link IFileConverter} implementations.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public abstract class AbstractFileConverter implements IFileConverter {
+
+	protected static final Logger LOG = LoggerFactory.getLogger(AbstractFileConverter.class);
+
+	/**
+	 * 
+	 * Creates a zip file from the given folder.
+	 * 
+	 * @param targetFile  The path to the zip file to create
+	 * @param folderToZip The path to the folder to zip.
+	 * @throws FileConverterException Thrown if an error occurs.
+	 */
+	protected void zipFolder(String targetFile, String folderToZip) throws FileConverterException {
+		zipFolder(targetFile, folderToZip, false);
+	}
+
+	/**
+	 * Creates a zip file from the given folder.
+	 * 
+	 * @param targetFile  The path to the zip file to create
+	 * @param folderToZip The path to the folder to zip.
+	 * @param overWrite   True if the target file should be overwritten.
+	 * @throws FileConverterException Thrown if an error occurs.
+	 */
+	protected void zipFolder(String targetFile, String folderToZip, boolean overWrite) throws FileConverterException {
+		File source = new File(folderToZip);
+		File target = new File(targetFile);
+		if (!source.exists()) {
+			throw new FileConverterException("Unable to zip folder: " + folderToZip + ". The folder does not exist.");
+		}
+		if (!overWrite && target.exists()) {
+			throw new FileConverterException(
+					"Unable to zip folder: " + folderToZip + ". The target file" + targetFile + "already exists.");
+		}
+		if (overWrite && target.exists()) {
+			target.delete();
+		}
+		zipFiles(listAllFilesRecursive(source), target, folderToZip);
+	}
+
+	/**
+	 * 
+	 * Locates the attribute value for the given string attribute.
+	 * 
+	 * @param em            The entity manager that manages the attribute
+	 * @param testStep      The {@link TestStep}
+	 * @param entityName    The name of the entity that belongs to the attribute.
+	 * @param attributeName The name of the attribute.
+	 * @return The attribute value.
+	 */
+	protected String locateStringAttributeValue(ApplicationContext context, TestStep testStep, String entityName,
+			String attributeName) {
+		try {
+			SearchService searchService = context.getSearchService()
+					.orElseThrow(() -> new FileReleaseException("Mandatory MDM SearchService not found"));
+
+			List<EntityType> list = searchService.listEntityTypes(TestStep.class);
+
+			EntityType entityType = locateEntityType(list, entityName);
+			Attribute attribute = locateAttribute(entityType, attributeName);
+
+			EntityType testStepET = locateEntityType(list, TestStep.class.getSimpleName());
+			Filter idFilter = Filter.idOnly(testStepET, testStep.getID());
+
+			List<TestStep> results = searchService.fetch(TestStep.class, Collections.singletonList(attribute),
+					idFilter);
+
+			if (results.size() < 0 || results.size() > 1) {
+				throw new FileReleaseException(
+						"Illegal search result for attribute value from '" + entityName + "." + attributeName + "'");
+			}
+
+			TestStep resultTestStep = results.get(0);
+			return resultTestStep.getValue(attributeName).extract();
+		} catch (DataAccessException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Creates a new directory
+	 * 
+	 * @param path The path to the directory to create
+	 * @return The created directory {@link File}
+	 */
+	protected File createDirectory(String path) {
+		File directory = new File(path);
+		if (!directory.exists() && !directory.mkdir()) {
+			throw new FileReleaseException("Unable to create directory at '" + directory.getAbsolutePath() + "'");
+		}
+
+		return directory;
+	}
+
+	/**
+	 * Deletes the given directory
+	 * 
+	 * @param directory The directory to delete.
+	 */
+	protected void deleteDirectory(File directory) {
+		if (!directory.exists()) {
+			return;
+		}
+
+		File[] files = directory.listFiles();
+		for (File file : files) {
+			if (file.isDirectory()) {
+				deleteDirectory(file);
+			}
+			if (!file.delete()) {
+				LOG.warn("Unable to delete file at '" + file.getAbsolutePath() + "'");
+			}
+		}
+		if (!directory.delete()) {
+			LOG.warn("Unable to delete directory at '" + directory.getAbsolutePath() + "'");
+		}
+	}
+
+	/**
+	 * Locates the directory {@link File} for the given path
+	 * 
+	 * @param inputPath The path to the directory.
+	 * @return The {@link File}
+	 */
+	protected File locateInputDirectory(String inputPath) {
+		File pakInputDirectory = new File(inputPath);
+		if (!pakInputDirectory.exists()) {
+			throw new FileReleaseException(
+					"Input path at '" + pakInputDirectory.getAbsolutePath() + "' does not exist!");
+		}
+
+		if (!pakInputDirectory.isDirectory()) {
+			throw new FileReleaseException(
+					"Input path at '" + pakInputDirectory.getAbsolutePath() + "' is not a directory path!");
+		}
+
+		return pakInputDirectory;
+	}
+
+	protected String readPropertyValue(String propertyValue, boolean mandatory, String defaultValue,
+			String propertyName) throws FileConverterException {
+		if (propertyValue == null || propertyValue.trim().length() <= 0) {
+			if (mandatory) {
+				throw new FileConverterException("Mandatory property with name '" + propertyName + "' is not defined!");
+			}
+			return defaultValue;
+		}
+		return propertyValue;
+	}
+
+	private void zipFiles(List<File> list, File target, String sourcePath) throws FileConverterException {
+		try (ZipOutputStream zipStream = new ZipOutputStream(new FileOutputStream(target))) {
+			for (File file : list) {
+				zipFile(file, zipStream, sourcePath);
+			}
+		} catch (IOException ioe) {
+			throw new FileConverterException(
+					"An error occured when creating an zip archive from the folder: " + target.getAbsolutePath(), ioe);
+		}
+	}
+
+	private List<File> listAllFilesRecursive(File sourceFolder) {
+		List<File> files = new ArrayList<>();
+		File[] subFiles = sourceFolder.listFiles();
+		for (File f : subFiles) {
+			if (f.isDirectory()) {
+				files.addAll(listAllFilesRecursive(f));
+			} else {
+				files.add(f);
+			}
+		}
+		return files;
+	}
+
+	private void zipFile(File file, ZipOutputStream zipStream, String sourcePath) throws FileConverterException {
+
+		try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(file))) {
+			String entryName = file.getAbsolutePath().replace(sourcePath, "");
+
+			ZipEntry zipEntry = new ZipEntry(entryName);
+			zipStream.putNextEntry(zipEntry);
+			byte[] buffer = new byte[1024];
+
+			for (int len = in.read(buffer); len > 0; len = in.read(buffer)) {
+				zipStream.write(buffer, 0, len);
+			}
+		} catch (IOException ioe) {
+			throw new FileConverterException("An error occured when zipping the file: " + file.getAbsolutePath(), ioe);
+		}
+
+	}
+
+	private EntityType locateEntityType(List<EntityType> list, String entityName) {
+		for (EntityType entityType : list) {
+			if (entityType.getName().equals(entityName)) {
+				return entityType;
+			}
+		}
+		throw new FileReleaseException("Entity with name '" + entityName + "' not available for TestStep query");
+	}
+
+	private Attribute locateAttribute(EntityType entityType, String attributeName) {
+		List<Attribute> list = entityType.getAttributes();
+		for (Attribute attribute : list) {
+			if (attribute.getName().equals(attributeName)) {
+				return attribute;
+			}
+		}
+		throw new FileReleaseException(
+				"Attribute with name '" + attributeName + "' does not exist at entity '" + entityType.getName() + "'");
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterException.java
new file mode 100644
index 0000000..3687e0e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterException.java
@@ -0,0 +1,46 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control.converter;
+
+/**
+ * FileConverterException
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class FileConverterException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param message The error message
+	 */
+	public FileConverterException(String message) {
+		super(message);
+	}
+
+	/**
+	 * Constructor#
+	 * 
+	 * @param message The error message
+	 * @param t       The {@link Throwable} that caused the exception.
+	 */
+	public FileConverterException(String message, Throwable t) {
+		super(message, t);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterPAK2ATFX.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterPAK2ATFX.java
new file mode 100644
index 0000000..947be25
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterPAK2ATFX.java
@@ -0,0 +1,175 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control.converter;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.filerelease.control.FileReleaseException;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.eclipse.mdm.property.GlobalProperty;
+
+/**
+ * 
+ * {@link IFileConverter} implementation for converting PAK to ATFX
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@RequestScoped
+public class FileConverterPAK2ATFX extends AbstractFileConverter {
+
+	private static final String CONVERTER_NAME = "PAK2ATFX";
+	private static final String COMPONENT_CONFIG_ROOT_FOLDER = "org.eclipse.mdm.filerelease";
+
+	private static final String MODEL_FILE_NAME = "model.atfx.technical";
+	private static final String OUTPUT_SUB_TEMP_DIRECTORY = "tmp";
+	private static final String ATFX_OUTPUT_FILE_NAME_PREFIX = "_ATFX.zip";
+
+	@Inject
+	@GlobalProperty("filerelease.converter.pak.pakApplicationPath")
+	private String pakApplicationPath = "";
+	@Inject
+	@GlobalProperty("filerelease.converter.pak.modelTypeEntity")
+	private String modelTypeEntity = "";
+	@Inject
+	@GlobalProperty("filerelease.converter.pak.modelTypeAttribute")
+	private String modelTypeAttribute = "";
+	@Inject
+	@GlobalProperty("filerelease.converter.pak.pakInputEntity")
+	private String pakInputEntity = "";
+	@Inject
+	@GlobalProperty("filerelease.converter.pak.pakInputAttribute")
+	private String pakInputAttribute = "";
+
+	@Override
+	public void execute(FileRelease fileRelease, TestStep testStep, ApplicationContext context, File targetDirectory)
+			throws FileConverterException {
+
+		int returnValue = -1;
+
+		String pakApplicationPathValue = super.readPropertyValue(this.pakApplicationPath, true, null,
+				"pakApplicationPath");
+		String modelTypeEntityValue = super.readPropertyValue(this.modelTypeEntity, true, null, "modelTypeEntity");
+		String modelTypeAttributeValue = super.readPropertyValue(this.modelTypeAttribute, true, null,
+				"modelTypeAttribute");
+		String pakInputEntityValue = super.readPropertyValue(this.pakInputEntity, true, null, "pakInputEntity");
+		String pakInputAttributeValue = super.readPropertyValue(this.pakInputAttribute, true, null,
+				"pakInputAttribute");
+
+		String modelType = locateStringAttributeValue(context, testStep, modelTypeEntityValue, modelTypeAttributeValue);
+		String inputPath = locateStringAttributeValue(context, testStep, pakInputEntityValue, pakInputAttributeValue);
+
+		File pakApplicationFile = locatePakApplicationFile(pakApplicationPathValue);
+		File modelFile = locateModelFileForModelType(modelType);
+		File inputDirectory = locateInputDirectory(inputPath);
+		File outputDirectory = createDirectory(targetDirectory.getAbsolutePath() + File.separator + fileRelease.name);
+		File outputTempDirectory = createDirectory(
+				outputDirectory.getAbsolutePath() + File.separator + OUTPUT_SUB_TEMP_DIRECTORY);
+		File outputZIPFile = new File(outputDirectory, fileRelease.name + ATFX_OUTPUT_FILE_NAME_PREFIX);
+
+		try {
+			if (!outputZIPFile.exists()) {
+				LOG.debug("executing external pak application ...");
+				returnValue = createATFX(pakApplicationFile, inputDirectory, outputTempDirectory, modelFile);
+				if (returnValue != 0) {
+					String errorMessage = translateErrorCode(returnValue);
+					throw new FileConverterException(
+							"external pak application ends with an error (message: '" + errorMessage + "')");
+				}
+				LOG.debug("executing external pak application ... done!");
+
+				LOG.debug("executing zip process for pak application result ...");
+
+				zipFolder(outputZIPFile.getAbsolutePath(), outputTempDirectory.getAbsolutePath(), true);
+				LOG.debug("executing zip process for pak application result ... done");
+			}
+
+			fileRelease.fileLink = fileRelease.name + File.separator + outputZIPFile.getName();
+
+		} catch (IOException | InterruptedException e) {
+			throw new FileConverterException(e.getMessage(), e);
+		} finally {
+			deleteDirectory(outputTempDirectory);
+		}
+	}
+
+	@Override
+	public String getConverterName() {
+		return CONVERTER_NAME;
+	}
+
+	private int createATFX(File pakApplicationFile, File inputDirectory, File outputTempDirectory, File modelFile)
+			throws IOException, InterruptedException {
+
+		ProcessBuilder pb = new ProcessBuilder(pakApplicationFile.getAbsolutePath(), "-M",
+				inputDirectory.getAbsolutePath(), "-E", outputTempDirectory.getAbsolutePath(), "-MF",
+				modelFile.getAbsolutePath());
+		Process process = pb.start();
+
+		return process.waitFor();
+	}
+
+	private String translateErrorCode(int returnValue) {
+
+		String errorMessage;
+
+		if (returnValue == 1) {
+			errorMessage = "invalid input pak measurement";
+		} else if (returnValue == 2) {
+			errorMessage = "illegal command (a parameter is missing)";
+		} else if (returnValue == 6) {
+			errorMessage = "foreign model measurement";
+		} else if (returnValue == 7) {
+			errorMessage = "illegal input path format";
+		} else if (returnValue == 8) {
+			errorMessage = "source directory does not exist";
+		} else if (returnValue == 9) {
+			errorMessage = "target directory does not exist";
+		} else if (returnValue == 10) {
+			errorMessage = "target directory is not empty";
+		} else if (returnValue == 11) {
+			errorMessage = "illegal commant (model file parameter is missing)";
+		} else {
+			errorMessage = "unknown error with error code '" + returnValue + "'";
+		}
+		return errorMessage + "  (errorCode = '" + returnValue + "')";
+	}
+
+	private File locatePakApplicationFile(String pakApplicationFilePath) {
+		File pakApplicationFile = new File(pakApplicationFilePath);
+		if (!pakApplicationFile.exists()) {
+			throw new FileReleaseException("pak application executable file at '" + pakApplicationFile.getAbsolutePath()
+					+ "' does not exist!");
+		}
+		return pakApplicationFile;
+	}
+
+	private File locateModelFileForModelType(String modelType) {
+		File modelFile = new File(
+				COMPONENT_CONFIG_ROOT_FOLDER + File.separator + modelType + File.separator + MODEL_FILE_NAME);
+		if (!modelFile.exists()) {
+			throw new FileReleaseException("mapping file for atfx model with type '" + modelType
+					+ "' does not exist! (expected at: '" + modelFile.getAbsolutePath() + "')");
+		}
+		return modelFile;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterPAK2RAW.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterPAK2RAW.java
new file mode 100644
index 0000000..080b678
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/FileConverterPAK2RAW.java
@@ -0,0 +1,74 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control.converter;
+
+import java.io.File;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.eclipse.mdm.property.GlobalProperty;
+
+/**
+ * 
+ * {@link IFileConverter} implementation for converting PAK to RAW
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@RequestScoped
+public class FileConverterPAK2RAW extends AbstractFileConverter {
+
+	private static final String ATFX_OUTPUT_FILE_NAME_PREFIX = "_RAW.zip";
+
+	@Inject
+	@GlobalProperty("filerelease.converter.raw.pakInputEntity")
+	private String pakInputEntity = "";
+	@Inject
+	@GlobalProperty("filerelease.converter.raw.pakInputAttribute")
+	private String pakInputAttribute = "";
+
+	@Override
+	public void execute(FileRelease fileRelease, TestStep testStep, ApplicationContext context, File targetDirectory)
+			throws FileConverterException {
+
+		String pakInputEntityValue = super.readPropertyValue(this.pakInputEntity, true, null, "pakInputEntity");
+		String pakInputAttributeValue = super.readPropertyValue(this.pakInputAttribute, true, null,
+				"pakInputAttribute");
+
+		String inputPath = locateStringAttributeValue(context, testStep, pakInputEntityValue, pakInputAttributeValue);
+		File inputDirectory = locateInputDirectory(inputPath);
+
+		File outputDirectory = createDirectory(targetDirectory.getAbsolutePath() + File.separator + fileRelease.name);
+		File outputZIPFile = new File(outputDirectory, fileRelease.name + ATFX_OUTPUT_FILE_NAME_PREFIX);
+
+		if (!outputZIPFile.exists()) {
+			LOG.debug("executing zip process for pak raw data ...");
+			zipFolder(outputZIPFile.getAbsolutePath(), inputDirectory.getAbsolutePath(), true);
+			LOG.debug("executing zip process for pak raw data ... done");
+		}
+
+		fileRelease.fileLink = fileRelease.name + File.separator + outputZIPFile.getName();
+	}
+
+	@Override
+	public String getConverterName() {
+		return "PAK2RAW ";
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/IFileConverter.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/IFileConverter.java
new file mode 100644
index 0000000..400d797
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/control/converter/IFileConverter.java
@@ -0,0 +1,50 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.control.converter;
+
+import java.io.File;
+
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+
+/**
+ * 
+ * Interface for file converters
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public interface IFileConverter {
+
+	/**
+	 * 
+	 * Executes the file conversion
+	 * 
+	 * @param fileRelease The file release that contains the file to convert
+	 * @param testStep    The {@link TestStep}
+	 * @param context     The {@link ApplicationContext}
+	 * @throws FileConverterException Thrown if the file conversion fails.
+	 */
+	void execute(FileRelease fileRelease, TestStep testStep, ApplicationContext context, File targetDirectory)
+			throws FileConverterException;
+
+	/**
+	 * Returns the name of the file converter
+	 * 
+	 * @return The name of the file converter
+	 */
+	String getConverterName();
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/entity/FileRelease.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/entity/FileRelease.java
new file mode 100644
index 0000000..e149428
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/entity/FileRelease.java
@@ -0,0 +1,80 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.entity;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.TestStep;
+
+/**
+ * FileRelease entity
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@XmlRootElement
+public class FileRelease implements Serializable {
+
+	private static final long serialVersionUID = -9016111258701009299L;
+
+	/** unique identifier of a {@link FileRelease} */
+	public String identifier = "";
+	/** current state of the {@link FileRelease} */
+	public String state = "";
+
+	/** name of the source {@link TestStep} */
+	public String name = "";
+	/**
+	 * name of the source {@link Environment} of the business object (part of MDM
+	 * URI)
+	 */
+	public String sourceName = "";
+	/** name of the type of the source business object (part of MDM URI) */
+	public String typeName = "";
+	/** id of the source business object (part of URI) */
+	public String id = "";
+
+	/** release sender name (MDM user name) */
+	public String sender = "";
+	/** release receiver name (MDM user name) */
+	public String receiver = "";
+
+	/**
+	 * order message to specify by the sender on creating a {@link FileRelease}
+	 */
+	public String orderMessage = "";
+	/**
+	 * reject message to specify by the receiver on rejecting a {@link FileRelease}
+	 */
+	public String rejectMessage = "";
+	/**
+	 * system error message set by the converter system if an error occuring during
+	 * generating the target file
+	 */
+	public String errorMessage = "";
+
+	/** output data format of the generated file */
+	public String format = "";
+	/** relative file link of the generated file */
+	public String fileLink = "";
+
+	/** number of days */
+	public int validity = 0;
+	/** calculated expire date (time stamp) */
+	public long expire = 0;
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/entity/FileReleaseResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/entity/FileReleaseResponse.java
new file mode 100644
index 0000000..8692903
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/entity/FileReleaseResponse.java
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.entity;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 
+ * {@link FileReleaseResponse}
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class FileReleaseResponse {
+
+	public List<FileRelease> data;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param fileRelease {@link FileRelease}
+	 */
+	public FileReleaseResponse(FileRelease fileRelease) {
+		this.data = new ArrayList<FileRelease>();
+		this.data.add(fileRelease);
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param list list of {@link FileRelease}s
+	 */
+	public FileReleaseResponse(List<FileRelease> list) {
+		this.data = new ArrayList<FileRelease>();
+		this.data.addAll(list);
+	}
+
+	/**
+	 * returns the {@link FileRelease} data
+	 * 
+	 * @return the {@link FileRelease} data
+	 */
+	public List<FileRelease> getData() {
+		return Collections.unmodifiableList(this.data);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/utils/FileReleasePermissionUtils.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/utils/FileReleasePermissionUtils.java
new file mode 100644
index 0000000..29964c3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/utils/FileReleasePermissionUtils.java
@@ -0,0 +1,145 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.utils;
+
+import java.util.List;
+
+import org.eclipse.mdm.filerelease.control.FileReleaseException;
+import org.eclipse.mdm.filerelease.control.FileReleaseManager;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+
+/**
+ * Provides utility methods for checking permissions on {@link FileRelease}s
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public final class FileReleasePermissionUtils {
+
+	private FileReleasePermissionUtils() {
+	}
+
+	/**
+	 * Checks if the user with the given name has the permission to create the given
+	 * {@link FileRelease}s.
+	 * 
+	 * @param request  The {@link FileReleaseRequest}
+	 * @param userName The name of the user to check the permissions
+	 * @param list     The list with the {@link FileRelease}
+	 * @throws FileReleaseException if the user is not allowed to create the
+	 *                              {@link FileRelease}s
+	 * 
+	 */
+	public static void canCreate(FileRelease newFileRelease, String userName, List<FileRelease> list) {
+		for (FileRelease fileRelease : list) {
+
+			boolean sourceNameEqual = fileRelease.sourceName.equals(newFileRelease.sourceName);
+			boolean typeNameEqual = fileRelease.typeName.equals(newFileRelease.typeName);
+			boolean idEqual = fileRelease.id == newFileRelease.id;
+			boolean formatEqual = fileRelease.format.equals(newFileRelease.format);
+
+			if (sourceNameEqual && typeNameEqual && idEqual && formatEqual) {
+				throw new FileReleaseException("FileRelease for user '" + userName + "' and path'"
+						+ fileRelease.sourceName + "/" + fileRelease.typeName + "/" + fileRelease.id + "' (Format: '"
+						+ fileRelease.format + "') already exists!");
+			}
+		}
+
+	}
+
+	/**
+	 * Checks if the user with the given name has the permission to delete the given
+	 * {@link FileRelease}
+	 * 
+	 * @param fileRelease The {@link FileRelease} to check
+	 * @param userName    The name of the user to check the permissions
+	 * @throws FileReleaseException if the user is not allowed to delete the
+	 *                              {@link FileRelease}
+	 */
+	public static void canDelete(FileRelease fileRelease, String userName) {
+		if (!fileRelease.sender.equalsIgnoreCase(userName)) {
+			throw new FileReleaseException("user with name '" + userName + "' can't remove FileRelease with id '"
+					+ fileRelease.identifier + "'");
+		}
+
+		if (fileRelease.state.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING)) {
+			throw new FileReleaseException("unable to remove FileRelease in state '"
+					+ FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING + "'");
+		}
+	}
+
+	/**
+	 * Checks if the user with the given name has the permission to approve the
+	 * given {@link FileRelease}
+	 * 
+	 * @param fileRelease The {@link FileRelease} to check
+	 * @param userName    The name of the user to check the permissions
+	 * @throws FileReleaseException if the user is not allowed to approve the
+	 *                              {@link FileRelease}
+	 */
+	public static void canApprove(FileRelease fileRelease, String userName) {
+		if (!fileRelease.receiver.equalsIgnoreCase(userName)) {
+			throw new FileReleaseException("user with name '" + userName + "' can't approve FileRelease with id '"
+					+ fileRelease.identifier + "'");
+		}
+
+		if (!fileRelease.state.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_STATE_ORDERED)) {
+			throw new FileReleaseException("unable to approve FileRelease in state '" + fileRelease.state + "'");
+		}
+	}
+
+	/**
+	 * Checks if the user with the given name has the permission to release the
+	 * given {@link FileRelease}
+	 * 
+	 * @param fileRelease The {@link FileRelease} to check
+	 * @param userName    The name of the user to check the permissions
+	 * @throws FileReleaseException if the user is not allowed to approve the
+	 *                              {@link FileRelease}
+	 */
+	public static void canRelease(FileRelease fileRelease, String userName) {
+		if (!fileRelease.receiver.equalsIgnoreCase(userName)) {
+			throw new FileReleaseException("user with name '" + userName + "' can't release FileRelease with id '"
+					+ fileRelease.identifier + "'");
+		}
+
+		if (!fileRelease.state.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_STATE_APPROVED)) {
+			throw new FileReleaseException("unable to release FileRelease in state '" + fileRelease.state + "'");
+		}
+	}
+
+	/**
+	 * Checks if the user with the given name is allowed to reject the given
+	 * {@link FileRelease}
+	 * 
+	 * @param fileRelease The {@link FileRelease} to reject
+	 * @param userName    The name of the user to check the permissions
+	 * @throws FileReleaseException if the user is not allowed to reject the
+	 *                              {@link FileRelease}
+	 */
+	public static void canReject(FileRelease fileRelease, String userName) {
+
+		if (!fileRelease.receiver.equalsIgnoreCase(userName)) {
+			throw new FileReleaseException("user with name '" + userName + "' can't reject FileRelease with id '"
+					+ fileRelease.identifier + "'");
+		}
+
+		if (!fileRelease.state.equalsIgnoreCase(FileReleaseManager.FILE_RELEASE_STATE_ORDERED)) {
+			throw new FileReleaseException("unable to reject FileRelease in state '" + fileRelease.state + "'");
+		}
+
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/utils/FileReleaseUtils.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/utils/FileReleaseUtils.java
new file mode 100644
index 0000000..94069e6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/main/java/org/eclipse/mdm/filerelease/utils/FileReleaseUtils.java
@@ -0,0 +1,227 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease.utils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.filerelease.control.FileReleaseException;
+import org.eclipse.mdm.filerelease.control.FileReleaseManager;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * Provides utility methods
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public final class FileReleaseUtils {
+
+	private static final Logger LOG = LoggerFactory.getLogger(FileReleaseUtils.class);
+
+	private FileReleaseUtils() {
+	}
+
+	/**
+	 * Returns the {@link User} that is logged in on the given
+	 * {@link ConnectorService}
+	 * 
+	 * @param connectorService The {@link ConnectorService}
+	 * @return The {@link User}
+	 */
+	public static User getLoggedOnUser(ConnectorService connectorService) {
+
+		try {
+			List<ApplicationContext> contextList = connectorService.getContexts();
+
+			if (contextList == null || contextList.size() <= 0) {
+				throw new FileReleaseException("unable to locate neccessary EntityManager for file release service");
+			}
+
+			return extractUser(contextList.get(0).getEntityManager().map(em -> em.loadLoggedOnUser())
+					.orElseThrow(() -> new FileReleaseException("Entity manager not present!")));
+		} catch (DataAccessException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns the {@link User} that is responsible for the given {@link TestStep}
+	 * 
+	 * @param connectorService The {@link ConnectorService}
+	 * @param testStep         The {@link TestStep}
+	 * @return The responsible {@link User}
+	 */
+	public static User getResponsiblePerson(ConnectorService connectorService, TestStep testStep) {
+		EntityManager em = connectorService.getContextByName(testStep.getSourceName()).getEntityManager()
+				.orElseThrow(() -> new FileReleaseException("Entity manager not present!"));
+		Test test = getTestParent(em, testStep);
+		return extractUser(test.getResponsiblePerson());
+	}
+
+	/**
+	 * 
+	 * Loads the {@link TestStep} with the given URI from the given
+	 * {@link ConnectorService}
+	 * 
+	 * @param connectorService The {@link ConnectorService}
+	 * @param sourceName       The source name
+	 * @param id               The id of the {@link TestStep}
+	 * @return The loaded {@link TestStep}
+	 */
+	public static TestStep loadTestStep(ConnectorService connectorService, String sourceName, String id) {
+		try {
+			EntityManager em = connectorService.getContextByName(sourceName).getEntityManager()
+					.orElseThrow(() -> new FileReleaseException("Entity manager not present!"));
+			return em.load(TestStep.class, id);
+		} catch (DataAccessException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 
+	 * Creates a {@link Response} with the given status.
+	 * 
+	 * @param response The object that should be returned in the response.
+	 * @param status   The status of the response.
+	 * @return The {@link Response}
+	 */
+	public static Response toResponse(Object response, Status status) {
+		GenericEntity<Object> genEntity = new GenericEntity<Object>(response, response.getClass());
+		return Response.status(status).entity(genEntity).type(MediaType.APPLICATION_JSON).build();
+	}
+
+	/**
+	 * Deletes a filelink
+	 * 
+	 * @param file The file to delete
+	 */
+	public static void deleteFileLink(File file) {
+
+		if (!file.exists() || file.isDirectory()) {
+			LOG.warn("unable to delete file '" + file.getAbsolutePath() + "' (file does not exist)!");
+			return;
+		}
+
+		boolean deleted = file.delete();
+		if (!deleted) {
+			LOG.warn("unable to delete file '" + file.getAbsolutePath() + "' (unkown error)!");
+		}
+	}
+
+	/**
+	 * Checks if the given format is a valid file converter format.
+	 * 
+	 * @param format The format as string
+	 * @return TRUE if the format is valid. Otherwise FALSE.
+	 */
+	public static boolean isFormatValid(String format) {
+		boolean valid = false;
+
+		if (FileReleaseManager.CONVERTER_FORMAT_PAK2RAW.equalsIgnoreCase(format)) {
+			valid = true;
+		}
+
+		if (FileReleaseManager.CONVERTER_FORMAT_PAK2ATFX.equalsIgnoreCase(format)) {
+			valid = true;
+		}
+
+		return valid;
+	}
+
+	public static List<FileRelease> filterByConnectedSources(List<FileRelease> fileReleases,
+			ConnectorService connectorService) {
+
+		List<FileRelease> filteredList = new ArrayList<FileRelease>();
+
+		List<String> sourceNameList = listConnectedSourceNames(connectorService);
+		for (FileRelease fileRelease : fileReleases) {
+			if (isFileReleaseSourceConnected(fileRelease, sourceNameList)) {
+				filteredList.add(fileRelease);
+			}
+		}
+		return filteredList;
+
+	}
+
+	public static File locateTargetDirectory(String targetDirectoryPath) {
+		if (targetDirectoryPath == null || targetDirectoryPath.trim().length() <= 0) {
+			throw new FileReleaseException("mandatory targetDirectoryPath property is missing");
+		}
+		File targetDirectory = new File(targetDirectoryPath);
+		if (!targetDirectory.exists()) {
+			throw new FileReleaseException(
+					"configured target directory at '" + targetDirectory.getAbsolutePath() + "' does not exist!");
+		}
+		return targetDirectory;
+	}
+
+	private static boolean isFileReleaseSourceConnected(FileRelease fileRelease, List<String> sourceNameList) {
+		for (String sourceName : sourceNameList) {
+			if (fileRelease.sourceName != null && fileRelease.sourceName.equals(sourceName)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private static List<String> listConnectedSourceNames(ConnectorService connectorService) {
+		try {
+			return connectorService.getContexts().stream().map(c -> c.getEntityManager()).filter(Optional::isPresent)
+					.map(Optional::get).map(em -> em.loadEnvironment().getSourceName()).collect(Collectors.toList());
+		} catch (DataAccessException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+	}
+
+	private static User extractUser(Optional<User> oUser) {
+		if (!oUser.isPresent()) {
+			throw new FileReleaseException("unable to locate neccessary User for file release service");
+		}
+		return oUser.get();
+	}
+
+	private static Test getTestParent(EntityManager em, TestStep testStep) {
+		try {
+			Optional<Test> oTest = em.loadParent(testStep, TestStep.PARENT_TYPE_TEST);
+			if (!oTest.isPresent()) {
+				throw new FileReleaseException(
+						"unable to locate Test parent for TestStep with ID '" + testStep.getID() + "'");
+			}
+			return oTest.get();
+		} catch (DataAccessException e) {
+			throw new FileReleaseException(e.getMessage(), e);
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/test/java/org/eclipse/mdm/filerelease/FileReleaseServiceMockHelper.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/test/java/org/eclipse/mdm/filerelease/FileReleaseServiceMockHelper.java
new file mode 100644
index 0000000..8c32db4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/test/java/org/eclipse/mdm/filerelease/FileReleaseServiceMockHelper.java
@@ -0,0 +1,164 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityStore;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.filerelease.control.FileConvertJobManager;
+import org.eclipse.mdm.filerelease.control.FileReleaseManager;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.mockito.Mockito;
+
+public class FileReleaseServiceMockHelper {
+
+	public static final String TEST_USERNAME_SELF = "sa";
+	public static final String TEST_USERNAME_OTHER = "ot";
+
+	public static final String TESTSTEP = "TestStep";
+
+	public static final int NUM_FILE_REL_IN = 3;
+	public static final int NUM_FILE_REL_OUT = 5;
+
+	public static final String ID_IN_PREFIX = "IN";
+	public static final String ID_OUT_PREFIX = "OUT";
+
+	private FileReleaseServiceMockHelper() {
+	}
+
+	public static FileReleaseManager createFileReleaseManagerMock() throws Exception {
+
+		FileReleaseManager frManagerMock = new FileReleaseManager();
+		Field releaseMapField = frManagerMock.getClass().getDeclaredField("releaseMap");
+		releaseMapField.setAccessible(true);
+		releaseMapField.set(frManagerMock, new HashMap<>());
+		for (FileRelease fr : createFileReleaseMockList()) {
+			frManagerMock.addFileRelease(fr);
+		}
+
+		releaseMapField.setAccessible(false);
+		return frManagerMock;
+	}
+
+	public static FileConvertJobManager createFileConvertJobManagerMock() {
+		return Mockito.mock(FileConvertJobManager.class);
+	}
+
+	public static ConnectorService createConnectorServiceMock() throws Exception {
+		ConnectorService mockedConnectorService = Mockito.mock(ConnectorService.class);
+		ApplicationContext mockedContext = createContextMock();
+		List<ApplicationContext> contextList = new ArrayList<>();
+		contextList.add(mockedContext);
+		when(mockedConnectorService.getContexts()).thenReturn(contextList);
+		when(mockedConnectorService.getContextByName("MDMENV")).thenReturn(contextList.get(0));
+		return mockedConnectorService;
+	}
+
+	public static ApplicationContext createContextMock() throws Exception {
+		EntityManager em = Mockito.mock(EntityManager.class);
+
+		Environment mockedEnv = createEntityMock(Environment.class, "MDMENV", "MDMENV", "1");
+		when(em.loadEnvironment()).thenReturn(mockedEnv);
+
+		User mockedUser = createEntityMock(User.class, TEST_USERNAME_SELF, "MDMENV", "1");
+		when(em.loadLoggedOnUser()).thenReturn(Optional.of(mockedUser));
+
+		Test mockedTest = createEntityMock(Test.class, "Test", "MDMENV", "1");
+		mockedTest.setResponsiblePerson(mockedUser);
+		when(em.loadParent(any(TestStep.class), eq(TestStep.PARENT_TYPE_TEST))).thenReturn(Optional.of(mockedTest));
+
+		TestStep mockedTestStep1 = createEntityMock(TestStep.class, "Teststep", "MDMENV", "123");
+		when(em.load(TestStep.class, "123")).thenReturn(mockedTestStep1);
+
+		TestStep mockedTestStep2 = createEntityMock(TestStep.class, "Teststep", "MDMENV", "1234");
+		when(em.load(TestStep.class, "1234")).thenReturn(mockedTestStep2);
+
+		ApplicationContext context = Mockito.mock(ApplicationContext.class);
+		when(context.getEntityManager()).thenReturn(Optional.of(em));
+		return context;
+	}
+
+	private static List<FileRelease> createFileReleaseMockList() {
+		List<FileRelease> fileReleasMockList = new ArrayList<>();
+
+		for (int i = 0; i < NUM_FILE_REL_IN; i++) {
+			FileRelease fileRelease = new FileRelease();
+			fileRelease.receiver = TEST_USERNAME_SELF;
+			fileRelease.sourceName = "MDMENV";
+			fileRelease.typeName = "TestStep";
+			fileRelease.id = String.valueOf(i);
+			fileRelease.sender = TEST_USERNAME_OTHER;
+			fileRelease.identifier = ID_IN_PREFIX + i;
+			fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_ORDERED;
+			fileReleasMockList.add(fileRelease);
+		}
+
+		for (int i = 0; i < NUM_FILE_REL_OUT; i++) {
+			FileRelease fileRelease = new FileRelease();
+			fileRelease.sourceName = "MDMENV";
+			fileRelease.typeName = "TestStep";
+			fileRelease.id = String.valueOf(i + NUM_FILE_REL_IN);
+			fileRelease.receiver = TEST_USERNAME_OTHER;
+			fileRelease.identifier = ID_OUT_PREFIX + i;
+			fileRelease.sender = TEST_USERNAME_SELF;
+			fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_ORDERED;
+			fileReleasMockList.add(fileRelease);
+		}
+		return fileReleasMockList;
+
+	}
+
+	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id)
+			throws Exception {
+
+		HashMap<String, Value> map = new HashMap<String, Value>();
+		map.put("Name", ValueType.STRING.create("Name", name));
+
+		Core core = Mockito.mock(Core.class);
+		when(core.getSourceName()).thenReturn(sourceName);
+		when(core.getValues()).thenReturn(map);
+		when(core.getID()).thenReturn(id);
+		when(core.getValues()).thenReturn(map);
+
+		EntityStore entityStore = new EntityStore();
+		when(core.getMutableStore()).thenReturn(entityStore);
+
+		Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
+		constructor.setAccessible(true);
+		T instance = constructor.newInstance(core);
+		constructor.setAccessible(false);
+		return instance;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/test/java/org/eclipse/mdm/filerelease/FileReleaseServiceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/test/java/org/eclipse/mdm/filerelease/FileReleaseServiceTest.java
new file mode 100644
index 0000000..a97a72f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.filerelease/src/test/java/org/eclipse/mdm/filerelease/FileReleaseServiceTest.java
@@ -0,0 +1,188 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.filerelease;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import org.eclipse.mdm.filerelease.boundary.FileReleaseService;
+import org.eclipse.mdm.filerelease.control.FileReleaseException;
+import org.eclipse.mdm.filerelease.control.FileReleaseManager;
+import org.eclipse.mdm.filerelease.entity.FileRelease;
+import org.junit.Test;
+
+public class FileReleaseServiceTest {
+
+	@Test
+	public void testGetReleases() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		List<FileRelease> fileReleases = fileReleaseService.getReleases(FileReleaseManager.FILE_RELEASE_STATE_ORDERED);
+		assertNotNull("The fileReleases list should not be null.", fileReleases);
+		int expectedSize = FileReleaseServiceMockHelper.NUM_FILE_REL_IN + FileReleaseServiceMockHelper.NUM_FILE_REL_OUT;
+		assertEquals("The size of the fileRelease list should be " + expectedSize, expectedSize, fileReleases.size());
+		fileReleases = fileReleaseService.getReleases("some unknown state");
+		assertEquals("The size of the fileRelease list should be " + 0, 0, fileReleases.size());
+
+	}
+
+	@Test
+	public void testGetRelease() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		FileRelease fileRelease = fileReleaseService.getRelease(FileReleaseServiceMockHelper.ID_IN_PREFIX + "1");
+		assertNotNull("The file release shoult not be null", fileRelease);
+	}
+
+	@Test
+	public void testGetIncommingReleases() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		List<FileRelease> fileReleasesIn = fileReleaseService
+				.getIncommingReleases(FileReleaseManager.FILE_RELEASE_STATE_ORDERED);
+		assertNotNull("The fileReleases list should not be null.", fileReleasesIn);
+		assertEquals("The size of the fileRelease list should be " + FileReleaseServiceMockHelper.NUM_FILE_REL_IN,
+				FileReleaseServiceMockHelper.NUM_FILE_REL_IN, fileReleasesIn.size());
+	}
+
+	@Test
+	public void testGetOutgoingReleases() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		List<FileRelease> fileReleasesOut = fileReleaseService
+				.getOutgoingReleases(FileReleaseManager.FILE_RELEASE_STATE_ORDERED);
+		assertNotNull("The fileReleases list should not be null.", fileReleasesOut);
+		assertEquals("The size of the fileRelease list should be " + FileReleaseServiceMockHelper.NUM_FILE_REL_OUT,
+				FileReleaseServiceMockHelper.NUM_FILE_REL_OUT, fileReleasesOut.size());
+	}
+
+	@Test
+	public void testCreate() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+
+		FileRelease request1 = new FileRelease();
+		request1.sourceName = "MDMENV";
+		request1.typeName = "TestStep";
+		request1.id = "123";
+		request1.format = FileReleaseManager.CONVERTER_FORMAT_PAK2RAW;
+		request1.orderMessage = "new file release";
+		request1.validity = 10;
+		List<FileRelease> fileReleases = fileReleaseService.getReleases(null);
+		fileReleaseService.create(request1);
+
+		FileRelease request2 = new FileRelease();
+		request2.sourceName = "MDMENV";
+		request2.typeName = "TestStep";
+		request2.id = "1234";
+		request2.format = FileReleaseManager.CONVERTER_FORMAT_PAK2ATFX;
+		request2.orderMessage = "new file release";
+		request2.validity = 10;
+		fileReleaseService.create(request2);
+		fileReleases = fileReleaseService.getReleases(null);
+		assertNotNull("The fileReleases list should not be null.", fileReleases);
+		int expectedSize = FileReleaseServiceMockHelper.NUM_FILE_REL_IN + FileReleaseServiceMockHelper.NUM_FILE_REL_OUT
+				+ 2;
+		assertEquals("The size of the fileRelease list should be " + expectedSize, expectedSize, fileReleases.size());
+	}
+
+	@Test(expected = FileReleaseException.class)
+	public void testCreateWithInvalidFileRelease() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		FileRelease request = new FileRelease();
+		request.sourceName = "MDMENV";
+		request.typeName = "TestStep";
+		request.id = "123";
+		request.format = FileReleaseManager.CONVERTER_FORMAT_PAK2RAW;
+		request.orderMessage = "new file release";
+		request.validity = 0;
+		fileReleaseService.create(request);
+	}
+
+	@Test(expected = FileReleaseException.class)
+	public void testCreateWithUnsuppotedType() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		FileRelease request = new FileRelease();
+		request.sourceName = "MDMENV";
+		request.typeName = "TestStep";
+		request.id = "123";
+		request.format = "Some unsupported type";
+		request.orderMessage = "new file release";
+		request.validity = 0;
+		fileReleaseService.create(request);
+	}
+
+	@Test
+	public void testDelete() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		fileReleaseService.delete(FileReleaseServiceMockHelper.ID_OUT_PREFIX + "1");
+		List<FileRelease> fileReleases = fileReleaseService.getReleases(FileReleaseManager.FILE_RELEASE_STATE_ORDERED);
+		assertNotNull("The fileReleases list should not be null.", fileReleases);
+		int expectedSize = FileReleaseServiceMockHelper.NUM_FILE_REL_IN + FileReleaseServiceMockHelper.NUM_FILE_REL_OUT
+				- 1;
+		assertEquals("The size of the fileRelease list should be " + expectedSize, expectedSize, fileReleases.size());
+	}
+
+	@Test
+	public void testApprove() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+		FileRelease release2Approve = new FileRelease();
+		release2Approve.identifier = FileReleaseServiceMockHelper.ID_IN_PREFIX + "1";
+		release2Approve.state = FileReleaseManager.FILE_RELEASE_STATE_APPROVED;
+		fileReleaseService.approve(release2Approve);
+	}
+
+	@Test
+	public void testReject() throws Exception {
+		FileReleaseService fileReleaseService = createMockedService();
+
+		FileRelease release2Reject = new FileRelease();
+		release2Reject.identifier = FileReleaseServiceMockHelper.ID_IN_PREFIX + "1";
+		release2Reject.state = FileReleaseManager.FILE_RELEASE_STATE_REJECTED;
+		release2Reject.rejectMessage = "reject message";
+
+		fileReleaseService.reject(release2Reject);
+
+		FileRelease fileRelease = fileReleaseService.getRelease(FileReleaseServiceMockHelper.ID_IN_PREFIX + "1");
+
+		assertNotNull("FileRelease should not be null.", fileRelease);
+		assertEquals("FileRelease state should be " + FileReleaseManager.FILE_RELEASE_STATE_REJECTED, fileRelease.state,
+				FileReleaseManager.FILE_RELEASE_STATE_REJECTED);
+	}
+
+	private FileReleaseService createMockedService() throws Exception {
+		FileReleaseService fileReleaseService = new FileReleaseService();
+
+		Field fileReleaseManagerField = fileReleaseService.getClass().getDeclaredField("manager");
+		fileReleaseManagerField.setAccessible(true);
+		fileReleaseManagerField.set(fileReleaseService, FileReleaseServiceMockHelper.createFileReleaseManagerMock());
+		fileReleaseManagerField.setAccessible(false);
+
+		Field connectorServiceField = fileReleaseService.getClass().getDeclaredField("connectorService");
+		connectorServiceField.setAccessible(true);
+		connectorServiceField.set(fileReleaseService, FileReleaseServiceMockHelper.createConnectorServiceMock());
+		connectorServiceField.setAccessible(false);
+
+		Field converterField = fileReleaseService.getClass().getDeclaredField("converter");
+		converterField.setAccessible(true);
+		converterField.set(fileReleaseService, FileReleaseServiceMockHelper.createFileConvertJobManagerMock());
+		converterField.setAccessible(false);
+
+		Field targetDirectoryPathField = fileReleaseService.getClass().getDeclaredField("targetDirectoryPath");
+		targetDirectoryPathField.setAccessible(true);
+		targetDirectoryPathField.set(fileReleaseService, System.getProperty("java.io.tmpdir"));
+		targetDirectoryPathField.setAccessible(false);
+
+		return fileReleaseService;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/.gitignore
new file mode 100644
index 0000000..b67ba80
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/.gitignore
@@ -0,0 +1,9 @@
+/build/
+.classpath
+.project
+/bin/
+/.gradle/
+
+/..gitignore.un~
+/.gitignore~
+/.gradle/
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/WebContent/META-INF/MANIFEST.MF b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0

+Class-Path: 

+

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/build.gradle
new file mode 100644
index 0000000..cdbeefb
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/build.gradle
@@ -0,0 +1,50 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+ 
+
+description = 'MDM FreeText Search Indexer'
+
+apply plugin: 'war'
+apply plugin: 'maven'
+apply plugin: 'eclipse'
+
+repositories {
+	jcenter()
+	mavenLocal()
+}
+
+dependencies {
+	compile 'commons-httpclient:commons-httpclient:3.1'
+	compile 'org.slf4j:jcl-over-slf4j:1.7.25'
+
+	compileOnly 'com.fasterxml.jackson.core:jackson-databind:2.5.1'
+
+	compile "org.eclipse.mdm:org.eclipse.mdm.api.default:${version}"
+	compile project(':org.eclipse.mdm.connector')
+	compile project(':org.eclipse.mdm.property')
+
+	compileOnly 'javax:javaee-api:7.0'
+
+	testCompile 'junit:junit:4.12'
+	testCompile project(':org.eclipse.mdm.api.atfxadapter')
+	testCompile "org.testcontainers:elasticsearch:1.12.5"
+	testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.5.2"
+	testCompile "org.elasticsearch.client:elasticsearch-rest-high-level-client:7.5.2"
+	testRuntimeClasspath 'com.fasterxml.jackson.core:jackson-databind:2.6.6'
+}
+
+jar {
+	metaInf { from '../NOTICE.txt' }
+	metaInf { from '../LICENSE.txt' }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/ElasticsearchBoundary.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/ElasticsearchBoundary.java
new file mode 100644
index 0000000..eb789e0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/ElasticsearchBoundary.java
@@ -0,0 +1,225 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.boundary;
+
+import java.io.IOException;
+import java.net.URI;
+import java.text.SimpleDateFormat;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.Stateless;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.inject.Inject;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.freetextindexer.entities.MDMEntityResponse;
+import org.eclipse.mdm.property.GlobalProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * This Boundary is back-end only to the ElasticSearch Server. It is responsible
+ * for the actual indexing work.
+ * 
+ * @author CWE
+ *
+ */
+@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
+@Stateless
+public class ElasticsearchBoundary {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchBoundary.class);
+
+	private ObjectMapper jsonMapper;
+	private HttpClient client;
+	private URI esUri;
+
+	@Inject
+	@GlobalProperty(value = "elasticsearch.url")
+	String esAddress;
+
+	@Inject
+	@GlobalProperty(value = "freetext.active")
+	String active;
+
+	/**
+	 * Connects to the ElasticSearch Server
+	 * 
+	 * @throws IOException
+	 */
+	public ElasticsearchBoundary() {
+		jsonMapper = new ObjectMapper();
+		jsonMapper.setDateFormat(new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"));
+		client = new HttpClient();
+	}
+
+	@PostConstruct
+	public void init() {
+		try {
+			esUri = URI.create(esAddress + "/");
+		} catch (IllegalArgumentException e) {
+			throw new IllegalArgumentException(
+					"Value '" + esAddress + "' for parameter 'elasticsearch.url' is invalid!", e);
+		}
+	}
+
+	public void index(MDMEntityResponse document) {
+		try {
+			PutMethod put = new PutMethod(getPath(document));
+
+			byte[] json = jsonMapper.writeValueAsBytes(document);
+			LOGGER.trace("Document {}: {}", put.getPath(), new String(json));
+
+			put.setRequestEntity(new ByteArrayRequestEntity(json, "application/json"));
+
+			execute(put);
+
+		} catch (IOException e) {
+			throw new IllegalStateException(e);
+		}
+	}
+
+	/**
+	 * @param document
+	 * @return the path of the {@link Entity} within elasticsearch
+	 */
+	private String getPath(MDMEntityResponse document) {
+		return getPath(document.source, document.type, document.id);
+	}
+
+	/**
+	 *
+	 * @param source Datasource of the {@link Entity}
+	 * @param type   Type of the {@link Entity}
+	 * @param id     Instance id of the {@link Entity}
+	 * @return the path of the {@link Entity} within elasticsearch
+	 */
+	private String getPath(String source, String type, String id) {
+		return esUri.resolve(source.toLowerCase() + "/_doc/" + getEsCompositeId(type, id)).toString();
+	}
+
+	/**
+	 *
+	 * @param type Type of the {@link Entity}
+	 * @param id   Instance id of the {@link Entity}
+	 * @return the composite id of the {@link Entity} within elasticsearch
+	 */
+	private String getEsCompositeId(String type, String id) {
+		return type + "-" + id;
+	}
+
+	private void execute(HttpMethod put) {
+		try {
+			int status = client.executeMethod(put);
+
+			checkError(status, put);
+		} catch (IOException e) {
+			throw new IllegalStateException("Problems querying ElasticSearch.", e);
+		}
+	}
+
+	private void checkError(int status, HttpMethod method) {
+		String text = String.format("ElasticSearch answered %d. ", status);
+
+		int httpCategory = status / 100;
+		switch (httpCategory) {
+		case 4:
+			text = text + "This indicates a Client error: ";
+			break;
+		case 5:
+			text = text + "This indicates a Server error. The ES instance must be checked (" + esUri.toString() + "): ";
+			break;
+		}
+
+		try {
+			if (httpCategory != 2) {
+				throw new IllegalStateException(text + method.getResponseBodyAsString());
+			}
+		} catch (IOException e) {
+			throw new IllegalStateException(text + "\nError occured during reading the elastic search response!", e);
+		}
+	}
+
+	public void delete(String api, String type, String id) {
+		String path = getPath(api.toLowerCase(), type, id);
+		DeleteMethod put = new DeleteMethod(esUri.resolve(path).toString());
+
+		execute(put);
+
+		if (LOGGER.isDebugEnabled()) {
+			LOGGER.debug("Document '{}' has been deleted!", path);
+		}
+	}
+
+	public boolean hasIndex(String source) {
+		boolean hasIndex = false;
+
+		if (active()) {
+			try {
+				GetMethod get = new GetMethod(esUri.resolve(source.toLowerCase()).toString());
+				int status = client.executeMethod(get);
+				LOGGER.info("Checking index {}: {}", source, status);
+
+				hasIndex = status / 100 == 2;
+			} catch (IOException e) {
+				LOGGER.warn("Querying ElasticSearch for the Index failed... Assuming no index is there!", e);
+				hasIndex = false;
+			}
+		}
+
+		return hasIndex;
+	}
+
+	public void createIndex(String source) {
+		if (Boolean.valueOf(active)) {
+			execute(new PutMethod(esUri.resolve("/" + source.toLowerCase()).toString()));
+			LOGGER.info("New Index created!");
+		}
+	}
+
+	public void validateConnectionIsPossible() {
+		if (active()) {
+			try {
+				GetMethod get = new GetMethod(esUri.toString());
+				int status = client.executeMethod(get);
+				if (status / 100 != 2) {
+					LOGGER.error(
+							"Cannot connect to elasticsearch at {} but free text search is enabled! http status was: {}",
+							esUri, status);
+					throw new RuntimeException("Cannot connect to elasticsearch.");
+				} else {
+					LOGGER.info("Successfully connected to elasticsearch!");
+				}
+
+			} catch (IOException e) {
+				LOGGER.error("Cannot connect to elasticsearch at {} but free text search is enabled!", esUri, e);
+				throw new RuntimeException("Cannot connect to elasticsearch.", e);
+			}
+		}
+	}
+
+	public boolean active() {
+		return Boolean.valueOf(active);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/MdmApiBoundary.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/MdmApiBoundary.java
new file mode 100644
index 0000000..01395ce
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/MdmApiBoundary.java
@@ -0,0 +1,330 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.boundary;
+
+import java.security.Principal;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.ejb.Schedule;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.enterprise.concurrent.ManagedScheduledExecutorService;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.notification.NotificationException;
+import org.eclipse.mdm.api.base.notification.NotificationFilter;
+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.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.connector.boundary.ConnectorService;
+import org.eclipse.mdm.freetextindexer.control.DatabaseLockHandler;
+import org.eclipse.mdm.freetextindexer.control.LockListener;
+import org.eclipse.mdm.freetextindexer.control.UpdateIndex;
+import org.eclipse.mdm.freetextindexer.entities.MDMEntityResponse;
+import org.eclipse.mdm.property.GlobalProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This boundary is a back-end Boundary to the openMDM Api. It uses the Seach
+ * Server to build up MDDocuments.
+ *
+ * @author CWE
+ *
+ */
+@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
+@Startup
+@Singleton
+public class MdmApiBoundary {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(MdmApiBoundary.class);
+
+	private static final String FREETEXT_NOTIFICATION_NAME = "freetext.notificationName";
+	private static final String FREETEXT_SESSION_CHECK_INTERVAL = "freetext.sessionCheckInterval";
+
+	public class FreeTextNotificationListener implements NotificationListener {
+
+		private EntityManager entityManager;
+
+		public FreeTextNotificationListener(EntityManager entityManager) {
+			this.entityManager = entityManager;
+		}
+
+		@Override
+		public void instanceCreated(List<? extends Entity> entities, User arg1) {
+			LOGGER.debug("{} entities created: {}", entities.size(), entities);
+			entities.forEach(e -> update.change(MDMEntityResponse.build(e.getClass(), e, entityManager)));
+		}
+
+		@Override
+		public void instanceDeleted(EntityType entityType, List<String> ids, User user) {
+			LOGGER.debug("{} entities deleted: {}", ids.size(), ids);
+			ids.forEach(id -> update.delete(getApiName(entityManager), workaroundForTypeMapping(entityType), id));
+		}
+
+		@Override
+		public void instanceModified(List<? extends Entity> entities, User arg1) {
+			LOGGER.debug("{} entities modified: {}", entities.size(), entities);
+			entities.forEach(e -> update.change(MDMEntityResponse.build(e.getClass(), e, entityManager)));
+		}
+
+		@Override
+		public void modelModified(EntityType arg0, User arg1) {
+			// not needed
+		}
+
+		@Override
+		public void securityModified(EntityType entityType, List<String> ids, User user) {
+			// not needed
+		}
+	}
+
+	@Inject
+	UpdateIndex update;
+
+	@Resource
+	ManagedScheduledExecutorService scheduler;
+
+	@Inject
+	@GlobalProperty(value = "freetext.active")
+	private String active = "false";
+
+	ConnectorService connectorService;
+
+	@Inject
+	@GlobalProperty
+	private Map<String, String> globalProperties = Collections.emptyMap();
+
+	private ScheduledFuture<?> scheduledFuture;
+
+	@EJB
+	DatabaseLockHandler databaseLockHandler;
+
+	@PostConstruct
+	public void initalize() {
+		if (!isActive()) {
+			return;
+		}
+
+		databaseLockHandler.init("free-text-indexer", new LockListener() {
+
+			@Override
+			public void onLockAcquired() {
+				LOGGER.info("Acquired database lock, starting fretextindexer.");
+
+				Principal principal = new Principal() {
+
+					@Override
+					public String getName() {
+						return null;
+					}
+				};
+
+				connectorService = new ConnectorService(principal, globalProperties);
+				connectorService.connect();
+				connectorService.getContexts().forEach(MdmApiBoundary.this::initializeContext);
+
+				long intervalSeconds = 60L;
+				try {
+					Long.parseLong(globalProperties.getOrDefault(FREETEXT_SESSION_CHECK_INTERVAL,
+							"60"));
+				} catch (NumberFormatException e) {
+					LOGGER.warn("Could not parse value for parameter '" +
+							FREETEXT_SESSION_CHECK_INTERVAL + "'. Using default value '60'.");
+				}
+
+				scheduledFuture = MdmApiBoundary.this.scheduler.scheduleAtFixedRate(
+						MdmApiBoundary.this::sessionCheck, intervalSeconds, intervalSeconds,
+						TimeUnit.SECONDS);
+
+				LOGGER.info("Initialized session tick timer with interval {}s.",
+						intervalSeconds);
+			}
+
+			@Override
+			public void onLockLost() {
+				deregister();
+			}
+		});
+		databaseLockHandler.requestLock();
+	}
+
+	/**
+	 * Tries in intervals of one minute to acquire the database lock. If the lock
+	 * could be acquired, the onLockAcquired method on the registered listener is
+	 * invoked.
+	 */
+	@Schedule(hour = "*", minute = "*/1", persistent = false)
+	public void checkLock() {
+		databaseLockHandler.requestLock();
+	}
+
+	private void initializeContext(ApplicationContext context) {
+
+		String source = getName(context);
+
+		try {
+			EntityManager entityManager = context.getEntityManager()
+					.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+
+			NotificationService manager = context.getNotificationService()
+					.orElseThrow(() -> new ConnectionException("Context has no NotificationManager!"));
+
+			String notificationName = context.getParameters().getOrDefault(FREETEXT_NOTIFICATION_NAME, "mdm5");
+			LOGGER.debug("Registering with name '{}' at source '{}'", notificationName, source);
+
+			manager.register(notificationName, new NotificationFilter(),
+					new FreeTextNotificationListener(entityManager));
+			LOGGER.info("Successfully registered for new notifications with name '{}' at source '{}!", notificationName,
+					source);
+		} catch (ConnectionException | NotificationException e) {
+			throw new IllegalArgumentException(
+					"The ODS Server and/or the Notification Service cannot be accessed for source '" + source + "'!",
+					e);
+		}
+	}
+
+	public void sessionCheck() {
+		LOGGER.debug("Session check on {} context(s).", connectorService.getContexts().size());
+
+		for (ApplicationContext context : connectorService.getContexts()) {
+			try {
+				Optional<EntityManager> em = context.getEntityManager();
+				if (em.isPresent()) {
+					em.get().loadLoggedOnUser();
+				}
+			} catch (Exception e) {
+				LOGGER.warn("ApplicationContext seems to be closed. Trying to reconnect.");
+
+				try {
+					Optional<ApplicationContext> c = connectorService.reconnect(context);
+					initializeContext(c.get());
+					LOGGER.info("Freetextindexer ApplicationContext reconnected.");
+				} catch (Exception ex) {
+					LOGGER.info("Could not reconnect Freetextindexer ApplicationContext!", ex);
+				}
+			}
+		}
+	}
+
+	@PreDestroy
+	public void deregister() {
+		if (isActive()) {
+			scheduledFuture.cancel(true);
+
+			for (ApplicationContext context : getContexts().values()) {
+				try {
+					context.getNotificationService()
+							.orElseThrow(() -> new ConnectionException("Context has no NotificationManager!"))
+							.close(false);
+
+				} catch (ConnectionException | NotificationException e) {
+					throw new IllegalStateException(
+							"The NotificationManager could not be deregistered. In rare cases, this leads to a missed notification. This means the index might not be up-to-date.");
+				}
+			}
+
+			connectorService.disconnect();
+		}
+		if (databaseLockHandler.hasDatabaseLock()) {
+			databaseLockHandler.releaseDatabaseLock();
+		}
+	}
+
+	public void doForAllEntities(Class<? extends Entity> entityClass, ApplicationContext context,
+			Consumer<? super MDMEntityResponse> executor) {
+		if (isActive()) {
+			try {
+				EntityManager entityManager = context.getEntityManager()
+						.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+
+				entityManager.loadAll(entityClass).stream().map(e -> this.buildEntity(e, entityManager))
+						.forEach(executor);
+
+			} catch (DataAccessException e) {
+				throw new IllegalStateException("MDM cannot be querried for new elements. Please check the MDM runtime",
+						e);
+			}
+		}
+	}
+
+	public Map<String, ApplicationContext> getContexts() {
+		if (connectorService == null) {
+			return Collections.emptyMap();
+		}
+		return connectorService.getContexts().stream().collect(Collectors.toMap(this::getName, Function.identity()));
+	}
+
+	public String getName(ApplicationContext context) {
+		return context.getEntityManager().map(this::getApiName)
+				.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+	}
+
+	private String getApiName(EntityManager entityManager) {
+		return entityManager.loadEnvironment().getSourceName();
+	}
+
+	private boolean isActive() {
+		return Boolean.parseBoolean(active);
+	}
+
+	private MDMEntityResponse buildEntity(Entity e, EntityManager entityManager) {
+		return MDMEntityResponse.build(e.getClass(), e, entityManager);
+	}
+
+	/**
+	 * Simple workaround for naming mismatch between Adapter and Business object
+	 * names.
+	 *
+	 * @param entityType entity type
+	 * @return MDM business object name
+	 */
+	private static String workaroundForTypeMapping(EntityType entityType) {
+		switch (entityType.getName()) {
+		case "StructureLevel":
+			return "Pool";
+		case "MeaResult":
+			return "Measurement";
+		case "SubMatrix":
+			return "ChannelGroup";
+		case "MeaQuantity":
+			return "Channel";
+		default:
+			return entityType.getName();
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/package-info.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/package-info.java
new file mode 100644
index 0000000..8c481ea
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/boundary/package-info.java
@@ -0,0 +1,31 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+/**
+ * This package contains all communication to external systems. Those systems
+ * are:
+ * <ul>
+ * <li>ElasticSearch for Indexing via REST
+ * {@link org.eclipse.mdm.freetextindexer.boundary.ElasticsearchBoundary
+ * ElasticsearchBoundary}</li>
+ * <li>MDM for querying the dataitems and getting notifications
+ * {@link org.eclipse.mdm.freetextindexer.boundary.MdmApiBoundary
+ * MDMBoundary}</li>
+ * <li>JEE Container for creating the initial index
+ * {@link org.eclipse.mdm.freetextindexer.boundary.StartupBoundary
+ * StartupBoundary}</li>
+ * </ul>
+ * 
+ */
+package org.eclipse.mdm.freetextindexer.boundary;
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/DatabaseLockHandler.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/DatabaseLockHandler.java
new file mode 100644
index 0000000..82413bd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/DatabaseLockHandler.java
@@ -0,0 +1,291 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.control;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.UUID;
+
+import javax.ejb.Stateful;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.eclipse.mdm.freetextindexer.entities.SystemProcess;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <p>
+ * Connection handler class which manages a connection from the JDBC pool of the
+ * application server. Additional it locks a database table entry on the
+ * 'system_process' table.
+ * </p>
+ * <p>
+ * If the database table 'system_process' does not exist it will automatically
+ * create it.
+ * </p>
+ * <p>
+ * If the locking entry does not exist within the table it will automatically
+ * create it.
+ * </p>
+ *
+ * @author Juergen Kleck, Peak Solution GmbH
+ */
+@Stateful
+public class DatabaseLockHandler {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseLockHandler.class);
+
+	// Health check timeout of 3 minutes after which the process can takeover
+	private static final int HEALTH_CHECK_TIMEOUT = 180000;
+
+	private boolean lockAcquired = false;
+	private boolean initialized = false;
+	private String lockingEntry;
+	private String processId;
+	private LockListener listener;
+
+	@PersistenceContext(unitName = "openMDM")
+	private EntityManager em;
+
+	/**
+	 * Define the locking entry and the process id
+	 *
+	 * @param lockingEntry The key of the system_process table which should be
+	 *                     locked
+	 */
+	public void init(String lockingEntry, LockListener listener) {
+		try {
+			this.processId = InetAddress.getLocalHost().getHostName() + "_" + UUID.randomUUID().toString();
+		} catch (UnknownHostException e) {
+			this.processId = UUID.randomUUID().toString();
+		}
+
+		this.lockingEntry = lockingEntry;
+		this.listener = listener;
+		this.initialized = false;
+	}
+
+	public void requestLock() {
+		// check if we have the lock, otherwise try to get it
+		if (!hasDatabaseLock()) {
+			acquireDatabaseLock();
+		}
+		if (hasDatabaseLock() && doHealthCheck()) {
+		} else {
+			LOGGER.debug("No database lock could be acquired for this process.");
+		}
+	}
+
+	/**
+	 * Instantiate the database setup
+	 */
+	public void setupDB() {
+		if (!this.initialized) {
+			boolean success = true;
+
+			// check if the process key exists or create it
+			String query = "SELECT sp FROM SystemProcess sp WHERE sp.processKey = '" + lockingEntry + "'";
+			List<SystemProcess> processes = em.createQuery(query, SystemProcess.class).getResultList();
+			if (processes.isEmpty()) {
+				success = insertTableRow();
+			}
+			this.initialized = success;
+			if (success) {
+				LOGGER.debug("Started database lock handler with process id '{}'", processId);
+			}
+		}
+	}
+
+	/**
+	 * This method updates the last connection time of the system process as
+	 * database locks are only active for the transaction lifecycle which end when
+	 * leaving the method
+	 *
+	 * @return true if the database lock is still active
+	 */
+	public boolean doHealthCheck() {
+		try {
+			LOGGER.debug("Health check for lock handler with process id {}", processId);
+			SystemProcess entity = em
+					.createQuery("SELECT sp FROM SystemProcess sp WHERE sp.processKey = '" + lockingEntry + "'",
+							SystemProcess.class)
+					.getSingleResult();
+			em.refresh(entity);
+
+			if (this.processId.equals(entity.getProcessId())) {
+				if (!em.isJoinedToTransaction()) {
+					em.joinTransaction();
+				}
+				entity.setTime(System.currentTimeMillis());
+				em.merge(entity);
+				em.flush();
+				LOGGER.trace("Renewed lock for process id {}", processId);
+			} else if (hasDatabaseLock()) {
+				// process id in database has changed, but we still think we have the lock ->
+				// release lock
+				LOGGER.trace("Another process id '{}' has acquired the lock. Health check failed for process id '{}'",
+						entity.getProcessId(), processId);
+				setLockAcquired(false);
+			}
+		} catch (Exception ignored) {
+			LOGGER.error("Exception occurred: {}", ignored);
+		}
+		return hasDatabaseLock();
+	}
+
+	/**
+	 * This method will try get a logical lock on the database table system_process.
+	 * It will check by the process id and the last locked time. The lock will
+	 * remain until the application disconnects from the database. In case of a
+	 * ungraceful disconnect the locking timeout will apply.
+	 *
+	 * @return true if the lock has been acquired
+	 */
+	public boolean acquireDatabaseLock() {
+		setupDB();
+		try {
+			LOGGER.trace(
+					"Trying to acquire the lock for '{}' for process id '{}'.", lockingEntry, processId);
+
+			SystemProcess entity = em
+					.createQuery("SELECT sp FROM SystemProcess sp WHERE sp.processKey = '" + lockingEntry + "'",
+							SystemProcess.class)
+					.getSingleResult();
+			em.refresh(entity);
+
+			// check if we can acquire this entity by:
+			// - different process id
+			// - last health check time is older than defined
+			if (!this.processId.equals(entity.getProcessId()) && System
+					.currentTimeMillis() - HEALTH_CHECK_TIMEOUT > entity.getTime()) {
+				LOGGER.trace(
+						"Another process id '{}' not renewed the lock for {} seconds. Replacing lock with own process id '{}'",
+						entity.getProcessId(), HEALTH_CHECK_TIMEOUT / 1000, processId);
+				if (!em.isJoinedToTransaction()) {
+					em.joinTransaction();
+				}
+				entity.setProcessId(this.processId);
+				em.merge(entity);
+				em.flush();
+
+				em.refresh(entity);
+				entity = em.find(SystemProcess.class, entity.getId());
+				if (this.processId.equals(entity.getProcessId())) {
+					setLockAcquired(true);
+				}
+			}
+		} catch (Exception e) {
+			LOGGER.error("Exception occurred: ", e);
+		}
+		LOGGER.trace(
+				"Acquired the lock for '{}' for process id '{}': ", lockingEntry, processId, hasDatabaseLock());
+		return hasDatabaseLock();
+	}
+
+	private void setLockAcquired(boolean acquired) {
+		if (acquired) {
+			LOGGER.debug(
+					"Successfully acquired the database lock for this process on the table 'system_process' for the process_key '{}'.",
+					lockingEntry);
+			lockAcquired = true;
+			listener.onLockAcquired();
+		} else {
+			LOGGER.debug("This process is no longer responsible for the database updates. Deactivating...");
+			lockAcquired = false;
+			listener.onLockLost();
+		}
+	}
+
+	/**
+	 * This method will release the database lock on the system_process table for
+	 * this locking entry
+	 */
+	public void releaseDatabaseLock() {
+		try {
+			SystemProcess entity = em
+					.createQuery("SELECT sp FROM SystemProcess sp WHERE sp.processKey = '" + lockingEntry + "'",
+							SystemProcess.class)
+					.getSingleResult();
+			em.refresh(entity);
+
+			// we can only release ourselves
+			if (this.processId.equals(entity.getProcessId())) {
+				if (!em.isJoinedToTransaction()) {
+					em.joinTransaction();
+				}
+				entity.setProcessId("-released-");
+				entity.setTime(0L);
+				em.merge(entity);
+				em.flush();
+				LOGGER.debug(
+						"Successfully released the database lock for this process on the table 'system_process' for the process_key '{}'.",
+						lockingEntry);
+			}
+			lockAcquired = false;
+		} catch (Exception ignored) {
+			LOGGER.error("Exception occurred: ", ignored);
+		}
+	}
+
+	/**
+	 * Check if the database lock has been applied
+	 *
+	 * @return true if the lock is applied
+	 */
+	public boolean hasDatabaseLock() {
+		return lockAcquired;
+	}
+
+	/**
+	 * Insert the value into the table if it does not exist yet.
+	 *
+	 * @return true if the initial table entry has been committed
+	 */
+	private boolean insertTableRow() {
+		try {
+			SystemProcess entity = new SystemProcess();
+			entity.setId(getHighestId() + 1L);
+			entity.setProcessKey(lockingEntry);
+			entity.setProcessId("-initialized-");
+			entity.setTime(0L);
+			em.persist(entity);
+			em.flush();
+			em.refresh(entity);
+			return true;
+		} catch (Throwable e) {
+			LOGGER.error("Failed to insert the data entry.", e);
+		}
+		return false;
+	}
+
+	/**
+	 * Get the highest id of the system process table
+	 *
+	 * @return the highest id or 0
+	 */
+	private long getHighestId() {
+		long id = 0L;
+		Query query = em.createQuery("SELECT sp FROM SystemProcess sp ORDER BY sp.id DESC", SystemProcess.class);
+		List<SystemProcess> result = query.getResultList();
+		if (!result.isEmpty()) {
+			id = result.get(0).getId();
+		}
+		return id;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/LockListener.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/LockListener.java
new file mode 100644
index 0000000..a4a5875
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/LockListener.java
@@ -0,0 +1,33 @@
+/********************************************************************************

+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+

+package org.eclipse.mdm.freetextindexer.control;

+

+/**

+ * Listener interface for receiving events on the locking state of

+ * {@link DatabaseLockHandler}.

+ *

+ */

+public interface LockListener {

+

+	/**

+	 * Invoked when a lock could be obtained.

+	 */

+	void onLockAcquired();

+

+	/**

+	 * Invoked when a lock was lost.

+	 */

+	void onLockLost();

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/SetupIndex.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/SetupIndex.java
new file mode 100644
index 0000000..b77af2e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/SetupIndex.java
@@ -0,0 +1,82 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.control;
+
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.Asynchronous;
+import javax.ejb.EJB;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.enterprise.event.Event;
+import javax.enterprise.event.Observes;
+import javax.inject.Inject;
+
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.freetextindexer.boundary.ElasticsearchBoundary;
+import org.eclipse.mdm.freetextindexer.boundary.MdmApiBoundary;
+import org.eclipse.mdm.freetextindexer.events.CreateIndex;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
+@Startup
+@Singleton
+public class SetupIndex {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(SetupIndex.class);
+
+	@EJB
+	ElasticsearchBoundary esBoundary;
+
+	@EJB
+	MdmApiBoundary apiBoundary;
+
+	@Inject
+	Event<CreateIndex> createIndexEvent;
+
+	@PostConstruct
+	public void createIndexIfNeccessary() {
+		for (Map.Entry<String, ApplicationContext> entry : apiBoundary.getContexts().entrySet()) {
+			String source = entry.getKey();
+
+			if (!esBoundary.hasIndex(source)) {
+				LOGGER.info("Scheduling asynchronous index creation.");
+				createIndexEvent.fire(new CreateIndex(source, Project.class, Pool.class, Test.class, TestStep.class,
+						Measurement.class));
+			}
+		}
+	}
+
+	@Asynchronous
+	public void handleCreateIndexEvent(@Observes CreateIndex event) {
+		LOGGER.info("About to create new lucene index!");
+		String source = event.getSourceName();
+		esBoundary.createIndex(source);
+		for (Class<? extends Entity> entityType : event.getEntitiesToIndex()) {
+			apiBoundary.doForAllEntities(entityType, apiBoundary.getContexts().get(source), e -> esBoundary.index(e));
+		}
+		LOGGER.info("Index '" + source + "' initialized");
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/UpdateIndex.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/UpdateIndex.java
new file mode 100644
index 0000000..2269fe3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/UpdateIndex.java
@@ -0,0 +1,43 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.control;
+
+import javax.ejb.EJB;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+
+import org.eclipse.mdm.freetextindexer.boundary.ElasticsearchBoundary;
+import org.eclipse.mdm.freetextindexer.entities.MDMEntityResponse;
+
+@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
+@Startup
+@Singleton
+public class UpdateIndex {
+
+	@EJB
+	ElasticsearchBoundary esBoundary;
+
+	public void change(MDMEntityResponse mdmEntityResponse) {
+		if (mdmEntityResponse != null) {
+			esBoundary.index(mdmEntityResponse);
+		}
+	}
+
+	public void delete(String apiName, String name, String id) {
+		esBoundary.delete(apiName, name, id);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/package-info.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/package-info.java
new file mode 100644
index 0000000..3bb5327
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/control/package-info.java
@@ -0,0 +1,15 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional information
+ * regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.control;
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/MDMEntity.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/MDMEntity.java
new file mode 100644
index 0000000..1b8db53
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/MDMEntity.java
@@ -0,0 +1,89 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.entities;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mdm.api.base.model.BaseEntity;
+import org.eclipse.mdm.api.base.model.Value;
+
+/**
+ * MDMEntity (Entity for a business object (contains a list of
+ * {@link MDMAttribute}s)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class MDMEntity {
+
+	private static final Set<String> NOTINDEXED = new HashSet<>(
+			Arrays.asList(BaseEntity.ATTR_ID, BaseEntity.ATTR_MIMETYPE, "Optional", "SortIndex"));
+
+	/** name of the MDM business object */
+	public final String name;
+
+	/** type of the MDM business object */
+	public final String type;
+
+	/** id of the MDM business object */
+	public final String id;
+
+	/** list of attribute to transfer */
+	public final Map<String, String> attributes;
+
+	public final List<MDMEntity> components = new ArrayList<>();
+
+	/**
+	 * Constructor
+	 * 
+	 * @param name   name of the MDM business object
+	 * @param type   type as String of the MDM business object (e.g. TestStep)
+	 * @param uri    URI of an MDM business object
+	 * @param values values of a MDM business object
+	 */
+	public MDMEntity(String name, String type, String id, Map<String, Value> values) {
+		this.name = name;
+		this.type = type;
+		this.id = id;
+
+		this.attributes = initAttributes(values);
+	}
+
+	/**
+	 * converts the MDM business object values to string values
+	 * 
+	 * @param values values of a MDM business object
+	 * @return list with converted attribute values
+	 */
+	private Map<String, String> initAttributes(Map<String, Value> values) {
+		Map<String, String> mapAttrs = new HashMap<>();
+		for (java.util.Map.Entry<String, Value> entry : values.entrySet()) {
+
+			String key = entry.getKey();
+			if (!NOTINDEXED.contains(key) && entry.getValue().isValid()) {
+				mapAttrs.put(key, entry.getValue().extract().toString());
+			}
+		}
+
+		return mapAttrs;
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityResponse.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityResponse.java
new file mode 100644
index 0000000..ebddc97
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityResponse.java
@@ -0,0 +1,102 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.entities;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+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.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.EntityManager;
+
+/**
+ * EntryResponse (Container for {@link MDMEntity}s)
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class MDMEntityResponse {
+
+	public String source;
+
+	public String type;
+
+	/** transferable data content */
+	public MDMEntity data;
+
+	public String id;
+
+	/**
+	 * Constructor (for a list of business objects {@link MDMEntity}s)
+	 * 
+	 * @param type    type of all containging {@link MDMEntity}s
+	 * @param entries list of {@link MDMEntity}
+	 * @throws DataAccessException
+	 */
+	public static <T extends Entity> MDMEntityResponse build(Class<? extends Entity> type, T businessObject,
+			EntityManager manager) {
+		MDMEntityResponse response = new MDMEntityResponse();
+
+		try {
+			response.type = type.getSimpleName();
+			response.source = businessObject.getSourceName();
+			response.data = toTransferable(businessObject);
+			response.id = businessObject.getID();
+
+			response.addContext(businessObject, manager);
+		} catch (DataAccessException e) {
+			response = null;
+		}
+
+		return response;
+	}
+
+	private <T extends Entity> void addContext(T businessObject, EntityManager manager) throws DataAccessException {
+		if (businessObject instanceof ContextDescribable) {
+			Map<ContextType, ContextRoot> contexts = manager.loadContexts((ContextDescribable) businessObject,
+					ContextType.UNITUNDERTEST, ContextType.TESTSEQUENCE, ContextType.TESTEQUIPMENT);
+
+			for (ContextRoot root : contexts.values()) {
+				MDMEntity entity = toTransferable(root);
+				data.components.add(entity);
+				for (ContextComponent comp : root.getContextComponents()) {
+					MDMEntity compEntity = toTransferable(comp);
+					entity.components.add(compEntity);
+					for (Entry<String, Value> entry : comp.getValues().entrySet()) {
+						Optional<Object> extractedValue = Optional.ofNullable(entry.getValue().extract());
+						compEntity.attributes.put(entry.getKey(), extractedValue.map(Object::toString).orElse(""));
+					}
+				}
+			}
+		}
+	}
+
+	private static <T extends Entity> MDMEntity toTransferable(T businessObject) {
+		return new MDMEntity(businessObject.getName(), businessObject.getClass().getSimpleName(),
+				businessObject.getID(), businessObject.getValues());
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/SystemProcess.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/SystemProcess.java
new file mode 100644
index 0000000..aa3f5da
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/SystemProcess.java
@@ -0,0 +1,72 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.entities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "system_process")
+public class SystemProcess {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Long id;
+
+	@Column(name = "process_key")
+	private String processKey;
+
+	@Column(name = "process_id")
+	private String processId;
+
+	@Column(name = "last_locked")
+	private Long time;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getProcessKey() {
+		return processKey;
+	}
+
+	public void setProcessKey(String processKey) {
+		this.processKey = processKey;
+	}
+
+	public String getProcessId() {
+		return processId;
+	}
+
+	public void setProcessId(String processId) {
+		this.processId = processId;
+	}
+
+	public Long getTime() {
+		return time;
+	}
+
+	public void setTime(Long time) {
+		this.time = time;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/package-info.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/package-info.java
new file mode 100644
index 0000000..017b1f3
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/entities/package-info.java
@@ -0,0 +1,15 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional information
+ * regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.entities;
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/events/CreateIndex.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/events/CreateIndex.java
new file mode 100644
index 0000000..1de74a1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/main/java/org/eclipse/mdm/freetextindexer/events/CreateIndex.java
@@ -0,0 +1,56 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.events;
+
+import java.util.Objects;
+
+import org.eclipse.mdm.api.base.model.Entity;
+
+import com.google.common.collect.ImmutableList;
+
+public class CreateIndex {
+	private final String sourceName;
+	private final ImmutableList<Class<? extends Entity>> entitiesToIndex;
+
+	@SafeVarargs
+	public CreateIndex(String sourceName, Class<? extends Entity>... entitiesToIndex) {
+		this.sourceName = Objects.requireNonNull(sourceName, "Source name may never be null!");
+		this.entitiesToIndex = ImmutableList.copyOf(entitiesToIndex);
+	}
+
+	public ImmutableList<Class<? extends Entity>> getEntitiesToIndex() {
+		return entitiesToIndex;
+	}
+
+	public String getSourceName() {
+		return sourceName;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (o == null || getClass() != o.getClass())
+			return false;
+		CreateIndex that = (CreateIndex) o;
+		return Objects.equals(sourceName, that.sourceName) && Objects.equals(entitiesToIndex, that.entitiesToIndex);
+	}
+
+	@Override
+	public int hashCode() {
+
+		return Objects.hash(sourceName, entitiesToIndex);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/boundary/ElasticsearchBoundaryTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/boundary/ElasticsearchBoundaryTest.java
new file mode 100644
index 0000000..00e2ba8
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/boundary/ElasticsearchBoundaryTest.java
@@ -0,0 +1,145 @@
+/********************************************************************************
+ * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.boundary;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+import org.apache.http.HttpHost;
+import org.eclipse.mdm.api.atfxadapter.ATFXContextFactory;
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.freetextindexer.entities.MDMEntityResponse;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.testcontainers.elasticsearch.ElasticsearchContainer;
+
+import com.google.common.collect.ImmutableMap;
+
+@Ignore
+//FIXME 05.02.2020: this test needs a docker to run elasticsearch and is not suitable for continous build in Jenkins.
+//Comment this in for local tests only, if docker is available
+public class ElasticsearchBoundaryTest {
+
+	private static String atfxFilePath = "../org.eclipse.mdm.api.atfxadapter/src/test/resources/";
+	private static String atfxFile = "Right_acc.atfx";
+
+	private static ApplicationContext context;
+	private static String sourceName;
+	private static RestHighLevelClient client;
+
+	private ElasticsearchBoundary es;
+
+	@ClassRule
+	public static ElasticsearchContainer elasticSearch = new ElasticsearchContainer(
+			"docker.elastic.co/elasticsearch/elasticsearch-oss:7.0.0").withEnv("discovery.type", "single-node");
+
+	@BeforeClass
+	public static void setup() throws ConnectionException {
+		context = new ATFXContextFactory().connect(ImmutableMap.of("atfxfile", atfxFilePath + atfxFile));
+		Environment env = context.getEntityManager().get().loadAll(Environment.class).get(0);
+		sourceName = env.getSourceName().toLowerCase();
+
+		client = new RestHighLevelClient(RestClient.builder(HttpHost.create(elasticSearch.getHttpHostAddress())));
+	}
+
+	@Before
+	public void init() throws DataAccessException, ConnectionException {
+		es = new ElasticsearchBoundary();
+		es.esAddress = "http://" + elasticSearch.getHttpHostAddress();
+		es.active = "true";
+		es.init();
+	}
+
+	@Test
+	public void indexSuccessfullyCreated_CaseDoesNotMatter() throws InterruptedException, ExecutionException {
+		es.createIndex("BlA");
+		assertThat(es.hasIndex("bla")).isTrue();
+	}
+
+	@Test
+	public void indexSuccessfullyCreated_OtherIndizesNot() throws InterruptedException, ExecutionException {
+		es.createIndex("someIndex");
+		assertThat(es.hasIndex("asdf")).isFalse();
+	}
+
+	@Test
+	public void deletedDoc_isGone() throws InterruptedException, DataAccessException, IOException {
+		Measurement ts = context.getEntityManager().get().load(Measurement.class, "1");
+
+		MDMEntityResponse document = MDMEntityResponse.build(Measurement.class, ts, context.getEntityManager().get());
+		es.index(document);
+		Thread.sleep(1000L);
+		es.delete(sourceName, "Measurement", "1");
+		Thread.sleep(1000L);
+		assertThat(search(sourceName, "Model P").getTotalHits().value).isEqualTo(0);
+	}
+
+	@Test
+	public void docIsIndexed_isFound() throws DataAccessException, InterruptedException, IOException {
+		Measurement ts = context.getEntityManager().get().load(Measurement.class, "1");
+
+		MDMEntityResponse document = MDMEntityResponse.build(Measurement.class, ts, context.getEntityManager().get());
+		es.index(document);
+		Thread.sleep(1000L);
+		assertThat(search(sourceName, "Model P").getTotalHits().value).isEqualTo(1);
+	}
+
+	@Test(expected = IllegalStateException.class)
+	public void indexCreatedTwice_ThrowsError() {
+		es.createIndex("someRandomIndex");
+		es.createIndex("someRandomIndex");
+	}
+
+	@Test
+	public void indexDeactivated_NoIndexingDone() {
+		es.active = "false";
+
+		es.createIndex("someSource");
+		assertThat(es.hasIndex("someSource")).isFalse();
+	}
+
+	private SearchHits search(String index, String query) throws IOException {
+		String[] includeFields = new String[] { "source", "type", "id" };
+		String[] excludeFields = new String[0];
+
+		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
+		sourceBuilder.query(QueryBuilders.simpleQueryStringQuery(query).lenient(true)).fetchSource(includeFields,
+				excludeFields);
+
+		SearchRequest searchRequest = new SearchRequest();
+		searchRequest.indices(index);
+		searchRequest.source(sourceBuilder);
+
+		SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
+		return response.getHits();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/control/SetupIndexTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/control/SetupIndexTest.java
new file mode 100644
index 0000000..f00dfe9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/control/SetupIndexTest.java
@@ -0,0 +1,66 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.control;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.enterprise.event.Event;
+
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.freetextindexer.boundary.ElasticsearchBoundary;
+import org.eclipse.mdm.freetextindexer.boundary.MdmApiBoundary;
+import org.eclipse.mdm.freetextindexer.events.CreateIndex;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+public class SetupIndexTest {
+
+	private SetupIndex setup;
+
+	@Before
+	@SuppressWarnings("unchecked")
+	public void init() {
+		setup = new SetupIndex();
+		setup.esBoundary = mock(ElasticsearchBoundary.class);
+		setup.apiBoundary = mock(MdmApiBoundary.class);
+		setup.createIndexEvent = mock(Event.class);
+	}
+
+	@Test
+	public void hasAlreadyIndex_doNothing() {
+		when(setup.esBoundary.hasIndex(any(String.class))).thenReturn(true);
+
+		setup.createIndexIfNeccessary();
+
+		verify(setup.esBoundary, times(0)).createIndex(any(String.class));
+	}
+
+	@Test
+	public void noIndex_created() {
+		ApplicationContext c = mock(ApplicationContext.class);
+		when(setup.esBoundary.hasIndex(any(String.class))).thenReturn(false);
+		when(setup.apiBoundary.getContexts()).thenReturn(ImmutableMap.of("MDM", c));
+
+		setup.createIndexIfNeccessary();
+
+		verify(setup.createIndexEvent, times(1)).fire(any(CreateIndex.class));
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/control/UpdateIndexTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/control/UpdateIndexTest.java
new file mode 100644
index 0000000..fbcdf85
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/control/UpdateIndexTest.java
@@ -0,0 +1,60 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.control;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import org.eclipse.mdm.freetextindexer.boundary.ElasticsearchBoundary;
+import org.eclipse.mdm.freetextindexer.entities.MDMEntityResponse;
+import org.junit.Before;
+import org.junit.Test;
+
+public class UpdateIndexTest {
+
+	private UpdateIndex update;
+
+	@Before
+	public void init() {
+		update = new UpdateIndex();
+		update.esBoundary = mock(ElasticsearchBoundary.class);
+	}
+
+	@Test
+	public void nullGiven_notUpdated() {
+		update.change(null);
+
+		verify(update.esBoundary, never()).index(any(MDMEntityResponse.class));
+	}
+
+	@Test
+	public void validDoc_Indexed() {
+		MDMEntityResponse response = mock(MDMEntityResponse.class);
+		update.change(response);
+
+		verify(update.esBoundary, times(1)).index(eq(response));
+	}
+
+	@Test
+	public void validDoc_deleted() {
+		update.delete("api", "TestStep", "123");
+
+		verify(update.esBoundary, times(1)).delete(eq("api"), eq("TestStep"), eq("123"));
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityResponseTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityResponseTest.java
new file mode 100644
index 0000000..0e16c59
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityResponseTest.java
@@ -0,0 +1,53 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.entities;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class MDMEntityResponseTest {
+
+	@Ignore
+	@Test
+	public void notContextDescribale_noContext() {
+		Quantity q = mock(Quantity.class);
+		EntityManager manager = mock(EntityManager.class);
+
+		MDMEntityResponse response = MDMEntityResponse.build(Quantity.class, q, manager);
+
+		assertTrue(response.data.attributes.isEmpty());
+	}
+
+	@Ignore
+	@Test
+	public void buildFails_nullIsReturned() throws DataAccessException {
+		TestStep ts = mock(TestStep.class);
+		EntityManager manager = mock(EntityManager.class);
+		when(manager.loadContexts(eq(ts), any())).thenThrow(new DataAccessException("test"));
+
+		assertNull(MDMEntityResponse.build(TestStep.class, ts, manager));
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityTest.java
new file mode 100644
index 0000000..fd89c44
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.freetextindexer/src/test/java/org/eclipse/mdm/freetextindexer/entities/MDMEntityTest.java
@@ -0,0 +1,59 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.freetextindexer.entities;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.junit.Test;
+
+public class MDMEntityTest {
+
+	@Test
+	public void notIndexedFields_NotIndexed() {
+		MDMEntity entity = buildEntity("SortIndex", true);
+
+		assertTrue(entity.attributes.isEmpty());
+	}
+
+	@Test
+	public void invalidFields_NotIndexed() {
+		MDMEntity entity = buildEntity("indexed", false);
+
+		assertTrue(entity.attributes.isEmpty());
+	}
+
+	@Test
+	public void validField_Indexed() {
+		MDMEntity entity = buildEntity("indexed", true);
+
+		assertFalse(entity.attributes.isEmpty());
+	}
+
+	private MDMEntity buildEntity(String name, boolean valid) {
+		Value value = ValueType.INTEGER.create(name, 123);
+		value.setValid(valid);
+		Map<String, Value> map = new HashMap<>();
+		map.put(value.getName(), value);
+
+		MDMEntity entity = new MDMEntity("name", "", "1", map);
+		return entity;
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.openatfx/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.openatfx/.gitignore
new file mode 100644
index 0000000..7e12476
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.openatfx/.gitignore
@@ -0,0 +1,19 @@
+src/
+
+# eclipse
+.classpath
+.project
+.settings/
+bin/
+
+# gradle
+.gradle
+build/
+
+# intellij
+.idea/
+out/
+*.ipr
+*.iml
+*.iws
+/bin/
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.openatfx/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.openatfx/build.gradle
new file mode 100644
index 0000000..5568ded
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.openatfx/build.gradle
@@ -0,0 +1,76 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+plugins { 
+	id "de.undercouch.download" version "3.2.0"
+	id 'maven-publish'
+	id 'java-library'
+}
+
+import de.undercouch.gradle.tasks.download.Download
+
+def atfxVersion  = '0.7.4'
+description = 'Downloads openATFX and publishes it to the local maven repository'
+
+dependencies {
+	compile 'org.slf4j:jcl-over-slf4j:1.7.25'
+	compile 'org.slf4j:log4j-over-slf4j:1.7.25'
+	compile 'org.codehaus.woodstox:woodstox-core-asl:4.4.1'
+
+	// actually we just need the org.asam.ods.* classes
+	compile "org.eclipse.mdm:org.eclipse.mdm.api.odsadapter:${version}"
+	testCompile 'org.apache.commons:commons-math:2.2'
+}
+
+configurations.all {
+	// stax-api is included in Java 6 or higher
+	exclude group: 'javax.xml.stream', module: 'stax-api'
+}
+
+jar {
+    manifest {
+        attributes(
+            'Implementation-Title'   : 'openATFX',
+            'Implementation-Version' : atfxVersion,
+            'Implementation-URL'     : 'https://sourceforge.net/projects/openatfx'
+        )
+    }
+}
+
+task downloadOpenATFX(type: Download) {
+	acceptAnyCertificate true
+	overwrite false
+	// use mirror subdomain of 'https://sourceforge.net/projects/openatfx/files/openatfx-${atfxVersion}-jars.zip/download'
+	// because gradle has problems establishing a ssl connection with sourceforge directly
+	src "https://liquidtelecom.dl.sourceforge.net/project/openatfx/openatfx-${atfxVersion}-jars.zip"
+	dest file("${buildDir}/openatfx-${atfxVersion}-jars.zip")
+	outputs.file dest
+}
+
+task unzipOpenATFX(dependsOn: downloadOpenATFX, type: Copy) {
+	from zipTree(downloadOpenATFX.dest)
+	into buildDir
+	outputs.dir file("${buildDir}/openatfx-${atfxVersion}")
+}
+
+task copySource(dependsOn: unzipOpenATFX, type: Copy) {
+	from file("${buildDir}/openatfx-${atfxVersion}/src")
+	into 'src'
+}
+
+compileJava.dependsOn copySource
+/**
+ * Some tests in openATFX throw NPEs when executed with the ODS Corba classes generated
+ * by SunORB. The issue occurs, if an attribute is left uninitialized and then serialized.
+ */
+tasks.withType(Test) {enabled = false}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/.gitignore
new file mode 100644
index 0000000..1375395
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/.gitignore
@@ -0,0 +1 @@
+/derby.log
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/build.gradle
new file mode 100644
index 0000000..a78f130
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/build.gradle
@@ -0,0 +1,74 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+description = 'MDM preference service'
+
+apply plugin: 'java'
+apply plugin: 'maven'
+apply plugin: 'eclipse'
+apply plugin: 'io.github.divinespear.jpa-schema-generate'
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+repositories {
+	mavenLocal()
+	jcenter()
+	mavenCentral()
+}
+
+dependencies {
+	runtime  'org.glassfish.jersey.containers:jersey-container-servlet:2.23.2'
+	compile  'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.9.2'
+	compile 'com.google.guava:guava:25.0-jre'
+	compileOnly  'javax:javaee-api:7.0'
+
+    compile project(':org.eclipse.mdm.freetextindexer')
+	compile project(':org.eclipse.mdm.property')
+
+	testCompile  'org.eclipse.persistence:eclipselink:2.6.4'
+	testCompile 'junit:junit:4.12'
+	testCompile 'org.assertj:assertj-core:3.6.1'
+	testRuntime 'org.apache.derby:derby:10.13.1.1'
+}
+
+generateSchema {
+	vendor = "eclipselink"
+	packageToScan = [
+		"org.eclipse.mdm"
+	]
+	scriptAction = "drop-and-create"
+	targets {
+		postgres {
+			databaseProductName = "PostgreSQL"
+			databaseMajorVersion = 9
+			databaseMinorVersion = 0
+		}
+		derby { databaseProductName = "Apache Derby" }
+	}
+}
+
+buildscript {
+	repositories {
+		mavenCentral()
+		maven { url "https://plugins.gradle.org/m2/" }
+	}
+	dependencies { classpath 'gradle.plugin.io.github.divinespear:jpa-schema-gradle-plugin:0.3.2' }
+}
+
+jar {
+	metaInf { from '../NOTICE.txt' }
+	metaInf { from '../LICENSE.txt' }
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/boundary/PreferenceResource.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/boundary/PreferenceResource.java
new file mode 100644
index 0000000..63fb7a1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/boundary/PreferenceResource.java
@@ -0,0 +1,146 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.preferences.boundary;
+
+import java.util.List;
+
+import javax.ejb.EJB;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.eclipse.mdm.preferences.controller.PreferenceService;
+import org.eclipse.mdm.preferences.entity.PreferenceList;
+import org.eclipse.mdm.preferences.entity.PreferenceMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH
+ *
+ */
+@Tag(name = "Preferences")
+@Path("/preferences")
+public class PreferenceResource {
+
+	private static final Logger LOG = LoggerFactory.getLogger(PreferenceResource.class);
+
+	@EJB
+	private PreferenceService preferenceService;
+
+	/**
+	 * delegates the request to the {@link PreferenceService}
+	 * 
+	 * @param scope filter by scope, empty loads all
+	 * @param key   filter by key, empty loads all
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getPreference(@QueryParam("scope") String scope, @QueryParam("key") String key) {
+
+		try {
+			List<PreferenceMessage> config = this.preferenceService.getPreferences(scope, key);
+			return toResponse(new PreferenceList(config), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link PreferenceService}
+	 * 
+	 * @param source filter by source
+	 * @param key    filter by key, empty loads all
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@GET
+	@Path("/source")
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getPreferenceBySource(@QueryParam("source") String source, @QueryParam("key") String key) {
+
+		try {
+			List<PreferenceMessage> config = this.preferenceService.getPreferencesBySource(source, key);
+			return toResponse(new PreferenceList(config), Status.OK);
+
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link PreferenceService}
+	 * 
+	 * @param preference Configuration to save
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@PUT
+	@Consumes(MediaType.APPLICATION_JSON)
+	public Response setPreference(PreferenceMessage preference) {
+
+		try {
+			return toResponse(this.preferenceService.save(preference), Status.CREATED);
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * delegates the request to the {@link PreferenceService}
+	 * 
+	 * @param preference Configuration to delete
+	 * @return the result of the delegated request as {@link Response}
+	 */
+	@DELETE
+	@Path("/{ID}")
+	public Response deletePreference(@PathParam("ID") Long id) {
+
+		try {
+			return toResponse(this.preferenceService.deletePreference(id), Status.OK);
+		} catch (RuntimeException e) {
+			LOG.error(e.getMessage(), e);
+			throw new WebApplicationException(e.getMessage(), e, Status.INTERNAL_SERVER_ERROR);
+		}
+	}
+
+	/**
+	 * converts the given object to a {@link Response} with the given {@link Status}
+	 *
+	 * @param responseEntry object to convert
+	 * @param status        {@link Status} of the {@link Response}
+	 * @return the created {@link Response}
+	 */
+	private Response toResponse(Object response, Status status) {
+		GenericEntity<Object> genEntity = new GenericEntity<>(response, response.getClass());
+		return Response.status(status).entity(genEntity).type(MediaType.APPLICATION_JSON).build();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/controller/PreferenceException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/controller/PreferenceException.java
new file mode 100644
index 0000000..a587387
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/controller/PreferenceException.java
@@ -0,0 +1,14 @@
+package org.eclipse.mdm.preferences.controller;

+

+public class PreferenceException extends RuntimeException {

+

+	private static final long serialVersionUID = -4350425959578840884L;

+

+	public PreferenceException(String message) {

+		super(message);

+	}

+

+	public PreferenceException(String message, Throwable t) {

+		super(message, t);

+	}

+}

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/controller/PreferenceService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/controller/PreferenceService.java
new file mode 100644
index 0000000..59f5b6e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/controller/PreferenceService.java
@@ -0,0 +1,247 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.preferences.controller;
+
+import java.security.Principal;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+import javax.ejb.SessionContext;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+
+import org.eclipse.mdm.preferences.entity.Preference;
+import org.eclipse.mdm.preferences.entity.PreferenceMessage;
+import org.eclipse.mdm.preferences.entity.PreferenceMessage.Scope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+
+/**
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH
+ *
+ */
+@Stateless
+public class PreferenceService {
+	private static final Logger LOG = LoggerFactory.getLogger(PreferenceService.class);
+
+	private static final String ADMIN_ROLE = "Admin";
+
+	@PersistenceContext(unitName = "openMDM")
+	private EntityManager em;
+
+	@Resource
+	private SessionContext sessionContext;
+
+	public PreferenceService() {
+		// public no-arg constructor
+	}
+
+	/**
+	 * Constructor for unit tests
+	 * 
+	 * @param em             EntityManager to use
+	 * @param sessionContext sessionManager to use
+	 */
+	PreferenceService(EntityManager em, SessionContext sessionContext) {
+		this.em = em;
+		this.sessionContext = sessionContext;
+	}
+
+	public List<PreferenceMessage> getPreferences(String scope, String key) {
+
+		TypedQuery<Preference> query;
+		if (scope == null || scope.trim().isEmpty()) {
+			query = em.createQuery(
+					"select p from Preference p where (p.user is null or p.user = :user) and LOWER(p.key) like :key",
+					Preference.class).setParameter("user", sessionContext.getCallerPrincipal().getName())
+					.setParameter("key", key.toLowerCase() + "%");
+		} else {
+			query = em.createQuery(buildQuery(scope, key), Preference.class);
+
+			if (key != null && !key.trim().isEmpty()) {
+				query.setParameter("key", key.toLowerCase() + "%");
+			}
+		}
+
+		return query.getResultList().stream().map(this::convert).collect(Collectors.toList());
+	}
+
+	public List<PreferenceMessage> getPreferencesBySource(String source, String key) {
+		TypedQuery<Preference> query;
+
+		if (key == null || key.trim().isEmpty()) {
+			query = em.createQuery("select p from Preference p where p.source = :source", Preference.class)
+					.setParameter("source", Strings.emptyToNull(source));
+
+		} else {
+			query = em
+					.createQuery("select p from Preference p where p.source = :source and p.key = :key",
+							Preference.class)
+					.setParameter("source", Strings.emptyToNull(source)).setParameter("key", Strings.emptyToNull(key));
+		}
+		return query.getResultList().stream().map(this::convert).collect(Collectors.toList());
+	}
+
+	public PreferenceMessage save(PreferenceMessage preference) {
+		Principal principal = sessionContext.getCallerPrincipal();
+		List<Preference> existingPrefs = getExistingPreference(preference, principal);
+
+		Preference pe;
+
+		if (existingPrefs.isEmpty()) {
+			pe = convert(preference);
+		} else {
+			if (existingPrefs.size() > 1) {
+				LOG.warn(
+						"Found multiple entries for preference with scope={}, source={}, user={}, key={} where one entry was expected!",
+						preference.getScope(), preference.getSource(), preference.getUser(), preference.getKey());
+			}
+			pe = existingPrefs.get(0);
+			pe.setValue(preference.getValue());
+		}
+		if (isAllowed(pe)) {
+			em.persist(pe);
+			em.flush();
+			return convert(pe);
+		} else {
+			throw new PreferenceException(
+					"Only users with role " + ADMIN_ROLE
+							+ " are allowed to save Preferences outside of the USER scope!");
+		}
+
+	}
+
+	public PreferenceMessage deletePreference(Long id) {
+
+		Preference preference = em.find(Preference.class, id);
+
+		if (isAllowed(preference)) {
+			em.remove(preference);
+			em.flush();
+			return convert(preference);
+		} else {
+			throw new PreferenceException("Only users with role " + ADMIN_ROLE + " are allowed to delete Preference!");
+		}
+	}
+
+	private boolean isAllowed(Preference preference) {
+		return sessionContext.isCallerInRole(ADMIN_ROLE)
+				|| (preference.getUser() != null
+						&& preference.getUser().equalsIgnoreCase(sessionContext.getCallerPrincipal().getName()));
+	}
+
+	private PreferenceMessage convert(Preference pe) {
+		PreferenceMessage p = new PreferenceMessage();
+		p.setKey(pe.getKey());
+		p.setValue(pe.getValue());
+		p.setId(pe.getId());
+
+		if (pe.getUser() == null && pe.getSource() == null) {
+			p.setSource(pe.getSource());
+			p.setScope(Scope.SYSTEM);
+		} else if (pe.getUser() != null) {
+			p.setUser(pe.getUser());
+			p.setScope(Scope.USER);
+		} else if (pe.getSource() != null) {
+			p.setSource(pe.getSource());
+			p.setScope(Scope.SOURCE);
+		}
+
+		return p;
+	}
+
+	private Preference convert(PreferenceMessage p) {
+		Principal principal = sessionContext.getCallerPrincipal();
+
+		Preference pe = new Preference();
+		pe.setKey(p.getKey());
+		pe.setValue(p.getValue());
+		pe.setId(p.getId());
+
+		switch (p.getScope()) {
+		case SOURCE:
+			pe.setSource(p.getSource());
+			break;
+		case USER:
+			pe.setUser(principal.getName());
+			break;
+		case SYSTEM:
+		default:
+			break;
+		}
+		return pe;
+	}
+
+	private String buildQuery(String scope, String key) {
+		String query = "select p from Preference p";
+		String whereOrAnd = " where";
+		if (scope != null && scope.trim().length() > 0) {
+			switch (scope.toLowerCase()) {
+			case "system":
+				query = query.concat(whereOrAnd).concat(" p.source is null and p.user is null");
+				break;
+			case "source":
+				query = query.concat(whereOrAnd).concat(" p.source is not null and p.user is null");
+				break;
+			case "user":
+				query = query.concat(whereOrAnd).concat(" p.source is null and p.user is not null");
+				break;
+			default:
+			}
+			whereOrAnd = " and";
+		}
+		if (key != null && key.trim().length() > 0) {
+			query = query.concat(whereOrAnd).concat(" LOWER(p.key) LIKE :key");
+		}
+		return query;
+	}
+
+	private List<Preference> getExistingPreference(PreferenceMessage preference, Principal principal) {
+		Preconditions.checkNotNull(preference.getScope(), "Scope cannot be null!");
+
+		if (preference.getId() == null) {
+			switch (preference.getScope()) {
+			case USER:
+				return em
+						.createQuery(
+								"select p from Preference p where p.source is null and p.user = :user and p.key = :key",
+								Preference.class)
+						.setParameter("user", Strings.emptyToNull(principal.getName()))
+						.setParameter("key", preference.getKey()).getResultList();
+			case SOURCE:
+				return em.createQuery(
+						"select p from Preference p where p.source = :source and p.user is null and p.key = :key",
+						Preference.class).setParameter("source", Strings.emptyToNull(preference.getSource()))
+						.setParameter("key", preference.getKey()).getResultList();
+			case SYSTEM:
+				return em.createQuery(
+						"select p from Preference p where p.source is null and p.user is null and p.key = :key",
+						Preference.class).setParameter("key", preference.getKey()).getResultList();
+			default:
+				throw new IllegalArgumentException("Unknown Scope!");
+			}
+		} else {
+			return Arrays.asList(em.find(Preference.class, preference.getId()));
+		}
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/Preference.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/Preference.java
new file mode 100644
index 0000000..1529cf7
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/Preference.java
@@ -0,0 +1,135 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.preferences.entity;
+
+import java.util.Objects;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH
+ *
+ */
+@Entity
+@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "source", "username", "keyCol" }) })
+public class Preference {
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Long id;
+
+	@Column
+	private String source;
+
+	@Column(name = "username")
+	private String user;
+
+	@Column(name = "keyCol")
+	private String key;
+
+	@Column(name = "valueCol", nullable = false)
+	@Lob
+	private String value;
+
+	public Preference() {
+		super();
+	}
+
+	public Preference(String source, String user, String key, String value) {
+		super();
+		this.source = source;
+		this.user = user;
+		this.key = key;
+		this.value = value;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public String getUser() {
+		return user;
+	}
+
+	public void setUser(String user) {
+		this.user = user;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+
+		final Preference other = (Preference) obj;
+		return Objects.equals(this.id, other.id) && Objects.equals(this.source, other.source)
+				&& Objects.equals(this.user, other.user) && Objects.equals(this.key, other.key)
+				&& Objects.equals(this.value, other.value);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(id, source, user, key, value);
+	}
+
+	@Override
+	public String toString() {
+		return MoreObjects.toStringHelper(Preference.class).add("id", id).add("source", source).add("user", user)
+				.add("key", key).add("value", value).toString();
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/PreferenceList.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/PreferenceList.java
new file mode 100644
index 0000000..97ebf93
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/PreferenceList.java
@@ -0,0 +1,69 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.preferences.entity;
+
+import java.util.List;
+import java.util.Objects;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class PreferenceList {
+
+	private List<PreferenceMessage> preferences;
+
+	public PreferenceList(List<PreferenceMessage> preferenceList) {
+		preferences = preferenceList;
+	}
+
+	public List<PreferenceMessage> getPreferences() {
+		return preferences;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+
+		final PreferenceList other = (PreferenceList) obj;
+
+		return Objects.equals(this.preferences, other.preferences);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(preferences);
+	}
+
+	@Override
+	public String toString() {
+		return MoreObjects.toStringHelper(PreferenceList.class).add("preferences", preferences).toString();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/PreferenceMessage.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/PreferenceMessage.java
new file mode 100644
index 0000000..c28700d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/java/org/eclipse/mdm/preferences/entity/PreferenceMessage.java
@@ -0,0 +1,116 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.preferences.entity;
+
+import java.util.Objects;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 
+ * @author Johannes Stamm, Peak Solution GmbH
+ *
+ */
+@XmlRootElement(name = "preference")
+public class PreferenceMessage {
+
+	public enum Scope {
+		SYSTEM, SOURCE, USER;
+	}
+
+	private Scope scope;
+	private String source;
+	private String user;
+	private String key;
+	private String value;
+	private Long id;
+
+	public Scope getScope() {
+		return scope;
+	}
+
+	public void setScope(Scope scope) {
+		this.scope = scope;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public String getUser() {
+		return user;
+	}
+
+	public void setUser(String user) {
+		this.user = user;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+
+		final PreferenceMessage other = (PreferenceMessage) obj;
+		return Objects.equals(this.id, other.id) && Objects.equals(this.scope, other.scope)
+				&& Objects.equals(this.source, other.source) && Objects.equals(this.user, other.user)
+				&& Objects.equals(this.key, other.key) && Objects.equals(this.value, other.value);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(id, scope, source, user, key, value);
+	}
+
+	@Override
+	public String toString() {
+		return MoreObjects.toStringHelper(PreferenceMessage.class).add("id", id).add("scope", scope)
+				.add("source", source).add("user", user).add("key", key).add("value", value).toString();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/resources/META-INF/persistence.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..3f709eb
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!-- 
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+ -->
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+	version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+	<persistence-unit name="openMDM" transaction-type="JTA">
+		<jta-data-source>jdbc/openMDM</jta-data-source>
+		<class>org.eclipse.mdm.preferences.entity.Preference</class>
+		<class>org.eclipse.mdm.freetextindexer.entities.SystemProcess</class>
+		<properties>
+			<property name="eclipselink.logging.logger" value="ServerLogger" />
+			<property name="eclipselink.logging.level" value="INFO" />
+			<property name="eclipselink.ddl-generation" value="none" />
+			<!-- surpresses a NPE: see https://markmail.org/message/kdmqhgywxswokckm -->
+			<property name="eclipselink.target-server" value="org.eclipse.persistence.platform.server.glassfish.GlassfishPlatform"/>
+		</properties>
+	</persistence-unit>
+</persistence>	
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/sql/derby/5.1.0M1_update.sql b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/sql/derby/5.1.0M1_update.sql
new file mode 100644
index 0000000..2af00f9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/sql/derby/5.1.0M1_update.sql
@@ -0,0 +1 @@
+CREATE TABLE system_process (ID BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, process_id VARCHAR(255), process_key VARCHAR(255), last_locked BIGINT, PRIMARY KEY (ID));

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/sql/postgres/5.1.0M1_update.sql b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/sql/postgres/5.1.0M1_update.sql
new file mode 100644
index 0000000..5b71051
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/main/sql/postgres/5.1.0M1_update.sql
@@ -0,0 +1 @@
+CREATE TABLE system_process (ID  SERIAL NOT NULL, process_id VARCHAR(255), process_key VARCHAR(255), last_locked BIGINT, PRIMARY KEY (ID));

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/java/org/eclipse/mdm/preferences/controller/PreferenceServiceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/java/org/eclipse/mdm/preferences/controller/PreferenceServiceTest.java
new file mode 100644
index 0000000..3575f12
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/java/org/eclipse/mdm/preferences/controller/PreferenceServiceTest.java
@@ -0,0 +1,328 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.preferences.controller;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.security.Principal;
+import java.util.List;
+
+import javax.ejb.SessionContext;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.assertj.core.groups.Tuple;
+import org.eclipse.mdm.preferences.entity.Preference;
+import org.eclipse.mdm.preferences.entity.PreferenceMessage;
+import org.eclipse.mdm.preferences.entity.PreferenceMessage.Scope;
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import com.google.common.collect.ImmutableMap;
+
+public class PreferenceServiceTest {
+	private EntityManagerFactory factory;
+	private EntityManager em;
+	private SessionContext sessionContext = mock(SessionContext.class);
+	private PreferenceService service;
+
+	@Before
+	public void init() {
+		factory = Persistence.createEntityManagerFactory("preferenceTest", ImmutableMap
+				.of(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistence-test.xml"));
+
+		em = factory.createEntityManager();
+
+		Principal principal = mock(Principal.class);
+		when(principal.getName()).thenReturn("testUser");
+		when(sessionContext.getCallerPrincipal()).thenReturn(principal);
+		when(sessionContext.isCallerInRole(Mockito.anyString())).thenReturn(true);
+		service = new PreferenceService(em, sessionContext);
+	}
+
+	@After
+	public void destroy() {
+		factory.close();
+	}
+
+	private void initData(Preference... preferences) {
+		EntityManager emgr = factory.createEntityManager();
+		emgr.getTransaction().begin();
+		emgr.createQuery("delete from Preference").executeUpdate();
+		for (Preference p : preferences) {
+			emgr.persist(p);
+		}
+
+		emgr.getTransaction().commit();
+		emgr.close();
+	}
+
+	@Test
+	public void testGetPreferences() {
+		initData(new Preference(null, null, "testGetPreferences", "myValue1"),
+				new Preference("MDMTEST", null, "testGetPreferences", "myValue2"),
+				new Preference(null, "testUser", "testGetPreferences", "myValue3"),
+				new Preference(null, "otherUser", "testGetPreferences", "myValue4"),
+				new Preference(null, null, "otherKey", "myValue5"));
+
+		assertThat(service.getPreferences(null, "testGetPreferences"))
+				.extracting("scope", "source", "user", "key", "value")
+				.containsExactlyInAnyOrder(new Tuple(Scope.SYSTEM, null, null, "testGetPreferences", "myValue1"),
+						new Tuple(Scope.SOURCE, "MDMTEST", null, "testGetPreferences", "myValue2"),
+						new Tuple(Scope.USER, null, "testUser", "testGetPreferences", "myValue3"));
+	}
+
+	@Test
+	public void testGetPreferencesForSystem() {
+		initData(new Preference(null, null, "testGetPreferencesSystem", "myValue"),
+				new Preference("MDMTEST", null, "testGetPreferencesSystem", "myValue"));
+
+		assertThat(service.getPreferences("system", "testGetPreferencesSystem"))
+				.extracting("scope", "source", "user", "key", "value")
+				.containsExactly(new Tuple(Scope.SYSTEM, null, null, "testGetPreferencesSystem", "myValue"));
+	}
+
+	@Test
+	public void testGetPreferencesForSource() {
+		initData(new Preference(null, "testUser", "testGetPreferencesForSource", "myValue"),
+				new Preference("MDM_OTHER", null, "testGetPreferencesForSource", "myValue"),
+				new Preference("MDMTEST", null, "testGetPreferencesForSource", "myValue"));
+
+		assertThat(service.getPreferences("source", "testGetPreferencesForSource"))
+				.extracting("scope", "source", "user", "key", "value").containsExactlyInAnyOrder(
+						new Tuple(Scope.SOURCE, "MDM_OTHER", null, "testGetPreferencesForSource", "myValue"),
+						new Tuple(Scope.SOURCE, "MDMTEST", null, "testGetPreferencesForSource", "myValue"));
+	}
+
+	@Test
+	public void testGetPreferencesForUser() {
+		initData(new Preference(null, "other", "testGetPreferencesForUser", "myValue"),
+				new Preference(null, "testUser", "testGetPreferencesForUser", "myValue"),
+				new Preference("MDMTEST", null, "testGetPreferencesForUser", "myValue"));
+
+		assertThat(service.getPreferences("user", "testGetPreferencesForUser"))
+				.extracting("scope", "source", "user", "key", "value")
+				.containsExactly(new Tuple(Scope.USER, null, "other", "testGetPreferencesForUser", "myValue"),
+						new Tuple(Scope.USER, null, "testUser", "testGetPreferencesForUser", "myValue"));
+	}
+
+	@Test
+	public void testGetPreferencesBySource() {
+		initData(new Preference("MDMTEST", null, "testGetPreferencesSource", "myValue"),
+				new Preference("MDM_OTHER", null, "testGetPreferencesSource", "myValue"));
+
+		assertThat(service.getPreferencesBySource("MDMTEST", "testGetPreferencesSource")).hasSize(1)
+				.extracting("scope", "source", "user", "key", "value")
+				.containsExactly(new Tuple(Scope.SOURCE, "MDMTEST", null, "testGetPreferencesSource", "myValue"));
+	}
+
+	@Test
+	public void testGetPreferencesBySourceKeyEmpty() {
+		initData(new Preference("MDMTEST", null, "testGetPreferencesSourceKeyEmpty", "myValue"),
+				new Preference("MDM_OTHER", null, "testGetPreferencesSourceKeyEmpty", "myValue"));
+
+		assertThat(service.getPreferencesBySource("MDMTEST", "")).hasSize(1)
+				.extracting("scope", "source", "user", "key", "value").containsExactly(
+						new Tuple(Scope.SOURCE, "MDMTEST", null, "testGetPreferencesSourceKeyEmpty", "myValue"));
+	}
+
+	@Test
+	public void testAdminCanDeletePreferenceInScopeSystem() {
+		String prefName = "testAdminCanDeletePreference";
+		initData(new Preference(null, null, prefName, "myValue"));
+		when(sessionContext.isCallerInRole(Mockito.eq("Admin"))).thenReturn(true);
+
+		List<PreferenceMessage> listBeforeDelete = service.getPreferences("system", prefName);
+		assertThat(listBeforeDelete).hasSize(1);
+
+		em.getTransaction().begin();
+		service.deletePreference(listBeforeDelete.get(0).getId());
+		em.getTransaction().commit();
+
+		assertThat(service.getPreferences("system", prefName)).hasSize(0);
+	}
+
+	@Test
+	public void testOtherRolesCanNotDeletePreferenceInScopeSystem() {
+		String prefName = "testOtherUsersCanNotDeletePreferenceInScopeSystem";
+		initData(new Preference(null, null, prefName, "myValue"));
+		when(sessionContext.isCallerInRole(Mockito.eq("Admin"))).thenReturn(false);
+
+		List<PreferenceMessage> listBeforeDelete = service.getPreferences("system",
+				prefName);
+		assertThat(listBeforeDelete).hasSize(1);
+
+		try {
+			em.getTransaction().begin();
+			assertThatThrownBy(() -> service.deletePreference(listBeforeDelete.get(0).getId()))
+					.hasMessage("Only users with role Admin are allowed to delete Preference!");
+		} finally {
+			em.getTransaction().rollback();
+		}
+	}
+
+	@Test
+	public void testNonAdminCanDeleteOwnPreferenceInUserScope() {
+		String prefName = "testUserCanDeleteOwnPreferenceInUserScope";
+		initData(new Preference(null, "testUser", prefName, "myValue"));
+		when(sessionContext.isCallerInRole(Mockito.eq("Admin"))).thenReturn(false);
+
+		List<PreferenceMessage> listBeforeDelete = service.getPreferences("user", prefName);
+		assertThat(listBeforeDelete).hasSize(1);
+
+		em.getTransaction().begin();
+		service.deletePreference(listBeforeDelete.get(0).getId());
+		em.getTransaction().commit();
+
+		assertThat(service.getPreferences("user", prefName)).hasSize(0);
+	}
+
+	@Test
+	public void testNonAdminCanNotDeleteOtherPreferenceInUserScope() {
+		String prefName = "testNonAdminCanNotDeleteOtherPreferenceInUserScope";
+		initData(new Preference(null, "otherUser", prefName, "myValue"));
+		when(sessionContext.isCallerInRole(Mockito.eq("Admin"))).thenReturn(true);
+
+		List<PreferenceMessage> listBeforeDelete = service.getPreferences("user", prefName);
+		assertThat(listBeforeDelete).hasSize(1);
+		when(sessionContext.isCallerInRole(Mockito.eq("Admin"))).thenReturn(false);
+
+		try {
+			em.getTransaction().begin();
+			assertThatThrownBy(() -> service.deletePreference(listBeforeDelete.get(0).getId()))
+					.hasMessage("Only users with role Admin are allowed to delete Preference!");
+		} finally {
+			em.getTransaction().rollback();
+		}
+	}
+
+	@Test
+	public void testSaveSystemScope() {
+		PreferenceMessage pref = new PreferenceMessage();
+		pref.setScope(Scope.SYSTEM);
+		pref.setKey("testSaveSystemScope");
+		pref.setValue("myValue");
+
+		em.getTransaction().begin();
+		PreferenceMessage saved = service.save(pref);
+		em.getTransaction().commit();
+
+		assertThat(saved).hasNoNullFieldsOrPropertiesExcept("source", "user")
+				.hasFieldOrPropertyWithValue("scope", Scope.SYSTEM)
+				.hasFieldOrPropertyWithValue("key", "testSaveSystemScope")
+				.hasFieldOrPropertyWithValue("value", "myValue");
+	}
+
+	@Test
+	public void testNonAdminCannotSaveSystemScope() {
+		when(sessionContext.isCallerInRole(Mockito.eq("Admin"))).thenReturn(false);
+
+		PreferenceMessage pref = new PreferenceMessage();
+		pref.setScope(Scope.SYSTEM);
+		pref.setKey("testNonAdminCannotSaveSystemScope");
+		pref.setValue("myValue");
+
+		try {
+			em.getTransaction().begin();
+			assertThatThrownBy(() -> service.save(pref))
+					.hasMessage(
+							"Only users with role Admin are allowed to save Preferences outside of the USER scope!");
+		} finally {
+			em.getTransaction().rollback();
+		}
+	}
+
+	@Test
+	public void testSaveSourceScope() {
+		PreferenceMessage pref = new PreferenceMessage();
+		pref.setScope(Scope.SOURCE);
+		pref.setSource("MDMTEST");
+		pref.setKey("testSaveSourceScope");
+		pref.setValue("myValue");
+
+		em.getTransaction().begin();
+		PreferenceMessage saved = service.save(pref);
+		em.getTransaction().commit();
+
+		assertThat(saved).hasNoNullFieldsOrPropertiesExcept("user").hasFieldOrPropertyWithValue("scope", Scope.SOURCE)
+				.hasFieldOrPropertyWithValue("source", "MDMTEST")
+				.hasFieldOrPropertyWithValue("key", "testSaveSourceScope")
+				.hasFieldOrPropertyWithValue("value", "myValue");
+	}
+
+	@Test
+	public void testNonAdminCannotSaveSourceScope() {
+		when(sessionContext.isCallerInRole(Mockito.eq("Admin"))).thenReturn(false);
+
+		PreferenceMessage pref = new PreferenceMessage();
+		pref.setScope(Scope.SOURCE);
+		pref.setSource("MDMTEST");
+		pref.setKey("testNonAdminCannotSaveSystemScope");
+		pref.setValue("myValue");
+
+		try {
+			em.getTransaction().begin();
+			assertThatThrownBy(() -> service.save(pref))
+					.hasMessage(
+							"Only users with role Admin are allowed to save Preferences outside of the USER scope!");
+		} finally {
+			em.getTransaction().rollback();
+		}
+	}
+
+	@Test
+	public void testSaveUserScope() {
+		PreferenceMessage pref = new PreferenceMessage();
+		pref.setScope(Scope.USER);
+		pref.setKey("testSaveUserScope");
+		pref.setValue("myValue");
+
+		em.getTransaction().begin();
+		PreferenceMessage saved = service.save(pref);
+		em.getTransaction().commit();
+
+		assertThat(saved).hasNoNullFieldsOrPropertiesExcept("source").hasFieldOrPropertyWithValue("scope", Scope.USER)
+				.hasFieldOrPropertyWithValue("user", "testUser").hasFieldOrPropertyWithValue("key", "testSaveUserScope")
+				.hasFieldOrPropertyWithValue("value", "myValue");
+	}
+
+	@Test
+	public void testSaveOverrideExisting() {
+		initData(new Preference(null, null, "testSaveOverrideExisting", "myValue"));
+
+		PreferenceMessage pref = new PreferenceMessage();
+		pref.setScope(Scope.SYSTEM);
+		pref.setKey("testSaveOverrideExisting");
+		pref.setValue("myValue");
+
+		em.getTransaction().begin();
+		PreferenceMessage saved = service.save(pref);
+		em.getTransaction().commit();
+
+		assertThat(saved).hasNoNullFieldsOrPropertiesExcept("source", "user")
+				.hasFieldOrPropertyWithValue("scope", Scope.SYSTEM)
+				.hasFieldOrPropertyWithValue("key", "testSaveOverrideExisting")
+				.hasFieldOrPropertyWithValue("value", "myValue");
+
+		assertThat(service.getPreferences("System", "testSaveOverrideExisting")).hasSize(1);
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/java/org/eclipse/mdm/preferences/entity/PreferenceTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/java/org/eclipse/mdm/preferences/entity/PreferenceTest.java
new file mode 100644
index 0000000..c4fb22e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/java/org/eclipse/mdm/preferences/entity/PreferenceTest.java
@@ -0,0 +1,121 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.preferences.entity;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.TypedQuery;
+
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+public class PreferenceTest {
+	private static final long CLOB_SIZE = 1_000_000;
+
+	private EntityManagerFactory factory;
+
+	@Before
+	public void init() {
+		factory = Persistence.createEntityManagerFactory("preferenceTest", ImmutableMap
+				.of(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistence-test.xml"));
+
+		EntityManager em = factory.createEntityManager();
+		em.getTransaction().begin();
+		em.createQuery("delete from Preference").executeUpdate();
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	@After
+	public void destroy() {
+		factory.close();
+	}
+
+	@Test
+	public void testPersist() {
+
+		EntityManager em = factory.createEntityManager();
+
+		em.getTransaction().begin();
+		Preference p = new Preference("MDMXYZ", "*", "key1", "value1");
+		em.persist(p);
+		em.getTransaction().commit();
+	}
+
+	@Test
+	public void testLoad() {
+		EntityManager em = factory.createEntityManager();
+
+		em.getTransaction().begin();
+		Preference p = new Preference("MDMXYZ", "*", "key2", "value1");
+		em.persist(p);
+		em.getTransaction().commit();
+
+		assertThat(em.find(Preference.class, p.getId()))
+				.isEqualToIgnoringGivenFields(new Preference("MDMXYZ", "*", "key2", "value1"), "id");
+
+		em.close();
+	}
+
+	@Test
+	public void testQuery() {
+		EntityManager em = factory.createEntityManager();
+
+		em.getTransaction().begin();
+		Preference p = new Preference("MDMXYZ", "*", "key3", "value1");
+		em.persist(p);
+		em.getTransaction().commit();
+
+		TypedQuery<Preference> q = em.createQuery("select p from Preference p", Preference.class);
+		assertThat(q.getResultList()).hasSize(1).usingElementComparatorIgnoringFields("id")
+				.contains(new Preference("MDMXYZ", "*", "key3", "value1"));
+
+		em.close();
+	}
+
+	@Test
+	public void testPersistLob() {
+		String longString = generateString(CLOB_SIZE);
+
+		EntityManager em = factory.createEntityManager();
+
+		em.getTransaction().begin();
+		Preference p = new Preference("MDMXYZ", "*", "clob", longString);
+		em.persist(p);
+		em.getTransaction().commit();
+		em.close();
+
+		em = factory.createEntityManager();
+		Preference loaded = em.find(Preference.class, p.getId());
+
+		assertThat(loaded).isEqualToIgnoringGivenFields(new Preference("MDMXYZ", "*", "clob", longString), "id");
+		em.close();
+	}
+
+	private String generateString(long length) {
+		StringBuilder builder = new StringBuilder();
+		for (int i = 0; i < length; i++) {
+			builder.append("a");
+		}
+		return builder.toString();
+	}
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/resources/META-INF/persistence-test.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/resources/META-INF/persistence-test.xml
new file mode 100644
index 0000000..78e431d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.preferences/src/test/resources/META-INF/persistence-test.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!-- 
+/********************************************************************************

+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

+ *

+ * See the NOTICE file(s) distributed with this work for additional

+ * information regarding copyright ownership.

+ *

+ * This program and the accompanying materials are made available under the

+ * terms of the Eclipse Public License v. 2.0 which is available at

+ * http://www.eclipse.org/legal/epl-2.0.

+ *

+ * SPDX-License-Identifier: EPL-2.0

+ *

+ ********************************************************************************/

+
+ -->
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+	version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+	<persistence-unit name="preferenceTest" transaction-type="RESOURCE_LOCAL">
+
+		<class>org.eclipse.mdm.preferences.entity.Preference</class>
+
+		<properties>
+			<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
+			<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myDB;create=true" />
+			<property name="javax.persistence.jdbc.user" value="EclipseJPAExample" />
+			<property name="javax.persistence.jdbc.password" value="EclipseJPAExample" />
+
+			<!-- EclipseLink should create the database schema automatically -->
+			<property name="eclipselink.ddl-generation" value="create-tables" />
+			<property name="eclipselink.ddl-generation.output-mode" value="database" />
+
+			<property name="eclipselink.logging.level.sql" value="FINER" />
+			<property name="eclipselink.logging.parameters" value="true" />
+		</properties>
+
+	</persistence-unit>
+</persistence>	
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/build.gradle
new file mode 100644
index 0000000..71cb33a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/build.gradle
@@ -0,0 +1,33 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+description = 'MDM property component'
+
+apply plugin: 'java'
+apply plugin: 'maven'
+apply plugin: 'eclipse'
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+
+repositories {
+	mavenLocal()
+	mavenCentral()
+}
+
+jar {
+	metaInf { from '../NOTICE.txt' }
+	metaInf { from '../LICENSE.txt' }
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/configuration/global.properties b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/configuration/global.properties
new file mode 100644
index 0000000..d069819
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/configuration/global.properties
@@ -0,0 +1,52 @@
+#----------------------------------

+#configuration for Freetext Search

+#----------------------------------

+

+# The URL is required to ask for search results and put documents to

+# The port 9200 is ElasticSearch's default port for the RESTful API

+elasticsearch.url = http://localhost:9200/

+

+# Specifies the maximum number of results per source returned by the query endpoint.

+businessobjects.query.maxresultspersource=1001

+

+

+# ------------------------------

+# configuration for freetextindexer

+# ------------------------------

+# Whether the FreetextSearch should be active or not (true|false). The default value is false.

+# If the parameter is set to false. It cannot be overwritten in the service.xml

+freetext.active=false

+

+# Defines the interval in seconds, in which a session check is performed, to test if the session is still valid. 

+# If the test fails, the freetext indexer tries to reconnect.

+freetext.sessionCheckInterval=60

+

+# All other parameters for freetextindexer can be overwritten by their datasource specific values from service.xml.

+# For avalon the nameservice and servicename of the ODS service is used.

+

+#Avalon: How often the server is polled for new notifications

+freetext.pollingInterval=5000

+

+#Peak: The URL where the notification service is running. 

+#If running multiple ODS servers this parameter should be overwritten in service.xml

+freetext.notificationUrl=http://localhost:8089/api

+

+#Peak: a name for the registration. This ensures that missed notifications are delivered

+#after reregistration 

+freetext.notificationName=someUniqueName

+

+# Specifies a URL to redirect after a logout. By default the logout redirects to the context path.

+#application.logoutRedirect=

+

+# ------------------------------

+# configuration for file release process (PAK2RAW and PAK2ATFX)

+# ------------------------------

+

+#filerelease.converter.raw.pakInputEntity=<ENTITY FOR PAK INPUT PATH FOR RAW CONVERTER>

+#filerelease.converter.raw.pakInputAttribute=<ATTRIBUTE FOR PAK INPUT PATH FOR RAW CONVERTER>

+#filerelease.converter.pak.pakInputEntity=<ENTITY FOR PAK INPUT PATH FOR ATFX CONVERTER>

+#filerelease.converter.pak.pakInputAttribute=<ATTRIBUTE FOR PAK INPUT PATH FOR ATFX CONVERTER>

+#filerelease.converter.pak.pakApplicationPath=<PATH TO PAK APPLICATION (EXE)>

+#filerelease.converter.pak.modelTypeEntity=<ENTITY FOR PAK MODEL DEFINITION FOR RAW CONVERTER>

+#filerelease.converter.pak.modelTypeAttribute=<ATTRIBUTE FOR PAK MODEL DEFINITION FOR RAW CONVERTER>

+#filerelease.converter.target.root.d
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/META-INF/MANIFEST.MF b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0

+Class-Path: 

+

diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalProperty.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalProperty.java
new file mode 100644
index 0000000..63fc040
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalProperty.java
@@ -0,0 +1,37 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.property;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+
+/**
+ * Qualifier for global properties.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
+public @interface GlobalProperty {
+	@Nonbinding
+	String value() default "";
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalPropertyException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalPropertyException.java
new file mode 100644
index 0000000..28bae70
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalPropertyException.java
@@ -0,0 +1,48 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.property;
+
+/**
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+public class GlobalPropertyException extends RuntimeException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 8975069381247044049L;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param error error message.
+	 */
+	public GlobalPropertyException(String error) {
+		super(error);
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param error error message
+	 * @param e     throwable
+	 */
+	public GlobalPropertyException(String error, Exception e) {
+		super(error, e);
+	}
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalPropertyService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalPropertyService.java
new file mode 100644
index 0000000..fd0324a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.property/src/main/java/org/eclipse/mdm/property/GlobalPropertyService.java
@@ -0,0 +1,118 @@
+/********************************************************************************
+ * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.property;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Producer for injectable properties.
+ * 
+ * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
+ *
+ */
+@ApplicationScoped
+public class GlobalPropertyService {
+
+	private static final Logger LOG = LoggerFactory.getLogger(GlobalPropertyService.class);
+
+	public static final String PROPERTY_CONFIG_PATH = "org.eclipse.mdm.configPath";
+	private static final String COMPONENT_CONFIG_FOLDER = "org.eclipse.mdm.property";
+	private static final String GLOBAL_PROPERTIES_FILENAME = "global.properties";
+
+	private Properties globalProperties = new Properties();
+
+	/**
+	 * Reads the properties from the configuration file.
+	 */
+	@PostConstruct
+	public void readProperties() {
+
+		try (InputStream in = getPropertyConfiguration()) {
+			this.globalProperties.load(in);
+		} catch (IOException e) {
+			LOG.error(e.getMessage(), e);
+			throw new GlobalPropertyException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Producer method for global properties.
+	 * 
+	 * @param ip The injection point.
+	 * @return The global property value.
+	 * @throws GlobalPropertyException Thrown if the property is not set.
+	 */
+	@Produces
+	@GlobalProperty
+	public String getGlobalPropertyValue(InjectionPoint ip) throws GlobalPropertyException {
+		GlobalProperty property = ip.getAnnotated().getAnnotation(GlobalProperty.class);
+		String propertyName = property.value();
+		if (!globalProperties.containsKey(propertyName)) {
+			LOG.warn("global property with name '{}' not found!", propertyName);
+			return "";
+		}
+		return globalProperties.getProperty(propertyName);
+	}
+
+	/**
+	 * Producer method for a global property map.
+	 * 
+	 * @param ip The injection point.
+	 * @return A map with the global properties
+	 */
+	@Produces
+	@GlobalProperty
+	public Map<String, String> getGlobalPropertyMap(InjectionPoint ip) {
+		Map<String, String> map = new HashMap<>();
+		for (String key : globalProperties.stringPropertyNames()) {
+			map.put(key, globalProperties.getProperty(key));
+		}
+		return map;
+	}
+
+	private static InputStream getPropertyConfiguration() throws FileNotFoundException {
+		String configRoot = System.getProperty(PROPERTY_CONFIG_PATH, ".");
+		LOG.info("found system property {} with value {}", PROPERTY_CONFIG_PATH, configRoot);
+
+		File componentConfigFolder = new File(configRoot, COMPONENT_CONFIG_FOLDER);
+		if (!componentConfigFolder.exists() || !componentConfigFolder.isDirectory()) {
+			throw new GlobalPropertyException("property configuration folder  at '"
+					+ componentConfigFolder.getAbsolutePath() + "' does not exist! No properties available!");
+		}
+		File globalConfigFile = new File(componentConfigFolder, GLOBAL_PROPERTIES_FILENAME);
+		if (!globalConfigFile.exists()) {
+			throw new GlobalPropertyException("property configuration file for global properties at '"
+					+ globalConfigFile.getAbsolutePath() + "' does not exist! no global properties available");
+		}
+
+		LOG.info("loading global properties from file: {}", globalConfigFile);
+		return new FileInputStream(globalConfigFile);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/release_notes.md b/org.eclipse.mdm.nucleus/release_notes.md
new file mode 100644
index 0000000..f130a45
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/release_notes.md
@@ -0,0 +1,587 @@
+# Release Notes - openMDM(R) Application #
+
+* [mdmbl Eclipse Project Page](https://projects.eclipse.org/projects/technology.mdmbl)
+* [mdmbl Eclipse Git Repositories](http://git.eclipse.org/c/?q=mdmbl)
+* [mdmbl nightly builds - last stable version](http://download.eclipse.org/mdmbl/nightly_master/?d)
+
+## Version 5.2.0M1
+
+New Features:
+* Upload/download file attachments to FileAttachables and context attributes
+* Show/edit context data based on MDM templates
+* ATFxAdapter supports model mapping via ExtSystem
+* XY-Chartviewer to view measurement data
+* Introduce user roles on the webclient
+
+### Breaking changes ###
+
+#### Changes to MDMRealm ####
+Up to version 5.1.0 all Users had to be assigned the group `MDM` to use openMDM.
+Since 5.2.0M1 users need one of the following groups: `Admin`, `DescriptiveDataAuthor`, `Guest`.
+See `org.eclipse.mdm.nuclues/readme.md#Configure LoginModule` for more information.
+
+#### Database schema changes ####
+In this release openMDM 5 database schema was extended. 
+If you have an existing installation make sure to apply the provided update script to your database.
+The script can be found in `schema/update/{DATABASE}/5.2.0M1_update.sql`.
+
+
+### API changes ###
+REST-API:
+* Tests, teststeps and measurements have new subresource files to upload, download, and delete files.
+* Teststep and measurement contexts have new subresource to upload, download, and delete files at component attributes.
+* New user resource to get information about the currently logged in user and its roles.
+
+org.eclipse.mdm.api.base:
+* New method: o.e.m.a.b.f.FileService#uploadSequential(Entity, Collection<FileLink>, ProgressListener)
+* New method: o.e.m.a.b.f.FileService#uploadParallel(Entity, Collection<FileLink>, ProgressListener)
+* New method: o.e.m.a.b.f.FileService#delete(Entity, Collection<FileLink>)
+* New method: o.e.m.a.b.f.FileService#delete(Entity, FileLink)
+* New method: o.e.m.a.b.f.FileLink#newLocal(InputStream, String, long, MimeType, String)
+* New method: o.e.m.a.b.m.FileLink#getLocalStream()
+* New method: o.e.m.a.b.m.FileLink#setLocalStream(InputStream)
+* Removed method: o.e.m.a.b.m.FileLink#getLocalPath()
+* Removed method: o.e.m.a.b.m.FileLink#setLocalPath(Path)
+
+org.eclipse.mdm.api.default
+* New method: o.e.m.a.d.m.EntityFactory#createExtSystem(String)
+* New method: o.e.m.a.d.m.EntityFactory#createExtSystemAttribute(String, ExtSystem)
+* New method: o.e.m.a.d.m.EntityFactory#createMDMAttribute(String, ExtSystemAttribute)
+* New method: o.e.m.a.d.m.createTestStepWithOutContextRoots(Test, TemplateTestStep, Classification)
+* New method: o.e.m.a.d.m.createTestStepWithOutContextRoots(Test, TemplateTestStep)
+* New method: o.e.m.a.d.m.createTestStepWithOutContextRoots(Test, Status, TemplateTestStep)
+* New entity: o.e.m.a.d.m.ExtSystem
+* New entity: o.e.m.a.d.m.ExtSystemAttribute
+* New entity: o.e.m.a.d.m.MDMAttribute
+* New entity: o.e.m.a.d.m.SystemParameter
+* New entity: o.e.m.a.d.m.UserParameter
+
+### Changes ###
+
+* [552399](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552399) - Upload/download file attachments in webclient
+* [552400](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552400) - Show/edit context data based on MDM templates
+* [552401](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552401) - Model mapping in atfxadapter with ExtSystem
+* [552402](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552402) - Simple XY-Chartviewer
+* [552403](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552403) - Introduce user roles on the webclient
+* [562384](https://bugs.eclipse.org/bugs/show_bug.cgi?id=562384) - Freetextindexer should only index once in clustered deployments
+
+## Version 5.1.0 ##
+
+### Bugzilla Bugs fixed ###
+
+* [561163](https://bugs.eclipse.org/bugs/show_bug.cgi?id=561163) - Possible NPE in OdsEntityManager#loadTemplate()
+* [553867](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553867) - Upload shopping basket should use xml format
+* [553699](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553699) - Provide a user friendly error message if unsupported business objects are exported to atfx.
+* [560003](https://bugs.eclipse.org/bugs/show_bug.cgi?id=560003) - Relations in Response not shown correctly
+
+## Version 5.1.0RC1 ##
+
+New Features:
+* Support for Elasticsearch Version 7 or later
+
+### Changes ###
+
+* [520297](https://bugs.eclipse.org/bugs/show_bug.cgi?id=520297) - Fulltextsearch should support Elastic Search Version 7
+
+## Version 5.1.0M8, 2020/02/03 ##
+
+New Features:
+* Add Quantity and Unit in Detail-View in WebClient
+* Support for Status using Classification
+
+### API changes ###
+
+* REST-API has a new endpoints ProjectDomain, Status and Classification
+* Responses now contain relation information in property "relation"
+* New method: o.e.m.a.d.EntityManager#loadTemplate(Test)
+* New method: o.e.m.a.d.EntityManager#loadTemplate(TestStep)
+* New method: o.e.m.a.d.m.EntityFactory#createClassification(Domain, ProjectDomain, Status)
+* New method: o.e.m.a.d.m.EntityFactory#createTest(String, Pool, TemplateTest, Classification, boolean)
+* New method: o.e.m.a.d.m.EnttiyFactory#createTestStep(Test, TemplateTestStep, Classification)
+* New method: o.e.m.a.d.m.EnttiyFactory#createTestStep(String, Test, Classification)
+* New method: o.e.m.a.d.m.EntityFactory#createTestStep(String, Test, TemplateTestStep, Classification)
+* Renamed classes in org.eclipse.mdm.nucleus.api.copy
+* New method: o.e.m.a.b.q.Query#limit(int limit)
+
+### Changes ###
+
+* [553266](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553266) - Contributions of Peak Solution (2019/11)
+* [546639](https://bugs.eclipse.org/bugs/show_bug.cgi?id=546639) - Use openMDM 5 API to create Classifications
+* [552484](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552484) - Add parameter to specify the hostname in addition to the interface name for CORBAFileServer
+* [552505](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552505) - Webclient: All URLs routed by Angular have to fallback to index.html
+* [553162](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553162) - Webclient: Add Quantity and Unit to DetailView
+* [553163](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553163) - Implement a session check / reconnect for Freetextindexer
+* [553164](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553164) - Improve template resolving in apicopy
+* [550002](https://bugs.eclipse.org/bugs/show_bug.cgi?id=550002) - Add relation information to REST-API
+* [549844](https://bugs.eclipse.org/bugs/show_bug.cgi?id=549844) - [REST] Add unit info on /channels response
+* [544850](https://bugs.eclipse.org/bugs/show_bug.cgi?id=544850) - Allow to limit number of search results
+
+### Bugzilla Bugs fixed ###
+
+* [553369](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553369) - ATFX Import fails if multiple version of a Quantity exist 
+* [559366](https://bugs.eclipse.org/bugs/show_bug.cgi?id=559366) - [REST] Swagger Codegen leads to an error when using the provided openAPI files
+* [553266](https://bugs.eclipse.org/bugs/show_bug.cgi?id=553266)) - Contributions of Peak Solution (2019/11)
+  - ATFX export now correctly includes Context Data
+  - Fixed EntityService#satisfiesParameters
+  - Fixed memory leak when explicitly closing an context in ConnectorService
+  - Fixed: MeaQuantity name is set to DefMQName instead actual value on import/export
+  - Do not log ServiceConfiguration on connection failure.
+  - Remove odsadapter dependency from apicopy
+  - Fixed shopping basket context menu
+
+## Version 5.1.0M7, 2019/11/08 ##
+
+New Features:
+* Support for reading and writing measurement data.
+* Support for reading preview measurement values.
+* Measurement data can be transferred as Protocol Buffers or JSON
+
+### API changes ###
+
+* REST-API has a new endpoints read (/mdm/environments/{SOURCENAME}/values/read) and write (/mdm/environments/{SOURCENAME}/values/write) measurement values.
+* REST-API has a new endpoint to request preview values (/mdm/environments/{SOURCENAME}/values/preview)
+* o.e.m.a.b.m.ReadRequestBuilder now additionally has methods ReadRequestBuilder.values(int requestSize) and ReadRequestBuilder.values(int startIndex, int requestSize) as terminal operations.
+
+### Changes ###
+
+* [548162](https://bugs.eclipse.org/bugs/show_bug.cgi?id=548162) - Add support for reading/writing measurement data over REST API
+
+### Bugzilla Bugs fixed ###
+
+* [547141](https://bugs.eclipse.org/bugs/show_bug.cgi?id=547141) - ReadRequestBuilder does not allow to create ReadRequests with startIndex or requestSize != 0
+* [547115](https://bugs.eclipse.org/bugs/show_bug.cgi?id=547115) - ClassCastException in ReadRequestHandler#getODSColumns
+
+## Version 5.1.0M6, 2019/10/18 ##
+
+New Features:
+* Generate a openAPI definition file of the openMDM REST-API at build time.
+* Integrated Swagger UI into deployment for visualizing the API.
+
+
+### API changes ###
+
+* no
+
+### Changes ###
+
+* [537293](https://bugs.eclipse.org/bugs/show_bug.cgi?id=537293) - Use swagger for rest api docu
+
+### Bugzilla Bugs fixed ###
+
+* [552188](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552188) - Context menu in shopping basket is not displayed correctly
+* [551950](https://bugs.eclipse.org/bugs/show_bug.cgi?id=551950) - FreeTextIndexer cannot be deactivated
+
+## Version 5.1.0M5, 2019/08/27 ##
+
+New Features:
+* Support for reading FILE_LINK and FILE_LINK_SEQUENCE with REST-API
+
+
+### API changes ###
+
+* Added REST endpoints test/files/{remotePath}, teststep/files/{remotePath} and measurement/files/{remotePath}
+* Attributes with datatype `FILE_LINK`/`FILE_LINK_SEQUENCE` will return JSON objects with properties `remotePath`, `mimeType` and `description` as value.
+
+### Changes ###
+
+* [546774](https://bugs.eclipse.org/bugs/show_bug.cgi?id=546774) - Add support for reading FILE_LINK_SEQUENCE attributes
+
+### Bugzilla Bugs fixed ###
+
+-
+
+## Version 5.1.0M4, 2019/08/09 ##
+
+New Features:
+ * Eclipse Glassfish 5 Support
+
+
+### API changes ###
+
+* no
+
+### Changes ###
+
+*  [548241](https://bugs.eclipse.org/bugs/show_bug.cgi?id=548241) - Test nucleus with Eclipse Glassfish 5.1
+
+### Bugzilla Bugs fixed ###
+
+* [548347](https://bugs.eclipse.org/bugs/show_bug.cgi?id=548347) - Advanced search with date attribute fails if time portion is omitted in input field
+* [547115](https://bugs.eclipse.org/bugs/show_bug.cgi?id=547115) - ClassCastException in ReadRequestHandler#getODSColumns
+
+## Version 5.1.0M3, 2019/04/23 ##
+
+New Features:
+ * Angular 7 support, updated from Angular 2
+ * I18N support for web frontend, languages available: English, German.
+    * For adding a new language see: org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/README_I18N.md
+    * Files with translations: org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/assets/i18n/\*.json    
+
+
+### API changes ###
+
+* no
+
+### Changes ###
+
+*  [544530](https://bugs.eclipse.org/bugs/show_bug.cgi?id=544530) - Angular 7 Upgrade and I18N for Webfrontend
+
+### Bugzilla Bugs fixed ###
+
+* [544621](https://bugs.eclipse.org/bugs/show_bug.cgi?id=544621) - Mixed line endings (LF and CRLF) and other formatting issues
+* [545400](https://bugs.eclipse.org/bugs/show_bug.cgi?id=545400) - Apostroph ' (%27) in urls with filter parameters is blocked by proxy servers
+* [545591](https://bugs.eclipse.org/bugs/show_bug.cgi?id=545591) - OdsSearchService creates invalid ODS Query
+* [544562](https://bugs.eclipse.org/bugs/show_bug.cgi?id=544562) - Nucleus - navigator: Dropdown menu sources
+* [543525](https://bugs.eclipse.org/bugs/show_bug.cgi?id=543525) - Dependency Cleanup
+
+
+## Version 5.1.0M2, 2019/02/28 ##
+
+New Features:
+ * Read root configuration directory from system property ("org.eclipse.mdm.configPath")
+ * ATFX import/export
+ * Support added for the Entity Role in the openMDM 5 Java API: load and persist the many-to-many relation between User and Role.
+ * The business objects Project, Pool, Test, Teststep, Measurement are editable via the REST API. It is possible create, update and delete the listed business objects. Furthermore it is possible to edit the context data for Teststep and Measurement. CRUD operations for measured data are not part of this ticket.
+ * Property lookups for parameters values in service.xml: The service.xml contains all information necessary for the Connector-Service to connect to the available datasources/adapter instances. Since this information includes secret information like passwords, it is possible to provide lookups, which gives you the possibility to specify tokens as references to properties defined elsewhere.
+
+### API changes ###
+
+* All Repos: added Source Jar to build
+* o.e.m.api.base (impl): TestStep#loadContexts returns cached values if present
+* o.e.m.api.base (impl): Added IndependentBuilder#independent(boolean)
+* o.e.m.api.base (impl): Added ReadRequest#getValuesMode()/setValuesMode(ValuesMode)
+* o.e.m.api.base (impl): Added ReadRequestBuilder#valuesMode(ValuesMode)
+* o.e.m.api.base (impl): Added WriteRequest#setIndependent(boolean)
+* o.e.m.api.base (impl): Extended MeasuredValues with SequenceRepresentation, Generation Parameters, Independent Flag and AxisType
+* o.e.m.api.base (API): Added Parameters to ScalarType#createmeasuredValues()
+* o.e.m.api.default (impl): EntityFactory#createTestStep(Test, TemplateTestStep) is now public
+* o.e.m.api.default (impl): Added EntityFactory#createTest(String, Pool)
+* o.e.m.api.odsadapter: Added possibility to provide EntityConfigRepository OdsModelManager
+* o.e.m.api.odsadapter: Added SequenceRepresentation etc. for LocalColumns
+* o.e.m.api.default (impl): EntityFactory#createContextRoot(List<Measurement>, TemplateRoot)
+* o.e.m.api.base: added o.e.m.a.b.BaseEntityManager.loadRelatedEntities
+* o.e.m.api.base: added o.e.m.a.b.a.Core.getNtoMStore
+* org.eclipse.mdm.api.default: added o.e.m.a.d.m.EntityFactory.createRole
+* org.eclipse.mdm.api.default:added Entity o.e.m.a.d.m.Role
+
+### Changes ###
+
+* [540179](https://bugs.eclipse.org/bugs/show_bug.cgi?id=540179) - [[REQU-111]](https://openmdm.atlassian.net/browse/REQU-111) - Read root configuration directory from system property
+* [540180](https://bugs.eclipse.org/bugs/show_bug.cgi?id=540180) -[[REQU-112]](https://openmdm.atlassian.net/browse/REQU-112) - ATFX import/export
+* [545014](https://bugs.eclipse.org/bugs/show_bug.cgi?id=545014) - [[REQU-117]](https://openmdm.atlassian.net/browse/REQU-117) - CRUD operations for main business objects
+* [542769](https://bugs.eclipse.org/bugs/show_bug.cgi?id=542769) -[[REQU-116]](https://openmdm.atlassian.net/browse/REQU-116) -  Entity Role
+*  [544526](https://bugs.eclipse.org/bugs/show_bug.cgi?id=544526) - Property lookups for parameters values in service.xml
+
+### Bugzilla Bugs fixed ###
+
+*  [543675](https://bugs.eclipse.org/bugs/show_bug.cgi?id=543675) - ODSContextFactory leaks ORB instances
+* [543440](https://bugs.eclipse.org/bugs/show_bug.cgi?id=543440) - Configuration: Nodeprovider
+
+## Milestone 5.1.0M1, 2019/01/11 ##
+
+### Changes ###
+
+ * Support for Status was extended such that it can be attached to a Measurement / TestStep / Test class. Additional entities ProjectDomain Domain and Classification were added to the org.eclipse.mdm.api.default module
+ * New system property "org.eclipse.mdm.api.odsadapter.filetransfer.interfaceName" to set a specific network interface name to be used
+
+
+### Bugzilla Bugs fixed ###
+
+ * [540889](https://bugs.eclipse.org/bugs/show_bug.cgi?id=540889)	- Contribution for 5.1.0M1 bug/feature collection
+ * [529729](https://bugs.eclipse.org/bugs/show_bug.cgi?id=529729) - Status and MDMTag cannot be set on a test/testStep
+ * [539983](https://bugs.eclipse.org/bugs/show_bug.cgi?id=539983) -	Corba File Server does not work on windows because of a path format problem
+ * [539984](https://bugs.eclipse.org/bugs/show_bug.cgi?id=539984) -	Corba File Server always uses the first network interface
+ * [541606](https://bugs.eclipse.org/bugs/show_bug.cgi?id=541606) - InstallationGuide improvements
+ * [542519](https://bugs.eclipse.org/bugs/show_bug.cgi?id=542519) - 	Nullpointer exception in InsertStatement
+ * [542658](https://bugs.eclipse.org/bugs/show_bug.cgi?id=542658)	-	Nucleus markdown file - error in json "specifications"
+ * [542656](https://bugs.eclipse.org/bugs/show_bug.cgi?id=542656)	-	Nucleus markdown file - wrong documentation of valuelist values interface
+ * [542094](https://bugs.eclipse.org/bugs/show_bug.cgi?id=542094) - NotificationManager throws IllegalArgumentException: Incompatible value type
+
+## Release 5.0.0, 2018/11/07 ##
+
+[Release Review and Graduation Review](https://projects.eclipse.org/projects/technology.mdmbl/releases/5.0.0) of the mdmbl Eclipse project succeeded.
+
+
+## Version 5.0.0M5, 2018/10/30 ##
+
+### Changes ###
+
+ * License switch from Eclipse Public License 1.0 to Eclipse Public License 2.0.
+
+### Bugzilla Bugs fixed ###
+
+ * [540226](https://bugs.eclipse.org/bugs/show_bug.cgi?id=540226)   -  Failed EJB lookup if using catcomps endpoint
+ * [539716](https://bugs.eclipse.org/bugs/show_bug.cgi?id=539716)   -  License switch EPL-1.0 to EPL-2.0
+
+
+## Version 5.0.0M4, 2018/09/26 ##
+
+This code brings along a change with the realm configuration. You can configure your realm now in a standardized way.  In the [readme.md](http://git.eclipse.org/c/mdmbl/org.eclipse.mdm.nucleus.git/tree/README.md) in the org.eclipse.mdm.nucleus project is described how to setup and configure a file realm for local installations. You can also configure your LDAP, AD or others.
+See the [glassfish documentation](https://javaee.github.io/glassfish/doc/4.0/security-guide.pdf)
+
+Note: The component "org.eclipse.mdm.realms" is not used any longer.
+
+### Changes ###
+
+* [526883](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526883) - [[REQU-109]](https://openmdm.atlassian.net/browse/REQU-101) - Integrate external distribution "Authentification and Authorization"
+
+
+### Bugzilla Bugs fixed ###
+
+ * [535381](https://bugs.eclipse.org/bugs/show_bug.cgi?id=535381)   -       Delegated roles and rights with backend connectors
+
+## Version 5.0.0M3, 2018/09/10 ##
+
+In this milestone new REST APIs were added for editing MDM business objects.
+The list of all REST APIs see the [readme.md](http://git.eclipse.org/c/mdmbl/org.eclipse.mdm.nucleus.git/tree/README.md) in the org.eclipse.mdm.nucleus project.
+
+### API changes ###
+
+* no
+
+### Changes ###
+
+* [526883](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526883) - [[REQU-101]](https://openmdm.atlassian.net/browse/REQU-101) - The MDM business objects should be editable via openMDM5 RESTful API (CRUD operations)
+* [REQU-102](https://openmdm.atlassian.net/browse/REQU-102) - Deploy data model via RESTful API
+* [REQU-110](https://openmdm.atlassian.net/browse/REQU-110) - Integrate external distribtion "CRUD Operations for administrative objects"
+
+### Bugzilla Bugs fixed ###
+
+* no
+
+## Version 5.0.0M2, 2018/07/23 ##
+
+### API changes ###
+
+ * no
+
+### Changes ###
+
+* [REQU-108](https://openmdm.atlassian.net/browse/REQU-108) - Bug Fixes and enhancements
+
+### Bugzilla Bugs fixed ###
+
+  * [534866](https://bugs.eclipse.org/bugs/show_bug.cgi?id=534866)	- Results incorrect if attribute search is combined with full text search yielding no results
+  * [535606](https://bugs.eclipse.org/bugs/show_bug.cgi?id=535606)	- Attribute search is not case insensitive
+  * [536840](https://bugs.eclipse.org/bugs/show_bug.cgi?id=536840)	- Avoid function calls from html template for translation
+  * [530512](https://bugs.eclipse.org/bugs/show_bug.cgi?id=530512)	- Missing Information after change tabs
+  * [526163](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526163)	- Resolve unmet dependency error cause by ng2-dropdown-multiselect
+  * [532425](https://bugs.eclipse.org/bugs/show_bug.cgi?id=532425)	- Update and rename ng2-bootstrap to ngx-bootstrap
+  * [536229](https://bugs.eclipse.org/bugs/show_bug.cgi?id=536229)	- Provide a readable error message, if preference service throws an error
+
+
+
+
+## Version 5.0.0M1, 2018/05/18 ##
+
+Note: the system of version numbers has changed!
+
+### API changes ###
+
+ * no
+
+### Changes ###
+
+* [REQU-106](https://openmdm.atlassian.net/browse/REQU-106) - Provide legal documentation, IP Checks, end user content
+* [REQU-107](https://openmdm.atlassian.net/browse/REQU-107) - Notification Service Implementation vis OMG Specs
+
+### Bugzilla Bugs fixed ###
+
+* [528033](https://bugs.eclipse.org/bugs/show_bug.cgi?id=528033)	- Web client does not quote entity IDs in filter strings
+* [532154](https://bugs.eclipse.org/bugs/show_bug.cgi?id=532154)	- Update libraries for IP check
+* [532167](https://bugs.eclipse.org/bugs/show_bug.cgi?id=532167)	- logging
+* [532343](https://bugs.eclipse.org/bugs/show_bug.cgi?id=532343)	- Configure Logging
+* [532165](https://bugs.eclipse.org/bugs/show_bug.cgi?id=532165)	- Java lib
+* [532170](https://bugs.eclipse.org/bugs/show_bug.cgi?id=532170)	- freetext.notificationType
+* [534643](https://bugs.eclipse.org/bugs/show_bug.cgi?id=534643)	- search-datepicker does not recognize model changes via input textbox
+
+## Version V0.10, 2018/02/23 ##
+
+### API changes ###
+
+ * [529569](https://bugs.eclipse.org/bugs/show_bug.cgi?id=529569) - [[REQU-103]](https://openmdm.atlassian.net/browse/REQU-103) - Using Shopping Basket (Search results)
+
+#####  An overview of the API changes made :
+
+* Shopping basket:
+  - Added methods:
+    - String org.eclipse.mdm.api.base.BaseApplicationContext.getAdapterType()
+    - Map<Entity, String> org.eclipse.mdm.api.base.BaseEntityManager.getLinks(Collection<Entity>)
+  - file extensions:
+When downloading the contents of a shopping basket, a file with extension `mdm` is generated. The file extension can be changed by adding a preference with key `shoppingbasket.fileextensions`. For example the used extension can be set to `mdm-xml` by setting the value to `{ "default": "mdm-xml" }`.
+
+### Changes ###
+
+### Bugzilla Bugs fixed ###
+
+* [521880](https://bugs.eclipse.org/bugs/show_bug.cgi?id=521880)	- Component with empty FileLink can not be updated
+* [526124](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526124)	- OpenMDM web (nucleus) broken as of 10-16-2017 because of version ranges/tracking versions
+* [528261](https://bugs.eclipse.org/bugs/show_bug.cgi?id=528261)	- ODS EntityConfigRepository.find(EntityType) should throw IllegalArgumentException if requested entity type is not found	2018-01-11
+* [525848](https://bugs.eclipse.org/bugs/show_bug.cgi?id=525848)	- ODSConverter cannot parse 17 character dates
+* [529568](https://bugs.eclipse.org/bugs/show_bug.cgi?id=529568)	- Junit Tests have to run stand alone
+* [525980](https://bugs.eclipse.org/bugs/show_bug.cgi?id=525980)	- Remove version range in org.eclipse.mdm.api.base/build.gradle
+* [529629](https://bugs.eclipse.org/bugs/show_bug.cgi?id=529629)	- Query group and aggregate function are not working as expected
+* [526141](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526141)	- Remove version range in org.eclipse.mdm.api.odsadapter/build.gradle
+* [529867](https://bugs.eclipse.org/bugs/show_bug.cgi?id=529867)	- Jenkins builds fail since 12.01.17
+* [526147](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526147)	- wrong logic in org.eclipse.mdm.api.default/src/main/java/org/eclipse/mdm/api/dflt/model/EntityFactory
+* [529887](https://bugs.eclipse.org/bugs/show_bug.cgi?id=529887)	- FileUpload throws java.net.UnknownHostException
+* [526260](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526260)	- Writing enumeration values
+* [530511](https://bugs.eclipse.org/bugs/show_bug.cgi?id=530511)	- Missing progress bar
+* [526763](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526763)	- Issues in dynamic enumeration handling
+* [530775](https://bugs.eclipse.org/bugs/show_bug.cgi?id=530775)	- ODS adapter: getParameters exposes sensitive information
+* [527673](https://bugs.eclipse.org/bugs/show_bug.cgi?id=527673)	- ValueType.UNKNOWN.createValue() throws NPE due to ValueType.type not being set
+* [530791](https://bugs.eclipse.org/bugs/show_bug.cgi?id=530791)	- UpdateStatement is broken
+* [528149](https://bugs.eclipse.org/bugs/show_bug.cgi?id=528149)	- Search tab in web UI should accept attribute values even if no suggestions are present
+* [528193](https://bugs.eclipse.org/bugs/show_bug.cgi?id=528193)	- Autocomplete text box in search UI should accept custom values automatically
+* [528260](https://bugs.eclipse.org/bugs/show_bug.cgi?id=528260)	- ValueType.UNKNOWN should have Object rather than Void as representation type
+
+
+
+## Version V0.9, 2017/11/24 ##
+
+### API changes ###
+
+* [525536](https://bugs.eclipse.org/bugs/show_bug.cgi?id=525536) - [[REQU-50]](https://openmdm.atlassian.net/browse/REQU-50) - Modelling of relations
+* [526880](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526880) -  [[REQU-65]](https://openmdm.atlassian.net/browse/REQU-65) Separation of interfaces
+* [526882](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526882) -  [[REQU-78]](https://openmdm.atlassian.net/browse/REQU-78) Packaging
+* [522277](https://bugs.eclipse.org/bugs/show_bug.cgi?id=522277) -  [[REQU-80]](https://openmdm.atlassian.net/browse/REQU-80) Referencing
+
+#####  An overview of the API changes made :
+
+* service.xml:
+ - Property `entityManagerFactoryClass` has to be changed to `org.eclipse.mdm.api.odsadapter.ODSContextFactory` for ODS Datasources.
+ - Datasource specific parameters for `NotificationService` and the freetext search parameters are now supplied by service.xml not by global.properties.
+
+
+* org.eclipse.mdm.api.base:
+ - New entry class `BaseApplicationContextFactory` instead of `BaseEntityManagerFactory`.
+ - Services can now be retrieved from `BaseApplicationContext` instead of `BaseEntityManager`.
+ - `NotificationManagerFactory` was removed; `NotficationManager` was renamed to `NotificationService`.
+ - Query package was split into query and search.
+ - Creation of Query (`ModelManager#createQuery()`) was moved from `ModelManager` to new `QueryService` class.
+ - Moved `ModelManager`, `EntityType`, `Core` and similar to subpackage `adapter`
+ - `EntityStore` and `ChildrenStore` are now top-level classes in the subpackage `adapter`
+ - Moved `FileService` to subpackage file
+ - Added methods:
+   - `ContextComponent#getContextRoot()`
+   - `ContextSensor#getContextComponent()`
+  - Introduced new (protected) method `BaseEntityFactory.createBaseEntity(Class, Core)` for creating instances of classes derived from `BaseEntity` using an already existing `Core` instance. Must be overridden in derived classes to ensure the instances can be created via the (usually package-private) Constructor(Core) of the BaseEntity-derived class. If the constructor of the class passed to `createBaseEntity`  is not accessible, the super class implementation is called to try if the constructor is accessible from there.
+  - Introduced new (protected) method `BaseEntityFactory.getCore(BaseEntity)` to extract the Core object from a BaseEntity instance.
+  - Modified the interface of BaseEntityManager: the get*Store methods have been defined as non final.
+  With that, these methods can be overriden in the OdsAdpter and be used there to access the stores without resorting directly to the core.
+  There also comments added in several places to improve the understandibility of the current implementation.
+
+
+* org.eclipse.mdm.api.default:
+ - Introduced `ApplicationContextFactory` and `ApplicationContext` which extend their base counterparts. Should be unnecessary when merging api.base and api.default repositories.
+
+
+* org.eclipse.mdm.api.odsadapter:
+ - Adapted to the changes from `api.base` and `api.default`
+
+
+* org.eclipse.mdm.nucleus:
+ - Adapted to the changes from `api.base` and `api.default`
+ - `ConnectorService` manages `ApplicationContexts` instead of `EntityManagers`
+ - Datasource specific parameters for `NotificationService` are now supplied by service.xml not by global.properties.
+
+
+### Changes ###
+
+* [522278](https://bugs.eclipse.org/bugs/show_bug.cgi?id=522278) -  [[REQU-98]](https://openmdm.atlassian.net/browse/REQU-98) Search Parameter Parser
+* [526881](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526881) -  [[REQU-75]](https://openmdm.atlassian.net/browse/REQU-75) Specifications
+
+### Bugzilla Bugs fixed ###
+
+* [521880](https://bugs.eclipse.org/bugs/show_bug.cgi?id=521880) -  Component with empty FileLink can not be updatet
+* [526124](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526124) -  OpenMDM web (nucleus) broken as of 10-16-2017 because of version ranges/t
+* [526763](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526763) -  Issues in dynamic enumeration handling
+* [525980](https://bugs.eclipse.org/bugs/show_bug.cgi?id=525980) -  Remove version range in org.eclipse.mdm.api.base/build.gradle
+* [526260](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526260) -  Writing enumeration values
+* [526141](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526141) -  Remove version range in org.eclipse.mdm.api.odsadapter/build.gradle
+* [525848](https://bugs.eclipse.org/bugs/show_bug.cgi?id=525848) -  ODSConverter cannot parse 17 character dates
+* [526147](https://bugs.eclipse.org/bugs/show_bug.cgi?id=526147) -  wrong logic in org.eclipse.mdm.api.default/.../EntityFactory
+
+## Version V0.8, 2017/09/08 ##
+
+### API changes ###
+
+  * [REQU-62](https://openmdm.atlassian.net/browse/REQU-62) - Polyvalant variants
+  * [REQU-49](https://openmdm.atlassian.net/browse/REQU-49) - Extensibility of Entity Classes
+  * [REQU-79](https://openmdm.atlassian.net/browse/REQU-79) - Consistent relationships
+  * [REQU-97](https://openmdm.atlassian.net/browse/REQU-97) - Change handling of enumerations
+
+### Changes ###
+
+* [REQU-73](https://openmdm.atlassian.net/browse/REQU-73) - Representation class
+* [REQU-74](https://openmdm.atlassian.net/browse/REQU-74) - Empty Interface
+* [REQU-77](https://openmdm.atlassian.net/browse/REQU-77) - Name convention
+* [REQU-82](https://openmdm.atlassian.net/browse/REQU-82) - Return-Type
+* [REQU-91](https://openmdm.atlassian.net/browse/REQU-91) - Context Information
+
+### Bugzilla Bugs fixed ###
+
+* [520291](https://bugs.eclipse.org/bugs/show_bug.cgi?id=520291) - 	Elastic Search :: ElasticSearch answered 400, error while performing some search
+* [521011](https://bugs.eclipse.org/bugs/show_bug.cgi?id=521011) - 	EntityFactory.createContextSensor always throws an exception
+* [520330](https://bugs.eclipse.org/bugs/show_bug.cgi?id=520330) - 	Improve development setup in Eclipse
+* [518063](https://bugs.eclipse.org/bugs/show_bug.cgi?id=518063) - 	Nucleus: config-dir is missing in the build artefact mdm-web.zip
+* [518124](https://bugs.eclipse.org/bugs/show_bug.cgi?id=518124) - 	Configure JIPP and Sonar for mdmbl projects
+* [518444](https://bugs.eclipse.org/bugs/show_bug.cgi?id=518444) - 	Unify used gradle versions and update to latest stable
+* [518825](https://bugs.eclipse.org/bugs/show_bug.cgi?id=518825) - 	Nucleus build: create a separate gradle task for npm build
+* [519212](https://bugs.eclipse.org/bugs/show_bug.cgi?id=519212) - 	Enable production mode for client build
+* [519993](https://bugs.eclipse.org/bugs/show_bug.cgi?id=519993) - 	Create Gradle composite build
+* [519453](https://bugs.eclipse.org/bugs/show_bug.cgi?id=519453) - 	org.eclipse.mdm.openatfx build can't download dependency
+* [519995](https://bugs.eclipse.org/bugs/show_bug.cgi?id=519995) - 	Setup Guide and avalon
+* [520248](https://bugs.eclipse.org/bugs/show_bug.cgi?id=520248) - 	Build of org.eclipse.mdm.api.odsadapter only works with "gradle clean install"
+* [517057](https://bugs.eclipse.org/bugs/show_bug.cgi?id=517057) - 	Add Repository Descriptions
+
+
+
+## Version V0.7, 2017/07/21 ##
+
+### API changes ###
+  * [REQU-48](https://openmdm.atlassian.net/browse/REQU-48) - Type of Entity-IDs
+
+
+### Changes ###
+* [REQU-67](https://openmdm.atlassian.net/browse/REQU-67) - Final
+* [REQU-92](https://openmdm.atlassian.net/browse/REQU-92) - Error Handling
+
+### Bugzilla Bugs fixed ###
+* [519448](https://bugs.eclipse.org/bugs/show_bug.cgi?id=519448) - Build of of freetextindexer in org.eclipse.mdm.nucleus fails
+* [518062](https://bugs.eclipse.org/bugs/show_bug.cgi?id=518062) - ODSAdapter: Encoding issue when switching to UTF-8
+* [518060](https://bugs.eclipse.org/bugs/show_bug.cgi?id=518060) - ODSAdapter - junit tests fail
+* [515748](https://bugs.eclipse.org/bugs/show_bug.cgi?id=515748) - Unable to build org.eclipse.mdm.nucleus
+* [518335](https://bugs.eclipse.org/bugs/show_bug.cgi?id=518335) - Set executable flag for gradlew in git repo
+
+
+## Version V0.6, 2017/06/07
+### Changes ###
+
+  * [REQU-2](https://openmdm.atlassian.net/browse/REQU-2) - Display a tree view for navigation
+  * [REQU-3](https://openmdm.atlassian.net/browse/REQU-3) - Display icons in the tree view
+  * [REQU-4](https://openmdm.atlassian.net/browse/REQU-4) - Display different ODS data sources in the tree view
+  * [REQU-5](https://openmdm.atlassian.net/browse/REQU-5) - Expand serveral nodes of the tree view simultaneously    
+  * [REQU-6](https://openmdm.atlassian.net/browse/REQU-6) - Display a scroll bar in the tree vie
+  * [REQU-7](https://openmdm.atlassian.net/browse/REQU-7) - Web Client GUI Adjustment
+  * [REQU-9](https://openmdm.atlassian.net/browse/REQU-9) - Display tabs on Detail view
+  * [REQU-10](https://openmdm.atlassian.net/browse/REQU-10) - Update Detail View
+  * [REQU-12](https://openmdm.atlassian.net/browse/REQU-12) - Select data source for attribute-based search
+  * [REQU-13](https://openmdm.atlassian.net/browse/REQU-13) - Definition or selection of a search query
+  * [REQU-14](https://openmdm.atlassian.net/browse/REQU-14) - Limit search to a certain result type
+  * [REQU-15](https://openmdm.atlassian.net/browse/REQU-15) - Display attributes of the selected data source(s)
+  * [REQU-16](https://openmdm.atlassian.net/browse/REQU-16) - Set search attribute values
+  * [REQU-18](https://openmdm.atlassian.net/browse/REQU-18) - Select data source for fulltext search
+  * [REQU-22](https://openmdm.atlassian.net/browse/REQU-22) - Create and store a view for search results
+  * [REQU-23](https://openmdm.atlassian.net/browse/REQU-23) - Select a view to display search results
+  * [REQU-24](https://openmdm.atlassian.net/browse/REQU-24) - Filter fulltext search results
+  * [REQU-25](https://openmdm.atlassian.net/browse/REQU-25) - Display actions for search results
+  * [REQU-27](https://openmdm.atlassian.net/browse/REQU-27) - Select data objects for shoppping basket
+  * [REQU-28](https://openmdm.atlassian.net/browse/REQU-28) - Store a shopping basket
+  * [REQU-29](https://openmdm.atlassian.net/browse/REQU-29) - Select a shopping basket
+  * [REQU-30](https://openmdm.atlassian.net/browse/REQU-30) - Export shopping basket
+  * [REQU-31](https://openmdm.atlassian.net/browse/REQU-31) - Load an exported shopping basket
+  * [REQU-32](https://openmdm.atlassian.net/browse/REQU-32) - Display actions for shopping basket
+  * [REQU-85](https://openmdm.atlassian.net/browse/REQU-85) - Seach type date
+  * [REQU-86](https://openmdm.atlassian.net/browse/REQU-86) - Search across multiple data sources
+  * [REQU-95](https://openmdm.atlassian.net/browse/REQU-95) - Backend configuration
diff --git a/org.eclipse.mdm.nucleus/settings.gradle b/org.eclipse.mdm.nucleus/settings.gradle
new file mode 100644
index 0000000..71e1bab
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/settings.gradle
@@ -0,0 +1,38 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+
+rootProject.name = 'org.eclipse.mdm.nucleus'
+
+def includeIfExists(String projectPath) {
+    if (file(projectPath).exists()) {
+        includeBuild projectPath
+    }
+}
+
+includeIfExists '../org.eclipse.mdm.api.base'
+includeIfExists '../org.eclipse.mdm.api.default'
+includeIfExists '../org.eclipse.mdm.api.odsadapter'
+
+include 'org.eclipse.mdm.openatfx'
+include 'org.eclipse.mdm.api.atfxadapter'
+include 'org.eclipse.mdm.application'
+include 'org.eclipse.mdm.connector'
+include 'org.eclipse.mdm.apicopy'
+include 'org.eclipse.mdm.businessobjects'
+include 'org.eclipse.mdm.filerelease'
+include 'org.eclipse.mdm.property'
+include 'org.eclipse.mdm.freetextindexer'
+include 'org.eclipse.mdm.preferences'
+
diff --git a/org.eclipse.mdm.nucleus/src/main/openapi/openApiFile.json b/org.eclipse.mdm.nucleus/src/main/openapi/openApiFile.json
new file mode 100644
index 0000000..6fe3c2d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/src/main/openapi/openApiFile.json
@@ -0,0 +1,24 @@
+{
+  "openapi" : "3.0.1",
+  "info" : {
+    "version" : "@VERSION@",
+    "title" : "openMDM 5 REST API",
+    "description" : "openMDM 5 REST API.",
+    "license" : {
+      "name" : "EPL 2.0",
+      "url" : "http://www.eclipse.org/legal/epl-2.0"
+    },
+    "contact" : {
+      "name" : "Eclipse MDM|BL",
+      "url" : "https://projects.eclipse.org/projects/technology.mdmbl"
+    }
+  },
+  "servers" : [{
+    "url": "/org.eclipse.mdm.nucleus/mdm",
+    "description": "openMDM 5 REST API"
+  }],
+  "externalDocs" : {
+    "description" : "Getting Started Guide",
+    "url" : "https://wiki.eclipse.org/images/e/e0/GettingStarted_mdmbl.pdf"
+  }
+}
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/src/main/resources/logback.xml b/org.eclipse.mdm.nucleus/src/main/resources/logback.xml
new file mode 100644
index 0000000..edd3b62
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/src/main/resources/logback.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<configuration debug="true" scan="true">

+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">

+        <file>${com.sun.aas.instanceRoot}/logs/mdm5.log</file>

+        <append>true</append>

+        <encoder>

+            <Pattern>%date [%thread] %-5level %logger{36} - %msg%n</Pattern>

+        </encoder>

+    </appender>

+    <root>

+        <level value="INFO"/>

+        <appender-ref ref="FILE"/>

+    </root>

+</configuration>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/src/main/webapp/swagger.html b/org.eclipse.mdm.nucleus/src/main/webapp/swagger.html
new file mode 100644
index 0000000..fac1f9d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/src/main/webapp/swagger.html
@@ -0,0 +1,50 @@
+<!--********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************-->
+
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="UTF-8">
+    <title>openMDM 5 Swagger</title>
+    <link rel="stylesheet" type="text/css" href="webjars/swagger-ui/3.23.0/swagger-ui.css">
+</head>
+<body>
+
+<div id="swagger-ui"></div>
+
+<script src="webjars/swagger-ui/3.23.0/swagger-ui-standalone-preset.js"></script>
+<script src="webjars/swagger-ui/3.23.0/swagger-ui-bundle.js"></script>
+
+<script>
+    window.onload = function() {
+        // Build a system
+        const ui = SwaggerUIBundle({
+            url: window.location.href.replace("swagger.html", "openapi.json"),
+            dom_id: '#swagger-ui',
+            deepLinking: true,
+            presets: [
+                SwaggerUIBundle.presets.apis,
+                SwaggerUIStandalonePreset
+            ],
+            plugins: [
+                SwaggerUIBundle.plugins.DownloadUrl
+            ],
+            docExpansion: "none",
+            layout: "StandaloneLayout",
+        })
+        window.ui = ui
+    }
+</script>
+</body>
+</html>
\ No newline at end of file