Added basys.examples project
diff --git a/examples/basys.examples/.classpath b/examples/basys.examples/.classpath
new file mode 100644
index 0000000..3bf06c0
--- /dev/null
+++ b/examples/basys.examples/.classpath
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry kind="src" output="target/classes" path="src">

+		<attributes>

+			<attribute name="optional" value="true"/>

+			<attribute name="maven.pomderived" value="true"/>

+		</attributes>

+	</classpathentry>

+	<classpathentry kind="src" path="examples"/>

+	<classpathentry kind="src" path="servlets"/>

+	<classpathentry kind="src" path="directory"/>

+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">

+		<attributes>

+			<attribute name="maven.pomderived" value="true"/>

+		</attributes>

+	</classpathentry>

+	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v9.0">

+		<attributes>

+			<attribute name="owner.project.facets" value="jst.web"/>

+		</attributes>

+	</classpathentry>

+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>

+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">

+		<attributes>

+			<attribute name="maven.pomderived" value="true"/>

+			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>

+		</attributes>

+	</classpathentry>

+	<classpathentry kind="output" path="target/classes"/>

+</classpath>

diff --git a/examples/basys.examples/.gitignore b/examples/basys.examples/.gitignore
new file mode 100644
index 0000000..76daa49
--- /dev/null
+++ b/examples/basys.examples/.gitignore
@@ -0,0 +1,2 @@
+/build/
+/target/
diff --git a/examples/basys.examples/.project b/examples/basys.examples/.project
new file mode 100644
index 0000000..9532331
--- /dev/null
+++ b/examples/basys.examples/.project
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>basys.examples</name>

+	<comment></comment>

+	<projects>

+	</projects>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.jdt.core.javabuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.wst.common.project.facet.core.builder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.wst.validation.validationbuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.m2e.core.maven2Builder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.m2e.core.maven2Nature</nature>

+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>

+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>

+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>

+		<nature>org.eclipse.jdt.core.javanature</nature>

+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>

+	</natures>

+</projectDescription>

diff --git a/examples/basys.examples/.settings/.jsdtscope b/examples/basys.examples/.settings/.jsdtscope
new file mode 100644
index 0000000..5cee5ac
--- /dev/null
+++ b/examples/basys.examples/.settings/.jsdtscope
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="WebContent"/>

+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>

+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">

+		<attributes>

+			<attribute name="hide" value="true"/>

+		</attributes>

+	</classpathentry>

+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>

+	<classpathentry kind="output" path=""/>

+</classpath>

diff --git a/examples/basys.examples/.settings/org.eclipse.jdt.core.prefs b/examples/basys.examples/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1ab2bb5
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1

+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled

+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8

+org.eclipse.jdt.core.compiler.compliance=1.8

+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error

+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error

+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning

+org.eclipse.jdt.core.compiler.source=1.8

diff --git a/examples/basys.examples/.settings/org.eclipse.m2e.core.prefs b/examples/basys.examples/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=

+eclipse.preferences.version=1

+resolveWorkspaceProjects=true

+version=1

diff --git a/examples/basys.examples/.settings/org.eclipse.wst.common.component b/examples/basys.examples/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..8757062
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">

+    <wb-module deploy-name="basys.examples-0.0.1-SNAPSHOT">

+        <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>

+        <wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>

+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>

+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/examples"/>

+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/servlets"/>

+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/directory"/>

+        <dependent-module archiveName="basys.sdk-0.0.1-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/basys.sdk/basys.sdk">

+            <dependency-type>uses</dependency-type>

+        </dependent-module>

+        <property name="context-root" value="basys.examples"/>

+        <property name="java-output-path" value="/basys.examples/build/classes"/>

+    </wb-module>

+</project-modules>

diff --git a/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
new file mode 100644
index 0000000..b01fdb7
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
@@ -0,0 +1,7 @@
+<root>

+  <facet id="jst.jaxrs">

+    <node name="libprov">

+      <attribute name="provider-id" value="jaxrs-no-op-library-provider"/>

+    </node>

+  </facet>

+</root>

diff --git a/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.xml b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..87691af
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<faceted-project>

+  <runtime name="Apache Tomcat v9.0"/>

+  <fixed facet="wst.jsdt.web"/>

+  <fixed facet="jst.web"/>

+  <fixed facet="java"/>

+  <installed facet="java" version="1.8"/>

+  <installed facet="jst.web" version="3.1"/>

+  <installed facet="wst.jsdt.web" version="1.0"/>

+  <installed facet="jst.jaxrs" version="2.0"/>

+</faceted-project>

diff --git a/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.container b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.name b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.validation.prefs b/examples/basys.examples/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..6f1cba6
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,2 @@
+disabled=06target

+eclipse.preferences.version=1

diff --git a/examples/basys.examples/WebContent/META-INF/MANIFEST.MF b/examples/basys.examples/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/examples/basys.examples/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0

+Class-Path: 

+

diff --git a/examples/basys.examples/WebContent/WEB-INF/config/aasServer/aasServer.properties b/examples/basys.examples/WebContent/WEB-INF/config/aasServer/aasServer.properties
new file mode 100644
index 0000000..82fd539
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/config/aasServer/aasServer.properties
@@ -0,0 +1,26 @@
+# ##############################################################

+# Configuration sub model provider configuration file

+# ##############################################################

+

+

+

+# ##############################################################

+# Sub model provider configuration

+

+# Name of provided sub model

+basyx.submodelID       = aasRepository

+

+

+

+# ##############################################################

+# Sub model meta data

+

+# Sub model version

+administration/version           = 1.0

+

+

+

+# ##############################################################

+# Exported configuration

+

+

diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/components/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/components/.gitignore
new file mode 100644
index 0000000..97546d7
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/components/.gitignore
@@ -0,0 +1 @@
+/basyx_components.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/jersey/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/.gitignore
new file mode 100644
index 0000000..8f9fad4
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/.gitignore
@@ -0,0 +1,10 @@
+/javax.ws.rs-api-2.1.jar
+/jersey-client.jar
+/jersey-common.jar
+/jersey-container-servlet-core.jar
+/jersey-container-servlet.jar
+/jersey-hk2.jar
+/jersey-media-jaxb.jar
+/jersey-media-json-binding.jar
+/jersey-media-sse.jar
+/jersey-server.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/.gitignore
new file mode 100644
index 0000000..7ef177e
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/.gitignore
@@ -0,0 +1,21 @@
+/hk2-api-2.5.0-b42.jar
+/hk2-locator-2.5.0-b42.jar
+/hk2-utils-2.5.0-b42.jar
+/javassist-3.22.0-CR2.jar
+/javax.annotation-api-1.2.jar
+/javax.inject-1.jar
+/javax.inject-2.5.0-b42.jar
+/javax.json-1.1.jar
+/validation-api-1.1.0.Final.jar
+/yasson-1.0.jar
+/org.osgi.core-4.2.0.jar
+/osgi-resource-locator-1.0.1.jar
+/persistence-api-1.0.jar
+/javax.json-api-1.1.jar
+/javax.json.bind-api-1.0.jar
+/javax.servlet-api-3.0.1.jar
+/jaxb-api-2.2.7.jar
+/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
+/jsr250-api-1.0.jar
+/el-api-2.2.jar
+/cdi-api-1.1.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/aopalliance-repackaged-2.5.0-b42.jar b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/aopalliance-repackaged-2.5.0-b42.jar
new file mode 100644
index 0000000..83558eb
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/aopalliance-repackaged-2.5.0-b42.jar
Binary files differ
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/sdk/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/sdk/.gitignore
new file mode 100644
index 0000000..6feb9f5
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/sdk/.gitignore
@@ -0,0 +1 @@
+/basyx_sdk.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/web.xml b/examples/basys.examples/WebContent/WEB-INF/web.xml
new file mode 100644
index 0000000..40853bc
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/web.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

+  <display-name>basys.components</display-name>

+

+

+

+  <servlet>

+    <servlet-name>AAS_Server</servlet-name>

+    <servlet-class> org.eclipse.basyx.components.servlets.RawCFGSubModelProviderServlet </servlet-class>

+ 

+    <init-param>

+        <param-name>config</param-name>

+        <param-value>/WEB-INF/config/aasServer/aasServer.properties</param-value>

+    </init-param>

+    

+    <load-on-startup>5</load-on-startup>

+  </servlet>

+  <servlet-mapping>

+    <servlet-name>AAS_Server</servlet-name>

+    <url-pattern>/Testsuite/components/BaSys/1.0/aasserver/*</url-pattern>

+  </servlet-mapping>

+

+

+

+  <servlet>

+    <servlet-name>DeviceStatusVABObject</servlet-name>

+    <servlet-class> examples.controllingdevice.vab.object.SimpleVABElementServlet </servlet-class>

+

+    <load-on-startup>5</load-on-startup>

+  </servlet>

+  <servlet-mapping>

+    <servlet-name>DeviceStatusVABObject</servlet-name>

+    <url-pattern>/Testsuite/components/BaSys/1.0/devicestatusVAB/*</url-pattern>

+  </servlet-mapping>

+

+

+  <servlet>

+    <servlet-name>DeviceStatusSubmodel</servlet-name>

+    <servlet-class> examples.controllingdevice.vab.object.SimpleSubmodelServlet </servlet-class>

+

+    <load-on-startup>5</load-on-startup>

+  </servlet>

+  <servlet-mapping>

+    <servlet-name>DeviceStatusSubmodel</servlet-name>

+    <url-pattern>/Testsuite/components/BaSys/1.0/devicestatusSM/*</url-pattern>

+  </servlet-mapping>

+

+  

+  

+  <welcome-file-list>

+    <welcome-file>index.html</welcome-file>

+    <welcome-file>index.htm</welcome-file>

+    <welcome-file>index.jsp</welcome-file>

+    <welcome-file>default.html</welcome-file>

+    <welcome-file>default.htm</welcome-file>

+    <welcome-file>default.jsp</welcome-file>

+  </welcome-file-list>

+</web-app>
\ No newline at end of file
diff --git a/examples/basys.examples/directory/examples/directory/ExamplesDirectory.java b/examples/basys.examples/directory/examples/directory/ExamplesDirectory.java
new file mode 100644
index 0000000..bb06a65
--- /dev/null
+++ b/examples/basys.examples/directory/examples/directory/ExamplesDirectory.java
@@ -0,0 +1,28 @@
+package examples.directory;

+

+import org.eclipse.basyx.testsuite.support.backend.common.stubs.java.directory.TestsuiteDirectory;

+

+

+

+

+/**

+ * Implement the test suite directory service with pre-configured directory entries

+ * 

+ * @author kuhn

+ *

+ */

+public class ExamplesDirectory extends TestsuiteDirectory {

+

+	

+	/**

+	 * Constructor - load all directory entries

+	 */

+	public ExamplesDirectory() {

+		// Populate with entries from base implementation

+		super();

+

+		// Define mappings

+		// - AAS server mapping

+		addMapping("AASServer", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver/");

+	}	

+}

diff --git a/examples/basys.examples/examples.txt b/examples/basys.examples/examples.txt
new file mode 100644
index 0000000..8763873
--- /dev/null
+++ b/examples/basys.examples/examples.txt
@@ -0,0 +1,60 @@
+Product AAS

+- Application, e.g. ERP system creates a product AAS

+  - Loads product AAS on server

+  - Registers product AAS with registry

+  - Lookup product AAS descriptor from server

+  - Access product AAS, read "idShort" property

+

+

+Device AAS 1

+- A new device is added

+  - Device transfers its AAS to server

+  - Device transfers its status sub model to sub model server

+  - Device registers AAS on server in registry

+  - Device updates property "ready" of status sub model

+  - Dashboard looks up device AAS

+  - Dashboard retrieves status sub model end point from AAS descriptor

+  - Dashboard connects to status sub model provider

+  - Dashboard queries "ready" property of sub model

+

+

+Device AAS 2

+- A new device is added

+  - Administrator transfers device AAS, device sub model, and registers AAS on server in registry

+  - Device updates property "ready" of status sub model

+  - Dashboard looks up device AAS

+  - Dashboard retrieves status sub model end point from AAS descriptor

+  - Dashboard connects to status sub model provider

+  - Dashboard queries "ready" property of sub model

+   

+

+Device status

+- Device publishes its status in non-standard VAB data object

+  - Active device status AAS sub model continuously queries device state and writes device state into AAS sub model property

+  - Dashboard connects to device status sub model

+  - Dashboard reads "status" property, indicates device not available

+  - Device comes online, updates its status in local VAB object to ready

+  - Active device status AAS sub model continuously queries device state and writes device state into AAS sub model property

+  - Dashboard reads "status" property, indicates device is ready

+

+

+Controlling device (sub model)

+- Read device end point from AAS sub model

+  - Connect to device end point (device exports conforming sub model)

+  - Read device status

+  - Set device mode

+

+  

+Controlling device (VAB object)

+- Read device end point from AAS sub model

+  - Connect to device end point via VAB (device does not export conforming sub model)

+  - Read device status

+  - Set device mode

+

+  

+  

+  

+----------------

+Bugs:

+- BaSys connector sollte stabiler werden bzgl '/' am ende/anfang von Pfadsegment

+- Leerzeichen in Padnamen funktionieren nicht

diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceStatusSubmodel.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceStatusSubmodel.java
new file mode 100644
index 0000000..e8bfba4
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceStatusSubmodel.java
@@ -0,0 +1,64 @@
+package examples.controllingdevice.submodel.object;
+
+import java.util.Map;
+import org.eclipse.basyx.aas.api.resources.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.factory.MetaModelElementFactory;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.SubModel;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.property.atomicdataproperty.PropertySingleValued;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;
+
+
+
+/**
+ * Implement a sub model that describes a device status
+ * 
+ * @author kuhn
+ *
+ */
+public class DeviceStatusSubmodel extends SubModel {
+
+
+	/**
+	 * Version of serialized instances
+	 */
+	private static final long serialVersionUID = 1L;
+
+
+
+	/**
+	 * Constructor
+	 */
+	@SuppressWarnings("unchecked")
+	public DeviceStatusSubmodel() {
+
+		// Meta model element factory
+		MetaModelElementFactory factory = new MetaModelElementFactory();
+
+		// Initialize this sub model
+		((Map<String, Object>) this.get("identification")).put("id", "urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#002");
+		((Map<String, Object>) this.get("identification")).put("idType", Identification.URI);
+
+		
+		// This sub model only defines two property named "device status" and "mode"
+		PropertySingleValued deviceStatusProperty = factory.create(new PropertySingleValued(), "offline");
+		deviceStatusProperty.setId("deviceStatus");
+		PropertySingleValued deviceModeProperty = factory.create(new PropertySingleValued(), "idle");
+		deviceModeProperty.setId("mode");
+
+		// Add properties to sub model properties
+		((Map<String, Object>) get("properties")).put("deviceStatus", deviceStatusProperty);
+		((Map<String, Object>) get("properties")).put("mode", deviceModeProperty);
+	}
+
+
+	/**
+	 * Constructor
+	 */
+	public DeviceStatusSubmodel(IAssetAdministrationShell aas) {
+		// Invoke default constructor
+		this();
+
+		// Add sub model to AAS
+		aas.addSubModel(this);
+	}
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceTCPServer.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceTCPServer.java
new file mode 100644
index 0000000..c0f8735
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceTCPServer.java
@@ -0,0 +1,34 @@
+package examples.controllingdevice.submodel.object;

+

+import org.eclipse.basyx.vab.backend.server.basyx.BaSyxTCPServer;

+import org.eclipse.basyx.vab.provider.hashmap.VABHashmapProvider;

+

+

+

+/**

+ * BaSyx TCP server that communicates using the native BaSyx protocol

+ * 

+ * @author kuhn

+ *

+ */

+public class DeviceTCPServer {

+

+

+	/**

+	 * Main method

+	 */

+	public static void main(String[] args) {

+

+		// Create IModelProvider that provides a VAB element

+		VABHashmapProvider modelProvider = new VABHashmapProvider(new DeviceStatusSubmodel());

+

+		// Create native BaSyx TCP server using default port

+		BaSyxTCPServer<VABHashmapProvider> tcpServer = new BaSyxTCPServer<VABHashmapProvider>(modelProvider, 6998);

+

+		// Start TCP server

+		tcpServer.start();

+

+		// Wait until TCP server completes (which will never happen) or do something else meaningful

+		try {tcpServer.join();} catch (InterruptedException e) {e.printStackTrace();}

+	}

+}

diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/ExampleDirectory.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/ExampleDirectory.java
new file mode 100644
index 0000000..619a91f
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/ExampleDirectory.java
@@ -0,0 +1,24 @@
+package examples.controllingdevice.submodel.object;

+

+import org.eclipse.basyx.aas.impl.services.PreconfiguredDirectory;

+

+

+

+

+/**

+ * Implement a directory for the example setting

+ * 

+ * @author kuhn

+ *

+ */

+public class ExampleDirectory extends PreconfiguredDirectory {

+

+

+	/**

+	 * Constructor - load all directory entries

+	 */

+	public ExampleDirectory() {

+		// VAB Element mapping

+		addMapping("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#002", "localhost:6998");

+	}	

+}

diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/RunExample.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/RunExample.java
new file mode 100644
index 0000000..021f76f
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/RunExample.java
@@ -0,0 +1,42 @@
+package examples.controllingdevice.submodel.object;

+

+import org.eclipse.basyx.aas.backend.connector.basyx.BaSyxConnectorProvider;

+import org.eclipse.basyx.vab.core.VABConnectionManager;

+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;

+import org.junit.Test;

+

+

+

+/**

+ * Run example for controlling device (SubModel/BaSyx TCP)

+ * 

+ * @author kuhn

+ *

+ */

+public class RunExample {

+

+	

+	/**

+	 * VAB connection manager backend

+	 */

+	protected VABConnectionManager connManager = new VABConnectionManager(new ExampleDirectory(), new BaSyxConnectorProvider());

+

+	

+	

+	/**

+	 * Test basic queries

+	 */

+	@Test

+	public void test() throws Exception {

+

+		// Server connections

+		// - Connect to AAS server

+		VABElementProxy connSubModel = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#002");

+		

+		// Device updates status to ready

+		Object devState = connSubModel.readElementValue("properties/deviceStatus/value");

+		

+		// Output device status

+		System.out.println("Status:"+devState);

+	}

+}

diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/DeviceStatusVABObject.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/DeviceStatusVABObject.java
new file mode 100644
index 0000000..40b6f82
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/DeviceStatusVABObject.java
@@ -0,0 +1,37 @@
+package examples.controllingdevice.vab.object;

+

+import java.util.HashMap;

+import java.util.Map;

+

+

+

+/**

+ * A device status VAB object that does not conform to the sub model meta model. 

+ * 

+ * @author kuhn

+ *

+ */

+public class DeviceStatusVABObject extends HashMap<String, Object> {

+

+	

+	/**

+	 * Version of serialized instances

+	 */

+	private static final long serialVersionUID = -1339664424451243526L;

+

+	

+	/**

+	 * Constructor

+	 */

+	public DeviceStatusVABObject() {

+		

+		// Create contained property map

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

+		// - Create device status and mode property

+		propertyMap.put("deviceStatus", new String("offline"));

+		propertyMap.put("mode", new String("idle"));

+

+		// Put properties into 'elements' map of this provider

+		put("properties", propertyMap);

+	}

+}

diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/ExampleDirectory.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/ExampleDirectory.java
new file mode 100644
index 0000000..6695f14
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/ExampleDirectory.java
@@ -0,0 +1,27 @@
+package examples.controllingdevice.vab.object;

+

+import org.eclipse.basyx.aas.impl.services.PreconfiguredDirectory;

+

+

+

+

+/**

+ * Implement a pre-configured directory service. This is most helpful for static topologies or test setups.

+ * 

+ * @author kuhn

+ *

+ */

+public class ExampleDirectory extends PreconfiguredDirectory {

+

+	

+	/**

+	 * Constructor - load all directory entries

+	 */

+	public ExampleDirectory() {

+		// Define mappings

+		// - Device sub model (VAB)

+		addMapping("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#003",  "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/devicestatusVAB/");

+		// - Device sub model (SM)

+		addMapping("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#004",  "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/devicestatusSM/");

+	}	

+}

diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/RunExample.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/RunExample.java
new file mode 100644
index 0000000..f12ce07
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/RunExample.java
@@ -0,0 +1,75 @@
+package examples.controllingdevice.vab.object;

+

+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;

+import org.eclipse.basyx.vab.core.VABConnectionManager;

+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;

+import org.junit.Test;

+

+

+

+/**

+ * Run example for controlling device (SubModel/BaSyx TCP)

+ * 

+ * @author kuhn

+ *

+ */

+public class RunExample {

+

+	

+	/**

+	 * VAB connection manager backend

+	 */

+	protected VABConnectionManager connManager = new VABConnectionManager(new ExampleDirectory(), new HTTPConnectorProvider());

+

+	

+	

+	/**

+	 * Test basic queries

+	 */

+	@Test

+	public void test() throws Exception {

+

+		// Server connections

+		// - Connect to device (VAB object)

+		VABElementProxy connSubModel1 = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#003");

+

+		// Read status from device

+		Object devState1 = connSubModel1.readElementValue("properties/deviceStatus");

+		// - Output device status

+		System.out.println("Status1:"+devState1);

+

+		// Read mode from device

+		Object devMode1a = connSubModel1.readElementValue("properties/mode");

+		// - Output device mode

+		System.out.println("Mode1a:"+devMode1a);

+		// - Update device mode

+		connSubModel1.updateElementValue("properties/mode", "start");

+		// Read mode from device again

+		Object devMode1b = connSubModel1.readElementValue("properties/mode");

+		// - Output device mode again

+		System.out.println("Mode1b:"+devMode1b);

+

+		

+

+		// Server connections

+		// - Connect to device (sub model)

+		VABElementProxy connSubModel2 = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#004");

+

+		// Read status from device

+		Object devState2 = connSubModel2.readElementValue("properties/deviceStatus/value");

+		// - Output device status

+		System.out.println("Status2:"+devState2);

+		

+		// Read mode from device

+		Object devMode2a = connSubModel2.readElementValue("properties/mode/value");

+		// - Output device mode

+		System.out.println("Mode2a:"+devMode2a);

+		// - Update device mode

+		connSubModel2.updateElementValue("properties/mode/value", "start");

+		// Read mode from device again

+		Object devMode2b = connSubModel2.readElementValue("properties/mode/value");

+		// - Output device mode again

+		System.out.println("Mode2b:"+devMode2b);

+	}

+}

+

diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleSubmodelServlet.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleSubmodelServlet.java
new file mode 100644
index 0000000..02d1889
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleSubmodelServlet.java
@@ -0,0 +1,32 @@
+package examples.controllingdevice.vab.object;
+
+import org.eclipse.basyx.vab.backend.server.http.VABHTTPInterface;
+import org.eclipse.basyx.vab.provider.hashmap.VABHashmapProvider;
+
+import examples.controllingdevice.submodel.object.DeviceStatusSubmodel;
+
+
+
+/**
+ * Servlet interface for VAB elements, e.g. AAS, sub model, or other VAB objects
+ * 
+ * @author kuhn
+ *
+ */
+public class SimpleSubmodelServlet extends VABHTTPInterface<VABHashmapProvider> {
+
+	
+	/**
+	 * Version information to identify the version of serialized instances
+	 */
+	private static final long serialVersionUID = 1L;
+
+	
+	/**
+	 * Constructor
+	 */
+	public SimpleSubmodelServlet() {
+		// Invoke base constructor, instantiate device status sub model
+		super(new VABHashmapProvider(new DeviceStatusSubmodel()));
+	}
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleVABElementServlet.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleVABElementServlet.java
new file mode 100644
index 0000000..4b49c86
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleVABElementServlet.java
@@ -0,0 +1,30 @@
+package examples.controllingdevice.vab.object;
+
+import org.eclipse.basyx.vab.backend.server.http.VABHTTPInterface;
+import org.eclipse.basyx.vab.provider.hashmap.VABHashmapProvider;
+
+
+
+/**
+ * Servlet interface for VAB elements, e.g. AAS, sub model, or other VAB objects
+ * 
+ * @author kuhn
+ *
+ */
+public class SimpleVABElementServlet extends VABHTTPInterface<VABHashmapProvider> {
+
+	
+	/**
+	 * Version information to identify the version of serialized instances
+	 */
+	private static final long serialVersionUID = 1L;
+
+	
+	/**
+	 * Constructor
+	 */
+	public SimpleVABElementServlet() {
+		// Invoke base constructor, instantiate a device status VAB object
+		super(new VABHashmapProvider(new DeviceStatusVABObject()));
+	}
+}
diff --git a/examples/basys.examples/examples/examples/deviceaas/RunExample.java b/examples/basys.examples/examples/examples/deviceaas/RunExample.java
new file mode 100644
index 0000000..38f1b23
--- /dev/null
+++ b/examples/basys.examples/examples/examples/deviceaas/RunExample.java
@@ -0,0 +1,127 @@
+package examples.deviceaas;

+

+import java.util.HashMap;

+import java.util.Map;

+

+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;

+import org.eclipse.basyx.aas.backend.http.tools.JSONTools;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.SubModel_;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;

+import org.eclipse.basyx.tools.webserviceclient.WebServiceRawClient;

+import org.eclipse.basyx.vab.core.VABConnectionManager;

+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;

+import org.junit.Test;

+

+import basys.examples.aasdescriptor.AASDescriptor;

+import basys.examples.aasdescriptor.SubmodelDescriptor;

+import basys.examples.urntools.ModelUrn;

+import org.json.JSONObject;

+import examples.directory.ExamplesDirectory;

+

+

+

+/**

+ * Run example for device AAS

+ * 

+ * @author kuhn

+ *

+ */

+public class RunExample {

+

+	

+	/**

+	 * VAB connection manager backend

+	 */

+	protected VABConnectionManager connManager = new VABConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());

+

+	

+	

+	/**

+	 * Test basic queries

+	 */

+	@SuppressWarnings("unchecked")

+	@Test

+	public void test() throws Exception {

+

+		// Server connections

+		// - Connect to AAS server

+		VABElementProxy connSubModel = this.connManager.connectToVABElement("AASServer");

+		// - Invoke BaSyx service calls via web services

+		WebServiceRawClient client = new WebServiceRawClient();

+		// - Directory web service URL

+		String wsURL = "http://localhost:8080/basys.components/Testsuite/Directory/SQL";

+		// - AAS repository server URL

+		String aasSrvURL = "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver";

+

+		

+		

+		// Create device AAS

+		// - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)

+		ModelUrn deviceAASID = new ModelUrn("de.FHG", "devices.es.iese", "aas", "1.0", "3", "x-509", "001");

+		// - Create device AAS

+		AssetAdministrationShell_ aas = new AssetAdministrationShell_();

+		aas.put("idShort", "DeviceIDShort");

+		// - AAS URL on server

+		String aasURLOnServer = "/aas/submodels/aasRepository/"+deviceAASID.getEncodedURN();

+		// - Transfer device AAS to server

+		connSubModel.createElement(aasURLOnServer, aas);

+

+		

+		// The device also brings a sub model structure with an own ID that is being pushed on the server

+		ModelUrn deviceStatusSMID = new ModelUrn("de.FHG", "devices.es.iese", "statusSM", "1.0", "3", "x-509", "001");

+		// - Create generic sub model 

+		SubModel_ statusSM = new SubModel_();

+		((Map<String, Object>) statusSM.get("properties")).put("status", "offline");

+		// - Sub model URL on server

+		String statusSubmodelURLOnServer = "/aas/submodels/aasRepository/"+deviceStatusSMID.getEncodedURN();

+		// - Transfer device sub model to server

+		connSubModel.createElement(statusSubmodelURLOnServer, statusSM);

+		

+		

+		// The device also brings a sub model structure with an own ID that is being pushed on the server

+		ModelUrn deviceControllerSMID = new ModelUrn("jp.orin", "devices.orin", "controllerSM", "1.0", "3", "x-509", "001");

+		// - Create generic sub model 

+		SubModel_ controllerSM = new SubModel_();

+		//   - Create sub model contents

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

+		((Map<String, Object>) controllerSM.get("properties")).put("controllers", listOfControllers);

+		// - Sub model URL on server

+		String controllerSubmodelURLOnServer = "/aas/submodels/aasRepository/"+deviceControllerSMID.getEncodedURN();

+		// - Transfer device sub model to server

+		connSubModel.createElement(controllerSubmodelURLOnServer, controllerSM);

+

+		

+		

+		// Register AAS and sub models in directory (push AAS descriptor to server)

+		// - Create an AAS descriptor

+		AASDescriptor deviceAASDescriptor = new AASDescriptor(deviceAASID.getURN(), Identification.URI, aasSrvURL+aasURLOnServer);

+		// - Add a sub model descriptor for device

+		SubmodelDescriptor deviceStatusSubmodelDescriptor = new SubmodelDescriptor(deviceStatusSMID.getURN(), Identification.URI, aasSrvURL+statusSubmodelURLOnServer);

+		deviceAASDescriptor.addSubmodelDescriptor(deviceStatusSubmodelDescriptor);

+		SubmodelDescriptor deviceControllerSubmodelDescriptor = new SubmodelDescriptor(deviceControllerSMID.getURN(), Identification.URI, aasSrvURL+controllerSubmodelURLOnServer);

+		deviceAASDescriptor.addSubmodelDescriptor(deviceControllerSubmodelDescriptor);

+		// - Push AAS descriptor to server

+		client.post(wsURL+"/api/v1/registry", JSONTools.Instance.serialize(deviceAASDescriptor).toString());

+

+		

+		// Device updates status to ready

+		connSubModel.updateElementValue(statusSubmodelURLOnServer+"/properties/status", "ready");

+		

+

+		// Lookup device AAS

+		// - Lookup AAS from AAS directory, get AAS descriptor

+		String jsonData = client.get(wsURL+"/api/v1/registry/"+deviceAASID.getEncodedURN());

+		// - Read AAS end point from AAS descriptor

+		AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));

+		// - Get information about status sub model

+		SubmodelDescriptor smDescriptor = aasDescriptor.getSubModelDescriptor(deviceStatusSMID.getURN());

+		

+		

+		// Connect to status sub model end point

+		VABElementProxy connSM = connManager.connectToVABElementByURL(smDescriptor.getFirstEndpoint());

+		Map<String, Object> deviceSM = (Map<String, Object>) connSM.readElementValue("/");

+		// - Output status information

+		System.out.println("ReadBack:"+((Map<String, Object>) deviceSM.get("properties")).get("status"));

+	}

+}

diff --git a/examples/basys.examples/examples/examples/deviceaas/RunExampleSimpleAPIManualRegistry.java b/examples/basys.examples/examples/examples/deviceaas/RunExampleSimpleAPIManualRegistry.java
new file mode 100644
index 0000000..c295d9a
--- /dev/null
+++ b/examples/basys.examples/examples/examples/deviceaas/RunExampleSimpleAPIManualRegistry.java
@@ -0,0 +1,126 @@
+package examples.deviceaas;

+

+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;

+import org.eclipse.basyx.aas.metamodel.hashmap.VABModelMap;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.SubModel_;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;

+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;

+import org.junit.Test;

+

+import basys.examples.aasdescriptor.AASDescriptor;

+import basys.examples.aasdescriptor.SubmodelDescriptor;

+import basys.examples.frontend.client.connmanager.BaSysConnectionManager;

+import basys.examples.frontend.client.connmanager.ModelServerProxy;

+import basys.examples.frontend.client.proxies.AASRegistryProxy;

+import basys.examples.urntools.ModelUrn;

+import examples.directory.ExamplesDirectory;

+

+

+

+/**

+ * Run example for device AAS

+ * 

+ * @author kuhn

+ *

+ */

+public class RunExampleSimpleAPIManualRegistry {

+

+	

+	/**

+	 * BaSys connection manager backend

+	 */

+	protected BaSysConnectionManager connManager = new BaSysConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());

+

+	

+	

+	/**

+	 * Test basic queries

+	 */

+	@Test @SuppressWarnings("unchecked")

+	public void test() throws Exception {

+

+		// Server connections

+		// - Connect to AAS server

+		//VABElementProxy connSubModel = this.connManager.connectToVABElement("AASServer");

+		ModelServerProxy modelServer    = this.connManager.connectToModelServer("AASServer");

+		// - Invoke BaSyx service calls via web services

+		//WebServiceRawClient client = new WebServiceRawClient();

+		// - Directory web service URL

+		//String wsURL = "http://localhost:8080/basys.components/Testsuite/Directory/SQL";

+		// - AAS repository server URL

+		//String aasSrvURL = "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver";

+

+		

+		// Instantiate AAS registry proxy

+		AASRegistryProxy registry = new AASRegistryProxy("http://localhost:8080/basys.components/Testsuite/Directory/SQL");

+		

+		

+		// Create device AAS

+		// - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)

+		ModelUrn deviceAASID = new ModelUrn("de.FHG", "devices.es.iese", "aas", "1.0", "3", "x-509", "001");

+		// - Create device AAS

+		AssetAdministrationShell_ aas = new AssetAdministrationShell_();

+		aas.put("idShort", "DeviceIDShort");

+		// - Push AAS to model repository

+		modelServer.pushToServer(deviceAASID, aas);

+		// - AAS URL on server

+		//String aasURLOnServer = "/aas/submodels/aasRepository/"+deviceAASID.getEncodedURN();

+		// - Transfer device AAS to server

+		//connSubModel.createElement(aasURLOnServer, aas);

+

+		

+		// The device also brings a sub model structure with an own ID that is being pushed on the server

+		ModelUrn deviceStatusSMID = new ModelUrn("de.FHG", "devices.es.iese", "statusSM", "1.0", "3", "x-509", "001");

+		// - Create generic sub model 

+		SubModel_ statusSM = new SubModel_();

+		statusSM.putPath("properties/status", "offline");

+		//((Map<String, Object>) statusSM.get("properties")).put("status", "offline");

+		// - Push static sub model to model repository

+		modelServer.pushToServer(deviceStatusSMID, statusSM);

+		// - Sub model URL on server

+		//String statusSubmodelURLOnServer = "/aas/submodels/aasRepository/"+deviceStatusSMID.getEncodedURN();

+		// - Transfer device sub model to server

+		//connSubModel.createElement(statusSubmodelURLOnServer, statusSM);

+		

+		

+		// Register AAS and sub models in directory (push AAS descriptor to server)

+		// - Create an AAS descriptor

+		//AASDescriptor deviceAASDescriptor = new AASDescriptor(deviceAASID.getURN(), Identification.URI, aasSrvURL+aasURLOnServer);

+		AASDescriptor deviceAASDescriptor = new AASDescriptor(deviceAASID.getURN(), Identification.URI, modelServer.getURLToModel(deviceAASID));

+		// - Add a sub model descriptor for device

+		SubmodelDescriptor deviceStatusSubmodelDescriptor = new SubmodelDescriptor(deviceStatusSMID.getURN(), Identification.URI, modelServer.getURLToModel(deviceStatusSMID));

+		deviceAASDescriptor.addSubmodelDescriptor(deviceStatusSubmodelDescriptor);

+		// - Push AAS descriptor to server

+		//client.post(wsURL+"/api/v1/registry", JSONTools.Instance.serialize(deviceAASDescriptor).toString());

+		registry.register(deviceAASDescriptor);

+		

+		

+		// Device updates status to ready

+		//connSubModel.updateElementValue(statusSubmodelURLOnServer+"/properties/status", "ready");

+		modelServer.updateElementValue(deviceStatusSMID, "/properties/status", "ready");

+		// - Read updated status back

+		modelServer.readElementValue(deviceStatusSMID, "/properties/status");

+		

+

+		// Lookup device AAS

+		// - Lookup AAS from AAS directory, get AAS descriptor

+		//String jsonData = client.get(wsURL+"/api/v1/registry/"+deviceAASID.getEncodedURN());

+		// - Read AAS end point from AAS descriptor

+		//AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));

+		AASDescriptor aasDescriptor = registry.lookup(deviceAASID);

+		// - Get information about status sub model

+		SubmodelDescriptor smDescriptor = aasDescriptor.getSubModelDescriptor(deviceStatusSMID.getURN());

+		

+		

+		// Connect to status sub model end point

+		// - FIXME - we need the ability to connect to an absolute URL here

+		//Map<String, Object> deviceSM = (Map<String, Object>) connSubModel.readElementValue(statusSubmodelURLOnServer);

+		//Map<String, Object> deviceSM = (Map<String, Object>) connSubModel.readElementValue(smDescriptor.getFirstEndpoint());

+		VABElementProxy connSubModel = connManager.connectToVABElementByURL(smDescriptor.getFirstEndpoint());

+		VABModelMap<Object> deviceSM = (VABModelMap<Object>) connSubModel.readElementValue("/");

+		// - Output status information

+		//System.out.println("ReadBack:"+((Map<String, Object>) deviceSM.get("properties")).get("status"));

+		System.out.println("ReadBack:"+deviceSM.getPath("properties/status"));

+	}

+}

diff --git a/examples/basys.examples/examples/examples/productaas/RunExample.java b/examples/basys.examples/examples/examples/productaas/RunExample.java
new file mode 100644
index 0000000..2f9300d
--- /dev/null
+++ b/examples/basys.examples/examples/examples/productaas/RunExample.java
@@ -0,0 +1,89 @@
+package examples.productaas;

+

+import java.util.Map;

+

+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;

+import org.eclipse.basyx.aas.backend.http.tools.JSONTools;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;

+import org.eclipse.basyx.tools.webserviceclient.WebServiceRawClient;

+import org.eclipse.basyx.vab.core.VABConnectionManager;

+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;

+import org.json.JSONObject;

+import org.junit.Test;

+

+import basys.examples.aasdescriptor.AASDescriptor;

+import basys.examples.urntools.ModelUrn;

+import examples.directory.ExamplesDirectory;

+

+

+

+/**

+ * Run example for product AAS

+ * 

+ * @author kuhn

+ *

+ */

+public class RunExample {

+

+	

+	/**

+	 * VAB connection manager backend

+	 */

+	protected VABConnectionManager connManager = new VABConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());

+

+	

+	

+	/**

+	 * Test basic queries

+	 */

+	@SuppressWarnings("unchecked")

+	@Test

+	public void test() throws Exception {

+

+		// Server connections

+		// - Connect to AAS server

+		VABElementProxy connSubModel = this.connManager.connectToVABElement("AASServer");

+		// - Invoke BaSyx service calls via web services

+		WebServiceRawClient client = new WebServiceRawClient();

+		// - Directory web service URL

+		String wsURL = "http://localhost:8080/basys.components/Testsuite/Directory/SQL";

+		// - AAS repository server URL

+		String aasSrvURL = "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver";

+

+		

+		

+		// Create product AAS

+		// - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)

+		ModelUrn productID = new ModelUrn("de.FHG", "products.es.iese", "aas", "1.0", "3", "product1", null);

+		// - Create map with complex type

+		AssetAdministrationShell_ aas = new AssetAdministrationShell_();

+		aas.put("idShort", "ProductIDShort");

+		// - AAS URL on server

+		String aasURLOnServer = "/aas/submodels/aasRepository/"+productID.getEncodedURN();

+		// - Create AAS structure on server

+		connSubModel.createElement(aasURLOnServer, aas);

+

+

+		// Register AAS in directory (push AAS descriptor to server)

+		// - Create an AAS descriptor

+		AASDescriptor productAASDescriptor = new AASDescriptor(productID.getURN(), Identification.URI, aasSrvURL+aasURLOnServer);

+		// - Push AAS descriptor to server

+		client.post(wsURL+"/api/v1/registry", JSONTools.Instance.serialize(productAASDescriptor).toString());

+

+		

+		// Lookup AAS

+		// - Lookup AAS from AAS directory, get AAS descriptor

+		String jsonData = client.get(wsURL+"/api/v1/registry/"+productID.getEncodedURN());

+		// - Read AAS end point from AAS descriptor

+		AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));

+		System.out.println("Endpoint:"+aasDescriptor.getFirstEndpoint());

+		

+		

+		// Connect to AAS end point

+		VABElementProxy connSM = connManager.connectToVABElementByURL(aasDescriptor.getFirstEndpoint());

+		Map<String, Object> productAAS = (Map<String, Object>) connSM.readElementValue("");

+		// - Read product AAS from server

+		System.out.println("ReadBack:"+productAAS.get("idShort"));

+	}

+}

diff --git a/examples/basys.examples/examples/examples/productaas/RunExampleSimpleAPI.java b/examples/basys.examples/examples/examples/productaas/RunExampleSimpleAPI.java
new file mode 100644
index 0000000..fef42bf
--- /dev/null
+++ b/examples/basys.examples/examples/examples/productaas/RunExampleSimpleAPI.java
@@ -0,0 +1,80 @@
+package examples.productaas;

+

+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;

+import org.eclipse.basyx.aas.metamodel.hashmap.VABModelMap;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;

+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;

+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;

+import org.junit.Test;

+

+import basys.examples.aasdescriptor.AASDescriptor;

+import basys.examples.frontend.client.connmanager.BaSysConnectionManager;

+import basys.examples.frontend.client.connmanager.ModelServerProxy;

+import basys.examples.frontend.client.proxies.AASRegistryProxy;

+import basys.examples.urntools.ModelUrn;

+import examples.directory.ExamplesDirectory;

+

+

+

+/**

+ * Run example for product AAS

+ * 

+ * @author kuhn

+ *

+ */

+public class RunExampleSimpleAPI {

+

+	

+	/**

+	 * VAB connection manager backend

+	 */

+	protected BaSysConnectionManager connManager = new BaSysConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());

+

+	

+	

+	/**

+	 * Test basic queries

+	 */

+	@SuppressWarnings("unchecked")

+	@Test

+	public void test() throws Exception {

+

+		// Server connections

+		// - Connect to AAS server

+		ModelServerProxy modelServer = this.connManager.connectToModelServer("AASServer");

+

+		

+		// Instantiate AAS registry proxy

+		AASRegistryProxy registry = new AASRegistryProxy("http://localhost:8080/basys.components/Testsuite/Directory/SQL");

+		

+		

+		// Create product AAS

+		// - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)

+		ModelUrn productID = new ModelUrn("de.FHG", "products.es.iese", "aas", "1.0", "3", "product1", null);

+		// - Create map with complex type

+		AssetAdministrationShell_ aas = new AssetAdministrationShell_();

+		aas.put("idShort", "ProductIDShort");

+		// - Push AAS to model repository

+		modelServer.pushToServer(productID, aas);

+

+

+		// Register AAS in directory (push AAS descriptor to server)

+		// - Create an AAS descriptor

+		AASDescriptor productAASDescriptor = new AASDescriptor(productID.getURN(), Identification.URI, modelServer.getURLToModel(productID));

+		// - Push AAS descriptor to server

+		registry.register(productAASDescriptor);

+

+		

+		// Lookup AAS

+		// - Read AAS end point from AAS descriptor

+		AASDescriptor aasDescriptor = registry.lookup(productID);

+		System.out.println("Endpoint:"+aasDescriptor.getFirstEndpoint());

+

+

+		// Connect to AAS end point

+		VABElementProxy connSubModel = connManager.connectToVABElementByURL(aasDescriptor.getFirstEndpoint());

+		VABModelMap<Object> productAAS = (VABModelMap<Object>) connSubModel.readElementValue("/");

+		// - Read product AAS from server

+		System.out.println("ReadBack:"+productAAS.get("idShort"));

+	}

+}

diff --git a/examples/basys.examples/pom.xml b/examples/basys.examples/pom.xml
new file mode 100644
index 0000000..4070d6f
--- /dev/null
+++ b/examples/basys.examples/pom.xml
@@ -0,0 +1,273 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

+  <modelVersion>4.0.0</modelVersion>

+  <groupId>basys.examples</groupId>

+  <artifactId>basys.examples</artifactId>

+  <version>0.0.1-SNAPSHOT</version>

+  <packaging>war</packaging>

+  <repositories>

+	  <repository>

+	    <id>data-local</id>

+	    <name>data</name>

+	    <url>file://${project.basedir}/repo</url>

+	  </repository>

+	</repositories>

+

+   <build>

+    <sourceDirectory></sourceDirectory>

+    

+     <resources>

+      <resource>

+       <directory>src</directory>

+		 <excludes>

+          <exclude>**/*.java</exclude>

+        </excludes>

+      </resource>

+      <resource>

+       <directory>servlets</directory>

+        <excludes>

+          <exclude>**/*.java</exclude>

+        </excludes>

+      </resource>

+      <resource>

+       <directory>examples</directory>

+        <excludes>

+          <exclude>**/*.java</exclude>

+        </excludes>

+      </resource>

+      <resource>

+       <directory>directory</directory>

+        <excludes>

+          <exclude>**/*.java</exclude>

+        </excludes>

+      </resource>

+     </resources>

+    

+    <testSourceDirectory>

+    		${project.basedir}/examples

+    </testSourceDirectory>

+    

+    <plugins>

+      <plugin>

+        <artifactId>maven-compiler-plugin</artifactId>

+        <version>3.7.0</version>

+        <configuration>

+          <source>1.8</source>

+          <target>1.8</target>

+          <compilerArgument>-proc:none</compilerArgument>

+        </configuration>

+      </plugin>

+      

+	 <plugin>

+        <artifactId>maven-war-plugin</artifactId>

+        <version>3.0.0</version>

+    <!--     <configuration>

+          <warSourceDirectory>WebContent</warSourceDirectory>

+        </configuration> -->

+      </plugin> 

+      

+      <plugin>

+         <groupId>org.apache.maven.plugins</groupId>

+         <artifactId>maven-surefire-plugin</artifactId>

+         <!-- <version>2.12.1</version> -->

+         <version>2.4.2</version>

+          <configuration>

+    		<excludes>

+      			<exclude>**/*HTTP*</exclude>

+      			<exclude>**/*TCP*</exclude>

+    		</excludes>

+  		 </configuration>

+       </plugin>

+       

+       <plugin>

+		  <groupId>org.apache.maven.plugins</groupId>

+		  <artifactId>maven-failsafe-plugin</artifactId>

+		  <version>2.12.4</version>

+		  <configuration>

+		    <includes>

+		      <include>**/*HTTP*</include>

+		      <include>**/*TCP*</include>

+		    </includes>

+		  </configuration>

+		  <executions>

+		    <execution>

+		      <goals>

+		        <goal>integration-test</goal>

+		        <goal>verify</goal>

+		      </goals>

+		    </execution>

+		  </executions>

+		</plugin>   

+    </plugins>

+  </build>

+  

+  <dependencies>

+	 

+		

+		<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->

+	      <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->

+		  <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client -->

+		<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->

+		<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina (Tomcat 8, not 9) -->

+		

+		<dependency>

+	  		<groupId>org.json</groupId>

+	  		<artifactId>json</artifactId>

+	  		<version>20180813</version>

+	  	<!-- 	<scope>provided</scope> -->

+	  	</dependency>

+		

+		<!--  Dependencies removed from Classpath -->

+		<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->

+		<dependency>

+		    <groupId>org.postgresql</groupId>

+		    <artifactId>postgresql</artifactId>

+		    <version>42.2.2</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/org.glassfish.hk2.external/aopalliance-repackaged -->

+		<dependency>

+		    <groupId>org.glassfish.hk2.external</groupId>

+		    <artifactId>aopalliance-repackaged</artifactId>

+		    <version>2.5.0-b42</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.enterprise/cdi-api -->

+		<dependency>

+		    <groupId>javax.enterprise</groupId>

+		    <artifactId>cdi-api</artifactId>

+		    <version>2.0</version>

+		    <scope>provided</scope>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.el/el-api -->

+		<dependency>

+		    <groupId>javax.el</groupId>

+		    <artifactId>el-api</artifactId>

+		    <version>2.2</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/org.glassfish.hk2/hk2-api -->

+		<dependency>

+		    <groupId>org.glassfish.hk2</groupId>

+		    <artifactId>hk2-api</artifactId>

+		    <version>2.5.0</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javassist/javassist -->

+		<dependency>

+		    <groupId>javassist</groupId>

+		    <artifactId>javassist</artifactId>

+		    <version>3.12.1.GA</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->

+		<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->

+		<dependency>

+		    <groupId>javax.inject</groupId>

+		    <artifactId>javax.inject</artifactId>

+		    <version>1</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.json/javax.json-api -->

+		<dependency>

+		    <groupId>javax.json</groupId>

+		    <artifactId>javax.json-api</artifactId>

+		    <version>1.0</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->

+		<dependency>

+		    <groupId>javax.xml.bind</groupId>

+		    <artifactId>jaxb-api</artifactId>

+		    <version>2.3.0</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/org.jboss.spec.javax.interceptor/jboss-interceptors-api_1.1_spec -->

+		<dependency>

+		    <groupId>org.jboss.spec.javax.interceptor</groupId>

+		    <artifactId>jboss-interceptors-api_1.1_spec</artifactId>

+		    <version>1.0.1.Final</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->

+		<dependency>

+		    <groupId>javax.annotation</groupId>

+		    <artifactId>javax.annotation-api</artifactId>

+		    <version>1.3.2</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/org.osgi/org.osgi.core -->

+		<dependency>

+		    <groupId>org.osgi</groupId>

+		    <artifactId>org.osgi.core</artifactId>

+		    <version>4.2.0</version>

+		    <scope>provided</scope>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/org.glassfish.hk2/osgi-resource-locator -->

+		<dependency>

+		    <groupId>org.glassfish.hk2</groupId>

+		    <artifactId>osgi-resource-locator</artifactId>

+		    <version>1.0.1</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api -->

+		<dependency>

+		    <groupId>javax.persistence</groupId>

+		    <artifactId>persistence-api</artifactId>

+		    <version>1.0.2</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->

+		<dependency>

+		    <groupId>javax.validation</groupId>

+		    <artifactId>validation-api</artifactId>

+		    <version>2.0.1.Final</version>

+		</dependency>

+		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

+		<dependency>

+		    <groupId>javax.servlet</groupId>

+		    <artifactId>javax.servlet-api</artifactId>

+		    <version>3.1.0</version>

+		    <scope>provided</scope>

+		</dependency>

+		

+		<!-- https://mvnrepository.com/artifact/org.eclipse/yasson -->

+		<dependency>

+		    <groupId>org.eclipse</groupId>

+		    <artifactId>yasson</artifactId>

+		    <version>1.0.2</version>

+		</dependency>

+		

+		<!-- https://mvnrepository.com/artifact/javax.xml.xquery/xqj-api (Add from local repository because jar cannot be found on maven central -->

+		<dependency>

+		    <groupId>javax.xml.xquery</groupId>

+		    <artifactId>xqj-api</artifactId>

+		    <version>1.0</version>

+		</dependency>

+		

+		<!-- https://mvnrepository.com/artifact/net.sf.saxon/saxon-xqj -->

+		<!-- <dependency>

+		    <groupId>net.sf.saxon</groupId>

+		    <artifactId>saxon-xqj</artifactId>

+		    <version>9.x</version>

+		</dependency> -->

+		

+		<!-- https://mvnrepository.com/artifact/net.sf.saxon/saxon-xqj -->

+		<dependency>

+		    <groupId>net.sf.saxon</groupId>

+		    <artifactId>saxon-xqj</artifactId>

+		    <version>8.9</version>

+		</dependency>

+				

+		

+		<!-- https://mvnrepository.com/artifact/net.sf.saxon/Saxon-HE -->

+		<dependency>

+		    <groupId>net.sf.saxon</groupId>

+		    <artifactId>Saxon-HE</artifactId>

+		    <version>9.5.1-5</version>

+		</dependency>

+				

+	

+		<!-- Add BaSys SDK from local repository. Maven build of SDK must generate a jar and place it into the repository to update -->

+		<dependency>

+			<groupId>basys.sdk</groupId>

+			<artifactId>basys.sdk</artifactId>

+			<version>0.0.1-SNAPSHOT</version>

+		</dependency>

+		

+		<!-- Add BaSys components from local repository. Maven build of SDK must generate a jar and place it into the repository to update -->

+		<dependency>

+			<groupId>basys.components</groupId>

+			<artifactId>basys.components</artifactId>

+			<version>0.0.1-SNAPSHOT</version>

+		</dependency>

+

+  </dependencies>

+</project>
\ No newline at end of file
diff --git a/examples/basys.examples/repo/basys/components/basys.components/0.0.1-SNAPSHOT/.gitignore b/examples/basys.examples/repo/basys/components/basys.components/0.0.1-SNAPSHOT/.gitignore
new file mode 100644
index 0000000..fddf610
--- /dev/null
+++ b/examples/basys.examples/repo/basys/components/basys.components/0.0.1-SNAPSHOT/.gitignore
@@ -0,0 +1 @@
+/basys.components-0.0.1-SNAPSHOT.jar
diff --git a/examples/basys.examples/repo/basys/sdk/basys.sdk/0.0.1-SNAPSHOT/.gitignore b/examples/basys.examples/repo/basys/sdk/basys.sdk/0.0.1-SNAPSHOT/.gitignore
new file mode 100644
index 0000000..0d11971
--- /dev/null
+++ b/examples/basys.examples/repo/basys/sdk/basys.sdk/0.0.1-SNAPSHOT/.gitignore
@@ -0,0 +1 @@
+/basys.sdk-0.0.1-SNAPSHOT.jar
diff --git a/examples/basys.examples/src/basys/examples/frontend/client/connmanager/BaSysConnectionManager.java b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/BaSysConnectionManager.java
new file mode 100644
index 0000000..e56500e
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/BaSysConnectionManager.java
@@ -0,0 +1,51 @@
+package basys.examples.frontend.client.connmanager;

+

+import org.eclipse.basyx.vab.core.IConnectorProvider;

+import org.eclipse.basyx.vab.core.IDirectoryService;

+import org.eclipse.basyx.vab.core.VABConnectionManager;

+

+

+

+

+

+/**

+ * Connection manager that creates BaSys specific connections on request

+ * 

+ * @author kuhn

+ *

+ */

+public class BaSysConnectionManager extends VABConnectionManager {

+

+	

+	/**

+	 * Constructor

+	 * 

+	 * @param networkDirectoryService Directory service provider

+	 * @param providerProvider        Connection provider

+	 */

+	public BaSysConnectionManager(IDirectoryService networkDirectoryService, IConnectorProvider providerProvider) {

+		// Invoke base constructor

+		super(networkDirectoryService, providerProvider);

+	}

+

+

+

+	/**

+	 * Connect to an model provider server

+	 * 

+	 * Model provider servers are network repositories that store models and enable access to them.

+	 * 

+	 * @param urn the URN that describes the model provider server 

+	 */

+	public ModelServerProxy connectToModelServer(String urn) {

+		// Get AAS from directory

+		String addr = null;

+

+		// Lookup address in directory server

+		addr = directoryService.lookup(urn);

+

+		// Return a new ModelServerProxy

+		return new ModelServerProxy(addr, providerProvider.getConnector(addr));

+	}

+}

+

diff --git a/examples/basys.examples/src/basys/examples/frontend/client/connmanager/ModelServerProxy.java b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/ModelServerProxy.java
new file mode 100644
index 0000000..0c66cca
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/ModelServerProxy.java
@@ -0,0 +1,117 @@
+package basys.examples.frontend.client.connmanager;

+

+import java.util.HashMap;

+

+import org.eclipse.basyx.vab.core.IModelProvider;

+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;

+

+import basys.examples.urntools.ModelUrn;

+

+

+

+/**

+ * Proxy class for connecting to a model server.

+ * 

+ * Model servers provide static data models to the VAB. this class hides the nasty details to communicate via VAB primitives with model servers. 

+ * 

+ * @author kuhn

+ *

+ */

+public class ModelServerProxy extends VABElementProxy {

+

+	

+	/**

+	 * Constructor

+	 * 

+	 * @param addr Address

+	 * @param provider Provider reference

+	 */

+	public ModelServerProxy(String addr, IModelProvider provider) {

+		super(addr, provider);

+		// TODO Auto-generated constructor stub

+	}

+	

+	

+	

+	

+	/**

+	 * Push model to model repository

+	 */

+	public void pushToServer(ModelUrn modelID, HashMap<String, Object> model) {

+		// Model URL on server

+		String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();

+		

+		// Transfer model to server

+		this.createElement(modelURLOnServer, model);	

+	}

+	

+	

+	/**

+	 * Get URL to model on server

+	 */

+	public String getURLToModel(ModelUrn modelID) {

+		// Return address on server

+		return this.addr+"/aas/submodels/aasRepository/"+modelID.getEncodedURN();

+	}

+

+	

+	/**

+	 * Update model element value on server

+	 */

+	public void updateElementValue(ModelUrn modelID, String elementPath, Object newValue) {

+		// Build URL

+		String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();

+		

+		// Invoke base function 

+		updateElementValue(modelURLOnServer+elementPath, newValue);

+	}

+	

+	

+	/**

+	 * Read model element value

+	 */

+	public Object readElementValue(ModelUrn modelID, String elementPath) {

+		// Build URL

+		String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();

+

+		// Invoke base function 

+		return readElementValue(modelURLOnServer+elementPath);

+	}

+	

+	

+	/**

+	 * Create model element 

+	 */

+	public void createElement(ModelUrn modelID, String elementPath, Object newValue) {

+		// Build URL

+		String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();

+

+		// Invoke base function 

+		createElement(modelURLOnServer+elementPath, newValue);

+	}

+	

+	

+	/**

+	 * Delete model element based on path

+	 */

+	public void deleteElement(ModelUrn modelID, String elementPath) {

+		// Build URL

+		String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();

+		

+		// Invoke base function 

+		deleteElement(modelURLOnServer+elementPath);

+	}

+	

+	

+	/**

+	 * Delete model element based on path and value

+	 */

+	public void deleteElement(ModelUrn modelID, String elementPath, Object value) {

+		// Build URL

+		String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();

+		

+		// Invoke base function 

+		deleteElement(modelURLOnServer+elementPath, value);

+	}

+}

+

diff --git a/examples/basys.examples/src/basys/examples/frontend/client/proxies/AASRegistryProxy.java b/examples/basys.examples/src/basys/examples/frontend/client/proxies/AASRegistryProxy.java
new file mode 100644
index 0000000..a6635c9
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/frontend/client/proxies/AASRegistryProxy.java
@@ -0,0 +1,75 @@
+package basys.examples.frontend.client.proxies;

+

+import java.util.Map;

+

+import org.eclipse.basyx.aas.backend.http.tools.JSONTools;

+import org.eclipse.basyx.tools.webserviceclient.WebServiceRawClient;

+import org.json.JSONObject;

+

+import basys.examples.aasdescriptor.AASDescriptor;

+import basys.examples.urntools.ModelUrn;

+

+

+

+

+/**

+ * Local proxy class that hides HTTP calls to BaSys registry

+ * 

+ * @author kuhn

+ *

+ */

+public class AASRegistryProxy {

+

+	

+	/**

+	 * Store AAS registry URL

+	 */

+	protected String aasRegistryURL = null;

+

+	

+	/**

+	 * Invoke BaSyx service calls via web services

+	 */

+	protected WebServiceRawClient client = null;

+

+	

+	

+	

+	

+	/**

+	 * Constructor

+	 */

+	public AASRegistryProxy(String aasRegURL) {

+		// Store URL

+		aasRegistryURL = aasRegURL;

+		

+		// Create web service client

+		client = new WebServiceRawClient();

+	}

+	

+	

+	/**

+	 * Register AAS descriptor in registry

+	 */

+	public void register(AASDescriptor deviceAASDescriptor) {

+		// Perform web service call to registry

+		client.post(aasRegistryURL+"/api/v1/registry", JSONTools.Instance.serialize(deviceAASDescriptor).toString());

+	}

+	

+	

+	/**

+	 * Lookup device AAS

+	 */

+	@SuppressWarnings("unchecked")

+	public AASDescriptor lookup(ModelUrn aasID) {

+		// Lookup AAS from AAS directory, get AAS descriptor

+		String jsonData = client.get(aasRegistryURL+"/api/v1/registry/"+aasID.getEncodedURN());

+		

+		// Deserialize AAS descriptor

+		AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));

+		

+		// Return AAS descriptor

+		return aasDescriptor;

+	}

+}

+

diff --git a/examples/basys.examples/src/basys/examples/urntools/ModelUrn.java b/examples/basys.examples/src/basys/examples/urntools/ModelUrn.java
new file mode 100644
index 0000000..2f691a9
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/urntools/ModelUrn.java
@@ -0,0 +1,75 @@
+package basys.examples.urntools;

+

+import java.io.UnsupportedEncodingException;

+import java.net.URLEncoder;

+

+/**

+ * Create URNs with the format urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>

+ * 

+ * @author kuhn

+ *

+ */

+public class ModelUrn {

+

+	

+	/**

+	 * URN string

+	 */

+	protected String urnString = null;

+	

+	

+	

+	/**

+	 * Constructor that accepts a single, raw URN

+	 */

+	public ModelUrn(String rawURN) {

+		urnString = rawURN;

+	}

+	

+	

+	/**

+	 * Constructor that build a URN

+	 */

+	public ModelUrn(String legalEntity, String subUnit, String subModel, String version, String revision, String elementId, String elementInstance) {

+		// Goal is: urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>

+		StringBuffer urnBuilder = new StringBuffer();

+		

+		// Start with header

+		urnBuilder.append("urn:");

+		// - Add URN components until instance

+		if (legalEntity != null) urnBuilder.append(legalEntity); urnBuilder.append(":");

+		if (subUnit != null)     urnBuilder.append(subUnit);     urnBuilder.append(":");

+		if (subModel != null)    urnBuilder.append(subModel);    urnBuilder.append(":");

+		if (version != null)     urnBuilder.append(version);     urnBuilder.append(":");

+		if (revision != null)    urnBuilder.append(revision);    urnBuilder.append(":");

+		if (elementId != null)   urnBuilder.append(elementId); 

+		// - Add element instance, prefix with '#'

+		if (elementInstance != null) urnBuilder.append("#"+elementInstance);

+		

+		// Build URN

+		urnString = urnBuilder.toString();

+	}

+	

+	

+	

+	/**

+	 * Get URN as string

+	 */

+	public String getURN() {

+		return urnString;

+	}

+	

+	

+	/**

+	 * Get URL encoded URN as string

+	 */

+	public String getEncodedURN() {

+		try {

+			// Try to encode urn string

+			return URLEncoder.encode(urnString, "UTF-8");

+		} catch (UnsupportedEncodingException e) {

+			// Catch block

+			e.printStackTrace(); return null;

+		}

+	}

+}