diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/AddSubmodelToAAS.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/AddSubmodelToAAS.java
new file mode 100644
index 0000000..62bfe8f
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/AddSubmodelToAAS.java
@@ -0,0 +1,40 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+
+/**
+ * This snippet showcases how to add a Submodel to an AAS,
+ * that already exists on a server
+ * 
+ * @author conradi
+ *
+ */
+public class AddSubmodelToAAS {
+
+	/**
+	 * Adds a Submodel to an AAS and registers it
+	 * 
+	 * @param submodel the Submodel to be added
+	 * @param aasIdentifier the Identifier of the AAS the Submodel should be added to
+	 * @param registryServerURL the URL of the registry server
+	 */
+	public static void addSubmodelToAAS(SubModel submodel, IIdentifier aasIdentifier, String registryServerURL) {
+
+		// Create a proxy pointing to the registry server
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a ConnectedAASManager using the registryProxy as its registry
+		ConnectedAssetAdministrationShellManager manager =
+				new ConnectedAssetAdministrationShellManager(registryProxy);
+		
+		// Add the submodel to the AAS using the ConnectedAASManager
+		// The manager pushes the submodel to the server and registers it
+		// For this to work, the Identification of the Submodel has to be set
+		manager.createSubModel(aasIdentifier, submodel);
+		
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/DeleteAAS.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/DeleteAAS.java
new file mode 100644
index 0000000..b79efdf
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/DeleteAAS.java
@@ -0,0 +1,34 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+/**
+ * Snippet that showcases how to delete an AAS from a server
+ * 
+ * @author conradi
+ *
+ */
+public class DeleteAAS {
+
+	/**
+	 * Removes an AAS from the server
+	 * 
+	 * @param aasIdentifier the Identifier of the AAS to be deleted
+	 * @param registryServerURL the URL of the registry server (e.g. http://localhost:8080/registry)
+	 */
+	public static void deleteAAS(IIdentifier aasIdentifier, String registryServerURL) {
+	
+		// Create a proxy pointing to the registry server
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a ConnectedAASManager using the registryProxy as its registry
+		ConnectedAssetAdministrationShellManager manager =
+				new ConnectedAssetAdministrationShellManager(registryProxy);
+		
+		// Delete the AAS
+		// Automatically deregisters it
+		manager.deleteAAS(aasIdentifier);
+	}
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/DeleteSubmodelFromAAS.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/DeleteSubmodelFromAAS.java
new file mode 100644
index 0000000..a6e0809
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/DeleteSubmodelFromAAS.java
@@ -0,0 +1,35 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+/**
+ * Snippet that showcases how to delete a Submodel from a server
+ * 
+ * @author conradi
+ *
+ */
+public class DeleteSubmodelFromAAS {
+
+	/**
+	 * Removes a Submodel from an AAS
+	 * 
+	 * @param smIdentifier the Identifier of the Submodel to be deleted
+	 * @param aasIdentifier the Identifier of the AAS the Submodel belongs to
+	 * @param registryServerURL the URL of the registry server (e.g. http://localhost:8080/registry)
+	 */
+	public static void deleteSubmodelFromAAS(IIdentifier smIdentifier, IIdentifier aasIdentifier, String registryServerURL) {
+	
+		// Create a proxy pointing to the registry server
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a ConnectedAASManager using the registryProxy as its registry
+		ConnectedAssetAdministrationShellManager manager =
+				new ConnectedAssetAdministrationShellManager(registryProxy);
+		
+		// Delete the Submodel
+		// Automatically deregisters it
+		manager.deleteSubModel(aasIdentifier, smIdentifier);
+	}
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/LookupAAS.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/LookupAAS.java
new file mode 100644
index 0000000..e7ed77c
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/LookupAAS.java
@@ -0,0 +1,31 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+/**
+ * Snippet that showcases how to look up an AAS in a RegistryComponent
+ * 
+ * @author conradi
+ *
+ */
+public class LookupAAS {
+
+	/**
+	 * Gets the Descriptor of the requested AAS from a registry
+	 * 
+	 * @param aasIdentifier the Identifier of the AAS to be looked up in the registry
+	 * @param registryServerURL the URL of the registry server
+	 * @return the AASDescriptor looked up in the registry
+	 */
+	public static AASDescriptor lookupAAS(IIdentifier aasIdentifier, String registryServerURL) {
+		
+		// Create a proxy pointing to the registry
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Lookup the AAS in the registry
+		return registryProxy.lookupAAS(aasIdentifier);
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/PushAASToServer.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/PushAASToServer.java
new file mode 100644
index 0000000..7a78f28
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/PushAASToServer.java
@@ -0,0 +1,37 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+
+
+/**
+ * This snippet showcases how to push a AAS to a server
+ * 
+ * @author conradi
+ *
+ */
+public class PushAASToServer {
+	
+	/**
+	 * Pushes the AAS to a server and registers it
+	 * 
+	 * @param aas the AssetAdministrationShell to be pushed to the server
+	 * @param aasServerURL the URL of the aas server (e.g. http://localhost:8080/aasComponent)
+	 * @param registryServerURL the URL of the registry server (e.g. http://localhost:8080/registry)
+	 */
+	public static void pushAAS(AssetAdministrationShell aas, String aasServerURL, String registryServerURL) {
+
+		// Create a proxy pointing to the registry server
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a ConnectedAASManager using the registryProxy as its registry
+		ConnectedAssetAdministrationShellManager manager =
+				new ConnectedAssetAdministrationShellManager(registryProxy);
+		
+		// The ConnectedAASManager automatically pushes the given AAS
+		// to the server to which the address was given
+		// It also registers the AAS in the registry it got in its ctor
+		manager.createAAS(aas, aasServerURL);
+	}
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RegisterAAS.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RegisterAAS.java
new file mode 100644
index 0000000..02e96b3
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RegisterAAS.java
@@ -0,0 +1,34 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+
+/**
+ * Snippet that showcases how to register a given AAS in a RegistryComponent
+ * 
+ * @author conradi
+ *
+ */
+public class RegisterAAS {
+
+	/**
+	 * Registers a given AssetAdministrationShell in a registry.
+	 * 
+	 * @param aas the AssetAdministrationShell to be registered
+	 * @param aasEndpoint the address where the AAS will be hosted (e.g. http://localhost:8080/aasList/{aasId}/aas)
+	 * @param registryServerURL the address of the registry
+	 */
+	public static void registerAAS(IAssetAdministrationShell aas, String aasEndpoint, String registryServerURL) {
+		
+		// Create a proxy pointing to the registry
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a Descriptor for the AAS using the endpoint where it will be hosted
+		AASDescriptor descriptor = new AASDescriptor(aas, aasEndpoint);
+		
+		// Register this Descriptor in the registry
+		registryProxy.register(descriptor);
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RetrieveRemoteAAS.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RetrieveRemoteAAS.java
new file mode 100644
index 0000000..d50c408
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RetrieveRemoteAAS.java
@@ -0,0 +1,36 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+/**
+ * This snippet showcases how to retrieve an AAS from a server
+ * 
+ * @author conradi
+ *
+ */
+public class RetrieveRemoteAAS {
+
+	/**
+	 * Get an AAS from a server
+	 * 
+	 * @param aasIdentifier the Identifier of the requested AAS
+	 * @param registryServerURL the URL of the registry server
+	 * @return The requested AAS as ConnectedAAS
+	 */
+	public static IAssetAdministrationShell retrieveRemoteAAS(IIdentifier aasIdentifier, String registryServerURL) {
+
+		// Create a proxy pointing to the registry server
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a ConnectedAASManager using the registryProxy as its registry
+		ConnectedAssetAdministrationShellManager manager =
+				new ConnectedAssetAdministrationShellManager(registryProxy);
+		
+		// Get the requested AAS from the manager
+		return manager.retrieveAAS(aasIdentifier);
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RetrieveSubmodelFromAAS.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RetrieveSubmodelFromAAS.java
new file mode 100644
index 0000000..1404875
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/aas/RetrieveSubmodelFromAAS.java
@@ -0,0 +1,38 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+
+/**
+ * This snippet showcases how to retrieve a Submodel from a AAS on a server
+ * 
+ * @author conradi
+ *
+ */
+public class RetrieveSubmodelFromAAS {
+
+	/**
+	 * Gets a Submodel from an AAS
+	 * 
+	 * @param smIdentifier the Identifier of the requested Submodel
+	 * @param aasIdentifier the Identifier of the AAS the Submodel belongs to
+	 * @param registryServerURL the URL of the registry server
+	 * @return the requested Submodel as ConnectedSubModel
+	 */
+	public static ISubModel retrieveSubmodelFromAAS(IIdentifier smIdentifier, IIdentifier aasIdentifier, String registryServerURL) {
+
+		// Create a proxy pointing to the registry server
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a ConnectedAASManager using the registryProxy as its registry
+		ConnectedAssetAdministrationShellManager manager =
+				new ConnectedAssetAdministrationShellManager(registryProxy);
+		
+		// Get the requested Submodel from the ConnectedAASManager using the Identifiers of the AAS and the SM
+		return manager.retrieveSubModel(aasIdentifier, smIdentifier);
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/AddSubmodelElement.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/AddSubmodelElement.java
new file mode 100644
index 0000000..a33e08d
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/AddSubmodelElement.java
@@ -0,0 +1,35 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import org.eclipse.basyx.examples.snippets.aas.RetrieveSubmodelFromAAS;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElement;
+
+/**
+ * This snippet showcases how add to a SubmodelElement to a Submodel,
+ * that already exists on a server
+ * 
+ * @author conradi
+ *
+ */
+public class AddSubmodelElement {
+
+	/**
+	 * Adds a SubmodelElement to a remote Submodel
+	 * 
+	 * @param smElement the SubmodelElement to be added
+	 * @param smIdentifier the Identifier of the Submodel the element should be added to
+	 * @param aasIdentifier the Identifier of the AAS the Submodel belongs to
+	 * @param registryServerURL the URL of the registry server
+	 */
+	public static void addSubmodelElement(SubmodelElement smElement, IIdentifier smIdentifier, IIdentifier aasIdentifier, String registryServerURL) {
+
+		// Get the ConnectedSubmodel
+		ISubModel submodel = RetrieveSubmodelFromAAS.retrieveSubmodelFromAAS(smIdentifier, aasIdentifier, registryServerURL);
+		
+		// Add the element to it
+		submodel.addSubModelElement(smElement);
+		
+	}
+
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/DeleteSubmodelElement.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/DeleteSubmodelElement.java
new file mode 100644
index 0000000..8e31408
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/DeleteSubmodelElement.java
@@ -0,0 +1,31 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import org.eclipse.basyx.examples.snippets.aas.RetrieveSubmodelFromAAS;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+/**
+ * Snippet that showcases how to delete a SubmodelElement from a Submodel
+ * 
+ * @author conradi
+ *
+ */
+public class DeleteSubmodelElement {
+
+	/**
+	 * Removes a SubmodelElement from a Submodel
+	 * 
+	 * @param elementId the Id of the Element to be deleted (can also be a path if the Element is in a Collection)
+	 * @param smIdentifier the Identifier of the Submodel the Element belongs to
+	 * @param aasIdentifier the Identifier of the AAS the Submodel belongs to
+	 * @param registryServerURL the URL of the registry server (e.g. http://localhost:8080/registry)
+	 */
+	public static void deleteSubmodelElement(String elementId, IIdentifier smIdentifier, IIdentifier aasIdentifier, String registryServerURL) {
+	
+		// Retrieve the Submodel from the server as a ConnectedSubmodel
+		ISubModel submodel = RetrieveSubmodelFromAAS.retrieveSubmodelFromAAS(smIdentifier, aasIdentifier, registryServerURL);
+		
+		// Delete the Element from the Submodel
+		submodel.deleteSubmodelElement(elementId);
+	}
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/ExecuteOperation.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/ExecuteOperation.java
new file mode 100644
index 0000000..74d5774
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/ExecuteOperation.java
@@ -0,0 +1,45 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.operation.IOperation;
+
+/**
+ * Snippet that showcases how to execute an Operation contained in a Submodel
+ * 
+ * @author conradi
+ *
+ */
+public class ExecuteOperation {
+
+	/**
+	 * Executes an Operation with the given parameters and return the result.
+	 * The execution itself is run on the remote server
+	 * 
+	 * @param operationId the idShort of the Operation to be executed
+	 * @param operationParameters the parameters for the execution
+	 * @param smIdentifier the Identifier of the Submodel the Operation belongs to
+	 * @param aasIdentifier the Identifier of the AAS the Submodel belongs to
+	 * @param registryServerURL the URL of the registry server
+	 * @return the result of the execution
+	 * @throws Exception thrown if the execution of the Operation threw an Exception
+	 */
+	public static Object executeOperation(String operationId, Object[] operationParameters, IIdentifier smIdentifier, IIdentifier aasIdentifier, String registryServerURL) throws Exception {
+
+		// Get the Operation from the Submodel
+		ISubmodelElement element = RetrieveSubmodelElement.retrieveSubmodelElement(operationId, smIdentifier, aasIdentifier, registryServerURL);
+		
+		// Check if the element is really an Operation
+		if( ! (element instanceof IOperation)) {
+			// The element with the given Id is not an Operation
+			throw new IllegalArgumentException("The SubmodelElement '" + operationId + "' is not an Operation");
+		}
+		
+		// Cast the retrieved ISubmodelElement to an IOperation
+		IOperation operation = (IOperation) element;
+		
+		// Invoke the Operation and return the Result
+		return operation.invoke(operationParameters);
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/LookupSubmodel.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/LookupSubmodel.java
new file mode 100644
index 0000000..1b3e4f4
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/LookupSubmodel.java
@@ -0,0 +1,32 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+/**
+ * Snippet that showcases how to look up a Submodel in a RegistryComponent
+ * 
+ * @author conradi
+ *
+ */
+public class LookupSubmodel {
+
+	/**
+	 * Gets the Descriptor of the requested Submodel from a registry
+	 * 
+	 * @param smIdentifier the Identifier of the Submodel to be looked up in the registry
+	 * @param aasIdentifier the Identifier of the AAS the Submodel belongs to
+	 * @param registryServerURL the URL of the registry server
+	 * @return the SubmodelDescriptor looked up in the registry
+	 */
+	public static SubmodelDescriptor lookupSubmodel(IIdentifier smIdentifier, IIdentifier aasIdentifier, String registryServerURL) {
+		
+		// Create a proxy pointing to the registry
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Lookup the Submodel in the registry
+		return registryProxy.lookupSubmodel(aasIdentifier, smIdentifier);
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/RegisterSubmodel.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/RegisterSubmodel.java
new file mode 100644
index 0000000..6c4a751
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/RegisterSubmodel.java
@@ -0,0 +1,35 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+/**
+ * Snippet that showcases how to register a given Submodel in a RegistryComponent
+ * 
+ * @author conradi
+ *
+ */
+public class RegisterSubmodel {
+
+	/**
+	 * Registers a given Submodel in a registry.
+	 * 
+	 * @param submodel the Submodel to be registered
+	 * @param smEndpoint the address where the SM will be hosted (e.g. http://localhost:8080/aasList/{aasId}/aas/submodels/{smId})
+	 * @param registryServerURL the address of the registry
+	 */
+	public static void registerSubmodel(ISubModel submodel, String smEndpoint, IIdentifier aasIdentifier, String registryServerURL) {
+		
+		// Create a proxy pointing to the registry
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryServerURL);
+		
+		// Create a Descriptor for the sm using the endpoint where it will be hosted
+		SubmodelDescriptor descriptor = new SubmodelDescriptor(submodel, smEndpoint);
+		
+		// Register this Descriptor in the registry
+		registryProxy.register(aasIdentifier, descriptor);
+	}
+
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/RetrieveSubmodelElement.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/RetrieveSubmodelElement.java
new file mode 100644
index 0000000..cfce36e
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/snippets/submodel/RetrieveSubmodelElement.java
@@ -0,0 +1,34 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import org.eclipse.basyx.examples.snippets.aas.RetrieveSubmodelFromAAS;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
+
+/**
+ * This snippet showcases how to retrieve a SubmodelElement from a remote Submodel
+ * 
+ * @author conradi
+ *
+ */
+public class RetrieveSubmodelElement {
+
+	/**
+	 * Gets a SubmodelElement from a remote Submodel
+	 * 
+	 * @param elementId the idShort SubmodelElement to be retrieved
+	 * @param smIdentifier the Identifier of the Submodel the element belongs to
+	 * @param aasIdentifier the Identifier of the AAS the Submodel belongs to
+	 * @param registryServerURL the URL of the registry server
+	 * @return the requested SubmodelElement
+	 */
+	public static ISubmodelElement retrieveSubmodelElement(String elementId, IIdentifier smIdentifier, IIdentifier aasIdentifier, String registryServerURL) {
+
+		// Get the ConnectedSubmodel
+		ISubModel submodel = RetrieveSubmodelFromAAS.retrieveSubmodelFromAAS(smIdentifier, aasIdentifier, registryServerURL);
+		
+		// Add the element to it
+		return submodel.getSubmodelElement(elementId);
+		
+	}
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleAASComponent.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleAASComponent.java
new file mode 100644
index 0000000..4260956
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleAASComponent.java
@@ -0,0 +1,53 @@
+package org.eclipse.basyx.examples.support;
+
+import org.eclipse.basyx.aas.registration.api.IAASRegistryService;
+import org.eclipse.basyx.components.aas.AASServerComponent;
+import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
+
+/**
+ * This class is used to startup an AAS-Server using the AASServerComponent
+ * 
+ * @author conradi
+ *
+ */
+public class ExampleAASComponent {
+
+	public static final String CONTEXT_PATH = "aasComponent"; 
+	
+	private int port;
+	
+	private IAASRegistryService registry;
+	
+	// Hold a reference to the server to be able to shut it down
+	private AASServerComponent aasServer = null;
+	
+	
+	public ExampleAASComponent(int port, IAASRegistryService registry) {
+		this.port = port;
+		this.registry = registry;
+	}
+	
+	public void startupAASServer() {
+		// Create a Configuration telling the component the port to use and the contextPath
+		// The contextPath is attached to the address of the server "http://localhost:8080/{contextPath}"
+		BaSyxContextConfiguration contextConfig = new BaSyxContextConfiguration(port, CONTEXT_PATH);
+		aasServer = new AASServerComponent(contextConfig);
+		
+		// Set the registry to be used by the server
+		aasServer.setRegistry(registry);
+		
+		// Startup the AASServer
+		aasServer.startComponent();
+	}
+	
+	public void shutdownAASServer() {
+		// If an AASServer was started -> stop it
+		if(aasServer != null) {
+			aasServer.stopComponent();
+		}
+	}
+	
+	public String getAASServerPath() {
+		return "http://localhost:" + port + "/" + CONTEXT_PATH;
+	}
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleComponentBuilder.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleComponentBuilder.java
new file mode 100644
index 0000000..7db04ec
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleComponentBuilder.java
@@ -0,0 +1,75 @@
+package org.eclipse.basyx.examples.support;
+
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElementCollection;
+import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
+
+/**
+ * This class is used to build AssetAdministrationShells and Submodels
+ * for the scenarios and snippets.
+ * 
+ * Please note that the generated objects are just for showcasing,
+ * several mandatory attributes are missing. 
+ * 
+ * @author conradi
+ *
+ */
+public class ExampleComponentBuilder {
+
+	public static final String PROPERTY_ID = "prop";
+	public static final int PROPERTY_VALUE = 123;
+
+	public static final String COLLECTION_ID = "collection";
+	public static final String COLLECTION_PROPERTY_ID = "propInCollection";
+	public static final String COLLECTION_PROPERTY_VALUE = "TheValue";
+	
+	/**
+	 * Builds a Submodel containing a Property and a Collection with a Property
+	 * 
+	 * @param idShort the idShort for the new Submodel
+	 * @return the new Submodel
+	 */
+	public static SubModel buildExampleSubmodel(String idShort, String id) {
+		SubModel submodel = new SubModel();
+		submodel.setIdShort(idShort);
+		submodel.setIdentification(IdentifierType.CUSTOM, id);
+		
+		// Add a Property to the Submodel
+		Property property = new Property();
+		property.setIdShort(PROPERTY_ID);
+		property.setValue(PROPERTY_VALUE);
+		submodel.addSubModelElement(property);
+				
+		// Add a SubmodelElementCollection
+		SubmodelElementCollection collection = new SubmodelElementCollection();
+		collection.setIdShort(COLLECTION_ID);
+		
+		// Add a Property to the SubmodelElementCollection
+		Property property2 = new Property();
+		property2.setIdShort(COLLECTION_PROPERTY_ID);
+		property2.setValue(COLLECTION_PROPERTY_VALUE);
+		collection.addSubModelElement(property2);
+		submodel.addSubModelElement(collection);
+		
+		return submodel;
+	}
+	
+	/**
+	 * Builds an AssetAdministrationShell
+	 * 
+	 * @param idShort the idShort for the new AAS
+	 * @param id the id to be used in Identification
+	 * @return the new AAS
+	 */
+	public static AssetAdministrationShell buildExampleAAS(String idShort, String id) {
+		AssetAdministrationShell aas = new AssetAdministrationShell();
+		aas.setIdShort(idShort);
+		
+		aas.setIdentification(IdentifierType.CUSTOM, id);
+		
+		return aas;
+	}
+	
+}
diff --git a/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleRegistryComponent.java b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleRegistryComponent.java
new file mode 100644
index 0000000..6f6e8a5
--- /dev/null
+++ b/examples/basys.examples/src/main/java/org/eclipse/basyx/examples/support/ExampleRegistryComponent.java
@@ -0,0 +1,53 @@
+package org.eclipse.basyx.examples.support;
+
+import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
+import org.eclipse.basyx.components.registry.RegistryComponent;
+import org.eclipse.basyx.components.registry.configuration.BaSyxRegistryConfiguration;
+import org.eclipse.basyx.components.registry.configuration.RegistryBackend;
+
+/**
+ * This class is used to startup a registry using the RegistryComponent
+ * 
+ * @author conradi
+ *
+ */
+public class ExampleRegistryComponent {
+
+	public static final String CONTEXT_PATH = "registry";
+
+	private int port; 
+	
+	// Hold a reference to the server to be able to shut it down
+	private RegistryComponent registry = null;
+	
+	
+	public ExampleRegistryComponent(int port) {
+		this.port = port;
+	}
+	
+	
+	public void startupRegistry() {	
+		// Create a Configuration telling the component the port to use and the contextPath
+		// The contextPath is attached to the address of the server "http://localhost:8080/{contextPath}"
+		BaSyxContextConfiguration contextConfig = new BaSyxContextConfiguration(port, CONTEXT_PATH);
+		
+		// Create a RegistrationConfiguration telling the component to hold the whole registry in memory
+		BaSyxRegistryConfiguration registryConfig = new BaSyxRegistryConfiguration(RegistryBackend.INMEMORY);
+		
+		registry = new RegistryComponent(contextConfig, registryConfig);
+		
+		// Startup the Registry
+		registry.startComponent();
+	}
+	
+	public void shutdownRegistry() {
+		// If a registry was started -> stop it
+		if(registry != null) {
+			registry.stopComponent();
+		}
+	}
+	
+	public String getRegistryPath() {
+		return "http://localhost:" + port + "/" + CONTEXT_PATH;
+	}
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/AbstractSnippetTest.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/AbstractSnippetTest.java
new file mode 100644
index 0000000..1a5260c
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/AbstractSnippetTest.java
@@ -0,0 +1,76 @@
+package org.eclipse.basyx.examples.snippets;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.examples.support.ExampleAASComponent;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.eclipse.basyx.examples.support.ExampleRegistryComponent;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * This class provides the server environment required by all snippet test
+ * 
+ * @author conradi
+ *
+ */
+public abstract class AbstractSnippetTest {
+	
+
+	protected static final String AAS_ID_SHORT = "aasIdShort";
+	protected static final String AAS_ID = "aasId";
+	protected static final String AAS_ENDPOINT = "http://localhost:8080/aasComponent/shells/" + AAS_ID + "/aas";
+	
+	protected static final String SM_ID_SHORT = "smIdShort";
+	protected static final String SM_ID = "smId";
+	protected static final String SM_ENDPOINT = AAS_ENDPOINT + "/submodels/" + SM_ID_SHORT + "/submodel";
+	
+	protected ExampleAASComponent aasComponent;
+	protected ExampleRegistryComponent registryComponent;
+	
+	@Before
+	public void setupServers() {
+		registryComponent = new ExampleRegistryComponent(8081);
+		registryComponent.startupRegistry();
+		aasComponent = new ExampleAASComponent(8080, new AASRegistryProxy(registryComponent.getRegistryPath()));
+		aasComponent.startupAASServer();
+		
+		// Populate the Server with an example AAS/SM
+		populateServer();
+	}
+	
+	@After
+	public void shutdownServers() {
+		aasComponent.shutdownAASServer();
+		registryComponent.shutdownRegistry();
+	}
+	
+	/**
+	 * Pushes and registers an AAS and a Submodel to the test server
+	 */
+	private void populateServer() {
+		ConnectedAssetAdministrationShellManager manager = getManager();
+		
+		// Get the example AAS and Submodel
+		AssetAdministrationShell aas = ExampleComponentBuilder.buildExampleAAS(AAS_ID_SHORT, AAS_ID);
+		SubModel sm = ExampleComponentBuilder.buildExampleSubmodel(SM_ID_SHORT, SM_ID);
+		
+		// Push and register the AAS
+		manager.createAAS(aas, aasComponent.getAASServerPath());
+		
+		// Push and register the Submodel
+		manager.createSubModel(aas.getIdentification(), sm);
+	}
+	
+	/**
+	 * Creates a ConnectedAASManager using the started registryComponent
+	 * 
+	 * @return the created ConnectedAASManager
+	 */
+	protected ConnectedAssetAdministrationShellManager getManager() {
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryComponent.getRegistryPath());
+		return new ConnectedAssetAdministrationShellManager(registryProxy);
+	}
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/AccessAASProperties.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/AccessAASProperties.java
deleted file mode 100644
index c6347e1..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/AccessAASProperties.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas;
-
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.junit.Test;
-
-/**
- * This code snippet illustrates the creation of an Asset Administration Shell (AAS) data structure 
- * and how to access its properties via different kinds of access operations
- * 
- * @author kuhn
- *
- */
-public class AccessAASProperties {
-
-		
-	/**
-	 * Code snippet that illustrates the instantiation and use of AAS
-	 */
-	@Test
-	public void snippet() throws Exception {
-		
-		// Create Asset Administration Shell
-		AssetAdministrationShell aas = new AssetAdministrationShell();
-		
-		// Access predefined AAS properties
-		// - Set AAS property via generic access method. For the generic access method,
-		//   the user must know the name of the accessed property. This kind of access
-		//   is discouraged, as it is not portable to new meta model versions. However,
-		//   it is illustrated for completeness.
-		aas.put("idShort", "DeviceIDShort");
-		// - Access AAS property via the specific access operation. This is the preferred
-		//   approach for accessing Asset Administration Shell and sub model properties,
-		//   as well as meta data.
-		Object deviceIDValue = aas.getIdShort();
-		
-		
-		// Compared received value to expected value
-		assertTrue(deviceIDValue.equals("DeviceIDShort"));
-	}
-}
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/CreateAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/CreateAAS.java
deleted file mode 100644
index d2afd50..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/CreateAAS.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas;
-
-import static org.junit.Assert.assertEquals;
-
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the creation of an Asset Administration Shell (AAS) by extending an SDK class
- * 
- * @author kuhn
- *
- */
-public class CreateAAS {
-
-	
-	/**
-	 * Example Asset Administration Shell
-	 */
-	static class ExampleAssetAdministrationShell extends AssetAdministrationShell {
-		/**
-		 * Constructor
-		 */
-		public ExampleAssetAdministrationShell() {
-			// Set Asset Administration Shell ID
-			setIdShort("aas-001");
-		}
-	}
-	
-	/**
-	 * Run code snippet. Connect to AAS on server, access AAS properties. 
-	 */
-	@Test
-	public void createAAS() throws Exception {
-		// Create Asset Administration Shell
-		ExampleAssetAdministrationShell aas = new ExampleAssetAdministrationShell();
-		
-		// Retrieve AAS ID value
-		Object propertyId = aas.getIdShort();
-		
-		
-		// Check result
-		assertEquals("aas-001", propertyId);
-	}
-}
-
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestAddSubmodelToAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestAddSubmodelToAAS.java
new file mode 100644
index 0000000..4ab8821
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestAddSubmodelToAAS.java
@@ -0,0 +1,46 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.junit.Test;
+
+/**
+ * Test for the AddSubmodelToAAS snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestAddSubmodelToAAS extends AbstractSnippetTest {
+
+	private static final String NEW_SM_ID_SHORT = "smIdShort_New";
+	private static final String NEW_SM_ID = "smId_New";
+	
+	@Test
+	public void testAddSubmodelToAAS() {
+		
+		// Get the example AAS and Submodel
+		SubModel submodel = ExampleComponentBuilder.buildExampleSubmodel(NEW_SM_ID_SHORT, NEW_SM_ID);
+
+		// Get the Identifiers for the AAS and the Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = submodel.getIdentification();
+		
+		// Add the Submodel to the AAS
+		AddSubmodelToAAS.addSubmodelToAAS(submodel, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Check if the Submodel was correctly added
+		ConnectedAssetAdministrationShellManager manager = getManager();
+		ISubModel remoteSM = manager.retrieveSubModel(aasIdentifier, smIdentifier);
+		assertEquals(NEW_SM_ID_SHORT, remoteSM.getIdShort());
+		
+	}
+	
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestDeleteAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestDeleteAAS.java
new file mode 100644
index 0000000..f3d795f
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestDeleteAAS.java
@@ -0,0 +1,38 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.fail;
+
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
+import org.junit.Test;
+
+/**
+ * Test for the DeleteAAS snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestDeleteAAS extends AbstractSnippetTest {
+
+	@Test
+	public void testDeleteAAS() {
+		
+		// Get the Identifier of the example AAS
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		
+		// Delete the AAS
+		DeleteAAS.deleteAAS(aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Try to retrieve deleted AAS; should throw ResourceNotFoundException
+		try {
+			RetrieveRemoteAAS.retrieveRemoteAAS(aasIdentifier, registryComponent.getRegistryPath());
+			fail();
+		} catch (ResourceNotFoundException e) {
+		}
+		
+	}
+	
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestDeleteSubmodelFromAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestDeleteSubmodelFromAAS.java
new file mode 100644
index 0000000..504c406
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestDeleteSubmodelFromAAS.java
@@ -0,0 +1,40 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.fail;
+
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
+import org.junit.Test;
+
+/**
+ * Test for the DeleteSubmodelFromAAS snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestDeleteSubmodelFromAAS extends AbstractSnippetTest {
+
+	@Test
+	public void testDeleteSubmodel() {
+		
+		// Get the Identifier of the example AAS and Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, SM_ID);
+		
+		// Delete the Submodel
+		DeleteSubmodelFromAAS.deleteSubmodelFromAAS(smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Try to retrieve deleted Submodel; should throw ResourceNotFoundException
+		try {
+			RetrieveSubmodelFromAAS.retrieveSubmodelFromAAS(
+					smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+			fail();
+		} catch (ResourceNotFoundException e) {
+		}
+		
+	}
+	
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestLookupAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestLookupAAS.java
new file mode 100644
index 0000000..339a0cc
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestLookupAAS.java
@@ -0,0 +1,34 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.junit.Test;
+
+/**
+ * Test for the LookupAAS snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestLookupAAS extends AbstractSnippetTest {
+
+	@Test
+	public void testLookupAAS() {
+		
+		// Get the Identifier of the example AAS
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		
+		// Lookup the AAS in the registry
+		AASDescriptor descriptor = LookupAAS.lookupAAS(aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Check if the returned Descriptor is as expected
+		assertEquals(AAS_ENDPOINT, descriptor.getFirstEndpoint());
+		
+	}
+	
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestPushAASToServer.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestPushAASToServer.java
new file mode 100644
index 0000000..1b57fd1
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestPushAASToServer.java
@@ -0,0 +1,38 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.junit.Test;
+
+/**
+ * Test for the PushAASToServer snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestPushAASToServer extends AbstractSnippetTest {
+	
+	protected static final String NEW_AAS_ID_SHORT = "aasIdShort_New";
+	protected static final String NEW_AAS_ID = "aasId_New";
+	
+	@Test
+	public void testPushAAS() throws Exception {
+		
+		// Get the example AAS
+		AssetAdministrationShell aas = ExampleComponentBuilder.buildExampleAAS(NEW_AAS_ID_SHORT, NEW_AAS_ID);
+		
+		// Push the AAS to the server
+		PushAASToServer.pushAAS(aas, aasComponent.getAASServerPath(), registryComponent.getRegistryPath());
+		
+		// Check if the AAS is present on the server
+		ConnectedAssetAdministrationShellManager manager = getManager();
+		IAssetAdministrationShell remoteAAS = manager.retrieveAAS(aas.getIdentification());
+		assertEquals(NEW_AAS_ID_SHORT, remoteAAS.getIdShort());
+	}
+	
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRegisterAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRegisterAAS.java
new file mode 100644
index 0000000..717f533
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRegisterAAS.java
@@ -0,0 +1,40 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.junit.Test;
+
+/**
+ * Test for the RegisterAAS snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestRegisterAAS extends AbstractSnippetTest {
+	
+	protected static final String NEW_AAS_ID_SHORT = "aasIdShort_New";
+	protected static final String NEW_AAS_ID = "aasId_New";
+	protected static final String NEW_AAS_ENDPOINT = "http://localhost:8080/aasComponent/shells/" + NEW_AAS_ID + "/aas";
+	
+	@Test
+	public void testRegisterAAS() {
+		
+		// Get the example AAS
+		AssetAdministrationShell aas = ExampleComponentBuilder.buildExampleAAS(NEW_AAS_ID_SHORT, NEW_AAS_ID);
+		
+		// Register this AAS
+		RegisterAAS.registerAAS(aas, NEW_AAS_ENDPOINT, registryComponent.getRegistryPath());
+		
+		// Check if the AAS was correctly registered
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryComponent.getRegistryPath());
+		AASDescriptor descriptor = registryProxy.lookupAAS(aas.getIdentification());
+		assertEquals(NEW_AAS_ENDPOINT, descriptor.getFirstEndpoint());
+		
+	}
+	
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRetrieveRemoteAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRetrieveRemoteAAS.java
new file mode 100644
index 0000000..933eed8
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRetrieveRemoteAAS.java
@@ -0,0 +1,33 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.junit.Test;
+
+/**
+ * Test for the RetrieveRemoteAAS snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestRetrieveRemoteAAS extends AbstractSnippetTest {
+	
+	@Test
+	public void testRetrieveRemoteAAS() {
+		
+		// Get the Identifier of the example AAS
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		
+		// Retrieve the AAS from the server
+		IAssetAdministrationShell remoteAAS =
+				RetrieveRemoteAAS.retrieveRemoteAAS(aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Check if the retrieved AAS can be used correctly
+		assertEquals(AAS_ID_SHORT, remoteAAS.getIdShort());
+	}
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRetrieveSubmodelFromAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRetrieveSubmodelFromAAS.java
new file mode 100644
index 0000000..03f98a8
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/TestRetrieveSubmodelFromAAS.java
@@ -0,0 +1,36 @@
+package org.eclipse.basyx.examples.snippets.aas;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.junit.Test;
+
+/**
+ * Test for the RetrieveSubmodelFromAAS snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestRetrieveSubmodelFromAAS extends AbstractSnippetTest {
+
+	
+	@Test
+	public void testRetrieveSubmodelFromAAS() {
+		
+		// Get the Identifiers of the AAS and Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, SM_ID);
+		
+		// Get the Submodel from the server
+		ISubModel remoteSubmodel = RetrieveSubmodelFromAAS.retrieveSubmodelFromAAS(
+				smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Check if the Submodel can be used correctly
+		assertEquals(SM_ID_SHORT, remoteSubmodel.getIdShort());
+	}
+	
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceAASDeployment.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceAASDeployment.java
deleted file mode 100644
index e5a4db2..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceAASDeployment.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.deployment.device;
-
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.aas.restapi.AASModelProvider;
-import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
-import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
-import org.eclipse.basyx.vab.protocol.basyx.connector.BaSyxConnectorProvider;
-import org.eclipse.basyx.vab.protocol.basyx.server.BaSyxTCPServer;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the deployment of an AAS to a device, and connects to that AAS
- * 
- * The AAS is deployed to a dynamic BaSyxTCPServer that exports the AAS using the BaSyx TCP protocol.
- * 
- * @author kuhn
- *
- */
-public class DeviceAASDeployment {
-
-	
-	/**
-	 * Run code snippet. Connect to AAS on server, access AAS properties. 
-	 */
-	@Test
-	public void createExportAndAccessSubModel() throws Exception {
-
-
-		// Create AAS sub model and sub model properties
-		// - Create AAS
-		AssetAdministrationShell aas = new AssetAdministrationShell();
-		// - Set sub model ID
-		aas.setIdShort("urn:de.FHG:devices.es.iese:AAS:1.0:3:x-509#003");
-
-
-		// Export AAS via BaSyx server
-		AASModelProvider modelProvider = new AASModelProvider(aas);
-		VABMultiSubmodelProvider aasProvider = new VABMultiSubmodelProvider(modelProvider);
-		BaSyxTCPServer<VABMultiSubmodelProvider> server = new BaSyxTCPServer<VABMultiSubmodelProvider>(aasProvider, 9998);
-		// - Start local BaSyx/TCP server
-		server.start();
-
-
-
-		// - We pre-register the aas endpoints to the dynamic BaSyx server
-		ExampleAASRegistry registry = new ExampleAASRegistry();
-		registry.addAASMapping("dynamicAAS", "basyx://localhost:9998/aas");
-
-		// Create connected aas manager to connect with the dynamic server
-		ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry,
-				// We connect via BaSyx TCP protocol
-				new BaSyxConnectorProvider());
-
-		
-		// Retrieve the AAS with ID "dynamicAAS" from the AAS server with SDK connector
-		// - IAssetAdministrationShell is the interface for the local AAS proxy
-		IAssetAdministrationShell shell = manager.retrieveAAS(new ModelUrn("dynamicAAS"));
-		// - Retrieve AAS values and compare to expected values
-		Object propertyId = shell.getIdShort();
-
-		
-		// Check value
-		assertTrue(propertyId.equals("urn:de.FHG:devices.es.iese:AAS:1.0:3:x-509#003"));
-		
-	
-		// Stop local BaSyx/TCP server
-		server.stop();
-	}
-}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceAASDeploymentVAB.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceAASDeploymentVAB.java
deleted file mode 100644
index a8783db..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceAASDeploymentVAB.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.deployment.device;
-
-import static org.junit.Assert.assertTrue;
-
-import java.util.Map;
-
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.eclipse.basyx.aas.restapi.AASModelProvider;
-import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
-import org.eclipse.basyx.vab.coder.json.connector.JSONConnector;
-import org.eclipse.basyx.vab.protocol.basyx.connector.BaSyxConnector;
-import org.eclipse.basyx.vab.protocol.basyx.server.BaSyxTCPServer;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the deployment of an AAS to a device, and connects to that AAS
- * 
- * The AAS is deployed to a dynamic BaSyxTCPServer that exports the AAS using the BaSyx TCP protocol.
- * 
- * @author kuhn
- *
- */
-public class DeviceAASDeploymentVAB {
-
-	
-	/**
-	 * Run code snippet. Connect to AAS on server, access AAS properties. 
-	 */
-	@SuppressWarnings("unchecked")
-	@Test
-	public void createExportAndAccessSubModel() throws Exception {
-
-
-		// Create AAS sub model and sub model properties
-		// - Create AAS
-		AssetAdministrationShell aas = new AssetAdministrationShell();
-		// - Set sub model ID
-		aas.setIdShort("urn:de.FHG:devices.es.iese:AAS:1.0:3:x-509#003");
-
-
-		// Export AAS via BaSyx server
-		AASModelProvider modelProvider = new AASModelProvider(aas);
-		VABMultiSubmodelProvider aasProvider = new VABMultiSubmodelProvider(modelProvider);
-		BaSyxTCPServer<VABMultiSubmodelProvider> server = new BaSyxTCPServer<VABMultiSubmodelProvider>(aasProvider, 9998);
-		// - Start local BaSyx/TCP server
-		server.start();
-		
-		
-		// Access BaSyx TCP server using Virtual Automation Bus low level BaSyxConnector class
-		// - Create BaSyx connector to connect with the sub model
-		BaSyxConnector basyxConnector = new BaSyxConnector("localhost", 9998);
-		// - Create connection to BaSyx server manager
-		JSONConnector toDeviceManager = new JSONConnector(basyxConnector);	
-		// - Access sub model property, check value
-		AssetAdministrationShell shell = AssetAdministrationShell.createAsFacade((Map<String, Object>) toDeviceManager.getModelPropertyValue("aas"));
-
-		
-		// Check value
-		assertTrue(shell.getIdShort().equals("urn:de.FHG:devices.es.iese:AAS:1.0:3:x-509#003"));
-		
-	
-		// Stop local BaSyx/TCP server
-		server.stop();
-	}
-}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceSubModelDeployment.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceSubModelDeployment.java
deleted file mode 100644
index 4761650..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceSubModelDeployment.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.deployment.device;
-
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
-import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
-import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
-import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.submodel.restapi.SubModelProvider;
-import org.eclipse.basyx.vab.protocol.basyx.connector.BaSyxConnectorProvider;
-import org.eclipse.basyx.vab.protocol.basyx.server.BaSyxTCPServer;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the deployment of a AAS sub model to a device, and connects to that sub model
- * 
- * The AAS sub model is deployed to a dynamic BaSyxTCPServer that exports the sub model using the BaSyx TCP protocol.
- * 
- * @author kuhn
- *
- */
-public class DeviceSubModelDeployment {
-
-	
-	/**
-	 * Run code snippet. Connect to AAS sub model on server, access sub model properties. 
-	 */
-	@Test
-	public void createExportAndAccessSubModel() throws Exception {
-
-		
-		// Create AAS sub model and sub model properties
-
-		// - Create sub model
-		SubModel submodel = new SubModel();
-		// - Set sub model ID "SampleSM" to full qualified ID urn:de.FHG:devices.es.iese:SampleSM:1.0:3:x-509#003
-		IIdentifier smId = new ModelUrn("urn:de.FHG:devices.es.iese:SampleSM:1.0:3:x-509#003");
-		submodel.setIdShort("SampleSM");
-		submodel.setIdentification(smId.getIdType(), smId.getId());
-		// - Add example properties
-		Property prop1 = new Property(7);
-		prop1.setIdShort("prop1");
-		submodel.addSubModelElement(prop1);
-
-		Property prop2 = new Property("myStr");
-		prop2.setIdShort("prop2");
-		submodel.addSubModelElement(prop2);
-
-		
-		// Export sub model via BaSyx server
-		SubModelProvider modelProvider = new SubModelProvider(submodel);
-		VABMultiSubmodelProvider aasProvider = new VABMultiSubmodelProvider("SampleSM", modelProvider);
-		BaSyxTCPServer<VABMultiSubmodelProvider> server = new BaSyxTCPServer<>(aasProvider, 9998);
-		// - Start local BaSyx/TCP server
-		server.start();
-		
-		
-		// Create connected aas manager to connect with the dynamic server
-		// We pre-register the aas endpoints to the dynamic BaSyx server
-		ExampleAASRegistry registry = new ExampleAASRegistry();
-		registry.addAASMapping("", ""); // No AAS is provided in this example
-		registry.addSubmodelMapping("", smId.getId(), "basyx://localhost:9998/aas/submodels/SampleSM");
-		
-		// Create manager using the directory stub an the HTTPConnectorProvider
-		ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry,
-				// We connect via BaSyx TCP protocol
-				new BaSyxConnectorProvider());
-		
-		// Create and connect SDK connector
-		// - Retrieve sub model
-		ISubModel subModel = manager.retrieveSubModel(new ModelUrn(""), smId);
-		
-		// Retrieve sub model values and compare to expected values
-		String submodelId = subModel.getIdShort();
-		String prop1Id    = subModel.getProperties().get("prop1").getIdShort();
-		int prop1Val = (int) subModel.getProperties().get("prop1").getValue();
-		String prop2Id    = subModel.getProperties().get("prop2").getIdShort();
-		String prop2Val = (String) subModel.getProperties().get("prop2").getValue();
-
-		
-		// Compare received property values to expected values
-		assertTrue(submodelId.equals("SampleSM"));
-		assertTrue(prop1Id.equals("prop1"));
-		assertTrue(prop1Val == 7);
-		assertTrue(prop2Id.equals("prop2"));
-		assertTrue(prop2Val.equals("myStr"));
-
-	
-		// Stop local BaSyx/TCP server
-		server.stop();
-	}
-}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceSubModelDeploymentVAB.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceSubModelDeploymentVAB.java
deleted file mode 100644
index 5406ade..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/device/DeviceSubModelDeploymentVAB.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.deployment.device;
-
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.submodel.restapi.MultiSubmodelElementProvider;
-import org.eclipse.basyx.submodel.restapi.SubModelProvider;
-import org.eclipse.basyx.vab.coder.json.connector.JSONConnector;
-import org.eclipse.basyx.vab.protocol.basyx.connector.BaSyxConnector;
-import org.eclipse.basyx.vab.protocol.basyx.server.BaSyxTCPServer;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the deployment of a AAS sub model to a device, and connects to that sub model using
- * Virtual Automation Bus (VAB) primitives.
- * 
- * The AAS sub model is deployed to a dynamic BaSyxTCPServer that exports the sub model using the BaSyx TCP protocol.
- * 
- * @author kuhn
- *
- */
-public class DeviceSubModelDeploymentVAB {
-
-	
-	/**
-	 * Run code snippet. Connect to AAS sub model on server, access sub model properties using VAB properties. 
-	 */
-	@Test
-	public void createExportAndAccessSubModel() throws Exception {
-
-		
-		// Create AAS sub model and sub model properties
-		// - Create sub model
-		SubModel submodel = new SubModel();
-		// - Set sub model ID
-		submodel.setIdShort("dynamicSM");
-		// - Add example properties
-		Property prop1 = new Property(7);
-		prop1.setIdShort("prop1");
-		submodel.addSubModelElement(prop1);
-
-		Property prop2 = new Property("myStr");
-		prop2.setIdShort("prop2");
-		submodel.addSubModelElement(prop2);
-
-		
-		// Export sub model via BaSyx server
-		SubModelProvider modelProvider = new SubModelProvider(submodel);
-		VABMultiSubmodelProvider aasProvider = new VABMultiSubmodelProvider("dynamicSM", modelProvider);
-		BaSyxTCPServer<VABMultiSubmodelProvider> server = new BaSyxTCPServer<VABMultiSubmodelProvider>(aasProvider, 9998);
-		// - Start local BaSyx/TCP server
-		server.start();
-				
-		
-		// Access BaSyx TCP server using low-level BaSyx connector instead of connection manager
-		// - Create BaSyx connector to connect with the sub model
-		BaSyxConnector basyxConnector = new BaSyxConnector("localhost", 9998);
-		// - Create connection to BaSyx server manager
-		JSONConnector toDeviceManager = new JSONConnector(basyxConnector);	
-		// - Access sub model property, check value
-		int propVal = (Integer) toDeviceManager
-				.getModelPropertyValue("/aas/submodels/dynamicSM/submodel/" + MultiSubmodelElementProvider.ELEMENTS + "/prop1/value");
-		
-		
-		// Check value
-		assertTrue(propVal == 7);
-		
-	
-		// Stop local BaSyx/TCP server
-		server.stop();
-	}
-}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/http/ConnectToRemoteAAS.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/http/ConnectToRemoteAAS.java
deleted file mode 100644
index 2a4d1c5..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/deployment/http/ConnectToRemoteAAS.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.deployment.http;
-
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.components.servlet.aas.AASServlet;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext_Empty;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the creation of an Asset Administration Shell (AAS) by extending an SDK class
- * 
- * The AAS is deployed to an AASServlet instance running on a Apache Tomcat HTTP server. The AASServlet exports
- * an Asset Administration Shell via the defined BaSyx REST interface. 
- * 
- * @author kuhn
- *
- */
-public class ConnectToRemoteAAS {
-
-
-	/**
-	 * Example Asset Administration Shell
-	 */
-	static class ExampleAssetAdministrationShell extends AssetAdministrationShell {
-		/**
-		 * Constructor
-		 */
-		public ExampleAssetAdministrationShell() {
-			// Set Asset Administration Shell ID
-			setIdShort("aas-001");
-		}
-	}
-
-	
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-				// Servlets for example snippet
-			new BaSyxExamplesContext_Empty().
-					// Deploy example specific servlets to Tomcat server in this context
-					addServletMapping("/Testsuite/components/BaSys/1.0/SampleAAS/*",         new AASServlet(new ExampleAssetAdministrationShell()))
-			);
-
-	
-	
-	/**
-	 * Run code snippet. Connect to AAS on server, access AAS properties. 
-	 */
-	@Test
-	public void connectToAAS() throws Exception {
-		// Create AAS Registry to store meta-infomation using aas descriptor
-		// This is a pre-configured aas registry that resolves urn to aas-descriptor
-		ExampleAASRegistry registry = new ExampleAASRegistry();
-		registry.addAASMapping("aas-001",
-				"http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleAAS/aas");
-
-		// Create manager using the directory stub an the HTTPConnectorProvider
-		// - Connect to VAB object by ID. The connection manager looks up this ID in
-		//   its directory
-		ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry,
-				// We connect via HTTP
-				new HTTPConnectorProvider());
-		
-		// Retrieve the AAS from the AAS server with SDK connector
-		// - IAssetAdministrationShell is the interface for the local AAS proxy
-		IAssetAdministrationShell shell = manager
-				.retrieveAAS(new ModelUrn("aas-001"));
-		// - Retrieve AAS values and compare to expected values
-		Object propertyId = shell.getIdShort();
-		
-		
-		// Check result
-		assertTrue(propertyId.equals("aas-001"));
-	}
-}
-
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/ConnectToAASEndpoints.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/ConnectToAASEndpoints.java
deleted file mode 100644
index d105f5c..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/ConnectToAASEndpoints.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.registry;
-
-import static org.junit.Assert.assertEquals;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.aas.metamodel.connected.ConnectedAssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that registers an AAS descriptor with the AAS registry and connects to the registered AAS endpoint
- * 
- * The snippet communicates with a VAB element that is deployed to a VABLambdaServlet on a
- * Apache Tomcat HTTP server instance. The VABLambdaServlet provides an empty container that
- * is able to host any VAB object.
- * 
- * @author kuhn
- *
- */
-public class ConnectToAASEndpoints {
-
-	
-	/**
-	 * Create VAB connection manager backend
-	 * 
-	 * The connection manager uses a preconfigured directory for resolving IDs to 
-	 * network addresses, and a HTTP connector to connect to VAB objects.
-	 */
-	protected ConnectedAssetAdministrationShellManager connManager = new ConnectedAssetAdministrationShellManager(
-			new AASRegistryProxy("http://localhost:8080" + BaSyxExamplesContext.REGISTRYURL),
-			new HTTPConnectorProvider());
-
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-			new BaSyxExamplesContext()
-			);
-
-	
-	
-	
-	/**
-	 * Run code snippet. This code snippet illustrates the creation of an AASDescriptor, the dynamic creation and deployment of AAS, 
-	 * the lookup of the AAS, and the access of the AAS. 
-	 */
-	@Test
-	public void snippet() throws Exception {
-		
-		// Create AAS descriptor and sub model descriptors
-		ModelUrn      aasURN         = new ModelUrn("urn:de.FHG:devices.es.iese:aas:1.0:3:x-509#001");
-		String aasSrvURL = "http://localhost:8080" + BaSyxExamplesContext.AASSERVERURL + "/shells";
-
-		// Create AAS
-		AssetAdministrationShell aas = new AssetAdministrationShell();
-
-		// - Set AAS ID
-		aas.setIdentification(aasURN);
-
-		// - Transfer AAS to server
-		//   - This creates the "urn:de.FHG:devices.es.iese:aas:1.0:3:x-509#001" element on the server, which is the server
-		//     end point that will host the AAS.
-		connManager.createAAS(aas, aasSrvURL);
-
-		// Server connections
-		// - Connect AAS
-		ConnectedAssetAdministrationShell shell = connManager.retrieveAAS(aasURN);
-
-		// Retrieve the AAS from the AAS server with SDK connector
-		// - IAssetAdministrationShell is the interface for the local AAS proxy
-		// - Retrieve AAS values and compare to expected values
-		Object aasIDProperty = shell.getIdentification().getId();
-		
-		// Check property value
-		assertEquals(aasURN.getURN(), aasIDProperty);
-	}
-}
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/ConnectToSubModelEndpoints.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/ConnectToSubModelEndpoints.java
deleted file mode 100644
index a742439..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/ConnectToSubModelEndpoints.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.registry;
-
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
-import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
-import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that registers an AAS descriptor with the AAS registry and connects to a sub model of
- * the registered AAS endpoint
- * 
- * The snippet communicates with a VAB element that is deployed to a VABLambdaServlet on a
- * Apache Tomcat HTTP server instance. The VABLambdaServlet provides an empty container that
- * is able to host any VAB object.
- * 
- * @author kuhn
- *
- */
-public class ConnectToSubModelEndpoints {
-	/**
-	 * Create VAB connection manager backend
-	 * 
-	 * The connection manager uses a preconfigured directory for resolving IDs to 
-	 * network addresses, and a HTTP connector to connect to VAB objects.
-	 */
-	protected ConnectedAssetAdministrationShellManager connManager = new ConnectedAssetAdministrationShellManager(
-			new AASRegistryProxy("http://localhost:8080" + BaSyxExamplesContext.REGISTRYURL),
-			new HTTPConnectorProvider());
-
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-			new BaSyxExamplesContext()
-			);
-
-	
-	
-	
-	/**
-	 * Run code snippet. This code snippet illustrates the creation of an AASDescriptor, the dynamic creation and deployment of an AAS sub model, 
-	 * the lookup of the AAS sub model, and the access of the AAS sub model. 
-	 */
-	@Test
-	public void snippet() throws Exception {
-		
-		// Create AAS descriptor and sub model descriptors
-		ModelUrn      aasURN         = new ModelUrn("urn:de.FHG:devices.es.iese:aas:1.0:3:x-509#001");
-		String aasSrvURL = "http://localhost:8080" + BaSyxExamplesContext.AASSERVERURL;
-
-		// Create AAS
-		AssetAdministrationShell aas = new AssetAdministrationShell();
-
-		// - Set AAS ID
-		aas.setIdentification(aasURN);
-
-		// - Transfer AAS to server
-		// - This creates the "urn:de.FHG:devices.es.iese:aas:1.0:3:x-509#001" element
-		// on the server, which is the server
-		// end point that will host the AAS.
-		connManager.createAAS(aas, aasSrvURL);
-
-		// - Sub model ID
-		String smIdShort = "exampleSM";
-		IIdentifier smId = new Identifier(IdentifierType.CUSTOM, "exampleSMId");
-		
-		// Create sub model
-		SubModel submodel = new SubModel();
-		submodel.setIdShort(smIdShort);
-		submodel.setIdentification(smId.getIdType(), smId.getId());
-
-		// - Add example properties to sub model
-		Property prop1 = new Property(7);
-		prop1.setIdShort("prop1");
-		submodel.addSubModelElement(prop1);
-
-		Property prop2 = new Property("myStr");
-		prop2.setIdShort("prop2");
-		submodel.addSubModelElement(prop2);
-		// - Transfer sub model to server
-		//   - This creates the "exampleSM" element on the server, which is the server
-		//     end point that will host the AAS sub model.
-		connManager.createSubModel(aasURN, submodel);
-
-	
-		// Connect to sub model using BaSyx SDK
-		ISubModel connSM = connManager.retrieveSubModel(aasURN, smId);
-
-		
-		// Read property values from sub model
-		String smID     = connSM.getIdShort();
-		String prop1Id = connSM.getProperties().get("prop1").getIdShort();
-		int prop1Val = (int) connSM.getProperties().get("prop1").getValue();
-		String prop2Id  = connSM.getProperties().get("prop2").getIdShort();
-		String prop2Val = (String) connSM.getProperties().get("prop2").getValue();
-
-		
-		// Check property values
-		assertTrue(smID.equals(smIdShort));
-		assertTrue(prop1Id.equals("prop1"));
-		assertTrue(prop1Val == 7);
-		assertTrue(prop2Id.equals("prop2"));
-		assertTrue(prop2Val.equals("myStr"));
-	}
-}
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/RegisterRetrieveAASEndpoints.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/RegisterRetrieveAASEndpoints.java
deleted file mode 100644
index cb6c73e..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/registry/RegisterRetrieveAASEndpoints.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.registry;
-
-import static org.junit.Assert.assertEquals;
-
-import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
-import org.eclipse.basyx.aas.registration.api.IAASRegistryService;
-import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.examples.support.directory.ExamplesPreconfiguredDirectory;
-import org.eclipse.basyx.vab.manager.VABConnectionManager;
-import org.eclipse.basyx.vab.modelprovider.VABPathTools;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that registers an AAS descriptor with the AAS registry and accesses the registry using HTTP calls
- * 
- * The snippet communicates with a VAB element that is deployed to a VABLambdaServlet on a
- * Apache Tomcat HTTP server instance. The VABLambdaServlet provides an empty container that
- * is able to host any VAB object.
- * 
- * @author kuhn
- *
- */
-public class RegisterRetrieveAASEndpoints {
-
-	
-	/**
-	 * Create VAB connection manager backend
-	 * 
-	 * The connection manager uses a preconfigured directory for resolving IDs to 
-	 * network addresses, and a HTTP connector to connect to VAB objects.
-	 */
-	protected VABConnectionManager connManager = new VABConnectionManager(new ExamplesPreconfiguredDirectory(), new HTTPConnectorProvider());
-
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-			new BaSyxExamplesContext()
-			);
-
-	
-	
-	
-	/**
-	 * Run code snippet. This code snippet illustrates the creation of an AASDescriptor, its registration, and 
-	 * the lookup of the AAS using HTTP REST calls
-	 */
-	@Test
-	public void snippet() throws Exception {
-		
-		// Create AAS descriptor and sub model descriptors
-		ModelUrn      aasURN         = new ModelUrn("urn:de.FHG:devices.es.iese:aas:1.0:3:x-509#001");
-		ModelUrn      subModelURN    = new ModelUrn("urn:de.FHG:devices.es.iese:exampleSM:1.0:3:x-509#001");
-		String aasSrvURL = "http://localhost:8080" + BaSyxExamplesContext.AASSERVERURL;
-		String aasPath = VABPathTools.concatenatePaths(aasSrvURL, aasURN.getEncodedURN(), "/aas");
-		// - Create AAS descriptor
-		AASDescriptor aasDescriptor = new AASDescriptor(aasURN, aasPath);
-		// - Add sub model descriptor URI
-
-		String smPath = VABPathTools.concatenatePaths(aasPath, "/submodels/" + subModelURN.getEncodedURN() + "/submodel");
-		SubmodelDescriptor submodelDescriptor = new SubmodelDescriptor("smIdShort", subModelURN, smPath);
-		aasDescriptor.addSubmodelDescriptor(submodelDescriptor);
-
-
-		// Register AAS and sub model descriptors in directory (push AAS descriptor to server)
-		// - Connect to AAS registry
-		IAASRegistryService regProxy = new AASRegistryProxy(
-				"http://localhost:8080/" + BaSyxExamplesContext.REGISTRYURL);
-		// - Register AAS descriptor with AAS and sub model endpoints in registry
-		regProxy.register(aasDescriptor);
-
-		
-		// Lookup AAS descriptor
-		AASDescriptor aasDesc = regProxy.lookupAAS(aasURN);
-		// - AAS end sub model end points
-		String aasEndpointURL = aasDesc.getFirstEndpoint();
-		String smEndpointURL  = aasDesc.getSubModelDescriptor(subModelURN).getFirstEndpoint();
-		
-		
-		// Check results
-		assertEquals(aasPath, aasEndpointURL);
-		assertEquals(smPath, smEndpointURL);
-	}
-}
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/ConnectToAASSubModelSDK.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/ConnectToAASSubModelSDK.java
deleted file mode 100644
index 6a4402c..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/ConnectToAASSubModelSDK.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.submodels;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.Map;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.components.servlet.submodel.SubmodelServlet;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext_Empty;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
-import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
-import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
-import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
-import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
-import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElementCollection;
-import org.eclipse.basyx.submodel.metamodel.api.submodelelement.dataelement.IProperty;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElementCollection;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the use of CRUD Virtual Automation Bus (VAB) operations
- * 
- * The snippet communicates with a VAB element that is deployed to a VABLambdaServlet on a
- * Apache Tomcat HTTP server instance. The VABLambdaServlet provides an empty container that
- * is able to host any VAB object.
- * 
- * @author kuhn
- *
- */
-public class ConnectToAASSubModelSDK {
-
-
-	/**
-	 * Example sub model. This example sub model is created with the BaSyx SDK factory and defines the AAS meta model properties
-	 */
-	static class SampleSubModel extends SubModel {
-		/**
-		 * Constructor - create sub model
-		 * 
-		 * This sub model contains static properties, i.e. properties that have a static value assigned.
-		 */
-		@SuppressWarnings("unchecked")
-		public SampleSubModel() {
-			// Set sub model id and name
-			setIdShort("smName");
-			setIdentification(IdentifierType.CUSTOM, "sm-001");
-
-			// Add example properties
-			// - Add simple property
-			Property prop1 = new Property(234);
-			prop1.setIdShort("prop1");
-			addSubModelElement(prop1);
-
-			Property prop11 = new Property(123);
-			prop11.setIdShort("prop11");
-			// - Add container property that holds other properties
-			SubmodelElementCollection container = new SubmodelElementCollection();
-			container.setIdShort("prop2");
-			container.addSubModelElement(prop11);
-			// - Add container to property map
-			addSubModelElement(container);
-
-			// Add another property manually to sub model container "properties"
-			Property prop3 = new Property(17);
-			prop3.setIdShort("prop3");
-			((Map<String, Object>) this.get("submodelElements")).put("prop3", prop3);
-		}
-	}
-
-	
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-				// Servlets for example snippet
-			new BaSyxExamplesContext_Empty().
-					// Deploy example specific servlets to Tomcat server in this context
-					addServletMapping("/Testsuite/components/BaSys/1.0/SampleModel/*",       new SubmodelServlet(new SampleSubModel()))
-			);
-
-	
-	/**
-	 * Run code snippet. Access sub model, query data
-	 */
-	@Test
-	public void accessSubModel() throws Exception {
-		// Create the AAS registry
-		ExampleAASRegistry registry = new ExampleAASRegistry();
-		registry.addAASMapping("aas-001", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/")
-			.addSubmodelMapping("aas-001", "sm-001", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/");
-		
-		// Create manager using the directory stub and the HTTPConnectorProvider
-		ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry,
-				// We connect via HTTP
-				new HTTPConnectorProvider());
-		
-		
-		// Retrieve sub model (created by factory) with SDK connector
-		// - Create and connect SDK connector
-		IIdentifier aasId = new Identifier(IdentifierType.CUSTOM, "aas-001");
-		IIdentifier smId = new Identifier(IdentifierType.CUSTOM, "sm-001");
-		ISubModel subModel = manager.retrieveSubModel(aasId, smId);
-
-		// - Retrieve sub model values and compare to expected values
-		Map<String, ISubmodelElement> smElements = subModel.getSubmodelElements();
-		IProperty prop1 = (IProperty) smElements.get("prop1");
-		ISubmodelElementCollection prop2 = (ISubmodelElementCollection) smElements.get("prop2");
-		IProperty prop11 = prop2.getProperties().get("prop11");
-		IProperty prop3 = (IProperty) smElements.get("prop3");
-
-		assertEquals(smId.getId(), subModel.getIdentification().getId());
-		assertEquals("smName", subModel.getIdShort());
-		assertEquals("prop1", prop1.getIdShort());
-		assertEquals(234, prop1.getValue());
-		assertEquals("prop2", prop2.getIdShort());
-		assertEquals("prop11", prop11.getIdShort());
-		assertEquals(123, prop11.getValue());
-		assertEquals("prop3", prop3.getIdShort());
-		assertEquals(17, prop3.getValue());
-	}
-}
-
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/ConnectToAASSubModelVAB.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/ConnectToAASSubModelVAB.java
deleted file mode 100644
index fbb25ed..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/ConnectToAASSubModelVAB.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.submodels;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.Map;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.components.servlet.submodel.SubmodelServlet;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext_Empty;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
-import org.eclipse.basyx.examples.support.directory.ExamplesPreconfiguredDirectory;
-import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
-import org.eclipse.basyx.submodel.metamodel.map.qualifier.Identifiable;
-import org.eclipse.basyx.submodel.metamodel.map.qualifier.Referable;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElementCollection;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.submodel.restapi.MultiSubmodelElementProvider;
-import org.eclipse.basyx.vab.manager.VABConnectionManager;
-import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-
-
-/**
- * Code snippet that illustrates the use of CRUD Virtual Automation Bus (VAB) operations
- * 
- * The snippet communicates with a VAB element that is deployed to a VABLambdaServlet on a
- * Apache Tomcat HTTP server instance. The VABLambdaServlet provides an empty container that
- * is able to host any VAB object.
- * 
- * @author kuhn
- *
- */
-public class ConnectToAASSubModelVAB {
-
-	
-	/**
-	 * Example sub model. This example sub model is created with the BaSyx SDK factory and defines the AAS meta model properties
-	 */
-	static class SampleSubModel extends SubModel {
-		/**
-		 * Constructor - create sub model
-		 * 
-		 * This sub model contains static properties, i.e. properties that have a static value assigned.
-		 */
-		@SuppressWarnings("unchecked")
-		public SampleSubModel() {
-			// Set sub model id and name
-			setIdShort("smName");
-			setIdentification(IdentifierType.CUSTOM, "sm-001");
-
-			// Add example properties
-			// - Add simple property
-			Property prop1 = new Property(234);
-			prop1.setIdShort("prop1");
-			addSubModelElement(prop1);
-
-			Property prop11 = new Property(123);
-			prop11.setIdShort("prop11");
-			// - Add container property that holds other properties
-			SubmodelElementCollection container = new SubmodelElementCollection();
-			container.setIdShort("prop2");
-			container.addSubModelElement(prop11);
-			// - Add container to property map
-			addSubModelElement(container);
-
-			// Add another property manually to sub model container "properties"
-			Property prop3 = new Property(17);
-			prop3.setIdShort("prop3");
-			((Map<String, Object>) this.get("submodelElements")).put("prop3", prop3);
-		}
-	}
-
-	
-	
-	/**
-	 * Create VAB connection manager backend
-	 * 
-	 * The connection manager uses a preconfigured directory for resolving IDs to 
-	 * network addresses, and a HTTP connector to connect to VAB objects.
-	 */
-	protected VABConnectionManager connManager = new VABConnectionManager(
-			// Add example specific mappings
-			new ExamplesPreconfiguredDirectory()
-				.addMapping("aas-001",    "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/")
-			    .addMapping("sm-001",     "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/")
-			    .addMapping("sm-001VAB",  "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/"),
-			// We connect via HTTP
-			new HTTPConnectorProvider());
-
-	protected ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(
-			new ExampleAASRegistry()
-					.addAASMapping("aas-001", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/")
-					.addSubmodelMapping("aas-001", "sm-001", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/"),
-			// We connect via HTTP
-			new HTTPConnectorProvider());
-	
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-				// Servlets for example snippet
-				new BaSyxExamplesContext_Empty().
-					// Deploy example specific servlets to Tomcat server in this context
-					addServletMapping("/Testsuite/components/BaSys/1.0/SampleModel/*",       new SubmodelServlet(new SampleSubModel()))
-			);
-
-	
-	/**
-	 * Run code snippet. Access sub model, query data
-	 */
-	@Test @SuppressWarnings("unchecked")
-	public void accessSubModel() throws Exception {
-		// Retrieve sub model (created by factory) with SDK connector
-		// - Connect to sub model using lower-level VAB interface
-		VABElementProxy connSubModel1 = this.connManager.connectToVABElement("sm-001VAB");
-		Map<String, Object> submodel = (Map<String, Object>) connSubModel1.getModelPropertyValue("");
-		Map<String, Object> smId = (Map<String, Object>) submodel.get(Identifiable.IDENTIFICATION);
-
-		// - Read properties
-		Map<String, Object> prop1 = (Map<String, Object>) connSubModel1.getModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS + "/prop1");
-		Map<String, Object> prop2 = (Map<String, Object>) connSubModel1.getModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS + "/prop2");
-		Map<String, Object> prop11 = (Map<String, Object>) connSubModel1.getModelPropertyValue("submodelElements/prop2/prop11");
-		Map<String, Object> prop3 = (Map<String, Object>) connSubModel1.getModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS + "/prop3");
-
-		// - Change property value using VAB primitive
-		connSubModel1.setModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS + "/prop1/value", 456);
-
-		// - Read value back using VAB primitive
-		Map<String, Object> changedProp1 = (Map<String, Object>) connSubModel1
-				.getModelPropertyValue(MultiSubmodelElementProvider.ELEMENTS + "/prop1");
-
-		// - Check results
-		assertEquals("sm-001", smId.get(Identifier.ID));
-		assertEquals("smName", submodel.get(Referable.IDSHORT));
-		assertEquals("prop1", prop1.get(Referable.IDSHORT));
-		assertEquals(234, prop1.get(Property.VALUE)); // old value of prop1 has been stored locally
-		assertEquals(456, changedProp1.get(Property.VALUE)); // new value is 456
-		assertEquals("prop2", prop2.get(Referable.IDSHORT));
-		assertEquals("prop11", prop11.get(Referable.IDSHORT));
-		assertEquals(123, prop11.get(Property.VALUE));
-		assertEquals("prop3", prop3.get(Referable.IDSHORT));
-		assertEquals(17, prop3.get(Property.VALUE));
-
-	}
-}
-
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/CreateAASSubModelSDK.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/CreateAASSubModelSDK.java
deleted file mode 100644
index c19ef23..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/CreateAASSubModelSDK.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.submodels;
-
-import static org.junit.Assert.assertTrue;
-
-import java.util.Map;
-
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElementCollection;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.junit.Test;
-
-
-
-/**
- * Code snippet that illustrates the creation of an AAS sub model
- * 
- * @author kuhn
- *
- */
-public class CreateAASSubModelSDK {
-
-	
-	/**
-	 * Example sub model. This example sub model is created with the BaSyx SDK factory and defines the AAS meta model properties
-	 */
-	static class SampleSubModel extends SubModel {
-		/**
-		 * Constructor - create sub model
-		 * 
-		 * This sub model contains static properties, i.e. properties that have a static value assigned.
-		 */
-		@SuppressWarnings("unchecked")
-		public SampleSubModel() {
-			// Set sub model ID
-			setIdShort("sm-001");
-
-			// Add example properties
-			// - Add simple property
-			Property prop1 = new Property(234);
-			prop1.setIdShort("prop1");
-			addSubModelElement(prop1);
-
-			Property prop11 = new Property(123);
-			prop11.setIdShort("prop11");
-			// - Add container property that holds other properties
-			SubmodelElementCollection container = new SubmodelElementCollection();
-			container.setIdShort("prop2");
-			container.addSubModelElement(prop11);
-			// - Add container to property map
-			addSubModelElement(container);
-
-			// Add another property manually to sub model container "properties"
-			Property prop3 = new Property(17);
-			prop3.setIdShort("prop3");
-			{
-				((Map<String, Object>) this.get("submodelElements")).put("prop3", prop3);
-			}
-		}
-	}
-
-	
-	/**
-	 * Run code snippet. Instantiate AAS sub model.
-	 */
-	@Test
-	public void accessSubModel() throws Exception {
-		// Instantiate AAS sub model
-		SampleSubModel sampleSM = new SampleSubModel();
-		
-		// Access sub model property
-		int propertyVal = (int) sampleSM.getPath("submodelElements/prop1/value");
-		
-		// Check property value
-		assertTrue(propertyVal == 234);
-	}
-}
-
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/CreateAASSubModelVAB.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/CreateAASSubModelVAB.java
deleted file mode 100644
index 84327cd..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/CreateAASSubModelVAB.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.submodels;
-
-import static org.junit.Assert.assertTrue;
-
-import java.util.Map;
-
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.valuetypedef.PropertyValueTypeDefHelper;
-import org.junit.Test;
-
-
-
-/**
- * Code snippet that illustrates the creation of an AAS sub model
- * 
- * @author kuhn
- *
- */
-public class CreateAASSubModelVAB {
-
-	
-	/**
-	 * Example sub model. This example sub model is created with the BaSyx SDK factory and defines the AAS meta model properties
-	 */
-	static class SampleSubModel extends SubModel {
-		/**
-		 * Constructor - create sub model property
-		 * 
-		 * This sub model contains static properties, i.e. properties that have a static value assigned.
-		 */
-		@SuppressWarnings("unchecked")
-		public SampleSubModel() {
-			// Set sub model ID
-			setIdShort("sm-001M");
-
-			// Add example properties
-			// - Add simple property with value and idShort meta elements
-			this.putPath("properties/prop1/value",     234);
-			this.putPath("properties/prop1/valueType", PropertyValueTypeDefHelper.getTypeWrapperFromObject(234));
-			this.putPath("properties/prop1/idShort",   "prop1");
-
-			// Add container property that holds other properties
-			this.putPath("properties/prop2/idShort", "prop2");
-			// - Add contained property
-			this.putPath("properties/prop2/properties/prop11/value",     123);
-			this.putPath("properties/prop2/properties/prop11/valueType", PropertyValueTypeDefHelper.getTypeWrapperFromObject(123).toString());
-			this.putPath("properties/prop2/properties/prop11/idShort", "prop11");
-			
-			// Add another property manually to sub model container "properties"
-			// - Using the Property class ensures presence of all meta properties
-			Property addedProperty = new Property(); 
-			addedProperty.set(17);
-			addedProperty.setIdShort("prop3");
-			// - Add property to sub model container "properties"
-			{((Map<String, Object>) this.get("properties")).put("prop3", addedProperty);}
-		}
-	}
-
-	
-	/**
-	 * Run code snippet. Instantiate AAS sub model.
-	 */
-	@Test
-	public void accessSubModel() throws Exception {
-		// Instantiate AAS sub model
-		SampleSubModel sampleSM = new SampleSubModel();
-		
-		// Access sub model property
-		int propertyVal = (int) sampleSM.getPath("properties/prop1/value");
-		
-		// Check property value
-		assertTrue(propertyVal == 234);
-	}
-}
-
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/DynamicSubModelDeployment.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/DynamicSubModelDeployment.java
deleted file mode 100644
index 0028072..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/DynamicSubModelDeployment.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.submodels;
-
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.components.servlet.aas.AASServlet;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
-import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the creation of an AAS sub model
- * 
- * @author kuhn
- *
- */
-public class DynamicSubModelDeployment {
-
-	private static final String AAS = "de.FHG:devices.es.iese:aas:1.0:3:x-509#003";
-	private static final String STATUS_SM = "de.FHG:devices.es.iese:statusSM:1.0:3:x-509#003";
-
-	protected ConnectedAssetAdministrationShellManager aasManager = new ConnectedAssetAdministrationShellManager(
-			new ExampleAASRegistry()
-					.addAASMapping(AAS,
-							"http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/dynamicModelRepository/aas/")
-					// Ass Example specific mappings
-					.addSubmodelMapping(AAS, STATUS_SM,
-							"http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/dynamicModelRepository/aas/submodels/Status"),
-			new HTTPConnectorProvider());
-
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-				// Simulated servlets
-				// - BaSys topology with one AAS Server and one SQL directory
-				new BaSyxExamplesContext()
-					// Deploy example specific servlets to Apache Tomcat server in this context
-					.addServletMapping("/Testsuite/components/BaSys/1.0/dynamicModelRepository/*",
-							new AASServlet(new AssetAdministrationShell()))
-			);
-
-	
-	
-	
-	/**
-	 * Run code snippet. This code snippet illustrates the use of CRUD operations to 
-	 * access Virtual Automation Bus objects
-	 */
-	@Test
-	public void snippet() throws Exception {
-		// Instantiate sub model
-		SubModel submodel = new SubModel();
-		// - Add example properties to sub model
-		submodel.setIdShort("Status");
-		Property prop1 = new Property(7);
-		prop1.setIdShort("prop1");
-		submodel.addSubModelElement(prop1);
-
-		Property prop2 = new Property("myStr");
-		prop2.setIdShort("prop2");
-		submodel.addSubModelElement(prop2);
-
-		
-		
-		// Transfer sub model to server
-		aasManager.createSubModel(new ModelUrn(AAS), submodel);
-
-		
-		// Retrieve sub model with SDK connector
-		{
-
-			// Server connections
-			// - Connect to sub model. Connecting to a sub model by its ID is discouraged, because a sub 
-			//   model ID is not necessarily unique outside the scope of its AAS. If users want to connect
-			//   directly to sub models, the registry needs to support this, and unique identifies (as here)
-			//   must be used. For portability, users should connect to sub models instead via an AAS ID and 
-			//   sub model ID tuple, as illustrated in the registry examples. 
-			ISubModel subModel = aasManager.retrieveSubModel(new ModelUrn(AAS), new ModelUrn(STATUS_SM));
-
-			// Read sub model properties
-			String smId     = subModel.getIdShort();
-			String prop1Id  = subModel.getProperties().get("prop1").getIdShort();
-			int prop1Val = (int) subModel.getProperties().get("prop1").getValue();
-			String prop2Id  = subModel.getProperties().get("prop2").getIdShort();
-			String prop2Val = (String) subModel.getProperties().get("prop2").getValue();
-			
-			// Compare sub model property values
-			assertTrue(smId.equals("Status"));
-			assertTrue(prop1Id.equals("prop1"));
-			assertTrue(prop1Val == 7);
-			assertTrue(prop2Id.equals("prop2"));
-			assertTrue(prop2Val.equals("myStr"));
-		}
-	}
-}
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/DynamicSubModelDeploymentHTTP.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/DynamicSubModelDeploymentHTTP.java
deleted file mode 100644
index cabbd95..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/DynamicSubModelDeploymentHTTP.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.submodels;
-
-import static org.junit.Assert.assertTrue;
-
-import java.util.Map;
-
-import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
-import org.eclipse.basyx.components.servlet.aas.AASServlet;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.examples.support.directory.ExamplesPreconfiguredDirectory;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
-import org.eclipse.basyx.submodel.restapi.MultiSubmodelElementProvider;
-import org.eclipse.basyx.tools.webserviceclient.WebServiceJSONClient;
-import org.eclipse.basyx.vab.manager.VABConnectionManager;
-import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the creation of an AAS sub model, and the access to the sub model via HTTP REST calls
- * 
- * @author kuhn
- *
- */
-public class DynamicSubModelDeploymentHTTP {
-
-	
-	/**
-	 * Create VAB connection manager backend
-	 * 
-	 * The connection manager uses a preconfigured directory for resolving IDs to 
-	 * network addresses, and a HTTP connector to connect to VAB objects.
-	 */
-	protected VABConnectionManager connManager = new VABConnectionManager(
-			new ExamplesPreconfiguredDirectory()
-				// Add example specific mappings
-					.addMapping("urn:de.FHG:devices.es.iese:aas:1.0:3:x-509:003",
-							"http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/dynamicModelRepository/aas"),
-			new HTTPConnectorProvider());
-
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-				// Simulated servlets
-				// - BaSys topology with one AAS Server and one SQL directory
-			new BaSyxExamplesContext()
-					// Deploy example specific servlets to Apache Tomcat server in this context
-					.addServletMapping("/Testsuite/components/BaSys/1.0/dynamicModelRepository/*",
-							new AASServlet(new AssetAdministrationShell()))
-			);
-
-	
-	
-	
-	/**
-	 * Run code snippet. This code snippet illustrates the dynamic deployment of a sub model and the use of HTTP REST operations to 
-	 * access the sub model
-	 */
-	@Test @SuppressWarnings("unchecked")
-	public void snippet() throws Exception {
-
-		// Server connections
-		// - Connect to sub model. Connecting to a sub model by its ID is discouraged, because a sub 
-		//   model ID is not necessarily unique outside the scope of its AAS. If users want to connect
-		//   directly to sub models, the registry needs to support this, and unique identifies (as here)
-		//   must be used. For portability, users should connect to sub models instead via an AAS ID and 
-		//   sub model ID tuple, as illustrated in the registry examples. 
-		VABElementProxy connSubModels = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:aas:1.0:3:x-509:003");
-
-		// Add example properties
-		SubModel submodel = new SubModel();
-		submodel.setIdShort("Status");
-		Property prop1 = new Property(7);
-		prop1.setIdShort("prop1");
-		submodel.addSubModelElement(prop1);
-
-		Property prop2 = new Property("myStr");
-		prop2.setIdShort("prop2");
-		submodel.addSubModelElement(prop2);
-
-		// Transfer sub model to server
-		connSubModels.setModelPropertyValue("/submodels/" + submodel.getIdShort(), submodel);
-
-		
-		// Web service client accesses AAS using HTTP REST calls
-		WebServiceJSONClient jsonClient = new WebServiceJSONClient();
-		
-		// Read property values using the WebServiceJSONClient class. 
-		// - Returned property contains meta data. The actual property is stored in property "entity", property value is in entity property "value"
-		String smEndpoint = "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/dynamicModelRepository/aas/submodels/Status/submodel";
-		Map<String, Object> sm = ((Map<String, Object>) jsonClient.get(smEndpoint));
-		String smId = (String) sm.get("idShort");
-		int prop1Val = (int) ((Map<String, Object>) jsonClient.get(smEndpoint + "/" + MultiSubmodelElementProvider.ELEMENTS + "/prop1")).get("value");
-		String prop1Id = (String) ((Map<String, Object>) jsonClient.get(smEndpoint + "/" + MultiSubmodelElementProvider.ELEMENTS + "/prop1")).get("idShort");
-		String prop2Val = (String) ((Map<String, Object>) jsonClient.get(smEndpoint + "/" + MultiSubmodelElementProvider.ELEMENTS + "/prop2")).get("value");
-
-		
-		// Check results
-		assertTrue(smId.equals("Status"));
-		assertTrue(prop1Val == 7);
-		assertTrue(prop1Id.equals("prop1"));
-		assertTrue(prop2Val.equals("myStr"));
-	}
-}
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/InvokeSubModelOperationSDK.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/InvokeSubModelOperationSDK.java
deleted file mode 100644
index d608f14..0000000
--- a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/aas/submodels/InvokeSubModelOperationSDK.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package org.eclipse.basyx.examples.snippets.aas.submodels;
-
-import static org.junit.Assert.assertTrue;
-
-import java.util.Map;
-import java.util.function.Function;
-
-import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
-import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
-import org.eclipse.basyx.components.servlet.submodel.SubmodelServlet;
-import org.eclipse.basyx.examples.contexts.BaSyxExamplesContext_Empty;
-import org.eclipse.basyx.examples.deployment.BaSyxDeployment;
-import org.eclipse.basyx.examples.support.directory.ExampleAASRegistry;
-import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
-import org.eclipse.basyx.submodel.metamodel.api.submodelelement.operation.IOperation;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.submodelelement.operation.Operation;
-import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-/**
- * Code snippet that illustrates the definition and invocation of sub model operations
- * 
- * The snippet communicates with a VAB element that is deployed to a VABLambdaServlet on a
- * Apache Tomcat HTTP server instance. The VABLambdaServlet provides an empty container that
- * is able to host any VAB object.
- * 
- * @author kuhn
- *
- */
-public class InvokeSubModelOperationSDK {
-
-	
-	/**
-	 * Example sub model. This example sub model is created with the BaSyx SDK factory and defines the AAS meta model properties
-	 */
-	static class SampleSubModel extends SubModel {
-		/**
-		 * Constructor - create sub model
-		 * 
-		 * This sub model contains operations
-		 */
-		public SampleSubModel() {
-			// Set sub model ID
-			setIdShort("sm-001");
-
-			// Define operations
-			Operation op1 = new Operation((Function<Object[], Object>) v -> {
-				return operation1();
-			});
-			op1.setIdShort("operation1");
-			addSubModelElement(op1);
-
-			Operation op2 = new Operation((Function<Object[], Object>) v -> {
-				return operation2((int) v[0], (int) v[1]);
-			});
-			op2.setIdShort("operation2");
-			addSubModelElement(op2);
-
-		}
-		
-		/**
-		 * Example operation implementation
-		 */
-		public int operation1() {
-			return 4;
-		}
-		
-		/**
-		 * Example operation with parameter
-		 */
-		public int operation2(int par1, int par2) {
-			return par1+par2;
-		}
-	}
-
-	
-	
-	/**
-	 * Create VAB connection manager backend
-	 * 
-	 * The connection manager uses a preconfigured directory for resolving IDs to 
-	 * network addresses, and a HTTP connector to connect to VAB objects.
-	 */
-	protected ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(
-			// Add example specific mappings
-			new ExampleAASRegistry()
-					.addAASMapping("aas-001", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/")
-					.addSubmodelMapping("aas-001", "sm-001", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/SampleModel/"),
-			// We connect via HTTP
-			new HTTPConnectorProvider());
-	
-	
-	/**
-	 * The BaSyx Deployment instantiates and starts context elements for this example. 
-	 * 
-	 * This example instantiates the BaSyxExamplesContext_1MemoryAASServer_1SQLDirectory
-	 * example context that creates one AAS server, and one SQL based AAS registry.
-	 * 
-	 * BaSyxDeployment contexts instantiate all components on the IP address of the host. 
-	 * Therefore, all components use the same IP address. 
-	 */
-	@ClassRule
-	public static BaSyxDeployment context = new BaSyxDeployment(
-				// Servlets for example snippet
-				new BaSyxExamplesContext_Empty().
-					// Deploy example specific servlets to Tomcat server in this context
-					addServletMapping("/Testsuite/components/BaSys/1.0/SampleModel/*",  new SubmodelServlet(new SampleSubModel()))
-			);
-
-	
-	/**
-	 * Run code snippet. Access sub model, query data
-	 */
-	@Test
-	public void accessSubModel() throws Exception {
-		// Retrieve sub model (created by factory) with SDK connector
-		{
-			// Create and connect SDK connector
-			ISubModel subModel = manager.retrieveSubModel(new ModelUrn("aas-001"), new ModelUrn("sm-001"));
-			
-			// Sub model operations
-			Map<String, IOperation> operations = subModel.getOperations();
-			
-			// Get first operation by name
-			IOperation op1 = operations.get("operation1");
-			// - Invoke operation
-			int result1 = (int) op1.invoke();
-
-			// Get second operation by name
-			IOperation op2 = operations.get("operation2");
-			// - Invoke operation
-			int result2 = (int) op2.invoke(7, 5);
-
-			
-			// Check results
-			assertTrue(result1 ==  4);
-			assertTrue(result2 == 12);
-		}
-	}
-}
-
-
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestAddSubmodelElement.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestAddSubmodelElement.java
new file mode 100644
index 0000000..d7af892
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestAddSubmodelElement.java
@@ -0,0 +1,50 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
+import org.junit.Test;
+
+/**
+ * Test for the AddSubmodelElement snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestAddSubmodelElement extends AbstractSnippetTest {
+
+	private static final String NEW_PROPERTY_ID = "new_prop";
+	private static final int NEW_PROPERTY_VALUE = 321;
+	
+	@Test
+	public void testAddSubmodelElement() {
+		
+		// Get the Identifiers of the AAS and Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, SM_ID);
+		
+		// Build a new SubmodelElement
+		Property newProperty = new Property();
+		newProperty.setIdShort(NEW_PROPERTY_ID);
+		newProperty.setValue(NEW_PROPERTY_VALUE);
+		
+		// Add the new Element to the Submodel
+		AddSubmodelElement.addSubmodelElement(newProperty, smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Get the Element from the server
+		ConnectedAssetAdministrationShellManager manager = getManager();
+		ISubModel remoteSubmodel = manager.retrieveSubModel(aasIdentifier, smIdentifier);
+		ISubmodelElement remoteElement = remoteSubmodel.getSubmodelElement(NEW_PROPERTY_ID);
+		
+		// Check if its value is as expected
+		assertEquals(NEW_PROPERTY_VALUE, remoteElement.getValue());
+	}
+	
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestDeleteSubmodelElement.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestDeleteSubmodelElement.java
new file mode 100644
index 0000000..5da765a
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestDeleteSubmodelElement.java
@@ -0,0 +1,53 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import static org.junit.Assert.fail;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
+import org.junit.Test;
+
+/**
+ * Test for the DeleteSubmodelElement snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestDeleteSubmodelElement extends AbstractSnippetTest {
+
+	@Test
+	public void testDeleteSubmodelElement() {
+		
+		// Get the Identifier of the example AAS and Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, SM_ID);
+		
+		// Delete the SubmodelElement
+		DeleteSubmodelElement.deleteSubmodelElement(ExampleComponentBuilder.PROPERTY_ID, smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Create a proxy pointing to the registry server
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryComponent.getRegistryPath());
+		
+		// Create a ConnectedAASManager using the registryProxy as its registry
+		ConnectedAssetAdministrationShellManager manager =
+				new ConnectedAssetAdministrationShellManager(registryProxy);
+		
+		// Retrieve the Submodel from the server as a ConnectedSubmodel
+		ISubModel submodel = manager.retrieveSubModel(aasIdentifier, smIdentifier);
+		
+		// Try to retrieve deleted SubmodelElement; should throw ResourceNotFoundException
+		try {
+			submodel.getSubmodelElement(ExampleComponentBuilder.PROPERTY_ID);
+			fail();
+		} catch (ResourceNotFoundException e) {
+		}
+		
+	}
+	
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestExecuteOperation.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestExecuteOperation.java
new file mode 100644
index 0000000..6da88ae
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestExecuteOperation.java
@@ -0,0 +1,104 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.function.Function;
+
+import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
+import org.eclipse.basyx.components.servlet.submodel.SubmodelServlet;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.eclipse.basyx.submodel.metamodel.map.submodelelement.operation.Operation;
+import org.eclipse.basyx.vab.protocol.http.server.AASHTTPServer;
+import org.eclipse.basyx.vab.protocol.http.server.BaSyxContext;
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * Test for the ExecuteOperation snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestExecuteOperation extends AbstractSnippetTest {
+
+	private static final String NEW_SM_ID_SHORT = "smIdShort_New";
+	private static final String NEW_SM_ID = "smId_New";
+	
+	private static final String OPERATION_ID = "operation";
+	
+	private static final Object[] PARAMETERS = {2, 3};
+	private static final int EXPECTED_RESULT = 5;
+	
+	private AASHTTPServer server;
+	
+	@After
+	public void shutdownServer() {
+		server.shutdown();
+	}
+	
+	@Test
+	public void testExecuteOperation() throws Exception {
+		
+		SubModel submodel = ExampleComponentBuilder.buildExampleSubmodel(NEW_SM_ID_SHORT, NEW_SM_ID);
+		
+		// Add an Operation which calculates the sum of the two parameters
+		Operation operation = new Operation((Function<Object[], Object>) v -> {
+			return (int) v[0] + (int) v[1];
+		});
+		operation.setIdShort(OPERATION_ID);
+		submodel.addSubModelElement(operation);
+		
+		// Startup a Server hosting this Submodel
+		provideSubmodel(submodel);
+		
+		
+		// Get the Identifiers of the AAS and Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, NEW_SM_ID);
+		
+		// Execute the Operation and get the result
+		Object result = ExecuteOperation.executeOperation(OPERATION_ID, PARAMETERS, smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Check if the result is the expected value
+		assertEquals(EXPECTED_RESULT, result);
+		
+	}
+	
+	/**
+	 * Starts a new server hosting a given Submodel
+	 * This is necessary as an Operation can not be transfered to a server via serialization
+	 * 
+	 * @param submodel the Submodel to be hosted
+	 */
+	private void provideSubmodel(SubModel submodel) {
+		// Create a BaSyxConetxt for port 8082 with an empty endpoint
+		BaSyxContextConfiguration contextConfig = new BaSyxContextConfiguration(8082, "");
+		BaSyxContext context = contextConfig.createBaSyxContext();
+		
+		// Create a new SubmodelServlet containing the submodel
+		SubmodelServlet smServlet = new SubmodelServlet(submodel);
+		
+		// Add the SubmodelServlet mapping to the context at the path "/submodel"
+		context.addServletMapping("/submodel/*", smServlet);
+		
+		
+		// Create and start a HTTP server with the context created above
+		server = new AASHTTPServer(context);
+		server.start();
+		
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		SubmodelDescriptor descriptor = new SubmodelDescriptor(submodel, "http://localhost:8082/submodel");
+		
+		// Register the new Submodel
+		AASRegistryProxy registry = new AASRegistryProxy(registryComponent.getRegistryPath());
+		registry.register(aasIdentifier, descriptor);
+	}
+	
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestLookupSubmodel.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestLookupSubmodel.java
new file mode 100644
index 0000000..0305f12
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestLookupSubmodel.java
@@ -0,0 +1,36 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.junit.Test;
+
+/**
+ * Test for the LookupSubmodel snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestLookupSubmodel extends AbstractSnippetTest {
+
+	@Test
+	public void testLookupSubmodel() {
+		
+		// Get the Identifiers of the AAS and Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, SM_ID);
+		
+		// Lookup the Submodel in the registry
+		SubmodelDescriptor descriptor = LookupSubmodel.lookupSubmodel(
+				smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Check if the returned Descriptor is as expected
+		assertEquals(SM_ENDPOINT, descriptor.getFirstEndpoint());
+		
+	}
+	
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestRegisterSubmodel.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestRegisterSubmodel.java
new file mode 100644
index 0000000..ea7c3bf
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestRegisterSubmodel.java
@@ -0,0 +1,45 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
+import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.examples.snippets.aas.RegisterAAS;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.junit.Test;
+
+/**
+ * Test for the RegisterSubmodel snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestRegisterSubmodel extends AbstractSnippetTest {
+
+	private static final String NEW_SM_ID_SHORT = "smIdShort_New";
+	private static final String NEW_SM_ID = "smId_New";
+	private static final String NEW_SM_ENDPOINT = "http://localhost:8080/aasComponent/" + NEW_SM_ID_SHORT + "/submodel";
+	
+	@Test
+	public void testRegisterSubmodel() {
+		
+		// Get the example AAS and Submodel
+		AssetAdministrationShell aas = ExampleComponentBuilder.buildExampleAAS(AAS_ID_SHORT, AAS_ID);
+		SubModel sm = ExampleComponentBuilder.buildExampleSubmodel(NEW_SM_ID_SHORT, NEW_SM_ID);
+		
+		// Register this AAS
+		RegisterAAS.registerAAS(aas, AAS_ENDPOINT, registryComponent.getRegistryPath());
+		
+		// Register this Submodel
+		RegisterSubmodel.registerSubmodel(sm, NEW_SM_ENDPOINT, aas.getIdentification(), registryComponent.getRegistryPath());
+		
+		// Check if the Submodel was correctly registered
+		AASRegistryProxy registryProxy = new AASRegistryProxy(registryComponent.getRegistryPath());
+		SubmodelDescriptor descriptor = registryProxy.lookupSubmodel(aas.getIdentification(), sm.getIdentification());
+		assertEquals(NEW_SM_ENDPOINT, descriptor.getFirstEndpoint());
+		
+	}
+}
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestRetrieveSubmodelElement.java b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestRetrieveSubmodelElement.java
new file mode 100644
index 0000000..7d8d03f
--- /dev/null
+++ b/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/submodel/TestRetrieveSubmodelElement.java
@@ -0,0 +1,41 @@
+package org.eclipse.basyx.examples.snippets.submodel;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
+import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
+import org.junit.Test;
+
+/**
+ * Test for the RetrieveSubmodelElement snippet
+ * 
+ * @author conradi
+ *
+ */
+public class TestRetrieveSubmodelElement extends AbstractSnippetTest {
+
+	
+	@Test
+	public void testRetrieveSubmodelElement() {
+		
+		// Get the Identifiers of the AAS and Submodel
+		IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
+		IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, SM_ID);
+		
+		// Get the idShort and value of the element to be retrieved
+		String elementId = ExampleComponentBuilder.PROPERTY_ID;
+		int elementValue = ExampleComponentBuilder.PROPERTY_VALUE;
+		
+		// Get the SubmodelElement
+		ISubmodelElement element = RetrieveSubmodelElement.retrieveSubmodelElement(
+				elementId, smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
+		
+		// Check if the SubmodelElement contains the expected value
+		assertEquals(elementValue, element.getValue());
+	}
+	
+}
\ No newline at end of file
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/code/BaSyxCreateProvideUseExampleAASSubmodel.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/code/BaSyxCreateProvideUseExampleAASSubmodel.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/code/BaSyxCreateProvideUseExampleAASSubmodel.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/code/BaSyxCreateProvideUseExampleAASSubmodel.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnection.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnection.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnection.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnection.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnectionFull.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnectionFull.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnectionFull.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASServletConnectionFull.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletConnectorConnection.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletConnectorConnection.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletConnectorConnection.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletConnectorConnection.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletVABConnection.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletVABConnection.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletVABConnection.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/connection/servlet/AASSubModelServletVABConnection.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASDynamicOperationSnippet.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASDynamicOperationSnippet.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASDynamicOperationSnippet.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASDynamicOperationSnippet.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASManualHTTPOperationsSnippet.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASManualHTTPOperationsSnippet.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASManualHTTPOperationsSnippet.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASManualHTTPOperationsSnippet.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASPropertiesCRUDAccessSnippet.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASPropertiesCRUDAccessSnippet.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASPropertiesCRUDAccessSnippet.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASPropertiesCRUDAccessSnippet.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASTailoredSupplierSnippet.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASTailoredSupplierSnippet.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASTailoredSupplierSnippet.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/aas/dynamic/RunAASTailoredSupplierSnippet.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASManualHTTPOperationsSnippet.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASManualHTTPOperationsSnippet.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASManualHTTPOperationsSnippet.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASManualHTTPOperationsSnippet.java
diff --git a/examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASPropertiesSnippet.java b/sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASPropertiesSnippet.java
similarity index 100%
rename from examples/basys.examples/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASPropertiesSnippet.java
rename to sandbox/Java/basyx.sandbox/src/test/java/org/eclipse/basyx/examples/snippets/undoc/vab/connection/RunAASPropertiesSnippet.java
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/xsd_types/Time.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/xsd_types/Time.h
index 89f5b05..7c4e9ed 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/xsd_types/Time.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/xsd_types/Time.h
@@ -3,7 +3,7 @@
 
 #include "Timezone.h"
 
-#include <stdint-gcc.h>
+#include <cstdint>
 #include <string>
 
 namespace basyx {
@@ -38,4 +38,5 @@
 }
 }
 }
+
 #endif /* BASYX_SIMPLE_SDK_TIME_H */
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/manager/ConnectedAssetAdministrationShellManager.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/manager/ConnectedAssetAdministrationShellManager.java
index 194c884..2d2c381 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/manager/ConnectedAssetAdministrationShellManager.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/manager/ConnectedAssetAdministrationShellManager.java
@@ -66,11 +66,8 @@
 
 	@Override
 	public ISubModel retrieveSubModel(IIdentifier aasId, IIdentifier smId) {
-		// look up AAS descriptor in the registry
-		AASDescriptor aasDescriptor = aasDirectory.lookupAAS(aasId);
-
-		// Get submodel descriptor from the aas descriptor
-		SubmodelDescriptor smDescriptor = aasDescriptor.getSubModelDescriptorFromIdentifierId(smId.getId());
+		// look up SM descriptor in the registry
+		SubmodelDescriptor smDescriptor = aasDirectory.lookupSubmodel(aasId, smId);
 
 		// get address of the submodel descriptor
 		String addr = smDescriptor.getFirstEndpoint();
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/manager/TestConnectedAssetAdministrationShellManager.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/manager/TestConnectedAssetAdministrationShellManager.java
index d73fcca..5fc2233 100644
--- a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/manager/TestConnectedAssetAdministrationShellManager.java
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/manager/TestConnectedAssetAdministrationShellManager.java
@@ -174,6 +174,62 @@
 	}
 
 	/**
+	 * Tries to retrieve a nonexistent AAS
+	 */
+	@Test
+	public void testRetrieveNonexistentAAS() {
+		IModelProvider provider = new AASAggregatorProvider(new AASAggregator());
+		prepareConnectorProvider(provider);
+		
+		IIdentifier nonexistentAASId = new Identifier(IdentifierType.CUSTOM, "nonexistentAAS");
+		
+		// Try to retrieve a nonexistent AAS
+		try {
+			manager.retrieveAAS(nonexistentAASId);
+			fail();
+		} catch (ResourceNotFoundException e) {
+		}
+	}
+	
+	/**
+	 * Tries to retrieve a nonexistent Submodel from a nonexistent AAS
+	 */
+	@Test
+	public void testRetrieveNonexistentSMFromNonexistentSM() {
+		IModelProvider provider = new AASAggregatorProvider(new AASAggregator());
+		prepareConnectorProvider(provider);
+		
+		IIdentifier nonexistentAASId = new Identifier(IdentifierType.CUSTOM, "nonexistentAAS");
+		IIdentifier nonexistentSMId = new Identifier(IdentifierType.CUSTOM, "nonexistentSM");
+		
+		// Try to retrieve a nonexistent Submodel from a nonexistent AAS
+		try {
+			manager.retrieveSubModel(nonexistentAASId, nonexistentSMId);
+			fail();
+		} catch (ResourceNotFoundException e) {
+		}
+	}
+	
+	/**
+	 * Tries to retrieve a nonexistent Submodel from an existing AAS
+	 */
+	@Test
+	public void testRetrieveNonexistentSMFromExistentAAS() {
+		IModelProvider provider = new AASAggregatorProvider(new AASAggregator());
+		prepareConnectorProvider(provider);
+		
+		IIdentifier aasId = new Identifier(IdentifierType.CUSTOM, "aasId");
+		IIdentifier nonexistentSMId = new Identifier(IdentifierType.CUSTOM, "nonexistentSM");
+		
+		// Try to retrieve a nonexistent Submodel from an existing AAS
+		try {
+			manager.retrieveSubModel(aasId, nonexistentSMId);
+			fail();
+		} catch (ResourceNotFoundException e) {
+		}
+	}
+	
+	/**
 	 * @param provider
 	 */
 	private void prepareConnectorProvider(IModelProvider provider) {
