diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellController.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellController.cs
new file mode 100644
index 0000000..ce24dc6
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellController.cs
@@ -0,0 +1,393 @@
+/*******************************************************************************
+* Copyright (c) 2020 Robert Bosch GmbH
+* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License 2.0 which is available at
+* http://www.eclipse.org/legal/epl-2.0
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+using Microsoft.AspNetCore.Mvc;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Utils.ResultHandling;
+using BaSyx.API.Components;
+using BaSyx.Models.Connectivity;
+using System.Linq;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
+using BaSyx.Models.Connectivity.Descriptors;
+using BaSyx.Models.Communication;
+
+namespace BaSyx.API.Http.Controllers
+{
+    /// <summary>
+    /// The Asset Administration Shell Controller
+    /// </summary>
+    public class AssetAdministrationShellController : Controller
+    {
+        private readonly IAssetAdministrationShellServiceProvider serviceProvider;
+
+        /// <summary>
+        /// The constructor for the Asset Administration Shell Controller
+        /// </summary>
+        /// <param name="assetAdministrationShellServiceProvider">The Asset Administration Shell Service Provider implementation provided by the dependency injection</param>
+        public AssetAdministrationShellController(IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider)
+        {
+            serviceProvider = assetAdministrationShellServiceProvider;
+        }
+
+        #region AssetAdminstrationShell Core Services
+        /// <summary>
+        /// Retrieves the Asset Administration Shell Descriptor
+        /// </summary>
+        /// <returns></returns>
+        /// <response code="200">Success</response>   
+        [HttpGet("aas", Name = "GetAssetAdministrationShell")]
+        [ProducesResponseType(typeof(AssetAdministrationShellDescriptor), 200)]
+        [Produces("application/json")]
+        public IActionResult GetAssetAdministrationShell()
+        {
+            var serviceDescriptor = serviceProvider?.ServiceDescriptor;
+
+            if (serviceDescriptor == null)
+                return StatusCode(502);
+            else
+                return new OkObjectResult(serviceProvider.ServiceDescriptor);
+        }
+
+        /// <summary>
+        /// Retrieves all Submodels from the  Asset Administration Shell
+        /// </summary>
+        /// <returns></returns>
+        /// <response code="200">Returns a list of found Submodels</response>
+        /// <response code="404">No Submodel Service Providers found</response>       
+        [HttpGet("aas/submodels", Name = "GetSubmodelsFromShell")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Submodel[]), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetSubmodelsFromShell()
+        {
+            var submodelProviders = serviceProvider.SubmodelRegistry.GetSubmodelServiceProviders();
+
+            if (!submodelProviders.Success || submodelProviders.Entity?.Count() == 0)
+                return NotFound(new Result(false, new NotFoundMessage("Submodels")));
+
+            var submodelBindings = submodelProviders.Entity.Select(s => s.GetBinding()).ToArray();
+
+            return new OkObjectResult(submodelBindings);
+        }
+
+        /// <summary>
+        /// Creates or updates a Submodel to an existing Asset Administration Shell
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="submodel">The serialized Submodel object</param>
+        /// <returns></returns>
+        /// <response code="201">Submodel created successfully</response>
+        /// <response code="400">Bad Request</response>               
+        [HttpPut("aas/submodels/{submodelIdShort}", Name = "PutSubmodelToShell")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(Submodel), 201)]
+        [ProducesResponseType(typeof(Result), 400)]
+        public IActionResult PutSubmodelToShell(string submodelIdShort, [FromBody] ISubmodel submodel)
+        {
+            if (string.IsNullOrEmpty(submodelIdShort))
+                return ResultHandling.NullResult(nameof(submodelIdShort));
+
+            if (submodel == null)
+                return ResultHandling.NullResult(nameof(submodel));
+
+            var spEndpoints = serviceProvider
+                .ServiceDescriptor
+                .Endpoints
+                .ToList()
+                .ConvertAll(c => new HttpEndpoint(DefaultEndpointRegistration.GetSubmodelEndpoint(c, submodel.IdShort)));
+
+            ISubmodelDescriptor descriptor = new SubmodelDescriptor(submodel, spEndpoints);
+            SubmodelServiceProvider cssp = new SubmodelServiceProvider(submodel, descriptor);
+            var result = serviceProvider.SubmodelRegistry.RegisterSubmodelServiceProvider(submodelIdShort, cssp);
+
+            return result.CreateActionResult(CrudOperation.Create, "aas/submodels/" + submodelIdShort);
+        }
+        /// <summary>
+        /// Retrieves the Submodel from the Asset Administration Shell
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="200">Submodel retrieved successfully</response>
+        /// <response code="404">No Submodel Service Provider found</response>    
+        [HttpGet("aas/submodels/{submodelIdShort}")]
+        [HttpGet("aas/submodels/{submodelIdShort}/submodel", Name = "GetSubmodelFromShellByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Submodel), 200)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetSubmodelFromShellByIdShort(string submodelIdShort)
+        {
+            if (string.IsNullOrEmpty(submodelIdShort))
+                return ResultHandling.NullResult(nameof(submodelIdShort));
+
+            var submodelProvider = serviceProvider.SubmodelRegistry.GetSubmodelServiceProvider(submodelIdShort);
+            if (!submodelProvider.Success || submodelProvider?.Entity == null)
+                return NotFound(new Result(false, new NotFoundMessage("Submodel")));
+
+            var result = submodelProvider.Entity.RetrieveSubmodel();
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+
+        /// <summary>
+        /// Deletes a specific Submodel from the Asset Administration Shell
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="204">Submodel deleted successfully</response>
+        /// <response code="400">Bad Request</response>    
+        [HttpDelete("aas/submodels/{submodelIdShort}", Name = "DeleteSubmodelFromShellByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 400)]
+        public IActionResult DeleteSubmodelFromShellByIdShort(string submodelIdShort)
+        {
+            if (string.IsNullOrEmpty(submodelIdShort))
+                return ResultHandling.NullResult(nameof(submodelIdShort));
+
+            var result = serviceProvider.SubmodelRegistry.UnregisterSubmodelServiceProvider(submodelIdShort);
+            return result.CreateActionResult(CrudOperation.Delete);
+        }
+        
+        #endregion
+
+        #region Submodel Services
+
+        /// <summary>
+        /// Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="200">Success</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("aas/submodels/{submodelIdShort}/submodel/values", Name = "Shell_GetSubmodelValues")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult Shell_GetSubmodelValues(string submodelIdShort)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelValues();
+        }
+
+        /// <summary>
+        /// Retrieves all Submodel-Elements from the Submodel
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="200">Returns a list of found Submodel-Elements</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("aas/submodels/{submodelIdShort}/submodel/submodelElements", Name = "Shell_GetSubmodelElements")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement[]), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult Shell_GetSubmodelElements(string submodelIdShort)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelElements();
+        }
+
+        /// <summary>
+        /// Creates or updates a Submodel-Element at the Submodel
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <param name="submodelElement">The Submodel-Element object</param>
+        /// <returns></returns>
+        /// <response code="201">Submodel-Element created successfully</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel not found</response>
+        [HttpPut("aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}", Name = "Shell_PutSubmodelElement")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement), 201)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult Shell_PutSubmodelElement(string submodelIdShort, string seIdShortPath, [FromBody] ISubmodelElement submodelElement)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.PutSubmodelElement(seIdShortPath, submodelElement);
+        }
+        /// <summary>
+        /// Retrieves a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the requested Submodel-Element</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>     
+        [HttpGet("aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}", Name = "Shell_GetSubmodelElementByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult Shell_GetSubmodelElementByIdShort(string submodelIdShort, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelElementByIdShort(seIdShortPath);
+        }
+
+        /// <summary>
+        /// Retrieves the value of a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the value of a specific Submodel-Element</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>  
+        /// <response code="405">Method not allowed</response>  
+        [HttpGet("aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}/value", Name = "Shell_GetSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(object), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        [ProducesResponseType(typeof(Result), 405)]
+        public IActionResult Shell_GetSubmodelElementValueByIdShort(string submodelIdShort, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelElementValueByIdShort(seIdShortPath);
+        }
+
+        /// <summary>
+        /// Updates the Submodel-Element's value
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <param name="value">The new value</param>
+        /// <returns></returns>
+        /// <response code="200">Submodel-Element's value changed successfully</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>     
+        /// <response code="405">Method not allowed</response>  
+        [HttpPut("aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}/value", Name = "Shell_PutSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(ElementValue), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult Shell_PutSubmodelElementValueByIdShort(string submodelIdShort, string seIdShortPath, [FromBody] object value)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.PutSubmodelElementValueByIdShort(seIdShortPath, value);
+        }
+
+        /// <summary>
+        /// Deletes a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="204">Submodel-Element deleted successfully</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>
+        [HttpDelete("aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}", Name = "Shell_DeleteSubmodelElementByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 200)]
+        public IActionResult Shell_DeleteSubmodelElementByIdShort(string submodelIdShort, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.DeleteSubmodelElementByIdShort(seIdShortPath);
+        }
+
+        /// <summary>
+        /// Invokes a specific operation from the Submodel synchronously or asynchronously
+        /// </summary>
+        /// <param name="submodelIdShort">Submodel's short id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+        /// <param name="invocationRequest">The parameterized request object for the invocation</param>
+        /// <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
+        /// <returns></returns>
+        /// <response code="200">Operation invoked successfully</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel / Method handler not found</response>
+        [HttpPost("aas/submodels/{submodelIdShort}/submodel/submodelElements/{idShortPathToOperation}/invoke", Name = "Shell_InvokeOperationByIdShort")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult Shell_InvokeOperationByIdShort(string submodelIdShort, string idShortPathToOperation, [FromBody] InvocationRequest invocationRequest, [FromQuery] bool async)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.InvokeOperationByIdShort(idShortPathToOperation, invocationRequest, async);
+        }
+
+        /// <summary>
+        /// Retrieves the result of an asynchronously started operation
+        /// </summary>
+        /// <param name="submodelIdShort">Submodel's short id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+        /// <param name="requestId">The request id</param>
+        /// <returns></returns>
+        /// <response code="200">Result found</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel / Operation / Request not found</response>
+        [HttpGet("aas/submodels/{submodelIdShort}/submodel/submodelElements/{idShortPathToOperation}/invocationList/{requestId}", Name = "Shell_GetInvocationResultByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(InvocationResponse), 200)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult Shell_GetInvocationResultByIdShort(string submodelIdShort, string idShortPathToOperation, string requestId)
+        {
+            if (IsNullOrNotFound(submodelIdShort, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetInvocationResultByIdShort(idShortPathToOperation, requestId);
+        }
+        #endregion
+
+        #region Helper
+        /// <summary>
+        /// Checks whether aasId is null or Asset Administration Shell Service Provider cannot be found
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="result">The IActionResult in case aasId is null or the provider cannot be found</param>
+        /// <param name="provider">The Asset Administration Shell Service Provider</param>
+        /// <returns></returns>
+        public bool IsNullOrNotFound(string submodelId, out IActionResult result, out ISubmodelServiceProvider provider)
+        {
+            if (string.IsNullOrEmpty(submodelId))
+            {
+                result = ResultHandling.NullResult(nameof(submodelId));
+                provider = null;
+                return true;
+            }
+            var retrieved = serviceProvider.SubmodelRegistry.GetSubmodelServiceProvider(submodelId);
+            if (!retrieved.Success || retrieved?.Entity == null)
+            {
+                result = NotFound(new Result(false, new NotFoundMessage("Submodel Provider")));
+                provider = null;
+                return true;
+            }
+            result = null;
+            provider = retrieved.Entity;
+            return false;
+        }
+
+        #endregion
+    }
+}
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryController.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryController.cs
new file mode 100644
index 0000000..c65e973
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryController.cs
@@ -0,0 +1,438 @@
+/*******************************************************************************
+* Copyright (c) 2020 Robert Bosch GmbH
+* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License 2.0 which is available at
+* http://www.eclipse.org/legal/epl-2.0
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+using System.Collections.Generic;
+using Microsoft.AspNetCore.Mvc;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Utils.ResultHandling;
+using BaSyx.API.Components;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
+using BaSyx.Models.Communication;
+
+namespace BaSyx.API.Http.Controllers
+{
+    /// <summary>
+    /// The Asset Administration Shell Repository Controller
+    /// </summary>
+    public class AssetAdministrationShellRepositoryController : Controller
+    {
+        private readonly IAssetAdministrationShellRepositoryServiceProvider serviceProvider;
+
+        /// <summary>
+        /// The constructor for the Asset Administration Shell Repository Controller
+        /// </summary>
+        /// <param name="assetAdministrationShellRepositoryServiceProvider"></param>
+        public AssetAdministrationShellRepositoryController(IAssetAdministrationShellRepositoryServiceProvider assetAdministrationShellRepositoryServiceProvider)
+        {
+            serviceProvider = assetAdministrationShellRepositoryServiceProvider;
+        }
+
+        /// <summary>
+        /// Retrieves all Asset Administration Shells from the Asset Administration Shell repository
+        /// </summary>
+        /// <returns></returns>
+        /// <response code="200">Returns a list of found Asset Administration Shells</response>
+        [HttpGet("shells", Name = "GetAllAssetAdministrationShells")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(List<BaSyx.Models.Core.AssetAdministrationShell.Implementations.AssetAdministrationShell>), 200)]
+        public IActionResult GetAllAssetAdministrationShells()
+        {
+            var result = serviceProvider.RetrieveAssetAdministrationShells();
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+        /// <summary>
+        /// Retrieves a specific Asset Administration Shell from the Asset Administration Shell repository
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the requested Asset Administration Shell</response>
+        /// <response code="404">No Asset Administration Shell found</response>           
+        [HttpGet("shells/{aasId}")]
+        [HttpGet("shells/{aasId}/aas", Name = "GetAssetAdministrationShellById")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(BaSyx.Models.Core.AssetAdministrationShell.Implementations.AssetAdministrationShell), 200)]
+        public IActionResult GetAssetAdministrationShellById(string aasId)
+        {
+            if (string.IsNullOrEmpty(aasId))
+                return ResultHandling.NullResult(nameof(aasId));
+
+            var result = serviceProvider.RetrieveAssetAdministrationShell(aasId);
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+
+        /// <summary>
+        /// Creates or updates a Asset Administration Shell at the Asset Administration Shell repository 
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="aas">The Asset Administration Shell</param>
+        /// <returns></returns>
+        /// <response code="201">Asset Administration Shell created successfully</response>
+        /// <response code="400">Bad Request</response>             
+        [HttpPut("shells/{aasId}", Name = "PutAssetAdministrationShell")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(BaSyx.Models.Core.AssetAdministrationShell.Implementations.AssetAdministrationShell), 201)]
+        public IActionResult PutAssetAdministrationShell(string aasId, [FromBody] IAssetAdministrationShell aas)
+        {
+            if (string.IsNullOrEmpty(aasId))
+                return ResultHandling.NullResult(nameof(aasId));
+            if (aas == null)
+                return ResultHandling.NullResult(nameof(aas));
+
+            var result = serviceProvider.CreateAssetAdministrationShell(aas);
+            return result.CreateActionResult(CrudOperation.Create);
+        }
+        /// <summary>
+        /// Deletes a specific Asset Administration Shell at the Asset Administration Shell repository
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <returns></returns>
+        /// <response code="200">Asset Administration Shell deleted successfully</response>
+        [HttpDelete("shells/{aasId}", Name = "DeleteAssetAdministrationShellById")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 200)]
+        public IActionResult DeleteAssetAdministrationShellById(string aasId)
+        {
+            if (string.IsNullOrEmpty(aasId))
+                return ResultHandling.NullResult(nameof(aasId));
+
+            var result = serviceProvider.DeleteAssetAdministrationShell(aasId);
+            return result.CreateActionResult(CrudOperation.Delete);            
+        }
+
+        #region AssetAdministrationShell-Services
+
+        /// <summary>
+        /// Retrieves all Submodels from the  Asset Administration Shell
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <returns></returns>
+        /// <response code="200">Returns a list of found Submodels</response>
+        /// <response code="404">No Submodel Service Providers found</response>       
+        [HttpGet("shells/{aasId}/aas/submodels", Name = "ShellRepo_GetSubmodelsFromShell")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 200)]
+        public IActionResult ShellRepo_GetSubmodelsFromShell(string aasId)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.GetSubmodelsFromShell();
+        }
+
+        /// <summary>
+        /// Creates or updates a Submodel to an existing Asset Administration Shell
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="submodel">The serialized Submodel object</param>
+        /// <returns></returns>
+        /// <response code="201">Submodel created successfully</response>
+        /// <response code="400">Bad Request</response>               
+        [HttpPut("shells/{aasId}/aas/submodels/{submodelIdShort}", Name = "ShellRepo_PutSubmodelToShell")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(Submodel), 201)]
+        [ProducesResponseType(typeof(Result), 400)]
+        public IActionResult ShellRepo_PutSubmodelToShell(string aasId, string submodelIdShort, [FromBody] ISubmodel submodel)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.PutSubmodelToShell(submodelIdShort, submodel);
+        }
+
+        /// <summary>
+        /// Retrieves the Submodel from the Asset Administration Shell
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="200">Submodel retrieved successfully</response>
+        /// <response code="404">No Submodel Service Provider found</response>    
+        [HttpGet("shells/{aasId}/aas/submodels/{submodelIdShort}")]
+        [HttpGet("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel", Name = "ShellRepo_GetSubmodelFromShellByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Submodel), 200)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_GetSubmodelFromShellByIdShort(string aasId, string submodelIdShort)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.GetSubmodelFromShellByIdShort(submodelIdShort);
+        }
+
+        /// <summary>
+        /// Deletes a specific Submodel from the Asset Administration Shell
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="204">Submodel deleted successfully</response>
+        /// <response code="400">Bad Request</response>    
+        [HttpDelete("shells/{aasId}/aas/submodels/{submodelIdShort}", Name = "ShellRepo_DeleteSubmodelFromShellByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 400)]
+        public IActionResult ShellRepo_DeleteSubmodelFromShellByIdShort(string aasId, string submodelIdShort)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.DeleteSubmodelFromShellByIdShort(submodelIdShort);
+        }
+
+        /// <summary>
+        /// Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="200">Success</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/values", Name = "ShellRepo_GetSubmodelValues")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_GetSubmodelValues(string aasId, string submodelIdShort)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_GetSubmodelValues(submodelIdShort);
+        }
+
+        /// <summary>
+        /// Retrieves all Submodel-Elements from the Submodel
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <returns></returns>
+        /// <response code="200">Returns a list of found Submodel-Elements</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements", Name = "ShellRepo_GetSubmodelElements")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement[]), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_GetSubmodelElements(string aasId, string submodelIdShort)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_GetSubmodelElements(submodelIdShort);
+        }
+
+        /// <summary>
+        /// Creates or updates a Submodel-Element at the Submodel
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <param name="submodelElement">The Submodel-Element object</param>
+        /// <returns></returns>
+        /// <response code="201">Submodel-Element created successfully</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel not found</response>
+        [HttpPut("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements/{*seIdShortPath}", Name = "ShellRepo_PutSubmodelElement")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement), 201)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_PutSubmodelElement(string aasId, string submodelIdShort, string seIdShortPath, [FromBody] ISubmodelElement submodelElement)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_PutSubmodelElement(submodelIdShort, seIdShortPath, submodelElement);
+        }
+
+        /// <summary>
+        /// Retrieves a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the requested Submodel-Element</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>     
+        [HttpGet("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}", Name = "ShellRepo_GetSubmodelElementByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_GetSubmodelElementByIdShort(string aasId, string submodelIdShort, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_GetSubmodelElementByIdShort(submodelIdShort, seIdShortPath);
+        }
+
+        /// <summary>
+        /// Retrieves the value of a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the value of a specific Submodel-Element</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>  
+        /// <response code="405">Method not allowed</response>  
+        [HttpGet("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}/value", Name = "ShellRepo_GetSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(object), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        [ProducesResponseType(typeof(Result), 405)]
+        public IActionResult ShellRepo_GetSubmodelElementValueByIdShort(string aasId, string submodelIdShort, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_GetSubmodelElementValueByIdShort(submodelIdShort, seIdShortPath);
+        }
+
+        /// <summary>
+        /// Updates the Submodel-Element's value
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <param name="value">The new value</param>
+        /// <returns></returns>
+        /// <response code="200">Submodel-Element's value changed successfully</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>     
+        /// <response code="405">Method not allowed</response>  
+        [HttpPut("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}/value", Name = "ShellRepo_PutSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(ElementValue), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_PutSubmodelElementValueByIdShort(string aasId, string submodelIdShort, string seIdShortPath, [FromBody] object value)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_PutSubmodelElementValueByIdShort(submodelIdShort, seIdShortPath, value);
+        }
+
+        /// <summary>
+        /// Deletes a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">The Submodel's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="204">Submodel-Element deleted successfully</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>
+        [HttpDelete("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements/{seIdShortPath}", Name = "ShellRepo_DeleteSubmodelElementByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 200)]
+        public IActionResult ShellRepo_DeleteSubmodelElementByIdShort(string aasId, string submodelIdShort, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_DeleteSubmodelElementByIdShort(submodelIdShort, seIdShortPath);
+        }
+
+        /// <summary>
+        /// Invokes a specific operation from the Submodel synchronously or asynchronously
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">Submodel's short id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+        /// <param name="invocationRequest">The parameterized request object for the invocation</param>
+        /// <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
+        /// <returns></returns>
+        /// <response code="200">Operation invoked successfully</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel / Method handler not found</response>
+        [HttpPost("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements/{idShortPathToOperation}/invoke", Name = "ShellRepo_InvokeOperationByIdShort")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_InvokeOperationByIdShort(string aasId, string submodelIdShort, string idShortPathToOperation, [FromBody] InvocationRequest invocationRequest, [FromQuery] bool async)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_InvokeOperationByIdShort(submodelIdShort, idShortPathToOperation, invocationRequest, async);
+        }
+
+        /// <summary>
+        /// Retrieves the result of an asynchronously started operation
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="submodelIdShort">Submodel's short id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+        /// <param name="requestId">The request id</param>
+        /// <returns></returns>
+        /// <response code="200">Result found</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel / Operation / Request not found</response>
+        [HttpGet("shells/{aasId}/aas/submodels/{submodelIdShort}/submodel/submodelElements/{idShortPathToOperation}/invocationList/{requestId}", Name = "ShellRepo_GetInvocationResultByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(InvocationResponse), 200)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult ShellRepo_GetInvocationResultByIdShort(string aasId, string submodelIdShort, string idShortPathToOperation, string requestId)
+        {
+            if (IsNullOrNotFound(aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider))
+                return result;
+
+            var service = new AssetAdministrationShellController(provider);
+            return service.Shell_GetInvocationResultByIdShort(submodelIdShort, idShortPathToOperation, requestId);
+        }
+
+        #endregion
+
+        #region Helper
+        /// <summary>
+        /// Checks whether aasId is null or Asset Administration Shell Service Provider cannot be found
+        /// </summary>
+        /// <param name="aasId">The Asset Administration Shell's unique id</param>
+        /// <param name="result">The IActionResult in case aasId is null or the provider cannot be found</param>
+        /// <param name="provider">The Asset Administration Shell Service Provider</param>
+        /// <returns></returns>
+        public bool IsNullOrNotFound(string aasId, out IActionResult result, out IAssetAdministrationShellServiceProvider provider)
+        {
+            if (string.IsNullOrEmpty(aasId))
+            {
+                result = ResultHandling.NullResult(nameof(aasId));
+                provider = null;
+                return true;
+            }
+            provider = serviceProvider.GetAssetAdministrationShellServiceProvider(aasId);
+            if (provider == null)
+            {
+                result = NotFound(new Result(false, new NotFoundMessage("Asset Administration Shell Provider")));
+                return true;
+            }
+            result = null;
+            return false;
+        }
+
+        #endregion
+
+    }
+}
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryServices.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryServices.cs
deleted file mode 100644
index 4fa5beb..0000000
--- a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryServices.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
-* Copyright (c) 2020 Robert Bosch GmbH
-* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
-*
-* This program and the accompanying materials are made available under the
-* terms of the Eclipse Public License 2.0 which is available at
-* http://www.eclipse.org/legal/epl-2.0
-*
-* SPDX-License-Identifier: EPL-2.0
-*******************************************************************************/
-using System.Collections.Generic;
-using Microsoft.AspNetCore.Mvc;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Utils.ResultHandling;
-using BaSyx.API.Components;
-
-namespace BaSyx.API.Http.Controllers
-{
-    /// <summary>
-    /// The Asset Administration Shell Repository Controller
-    /// </summary>
-    public class AssetAdministrationShellRepositoryServices : Controller
-    {
-        private readonly IAssetAdministrationShellRepositoryServiceProvider serviceProvider;
-
-        /// <summary>
-        /// Constructor for the Asset Administration Shell Repository Services Controller
-        /// </summary>
-        /// <param name="assetAdministrationShellRepositoryServiceProvider"></param>
-        public AssetAdministrationShellRepositoryServices(IAssetAdministrationShellRepositoryServiceProvider assetAdministrationShellRepositoryServiceProvider)
-        {
-            serviceProvider = assetAdministrationShellRepositoryServiceProvider;
-        }
-
-        /// <summary>
-        /// Retrieves all Asset Administration Shells from the repository service endpoint
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Returns a list of found Asset Administration Shells</response>
-        /// <response code="404">No Asset Administration Shells found</response>            
-        /// <response code="400">Bad Request</response>    
-        /// <response code="502">Bad Gateway</response>
-        [HttpGet("shells", Name = "GetAllAssetAdministrationShells")]
-        [ProducesResponseType(typeof(List<BaSyx.Models.Core.AssetAdministrationShell.Implementations.AssetAdministrationShell>), 200)]
-        public IActionResult GetAllAssetAdministrationShells()
-        {
-            var result = serviceProvider.RetrieveAssetAdministrationShells();
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-        /// <summary>
-        /// Retrieves a specific Asset Administration Shell from the repository service endpoint
-        /// </summary>
-        /// <param name="aasId">The Asset Administration Shell's unique id</param>
-        /// <returns></returns>
-        /// <response code="200">Returns the requested Asset Administration Shell</response>
-        /// <response code="404">No Asset Administration Shell found</response>     
-        /// <response code="400">Bad Request</response>         
-        /// <response code="502">Bad Gateway</response>
-        [HttpGet("shells/{aasId}", Name = "GetAssetAdministrationShellById")]
-        [ProducesResponseType(typeof(BaSyx.Models.Core.AssetAdministrationShell.Implementations.AssetAdministrationShell), 200)]
-        public IActionResult GetAssetAdministrationShellById(string aasId)
-        {
-            if (string.IsNullOrEmpty(aasId))
-                return ResultHandling.NullResult(nameof(aasId));
-
-            var result = serviceProvider.RetrieveAssetAdministrationShell(aasId);
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Creates or updates a Asset Administration Shell at the repository service endpoint
-        /// </summary>
-        /// <param name="aas">The serialized Asset Administration Shell object</param>
-        /// <returns></returns>
-        /// <response code="201">Asset Administration Shell created successfully</response>
-        /// <response code="400">Bad Request</response>             
-        /// <response code="502">Bad Gateway</response> 
-        [HttpPost("shells", Name = "PutAssetAdministrationShell")]
-        [ProducesResponseType(typeof(BaSyx.Models.Core.AssetAdministrationShell.Implementations.AssetAdministrationShell), 201)]
-        public IActionResult PutAssetAdministrationShell([FromBody] IAssetAdministrationShell aas)
-        {
-            if (aas == null)
-                return ResultHandling.NullResult(nameof(aas));
-
-            var result = serviceProvider.CreateAssetAdministrationShell(aas);
-            return result.CreateActionResult(CrudOperation.Create);
-        }
-        /// <summary>
-        /// Deletes a specific Asset Administration Shell at the repository service endpoint
-        /// </summary>
-        /// <param name="aasId">The Asset Administration Shell's unique id</param>
-        /// <returns></returns>
-        /// <response code="200">Asset Administration Shell deleted successfully</response>
-        /// <response code="400">Bad Request</response>      
-        /// <response code="502">Bad Gateway</response>
-        [HttpDelete("shells/{aasId}", Name = "DeleteAssetAdministrationShellById")]
-        [ProducesResponseType(typeof(Result), 200)]
-        public IActionResult DeleteAssetAdministrationShellById(string aasId)
-        {
-            if (string.IsNullOrEmpty(aasId))
-                return ResultHandling.NullResult(nameof(aasId));
-
-            var result = serviceProvider.DeleteAssetAdministrationShell(aasId);
-            return result.CreateActionResult(CrudOperation.Delete);
-        }
-    }
-}
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellServices.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellServices.cs
deleted file mode 100644
index ca84c6b..0000000
--- a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellServices.cs
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
-* Copyright (c) 2020 Robert Bosch GmbH
-* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
-*
-* This program and the accompanying materials are made available under the
-* terms of the Eclipse Public License 2.0 which is available at
-* http://www.eclipse.org/legal/epl-2.0
-*
-* SPDX-License-Identifier: EPL-2.0
-*******************************************************************************/
-using Microsoft.AspNetCore.Mvc;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Utils.ResultHandling;
-using BaSyx.API.Components;
-using BaSyx.Models.Connectivity;
-using System.Linq;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using Microsoft.Extensions.DependencyInjection;
-using BaSyx.Models.Connectivity.Descriptors;
-
-namespace BaSyx.API.Http.Controllers
-{
-    /// <summary>
-    /// All Asset Administration Shell Services provided by the component
-    /// </summary>
-    public class AssetAdministrationShellServices : Controller
-    {
-        private readonly IAssetAdministrationShellServiceProvider serviceProvider;
-
-        /// <summary>
-        /// Constructor for the Asset Administration Shell Services Controller
-        /// </summary>
-        /// <param name="assetAdministrationShellServiceProvider">The Asset Administration Shell Service Provider implementation provided by the dependency injection</param>
-        public AssetAdministrationShellServices(IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider)
-        {
-            serviceProvider = assetAdministrationShellServiceProvider;
-        }
-
-        /// <summary>
-        /// Retrieves the Asset Administration Shell Descriptor
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Success</response>   
-        [HttpGet("aas", Name = "GetAssetAdministrationShell")]
-        [ProducesResponseType(typeof(AssetAdministrationShellDescriptor), 200)]
-        public IActionResult GetAssetAdministrationShell()
-        {
-            var serviceDescriptor = serviceProvider?.ServiceDescriptor;
-
-            if(serviceDescriptor == null)
-                return StatusCode(502);
-            else
-                return new OkObjectResult(serviceProvider.ServiceDescriptor);
-        }
-
-        /// <summary>
-        /// Creates or updates a Submodel to an existing Asset Administration Shell
-        /// </summary>
-        /// <param name="submodel">The serialized Submodel object</param>
-        /// <returns></returns>
-        /// <response code="201">Submodel created successfully</response>
-        /// <response code="400">Bad Request</response>               
-        [HttpPost("aas/submodels", Name = "PutSubmodelToShell")]
-        [ProducesResponseType(typeof(Submodel), 201)]
-        [ProducesResponseType(typeof(Result), 400)]
-        public IActionResult PutSubmodelToShell([FromBody] ISubmodel submodel)
-        {
-            if (submodel == null)
-                return ResultHandling.NullResult(nameof(submodel));
-
-            var spEndpoints = serviceProvider
-                .ServiceDescriptor
-                .Endpoints
-                .ToList()
-                .ConvertAll(c => new HttpEndpoint(DefaultEndpointRegistration.GetSubmodelEndpoint(c, submodel.IdShort)));
-
-            ISubmodelDescriptor descriptor = new SubmodelDescriptor(submodel, spEndpoints);
-            SubmodelServiceProvider cssp = new SubmodelServiceProvider(submodel, descriptor);
-            var result = serviceProvider.SubmodelRegistry.RegisterSubmodelServiceProvider(submodel.IdShort, cssp);
-
-            return result.CreateActionResult(CrudOperation.Create, "aas/submodels/" + submodel.IdShort);
-        }
-        /// <summary>
-        /// Retrieves the Submodel from the Asset Administration Shell
-        /// </summary>
-        /// <param name="submodelIdShort">The Submodel's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Submodel retrieved successfully</response>
-        /// <response code="404">No Submodel Service Provider found</response>    
-        [HttpGet("aas/submodels/{submodelIdShort}", Name = "GetSubmodelFromShellByIdShort")]
-        [ProducesResponseType(typeof(Submodel), 200)]
-        [ProducesResponseType(typeof(Result), 400)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodelFromShellByIdShort(string submodelIdShort)
-        {
-            if (string.IsNullOrEmpty(submodelIdShort))
-                return ResultHandling.NullResult(nameof(submodelIdShort));
-
-            var submodelProvider = serviceProvider.SubmodelRegistry.GetSubmodelServiceProvider(submodelIdShort);
-            if (!submodelProvider.Success || submodelProvider?.Entity == null)
-                return NotFound(new Result(false, new NotFoundMessage("Submodel")));
-
-            return new OkObjectResult(submodelProvider.Entity.GetBinding());
-        }
-        /// <summary>
-        /// Deletes a specific Submodel from the Asset Administration Shell
-        /// </summary>
-        /// <param name="submodelIdShort">The Submodel's short id</param>
-        /// <returns></returns>
-        /// <response code="204">Submodel deleted successfully</response>
-        /// <response code="400">Bad Request</response>    
-        [HttpDelete("aas/submodels/{submodelIdShort}", Name = "DeleteSubmodelFromShellByIdShort")]
-        [ProducesResponseType(typeof(Result), 400)]
-        public IActionResult DeleteSubmodelFromShellByIdShort(string submodelIdShort)
-        {
-            if (string.IsNullOrEmpty(submodelIdShort))
-                return ResultHandling.NullResult(nameof(submodelIdShort));
-
-            var result = serviceProvider.SubmodelRegistry.UnregisterSubmodelServiceProvider(submodelIdShort);
-            return result.CreateActionResult(CrudOperation.Delete);
-        }
-        /// <summary>
-        /// Retrieves all Submodels from the  Asset Administration Shell
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Returns a list of found Submodels</response>
-        /// <response code="404">No Submodel Service Providers found</response>       
-        [HttpGet("aas/submodels", Name = "GetSubmodelsFromShell")]
-        [ProducesResponseType(typeof(Submodel[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodelsFromShell()
-        {
-            var submodelProviders = serviceProvider.SubmodelRegistry.GetSubmodelServiceProviders();
-
-            if (!submodelProviders.Success || submodelProviders.Entity?.Count() == 0)
-                return NotFound(new Result(false, new NotFoundMessage("Submodels")));
-
-            var submodelBindings = submodelProviders.Entity.Select(s => s.GetBinding()).ToArray();
-
-            return new OkObjectResult(submodelBindings);
-        }
-
-        /// <summary>
-        /// Retrieves all Submodel-Elements from the Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Returns a list of found Submodel-Elements</response>
-        /// <response code="404">Submodel not found / No Submodel-Elements found</response>       
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/submodelElements", Name = "RoutedGetSubmodelElements")]
-        [ProducesResponseType(typeof(SubmodelElement[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetSubmodelElements()
-        {
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetSubmodelElements();
-        }
-        
-        /// <summary>
-        /// Creates or updates a Submodel-Element to the Asset Administration Shell's Submodel
-        /// </summary>
-        /// <param name="submodelElement">The serialized Submodel Element object</param>
-        /// <returns></returns>
-        /// <response code="201">Submodel-Element created successfully</response>
-        /// <response code="400">Bad Request</response>
-        /// <response code="404">Submodel not found</response>
-        [HttpPut("aas/submodels/{submodelIdShort}/submodel/submodelElements", Name = "RoutedPutSubmodelElement")]
-        [ProducesResponseType(typeof(SubmodelElement), 201)]
-        [ProducesResponseType(typeof(Result), 400)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedPutSubmodelElement([FromBody] ISubmodelElement submodelElement)
-        {
-            if (submodelElement == null)
-                return ResultHandling.NullResult(nameof(submodelElement));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.PutSubmodelElement(submodelElement);
-        }
-        /// <summary>
-        /// Retrieves a specific Submodel-Element from the Asset Administrations's Submodel
-        /// </summary>
-        /// <param name="submodelElementIdShort">The Submodel-Element's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Returns the requested Submodel-Element</response>
-        /// <response code="404">Submodel / Submodel-Element not found</response>     
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/submodelElements/{submodelElementIdShort}", Name = "RoutedGetSubmodelElementByIdShort")]
-        [ProducesResponseType(typeof(SubmodelElement), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetSubmodelElementByIdShort(string submodelElementIdShort)
-        {
-            if (string.IsNullOrEmpty(submodelElementIdShort))
-                return ResultHandling.NullResult(nameof(submodelElementIdShort));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetSubmodelElementByIdShort(submodelElementIdShort);
-        }
-
-        /// <summary>
-        /// Deletes a specific Submodel-Element from the Asset Administration Shell's Submodel
-        /// </summary>
-        /// <param name="submodelElementIdShort">The Submodel-Element's short id</param>
-        /// <returns></returns>
-        /// <response code="204">Submodel-Element deleted successfully</response>
-        /// <response code="404">Submodel not found</response>
-        [HttpDelete("aas/submodels/{submodelIdShort}/submodel/submodelElements/{submodelElementIdShort}", Name = "RoutedDeleteSubmodelElementByIdShort")]
-        [ProducesResponseType(typeof(Result), 200)]
-        public IActionResult RoutedDeleteSubmodelElementByIdShort(string submodelElementIdShort)
-        {
-            if (string.IsNullOrEmpty(submodelElementIdShort))
-                return ResultHandling.NullResult(nameof(submodelElementIdShort));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.DeleteSubmodelElementByIdShort(submodelElementIdShort);
-        }
-    }
-}
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelController.cs
similarity index 62%
rename from sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelController.cs
index f8b5d94..76fabff 100644
--- a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelController.cs
@@ -16,28 +16,68 @@
 using Newtonsoft.Json.Linq;
 using BaSyx.Models.Extensions;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using BaSyx.Models.Core.Common;
 using BaSyx.Models.Communication;
+using System.Web;
+using System.ComponentModel;
 
 namespace BaSyx.API.Http.Controllers
 {
     /// <summary>
-    /// All Asset Administration Shell Services provided by the component
+    /// The Submodel Controller
     /// </summary>
-    public class SubmodelServices : Controller
+    [DisplayName("Submodel Interface")]
+    public class SubmodelController : Controller
     {
         private readonly ISubmodelServiceProvider serviceProvider;
 
         /// <summary>
-        /// Constructor for the Submodel Services Controller
+        /// The constructor for the Submodel Controller
         /// </summary>
         /// <param name="submodelServiceProvider">The Submodel Service Provider implementation provided by the dependency injection</param>
-        public SubmodelServices(ISubmodelServiceProvider submodelServiceProvider)
+        public SubmodelController(ISubmodelServiceProvider submodelServiceProvider)
         {
             serviceProvider = submodelServiceProvider;
         }
 
         /// <summary>
+        /// Retrieves the entire Submodel
+        /// </summary>
+        /// <returns></returns>
+        /// <response code="200">Success</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("submodel", Name = "GetSubmodel")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Submodel), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetSubmodel()
+        {
+            var result = serviceProvider.RetrieveSubmodel();
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+
+        /// <summary>
+        /// Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+        /// </summary>
+        /// <returns></returns>
+        /// <response code="200">Success</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("submodel/values", Name = "GetSubmodelValues")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetSubmodelValues()
+        {
+            var result = serviceProvider.RetrieveSubmodel();
+
+            if (result != null && result.Entity != null)
+            {
+                JObject minimizedSubmodel = result.Entity.MinimizeSubmodel();
+                return new JsonResult(minimizedSubmodel);
+            }
+
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+
+        /// <summary>
         /// Retrieves a customizable table version of a Submodel
         /// </summary>
         /// <param name="columns">A comma-separated list of field names to structure the payload beeing returned</param>
@@ -45,6 +85,7 @@
         /// <response code="200">Success</response>
         /// <response code="404">Submodel not found</response>   
         [HttpGet("submodel/table", Name = "GetSubmodelAsTable")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(Result), 404)]
         public IActionResult GetSubmodelAsTable([FromQuery] string columns)
         {
@@ -62,43 +103,6 @@
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
 
-
-        /// <summary>
-        /// Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel not found</response>       
-        [HttpGet("submodel/values", Name = "GetSubmodelValues")]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodelValues()
-        {
-            var result = serviceProvider.RetrieveSubmodel();
-
-            if (result != null && result.Entity != null)
-            {
-                JObject minimizedSubmodel = result.Entity.MinimizeSubmodel();
-                return new JsonResult(minimizedSubmodel);
-            }
-
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Retrieves the entire Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel not found</response>       
-        [HttpGet("submodel", Name = "GetSubmodel")]
-        [ProducesResponseType(typeof(Submodel), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodel()
-        {
-            var result = serviceProvider.RetrieveSubmodel();
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
         /// <summary>
         /// Retrieves all Submodel-Elements from the Submodel
         /// </summary>
@@ -106,6 +110,7 @@
         /// <response code="200">Returns a list of found Submodel-Elements</response>
         /// <response code="404">Submodel not found</response>       
         [HttpGet("submodel/submodelElements", Name = "GetSubmodelElements")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(SubmodelElement[]), 200)]
         [ProducesResponseType(typeof(Result), 404)]
         public IActionResult GetSubmodelElements()
@@ -115,147 +120,163 @@
         }
 
         /// <summary>
-        /// Adds a new Submodel-Element to the Submodel
+        /// Creates or updates a Submodel-Element at the Submodel
         /// </summary>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
         /// <param name="submodelElement">The Submodel-Element object</param>
         /// <returns></returns>
         /// <response code="201">Submodel-Element created successfully</response>
         /// <response code="400">Bad Request</response>
-        /// <response code="404">Submodel not found</response>
-        [HttpPut("submodel/submodelElements", Name = "PutSubmodelElement")]
+        [HttpPut("submodel/submodelElements/{seIdShortPath}", Name = "PutSubmodelElement")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
         [ProducesResponseType(typeof(SubmodelElement), 201)]
         [ProducesResponseType(typeof(Result), 400)]
         [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult PutSubmodelElement([FromBody] ISubmodelElement submodelElement)
+        public IActionResult PutSubmodelElement(string seIdShortPath, [FromBody] ISubmodelElement submodelElement)
         {
+            if (string.IsNullOrEmpty(seIdShortPath))
+                return ResultHandling.NullResult(nameof(seIdShortPath));
             if (submodelElement == null)
                 return ResultHandling.NullResult(nameof(submodelElement));
 
-            var result = serviceProvider.CreateSubmodelElement("/", submodelElement);
-            return result.CreateActionResult(CrudOperation.Create, "submodel/submodelElements/" + submodelElement.IdShort);
+            seIdShortPath = HttpUtility.UrlDecode(seIdShortPath);
+
+            var result = serviceProvider.CreateSubmodelElement(seIdShortPath, submodelElement);
+            return result.CreateActionResult(CrudOperation.Create, "submodel/submodelElements/" + seIdShortPath);
         }
 
 
         /// <summary>
         /// Retrieves a specific Submodel-Element from the Submodel
         /// </summary>
-        /// <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
         /// <returns></returns>
         /// <response code="200">Returns the requested Submodel-Element</response>
-        /// <response code="404">Submodel / Submodel Element not found</response>     
-        [HttpGet("submodel/submodelElements/{*submodelElementIdShort}", Name = "GetSubmodelElementByIdShort")]
+        /// <response code="404">Submodel Element not found</response>     
+        [HttpGet("submodel/submodelElements/{seIdShortPath}", Name = "GetSubmodelElementByIdShort")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(SubmodelElement), 200)]
         [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodelElementByIdShort(string submodelElementIdShort)
+        public IActionResult GetSubmodelElementByIdShort(string seIdShortPath)
         {
-            if (string.IsNullOrEmpty(submodelElementIdShort))
-                return ResultHandling.NullResult(nameof(submodelElementIdShort));
+            if (string.IsNullOrEmpty(seIdShortPath))
+                return ResultHandling.NullResult(nameof(seIdShortPath));
 
-            IResult result;
-            if (submodelElementIdShort.EndsWith("/value"))
-            {
-                var retrieveElementValueResult = serviceProvider.RetrieveSubmodelElementValue(submodelElementIdShort.Replace("/value", string.Empty));
-                if (retrieveElementValueResult.Success && retrieveElementValueResult.Entity != null)
-                    return new OkObjectResult(retrieveElementValueResult.Entity.Value);
-                else
-                    result = retrieveElementValueResult;
-            }
-            else
-                result = serviceProvider.RetrieveSubmodelElement(submodelElementIdShort);
+            seIdShortPath = HttpUtility.UrlDecode(seIdShortPath);
 
+            var result = serviceProvider.RetrieveSubmodelElement(seIdShortPath);
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
 
         /// <summary>
         /// Retrieves the value of a specific Submodel-Element from the Submodel
         /// </summary>
-        /// <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
         /// <returns></returns>
         /// <response code="200">Returns the value of a specific Submodel-Element</response>
         /// <response code="404">Submodel / Submodel-Element not found</response>  
         /// <response code="405">Method not allowed</response>  
-        [HttpGet("submodel/submodelElements/{submodelElementIdShort}/value", Name = "GetSubmodelElementValueByIdShort")]
+        [HttpGet("submodel/submodelElements/{seIdShortPath}/value", Name = "GetSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(object), 200)]
         [ProducesResponseType(typeof(Result), 404)]
         [ProducesResponseType(typeof(Result), 405)]
-        public IActionResult GetSubmodelElementValueByIdShort(string submodelElementIdShort)
+        public IActionResult GetSubmodelElementValueByIdShort(string seIdShortPath)
         {
-            return GetSubmodelElementByIdShort(submodelElementIdShort + "/value");
+            if (string.IsNullOrEmpty(seIdShortPath))
+                return ResultHandling.NullResult(nameof(seIdShortPath));
+
+            seIdShortPath = HttpUtility.UrlDecode(seIdShortPath);
+
+            var result = serviceProvider.RetrieveSubmodelElementValue(seIdShortPath);
+            if (result.Success && result.Entity != null)
+                return new OkObjectResult(result.Entity.Value);
+            else
+                return result.CreateActionResult(CrudOperation.Retrieve);
         }
 
         /// <summary>
-        /// Updates the Asset Administration Shell's Submodel's Submodel-Element
+        /// Updates the Submodel-Element's value
         /// </summary>
-        /// <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
         /// <param name="value">The new value</param>
         /// <returns></returns>
         /// <response code="200">Submodel-Element's value changed successfully</response>
-        /// <response code="404">Submodel / Submodel-Element not found</response>     
+        /// <response code="404">Submodel-Element not found</response>     
         /// <response code="405">Method not allowed</response>  
-        [HttpPut("submodel/submodelElements/{*submodelElementIdShort}", Name = "PutSubmodelElementValueByIdShort")]
+        [HttpPut("submodel/submodelElements/{seIdShortPath}/value", Name = "PutSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
         [ProducesResponseType(typeof(ElementValue), 200)]
         [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult PutSubmodelElementValueByIdShort(string submodelElementIdShort, [FromBody] IValue value)
+        public IActionResult PutSubmodelElementValueByIdShort(string seIdShortPath, [FromBody] object value)
         {
-            if (submodelElementIdShort.EndsWith("/value"))
-            {
-                if (string.IsNullOrEmpty(submodelElementIdShort))
-                    return ResultHandling.NullResult(nameof(submodelElementIdShort));
-                if (value == null)
-                    return ResultHandling.NullResult(nameof(value));
+            if (string.IsNullOrEmpty(seIdShortPath))
+                return ResultHandling.NullResult(nameof(seIdShortPath));
+            if (value == null)
+                return ResultHandling.NullResult(nameof(value));
 
-                var result = serviceProvider.UpdateSubmodelElementValue(submodelElementIdShort.Replace("/value", string.Empty), value);
-                return result.CreateActionResult(CrudOperation.Update);
-            }
-            return ResultHandling.MethodNotAllowedResult();
+            seIdShortPath = HttpUtility.UrlDecode(seIdShortPath);
+
+            ElementValue elementValue = new ElementValue(value, value.GetType());
+            var result = serviceProvider.UpdateSubmodelElementValue(seIdShortPath, elementValue);
+            return result.CreateActionResult(CrudOperation.Update);
         }
 
         /// <summary>
         /// Deletes a specific Submodel-Element from the Submodel
         /// </summary>
-        /// <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
         /// <returns></returns>
         /// <response code="204">Submodel-Element deleted successfully</response>
-        /// <response code="404">Submodel / Submodel-Element not found</response>
-        [HttpDelete("submodel/submodelElements/{*submodelElementIdShort}", Name = "DeleteSubmodelElementByIdShort")]
+        /// <response code="404">Submodel-Element not found</response>
+        [HttpDelete("submodel/submodelElements/{seIdShortPath}", Name = "DeleteSubmodelElementByIdShort")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(Result), 200)]
-        public IActionResult DeleteSubmodelElementByIdShort(string submodelElementIdShort)
+        public IActionResult DeleteSubmodelElementByIdShort(string seIdShortPath)
         {
-            if (string.IsNullOrEmpty(submodelElementIdShort))
-                return ResultHandling.NullResult(nameof(submodelElementIdShort));
+            if (string.IsNullOrEmpty(seIdShortPath))
+                return ResultHandling.NullResult(nameof(seIdShortPath));
 
-            var result = serviceProvider.DeleteSubmodelElement(submodelElementIdShort);
+            seIdShortPath = HttpUtility.UrlDecode(seIdShortPath);
+
+            var result = serviceProvider.DeleteSubmodelElement(seIdShortPath);
             return result.CreateActionResult(CrudOperation.Delete);
         }
 
         /// <summary>
         /// Invokes a specific operation from the Submodel synchronously or asynchronously
         /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
         /// <param name="invocationRequest">The parameterized request object for the invocation</param>
         /// <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
         /// <returns></returns>
         /// <response code="200">Operation invoked successfully</response>
         /// <response code="400">Bad Request</response>
-        /// <response code="404">Submodel / Method handler not found</response>
-        [HttpPost("submodel/submodelElements/{operationIdShort}/invoke/{async:bool?}", Name = "InvokeOperationByIdShortAsync")]
+        /// <response code="404">Method handler not found</response>
+        [HttpPost("submodel/submodelElements/{idShortPathToOperation}/invoke", Name = "InvokeOperationByIdShortAsync")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
         [ProducesResponseType(typeof(Result), 400)]
         [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult InvokeOperationByIdShort(string operationIdShort, [FromBody] InvocationRequest invocationRequest, [FromQuery] bool async)
+        public IActionResult InvokeOperationByIdShort(string idShortPathToOperation, [FromBody] InvocationRequest invocationRequest, [FromQuery] bool async)
         {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
+            if (string.IsNullOrEmpty(idShortPathToOperation))
+                return ResultHandling.NullResult(nameof(idShortPathToOperation));
             if (invocationRequest == null)
                 return ResultHandling.NullResult(nameof(invocationRequest));
 
+            idShortPathToOperation = HttpUtility.UrlDecode(idShortPathToOperation);
+
             if (async)
             {
-                IResult<CallbackResponse> result = serviceProvider.InvokeOperationAsync(operationIdShort, invocationRequest);
+                IResult<CallbackResponse> result = serviceProvider.InvokeOperationAsync(idShortPathToOperation, invocationRequest);
                 return result.CreateActionResult(CrudOperation.Invoke);
             }
             else
             {
-                IResult<InvocationResponse> result = serviceProvider.InvokeOperation(operationIdShort, invocationRequest);
+                IResult<InvocationResponse> result = serviceProvider.InvokeOperation(idShortPathToOperation, invocationRequest);
                 return result.CreateActionResult(CrudOperation.Invoke);
             }
         }
@@ -263,24 +284,27 @@
         /// <summary>
         /// Retrieves the result of an asynchronously started operation
         /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
         /// <param name="requestId">The request id</param>
         /// <returns></returns>
         /// <response code="200">Result found</response>
         /// <response code="400">Bad Request</response>
-        /// <response code="404">Submodel / Operation / Request not found</response>
-        [HttpGet("submodel/submodelElements/{operationIdShort}/invocationList/{requestId}", Name = "GetInvocationResultByIdShort")]
+        /// <response code="404">Operation / Request not found</response>
+        [HttpGet("submodel/submodelElements/{idShortPathToOperation}/invocationList/{requestId}", Name = "GetInvocationResultByIdShort")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(InvocationResponse), 200)]
         [ProducesResponseType(typeof(Result), 400)]
         [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetInvocationResultByIdShort(string operationIdShort, string requestId)
+        public IActionResult GetInvocationResultByIdShort(string idShortPathToOperation, string requestId)
         {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
+            if (string.IsNullOrEmpty(idShortPathToOperation))
+                return ResultHandling.NullResult(nameof(idShortPathToOperation));
             if (string.IsNullOrEmpty(requestId))
                 return ResultHandling.NullResult(nameof(requestId));
 
-            IResult<InvocationResponse> result = serviceProvider.GetInvocationResult(operationIdShort, requestId);
+            idShortPathToOperation = HttpUtility.UrlDecode(idShortPathToOperation);
+
+            IResult<InvocationResponse> result = serviceProvider.GetInvocationResult(idShortPathToOperation, requestId);
             return result.CreateActionResult(CrudOperation.Invoke);
         }
       }
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryController.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryController.cs
new file mode 100644
index 0000000..2dee9b4
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryController.cs
@@ -0,0 +1,342 @@
+/*******************************************************************************
+* Copyright (c) 2020 Robert Bosch GmbH
+* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License 2.0 which is available at
+* http://www.eclipse.org/legal/epl-2.0
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************/
+using System.Collections.Generic;
+using Microsoft.AspNetCore.Mvc;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Utils.ResultHandling;
+using BaSyx.API.Components;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
+using BaSyx.Models.Communication;
+
+namespace BaSyx.API.Http.Controllers
+{
+    /// <summary>
+    /// The Submodel Repository Controller
+    /// </summary>
+    public class SubmodelRepositoryController : Controller
+    {
+        private readonly ISubmodelRepositoryServiceProvider serviceProvider;
+
+        /// <summary>
+        /// The constructor for the Submodel Repository Controller
+        /// </summary>
+        /// <param name="submodelRepositoryServiceProvider"></param>
+        public SubmodelRepositoryController(ISubmodelRepositoryServiceProvider submodelRepositoryServiceProvider)
+        {
+            serviceProvider = submodelRepositoryServiceProvider;
+        }
+
+        /// <summary>
+        /// Retrieves all Submodels from the Submodel repository
+        /// </summary>
+        /// <returns></returns>
+        /// <response code="200">Returns a list of found Submodels</response>       
+        [HttpGet("submodels", Name = "GetAllSubmodelsFromRepo")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(List<Submodel>), 200)]
+        public IActionResult GetAllSubmodelsFromRepo()
+        {
+            var result = serviceProvider.RetrieveSubmodels();
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+        /// <summary>
+        /// Retrieves a specific Submodel from the Submodel repository
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the requested Submodel</response>
+        /// <response code="404">No Submodel found</response>        
+        [HttpGet("submodels/{submodelId}")]
+        [HttpGet("submodels/{submodelId}/submodel", Name = "RetrieveSubmodelFromRepoById")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Submodel), 200)]
+        public IActionResult RetrieveSubmodelFromRepoById(string submodelId)
+        {
+            if (string.IsNullOrEmpty(submodelId))
+                return ResultHandling.NullResult(nameof(submodelId));
+
+            var result = serviceProvider.RetrieveSubmodel(submodelId);
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+
+        /// <summary>
+        /// Creates or updates a Submodel at the Submodel repository
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="submodel">The Submodel object</param>
+        /// <returns></returns>
+        /// <response code="201">Submodel created / updated successfully</response>
+        /// <response code="400">Bad Request</response>             
+        [HttpPut("submodels/{submodelId}", Name = "PutSubmodelToRepo")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(Submodel), 201)]
+        public IActionResult PutSubmodelToRepo(string submodelId, [FromBody] ISubmodel submodel)
+        {
+            if (string.IsNullOrEmpty(submodelId))
+                return ResultHandling.NullResult(nameof(submodelId));
+            if (submodel == null)
+                return ResultHandling.NullResult(nameof(submodel));
+
+            var result = serviceProvider.CreateSubmodel(submodel);
+            return result.CreateActionResult(CrudOperation.Create, "submodels/"+ submodelId);
+        }
+        /// <summary>
+        /// Deletes a specific Submodel at the Submodel repository 
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <returns></returns>
+        /// <response code="200">Submodel deleted successfully</response>
+        [HttpDelete("submodels/{submodelId}", Name = "DeleteSubmodelFromRepoById")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 200)]
+        public IActionResult DeleteSubmodelFromRepoById(string submodelId)
+        {
+            if (string.IsNullOrEmpty(submodelId))
+                return ResultHandling.NullResult(nameof(submodelId));
+
+            var result = serviceProvider.DeleteSubmodel(submodelId);
+            return result.CreateActionResult(CrudOperation.Delete);
+        }
+
+        /*****************************************************************************************/
+        #region Routed Submodel Services
+
+        /// <summary>
+        /// Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <returns></returns>
+        /// <response code="200">Success</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("submodels/{submodelId}/submodel/values", Name = "SubmodelRepo_GetSubmodelValues")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult SubmodelRepo_GetSubmodelValues(string submodelId)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelValues();
+        }
+
+        /// <summary>
+        /// Retrieves all Submodel-Elements from the Submodel
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <returns></returns>
+        /// <response code="200">Returns a list of found Submodel-Elements</response>
+        /// <response code="404">Submodel not found</response>       
+        [HttpGet("submodels/{submodelId}/submodel/submodelElements", Name = "SubmodelRepo_GetSubmodelElements")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement[]), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult SubmodelRepo_GetSubmodelElements(string submodelId)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelElements();
+        }
+
+        /// <summary>
+        /// Creates or updates a Submodel-Element at the Submodel
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <param name="submodelElement">The Submodel-Element object</param>
+        /// <returns></returns>
+        /// <response code="201">Submodel-Element created successfully</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel not found</response>
+        [HttpPut("submodels/{submodelId}/submodel/submodelElements/{seIdShortPath}", Name = "SubmodelRepo_PutSubmodelElement")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement), 201)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult SubmodelRepo_PutSubmodelElement(string submodelId, string seIdShortPath, [FromBody] ISubmodelElement submodelElement)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.PutSubmodelElement(seIdShortPath, submodelElement);
+        }
+        /// <summary>
+        /// Retrieves a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the requested Submodel-Element</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>     
+        [HttpGet("submodels/{submodelId}/submodel/submodelElements/{seIdShortPath}", Name = "SubmodelRepo_GetSubmodelElementByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(SubmodelElement), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult SubmodelRepo_GetSubmodelElementByIdShort(string submodelId, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelElementByIdShort(seIdShortPath);
+        }
+
+        /// <summary>
+        /// Retrieves the value of a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="200">Returns the value of a specific Submodel-Element</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>  
+        /// <response code="405">Method not allowed</response>  
+        [HttpGet("submodels/{submodelId}/submodel/submodelElements/{seIdShortPath}/value", Name = "SubmodelRepo_GetSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(object), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        [ProducesResponseType(typeof(Result), 405)]
+        public IActionResult SubmodelRepo_GetSubmodelElementValueByIdShort(string submodelId, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetSubmodelElementValueByIdShort(seIdShortPath);
+        }
+
+        /// <summary>
+        /// Updates the Submodel-Element's value
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <param name="value">The new value</param>
+        /// <returns></returns>
+        /// <response code="200">Submodel-Element's value changed successfully</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>     
+        /// <response code="405">Method not allowed</response>  
+        [HttpPut("submodels/{submodelId}/submodel/submodelElements/{seIdShortPath}/value", Name = "SubmodelRepo_PutSubmodelElementValueByIdShort")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(ElementValue), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult SubmodelRepo_PutSubmodelElementValueByIdShort(string submodelId, string seIdShortPath, [FromBody] object value)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.PutSubmodelElementValueByIdShort(seIdShortPath, value);
+        }
+
+        /// <summary>
+        /// Deletes a specific Submodel-Element from the Submodel
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+        /// <returns></returns>
+        /// <response code="204">Submodel-Element deleted successfully</response>
+        /// <response code="404">Submodel / Submodel-Element not found</response>
+        [HttpDelete("submodels/{submodelId}/submodel/submodelElements/{seIdShortPath}", Name = "SubmodelRepo_DeleteSubmodelElementByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(Result), 200)]
+        public IActionResult SubmodelRepo_DeleteSubmodelElementByIdShort(string submodelId, string seIdShortPath)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.DeleteSubmodelElementByIdShort(seIdShortPath);
+        }
+
+        /// <summary>
+        /// Invokes a specific operation from the Submodel synchronously or asynchronously
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+        /// <param name="invocationRequest">The parameterized request object for the invocation</param>
+        /// <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
+        /// <returns></returns>
+        /// <response code="200">Operation invoked successfully</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel / Method handler not found</response>
+        [HttpPost("submodels/{submodelId}/submodel/submodelElements/{idShortPathToOperation}/invoke", Name = "SubmodelRepo_InvokeOperationByIdShort")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult SubmodelRepo_InvokeOperationByIdShort(string submodelId, string idShortPathToOperation, [FromBody] InvocationRequest invocationRequest, [FromQuery] bool async)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.InvokeOperationByIdShort(idShortPathToOperation, invocationRequest, async);
+        }
+
+        /// <summary>
+        /// Retrieves the result of an asynchronously started operation
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+        /// <param name="requestId">The request id</param>
+        /// <returns></returns>
+        /// <response code="200">Result found</response>
+        /// <response code="400">Bad Request</response>
+        /// <response code="404">Submodel / Operation / Request not found</response>
+        [HttpGet("submodels/{submodelId}/submodel/submodelElements/{idShortPathToOperation}/invocationList/{requestId}", Name = "SubmodelRepo_GetInvocationResultByIdShort")]
+        [Produces("application/json")]
+        [ProducesResponseType(typeof(InvocationResponse), 200)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult SubmodelRepo_GetInvocationResultByIdShort(string submodelId, string idShortPathToOperation, string requestId)
+        {
+            if (IsNullOrNotFound(submodelId, out IActionResult result, out ISubmodelServiceProvider provider))
+                return result;
+
+            var service = new SubmodelController(provider);
+            return service.GetInvocationResultByIdShort(idShortPathToOperation, requestId);
+        }
+        #endregion
+
+        #region Helper
+        /// <summary>
+        /// Checks whether submodelId is null or Submodel Service Provider cannot be found
+        /// </summary>
+        /// <param name="submodelId">The Submodel's unique id</param>
+        /// <param name="result">The IActionResult in case submodelId is null or the provider cannot be found</param>
+        /// <param name="provider">The Submodel Service Provider</param>
+        /// <returns></returns>
+        public bool IsNullOrNotFound(string submodelId, out IActionResult result, out ISubmodelServiceProvider provider)
+        {
+            if (string.IsNullOrEmpty(submodelId))
+            {
+                result = ResultHandling.NullResult(nameof(submodelId));
+                provider = null;
+                return true;
+            }
+            provider = serviceProvider.GetSubmodelServiceProvider(submodelId);
+            if (provider == null)
+            {
+                result = NotFound(new Result(false, new NotFoundMessage("Submodel Provider")));
+                return true;
+            }
+            result = null;
+            return false;
+        }
+
+        #endregion
+    }
+}
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs
deleted file mode 100644
index 68f56fb..0000000
--- a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
-* Copyright (c) 2020 Robert Bosch GmbH
-* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
-*
-* This program and the accompanying materials are made available under the
-* terms of the Eclipse Public License 2.0 which is available at
-* http://www.eclipse.org/legal/epl-2.0
-*
-* SPDX-License-Identifier: EPL-2.0
-*******************************************************************************/
-using System.Collections.Generic;
-using Microsoft.AspNetCore.Mvc;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Utils.ResultHandling;
-using BaSyx.API.Components;
-
-namespace BaSyx.API.Http.Controllers
-{
-    /// <summary>
-    /// The Submodel Repository Controller
-    /// </summary>
-    public class SubmodelRepositoryServices : Controller
-    {
-        private readonly ISubmodelRepositoryServiceProvider serviceProvider;
-
-        /// <summary>
-        /// Constructor for the Submodel Repository Services Controller
-        /// </summary>
-        /// <param name="submodelRepositoryServiceProvider"></param>
-        public SubmodelRepositoryServices(ISubmodelRepositoryServiceProvider submodelRepositoryServiceProvider)
-        {
-            serviceProvider = submodelRepositoryServiceProvider;
-        }
-
-        /// <summary>
-        /// Retrieves all Submodels from the repository service endpoint
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Returns a list of found Submodels</response>
-        /// <response code="404">No Submodels found</response>            
-        /// <response code="400">Bad Request</response>    
-        /// <response code="502">Bad Gateway</response>
-        [HttpGet("submodels", Name = "GetAllSubmodelsFromRepo")]
-        [ProducesResponseType(typeof(List<BaSyx.Models.Core.AssetAdministrationShell.Implementations.Submodel>), 200)]
-        public IActionResult GetAllSubmodelsFromRepo()
-        {
-            var result = serviceProvider.RetrieveSubmodels();
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-        /// <summary>
-        /// Retrieves a specific Submodel from the repository service endpoint
-        /// </summary>
-        /// <param name="submodelId">The Submodel's unique id</param>
-        /// <returns></returns>
-        /// <response code="200">Returns the requested Submodel</response>
-        /// <response code="404">No Submodel found</response>     
-        /// <response code="400">Bad Request</response>         
-        /// <response code="502">Bad Gateway</response>
-        [HttpGet("submodels/{submodelId}", Name = "RetrieveSubmodelFromRepoById")]
-        [ProducesResponseType(typeof(BaSyx.Models.Core.AssetAdministrationShell.Implementations.Submodel), 200)]
-        public IActionResult RetrieveSubmodelFromRepoById(string submodelId)
-        {
-            if (string.IsNullOrEmpty(submodelId))
-                return ResultHandling.NullResult(nameof(submodelId));
-
-            var result = serviceProvider.RetrieveSubmodel(submodelId);
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-        
-        /// <summary>
-        /// Creates or updates a Submodel at the repository service endpoint
-        /// </summary>
-        /// <param name="submodel">The serialized Submodel object</param>
-        /// <returns></returns>
-        /// <response code="201">Submodel created/updated successfully</response>
-        /// <response code="400">Bad Request</response>             
-        /// <response code="502">Bad Gateway</response> 
-        [HttpPost("submodels", Name = "PutSubmodelToRepo")]
-        [ProducesResponseType(typeof(BaSyx.Models.Core.AssetAdministrationShell.Implementations.Submodel), 201)]
-        public IActionResult PutSubmodelToRepo([FromBody] ISubmodel submodel)
-        {
-            if (submodel == null)
-                return ResultHandling.NullResult(nameof(submodel));
-
-            var result = serviceProvider.CreateSubmodel(submodel);
-            return result.CreateActionResult(CrudOperation.Create);
-        }
-        /// <summary>
-        /// Deletes a specific Submodel at the repository service endpoint
-        /// </summary>
-        /// <param name="submodelId">The Submodel's unique id</param>
-        /// <returns></returns>
-        /// <response code="200">Submodel deleted successfully</response>
-        /// <response code="400">Bad Request</response>      
-        /// <response code="502">Bad Gateway</response>
-        [HttpDelete("submodels/{submodelId}", Name = "DeleteSubmodelFromRepoById")]
-        [ProducesResponseType(typeof(Result), 200)]
-        public IActionResult DeleteSubmodelFromRepoById(string submodelId)
-        {
-            if (string.IsNullOrEmpty(submodelId))
-                return ResultHandling.NullResult(nameof(submodelId));
-
-            var result = serviceProvider.DeleteSubmodel(submodelId);
-            return result.CreateActionResult(CrudOperation.Delete);
-        }
-    }
-}
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
index 8ed3b60..3af001e 100644
--- a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
@@ -4,86 +4,43 @@
         <name>BaSyx.API.Http.Controllers</name>
     </assembly>
     <members>
-        <member name="T:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryServices">
+        <member name="T:BaSyx.API.Http.Controllers.AssetAdministrationShellController">
             <summary>
-            The Asset Administration Shell Repository Controller
+            The Asset Administration Shell Controller
             </summary>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryServices.#ctor(BaSyx.API.Components.IAssetAdministrationShellRepositoryServiceProvider)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.#ctor(BaSyx.API.Components.IAssetAdministrationShellServiceProvider)">
             <summary>
-            Constructor for the Asset Administration Shell Repository Services Controller
-            </summary>
-            <param name="assetAdministrationShellRepositoryServiceProvider"></param>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryServices.GetAllAssetAdministrationShells">
-            <summary>
-            Retrieves all Asset Administration Shells from the repository service endpoint
-            </summary>
-            <returns></returns>
-            <response code="200">Returns a list of found Asset Administration Shells</response>
-            <response code="404">No Asset Administration Shells found</response>            
-            <response code="400">Bad Request</response>    
-            <response code="502">Bad Gateway</response>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryServices.GetAssetAdministrationShellById(System.String)">
-            <summary>
-            Retrieves a specific Asset Administration Shell from the repository service endpoint
-            </summary>
-            <param name="aasId">The Asset Administration Shell's unique id</param>
-            <returns></returns>
-            <response code="200">Returns the requested Asset Administration Shell</response>
-            <response code="404">No Asset Administration Shell found</response>     
-            <response code="400">Bad Request</response>         
-            <response code="502">Bad Gateway</response>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryServices.PutAssetAdministrationShell(BaSyx.Models.Core.AssetAdministrationShell.Generics.IAssetAdministrationShell)">
-            <summary>
-            Creates or updates a Asset Administration Shell at the repository service endpoint
-            </summary>
-            <param name="aas">The serialized Asset Administration Shell object</param>
-            <returns></returns>
-            <response code="201">Asset Administration Shell created successfully</response>
-            <response code="400">Bad Request</response>             
-            <response code="502">Bad Gateway</response> 
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryServices.DeleteAssetAdministrationShellById(System.String)">
-            <summary>
-            Deletes a specific Asset Administration Shell at the repository service endpoint
-            </summary>
-            <param name="aasId">The Asset Administration Shell's unique id</param>
-            <returns></returns>
-            <response code="200">Asset Administration Shell deleted successfully</response>
-            <response code="400">Bad Request</response>      
-            <response code="502">Bad Gateway</response>
-        </member>
-        <member name="T:BaSyx.API.Http.Controllers.AssetAdministrationShellServices">
-            <summary>
-            All Asset Administration Shell Services provided by the component
-            </summary>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.#ctor(BaSyx.API.Components.IAssetAdministrationShellServiceProvider)">
-            <summary>
-            Constructor for the Asset Administration Shell Services Controller
+            The constructor for the Asset Administration Shell Controller
             </summary>
             <param name="assetAdministrationShellServiceProvider">The Asset Administration Shell Service Provider implementation provided by the dependency injection</param>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.GetAssetAdministrationShell">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.GetAssetAdministrationShell">
             <summary>
             Retrieves the Asset Administration Shell Descriptor
             </summary>
             <returns></returns>
             <response code="200">Success</response>   
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.PutSubmodelToShell(BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodel)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.GetSubmodelsFromShell">
+            <summary>
+            Retrieves all Submodels from the  Asset Administration Shell
+            </summary>
+            <returns></returns>
+            <response code="200">Returns a list of found Submodels</response>
+            <response code="404">No Submodel Service Providers found</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.PutSubmodelToShell(System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodel)">
             <summary>
             Creates or updates a Submodel to an existing Asset Administration Shell
             </summary>
+            <param name="submodelIdShort">The Submodel's short id</param>
             <param name="submodel">The serialized Submodel object</param>
             <returns></returns>
             <response code="201">Submodel created successfully</response>
             <response code="400">Bad Request</response>               
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.GetSubmodelFromShellByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.GetSubmodelFromShellByIdShort(System.String)">
             <summary>
             Retrieves the Submodel from the Asset Administration Shell
             </summary>
@@ -92,7 +49,7 @@
             <response code="200">Submodel retrieved successfully</response>
             <response code="404">No Submodel Service Provider found</response>    
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.DeleteSubmodelFromShellByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.DeleteSubmodelFromShellByIdShort(System.String)">
             <summary>
             Deletes a specific Submodel from the Asset Administration Shell
             </summary>
@@ -101,114 +58,342 @@
             <response code="204">Submodel deleted successfully</response>
             <response code="400">Bad Request</response>    
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.GetSubmodelsFromShell">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_GetSubmodelValues(System.String)">
             <summary>
-            Retrieves all Submodels from the  Asset Administration Shell
+            Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
             </summary>
+            <param name="submodelIdShort">The Submodel's short id</param>
             <returns></returns>
-            <response code="200">Returns a list of found Submodels</response>
-            <response code="404">No Submodel Service Providers found</response>       
+            <response code="200">Success</response>
+            <response code="404">Submodel not found</response>       
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetSubmodelElements">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_GetSubmodelElements(System.String)">
             <summary>
             Retrieves all Submodel-Elements from the Submodel
             </summary>
+            <param name="submodelIdShort">The Submodel's short id</param>
             <returns></returns>
             <response code="200">Returns a list of found Submodel-Elements</response>
-            <response code="404">Submodel not found / No Submodel-Elements found</response>       
+            <response code="404">Submodel not found</response>       
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedPutSubmodelElement(BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_PutSubmodelElement(System.String,System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
             <summary>
-            Creates or updates a Submodel-Element to the Asset Administration Shell's Submodel
+            Creates or updates a Submodel-Element at the Submodel
             </summary>
-            <param name="submodelElement">The serialized Submodel Element object</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <param name="submodelElement">The Submodel-Element object</param>
             <returns></returns>
             <response code="201">Submodel-Element created successfully</response>
             <response code="400">Bad Request</response>
             <response code="404">Submodel not found</response>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetSubmodelElementByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_GetSubmodelElementByIdShort(System.String,System.String)">
             <summary>
-            Retrieves a specific Submodel-Element from the Asset Administrations's Submodel
+            Retrieves a specific Submodel-Element from the Submodel
             </summary>
-            <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
             <returns></returns>
             <response code="200">Returns the requested Submodel-Element</response>
             <response code="404">Submodel / Submodel-Element not found</response>     
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedDeleteSubmodelElementByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_GetSubmodelElementValueByIdShort(System.String,System.String)">
             <summary>
-            Deletes a specific Submodel-Element from the Asset Administration Shell's Submodel
+            Retrieves the value of a specific Submodel-Element from the Submodel
             </summary>
-            <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <returns></returns>
+            <response code="200">Returns the value of a specific Submodel-Element</response>
+            <response code="404">Submodel / Submodel-Element not found</response>  
+            <response code="405">Method not allowed</response>  
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_PutSubmodelElementValueByIdShort(System.String,System.String,System.Object)">
+            <summary>
+            Updates the Submodel-Element's value
+            </summary>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <param name="value">The new value</param>
+            <returns></returns>
+            <response code="200">Submodel-Element's value changed successfully</response>
+            <response code="404">Submodel / Submodel-Element not found</response>     
+            <response code="405">Method not allowed</response>  
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_DeleteSubmodelElementByIdShort(System.String,System.String)">
+            <summary>
+            Deletes a specific Submodel-Element from the Submodel
+            </summary>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
             <returns></returns>
             <response code="204">Submodel-Element deleted successfully</response>
-            <response code="404">Submodel not found</response>
+            <response code="404">Submodel / Submodel-Element not found</response>
         </member>
-        <member name="T:BaSyx.API.Http.Controllers.SubmodelRepositoryServices">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_InvokeOperationByIdShort(System.String,System.String,BaSyx.Models.Communication.InvocationRequest,System.Boolean)">
             <summary>
-            The Submodel Repository Controller
+            Invokes a specific operation from the Submodel synchronously or asynchronously
+            </summary>
+            <param name="submodelIdShort">Submodel's short id</param>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+            <param name="invocationRequest">The parameterized request object for the invocation</param>
+            <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
+            <returns></returns>
+            <response code="200">Operation invoked successfully</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Submodel / Method handler not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.Shell_GetInvocationResultByIdShort(System.String,System.String,System.String)">
+            <summary>
+            Retrieves the result of an asynchronously started operation
+            </summary>
+            <param name="submodelIdShort">Submodel's short id</param>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+            <param name="requestId">The request id</param>
+            <returns></returns>
+            <response code="200">Result found</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Submodel / Operation / Request not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellController.IsNullOrNotFound(System.String,Microsoft.AspNetCore.Mvc.IActionResult@,BaSyx.API.Components.ISubmodelServiceProvider@)">
+            <summary>
+            Checks whether aasId is null or Asset Administration Shell Service Provider cannot be found
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="result">The IActionResult in case aasId is null or the provider cannot be found</param>
+            <param name="provider">The Asset Administration Shell Service Provider</param>
+            <returns></returns>
+        </member>
+        <member name="T:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController">
+            <summary>
+            The Asset Administration Shell Repository Controller
             </summary>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryServices.#ctor(BaSyx.API.Components.ISubmodelRepositoryServiceProvider)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.#ctor(BaSyx.API.Components.IAssetAdministrationShellRepositoryServiceProvider)">
             <summary>
-            Constructor for the Submodel Repository Services Controller
+            The constructor for the Asset Administration Shell Repository Controller
             </summary>
-            <param name="submodelRepositoryServiceProvider"></param>
+            <param name="assetAdministrationShellRepositoryServiceProvider"></param>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryServices.GetAllSubmodelsFromRepo">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.GetAllAssetAdministrationShells">
             <summary>
-            Retrieves all Submodels from the repository service endpoint
+            Retrieves all Asset Administration Shells from the Asset Administration Shell repository
             </summary>
             <returns></returns>
+            <response code="200">Returns a list of found Asset Administration Shells</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.GetAssetAdministrationShellById(System.String)">
+            <summary>
+            Retrieves a specific Asset Administration Shell from the Asset Administration Shell repository
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <returns></returns>
+            <response code="200">Returns the requested Asset Administration Shell</response>
+            <response code="404">No Asset Administration Shell found</response>           
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.PutAssetAdministrationShell(System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.IAssetAdministrationShell)">
+            <summary>
+            Creates or updates a Asset Administration Shell at the Asset Administration Shell repository 
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="aas">The Asset Administration Shell</param>
+            <returns></returns>
+            <response code="201">Asset Administration Shell created successfully</response>
+            <response code="400">Bad Request</response>             
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.DeleteAssetAdministrationShellById(System.String)">
+            <summary>
+            Deletes a specific Asset Administration Shell at the Asset Administration Shell repository
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <returns></returns>
+            <response code="200">Asset Administration Shell deleted successfully</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_GetSubmodelsFromShell(System.String)">
+            <summary>
+            Retrieves all Submodels from the  Asset Administration Shell
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <returns></returns>
             <response code="200">Returns a list of found Submodels</response>
-            <response code="404">No Submodels found</response>            
-            <response code="400">Bad Request</response>    
-            <response code="502">Bad Gateway</response>
+            <response code="404">No Submodel Service Providers found</response>       
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryServices.RetrieveSubmodelFromRepoById(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_PutSubmodelToShell(System.String,System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodel)">
             <summary>
-            Retrieves a specific Submodel from the repository service endpoint
+            Creates or updates a Submodel to an existing Asset Administration Shell
             </summary>
-            <param name="submodelId">The Submodel's unique id</param>
-            <returns></returns>
-            <response code="200">Returns the requested Submodel</response>
-            <response code="404">No Submodel found</response>     
-            <response code="400">Bad Request</response>         
-            <response code="502">Bad Gateway</response>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryServices.PutSubmodelToRepo(BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodel)">
-            <summary>
-            Creates or updates a Submodel at the repository service endpoint
-            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
             <param name="submodel">The serialized Submodel object</param>
             <returns></returns>
-            <response code="201">Submodel created/updated successfully</response>
-            <response code="400">Bad Request</response>             
-            <response code="502">Bad Gateway</response> 
+            <response code="201">Submodel created successfully</response>
+            <response code="400">Bad Request</response>               
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryServices.DeleteSubmodelFromRepoById(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_GetSubmodelFromShellByIdShort(System.String,System.String)">
             <summary>
-            Deletes a specific Submodel at the repository service endpoint
+            Retrieves the Submodel from the Asset Administration Shell
             </summary>
-            <param name="submodelId">The Submodel's unique id</param>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
             <returns></returns>
-            <response code="200">Submodel deleted successfully</response>
-            <response code="400">Bad Request</response>      
-            <response code="502">Bad Gateway</response>
+            <response code="200">Submodel retrieved successfully</response>
+            <response code="404">No Submodel Service Provider found</response>    
         </member>
-        <member name="T:BaSyx.API.Http.Controllers.SubmodelServices">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_DeleteSubmodelFromShellByIdShort(System.String,System.String)">
             <summary>
-            All Asset Administration Shell Services provided by the component
+            Deletes a specific Submodel from the Asset Administration Shell
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <returns></returns>
+            <response code="204">Submodel deleted successfully</response>
+            <response code="400">Bad Request</response>    
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_GetSubmodelValues(System.String,System.String)">
+            <summary>
+            Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <returns></returns>
+            <response code="200">Success</response>
+            <response code="404">Submodel not found</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_GetSubmodelElements(System.String,System.String)">
+            <summary>
+            Retrieves all Submodel-Elements from the Submodel
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <returns></returns>
+            <response code="200">Returns a list of found Submodel-Elements</response>
+            <response code="404">Submodel not found</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_PutSubmodelElement(System.String,System.String,System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
+            <summary>
+            Creates or updates a Submodel-Element at the Submodel
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <param name="submodelElement">The Submodel-Element object</param>
+            <returns></returns>
+            <response code="201">Submodel-Element created successfully</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Submodel not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_GetSubmodelElementByIdShort(System.String,System.String,System.String)">
+            <summary>
+            Retrieves a specific Submodel-Element from the Submodel
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <returns></returns>
+            <response code="200">Returns the requested Submodel-Element</response>
+            <response code="404">Submodel / Submodel-Element not found</response>     
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_GetSubmodelElementValueByIdShort(System.String,System.String,System.String)">
+            <summary>
+            Retrieves the value of a specific Submodel-Element from the Submodel
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <returns></returns>
+            <response code="200">Returns the value of a specific Submodel-Element</response>
+            <response code="404">Submodel / Submodel-Element not found</response>  
+            <response code="405">Method not allowed</response>  
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_PutSubmodelElementValueByIdShort(System.String,System.String,System.String,System.Object)">
+            <summary>
+            Updates the Submodel-Element's value
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <param name="value">The new value</param>
+            <returns></returns>
+            <response code="200">Submodel-Element's value changed successfully</response>
+            <response code="404">Submodel / Submodel-Element not found</response>     
+            <response code="405">Method not allowed</response>  
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_DeleteSubmodelElementByIdShort(System.String,System.String,System.String)">
+            <summary>
+            Deletes a specific Submodel-Element from the Submodel
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">The Submodel's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <returns></returns>
+            <response code="204">Submodel-Element deleted successfully</response>
+            <response code="404">Submodel / Submodel-Element not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_InvokeOperationByIdShort(System.String,System.String,System.String,BaSyx.Models.Communication.InvocationRequest,System.Boolean)">
+            <summary>
+            Invokes a specific operation from the Submodel synchronously or asynchronously
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">Submodel's short id</param>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+            <param name="invocationRequest">The parameterized request object for the invocation</param>
+            <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
+            <returns></returns>
+            <response code="200">Operation invoked successfully</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Submodel / Method handler not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.ShellRepo_GetInvocationResultByIdShort(System.String,System.String,System.String,System.String)">
+            <summary>
+            Retrieves the result of an asynchronously started operation
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="submodelIdShort">Submodel's short id</param>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+            <param name="requestId">The request id</param>
+            <returns></returns>
+            <response code="200">Result found</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Submodel / Operation / Request not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryController.IsNullOrNotFound(System.String,Microsoft.AspNetCore.Mvc.IActionResult@,BaSyx.API.Components.IAssetAdministrationShellServiceProvider@)">
+            <summary>
+            Checks whether aasId is null or Asset Administration Shell Service Provider cannot be found
+            </summary>
+            <param name="aasId">The Asset Administration Shell's unique id</param>
+            <param name="result">The IActionResult in case aasId is null or the provider cannot be found</param>
+            <param name="provider">The Asset Administration Shell Service Provider</param>
+            <returns></returns>
+        </member>
+        <member name="T:BaSyx.API.Http.Controllers.SubmodelController">
+            <summary>
+            The Submodel Controller
             </summary>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.#ctor(BaSyx.API.Components.ISubmodelServiceProvider)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.#ctor(BaSyx.API.Components.ISubmodelServiceProvider)">
             <summary>
-            Constructor for the Submodel Services Controller
+            The constructor for the Submodel Controller
             </summary>
             <param name="submodelServiceProvider">The Submodel Service Provider implementation provided by the dependency injection</param>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetSubmodelAsTable(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.GetSubmodel">
+            <summary>
+            Retrieves the entire Submodel
+            </summary>
+            <returns></returns>
+            <response code="200">Success</response>
+            <response code="404">Submodel not found</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.GetSubmodelValues">
+            <summary>
+            Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+            </summary>
+            <returns></returns>
+            <response code="200">Success</response>
+            <response code="404">Submodel not found</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.GetSubmodelAsTable(System.String)">
             <summary>
             Retrieves a customizable table version of a Submodel
             </summary>
@@ -217,84 +402,210 @@
             <response code="200">Success</response>
             <response code="404">Submodel not found</response>   
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetMinimizedSubmodel">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.GetSubmodelElements">
             <summary>
-            Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+            Retrieves all Submodel-Elements from the Submodel
             </summary>
             <returns></returns>
-            <response code="200">Success</response>
+            <response code="200">Returns a list of found Submodel-Elements</response>
             <response code="404">Submodel not found</response>       
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetSubmodel">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.PutSubmodelElement(System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
             <summary>
-            Retrieves the entire Submodel
+            Creates or updates a Submodel-Element at the Submodel
             </summary>
-            <returns></returns>
-            <response code="200">Success</response>
-            <response code="404">Submodel not found</response>       
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetSubmodelElements">
-            <summary>
-            Retrieves all SubmodelElements from the current Submodel
-            </summary>
-            <returns></returns>
-            <response code="200">Returns a list of found SubmodelElements</response>
-            <response code="404">Submodel not found</response>       
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.PutSubmodelElement(BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
-            <summary>
-            Adds a new Submodel-Element to the Submodel
-            </summary>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
             <param name="submodelElement">The Submodel-Element object</param>
             <returns></returns>
-            <response code="201">Submodel Element created successfully</response>
+            <response code="201">Submodel-Element created successfully</response>
             <response code="400">Bad Request</response>
-            <response code="404">Submodel not found</response>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetSubmodelElementByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.GetSubmodelElementByIdShort(System.String)">
             <summary>
             Retrieves a specific Submodel-Element from the Submodel
             </summary>
-            <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
             <returns></returns>
             <response code="200">Returns the requested Submodel-Element</response>
-            <response code="404">Submodel / Submodel Element not found</response>     
+            <response code="404">Submodel Element not found</response>     
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetSubmodelElementValueByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.GetSubmodelElementValueByIdShort(System.String)">
             <summary>
             Retrieves the value of a specific Submodel-Element from the Submodel
             </summary>
-            <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
             <returns></returns>
             <response code="200">Returns the value of a specific Submodel-Element</response>
             <response code="404">Submodel / Submodel-Element not found</response>  
             <response code="405">Method not allowed</response>  
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.PutSubmodelElementValueByIdShort(System.String,BaSyx.Models.Core.Common.IValue)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.PutSubmodelElementValueByIdShort(System.String,System.Object)">
             <summary>
-            Updates the Asset Administration Shell's Submodel's Submodel-Element
+            Updates the Submodel-Element's value
             </summary>
-            <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <param name="value">The new value</param>
+            <returns></returns>
+            <response code="200">Submodel-Element's value changed successfully</response>
+            <response code="404">Submodel-Element not found</response>     
+            <response code="405">Method not allowed</response>  
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.DeleteSubmodelElementByIdShort(System.String)">
+            <summary>
+            Deletes a specific Submodel-Element from the Submodel
+            </summary>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <returns></returns>
+            <response code="204">Submodel-Element deleted successfully</response>
+            <response code="404">Submodel-Element not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.InvokeOperationByIdShort(System.String,BaSyx.Models.Communication.InvocationRequest,System.Boolean)">
+            <summary>
+            Invokes a specific operation from the Submodel synchronously or asynchronously
+            </summary>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+            <param name="invocationRequest">The parameterized request object for the invocation</param>
+            <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
+            <returns></returns>
+            <response code="200">Operation invoked successfully</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Method handler not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelController.GetInvocationResultByIdShort(System.String,System.String)">
+            <summary>
+            Retrieves the result of an asynchronously started operation
+            </summary>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
+            <param name="requestId">The request id</param>
+            <returns></returns>
+            <response code="200">Result found</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Operation / Request not found</response>
+        </member>
+        <member name="T:BaSyx.API.Http.Controllers.SubmodelRepositoryController">
+            <summary>
+            The Submodel Repository Controller
+            </summary>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.#ctor(BaSyx.API.Components.ISubmodelRepositoryServiceProvider)">
+            <summary>
+            The constructor for the Submodel Repository Controller
+            </summary>
+            <param name="submodelRepositoryServiceProvider"></param>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.GetAllSubmodelsFromRepo">
+            <summary>
+            Retrieves all Submodels from the Submodel repository
+            </summary>
+            <returns></returns>
+            <response code="200">Returns a list of found Submodels</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.RetrieveSubmodelFromRepoById(System.String)">
+            <summary>
+            Retrieves a specific Submodel from the Submodel repository
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <returns></returns>
+            <response code="200">Returns the requested Submodel</response>
+            <response code="404">No Submodel found</response>        
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.PutSubmodelToRepo(System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodel)">
+            <summary>
+            Creates or updates a Submodel at the Submodel repository
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="submodel">The Submodel object</param>
+            <returns></returns>
+            <response code="201">Submodel created / updated successfully</response>
+            <response code="400">Bad Request</response>             
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.DeleteSubmodelFromRepoById(System.String)">
+            <summary>
+            Deletes a specific Submodel at the Submodel repository 
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <returns></returns>
+            <response code="200">Submodel deleted successfully</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_GetSubmodelValues(System.String)">
+            <summary>
+            Retrieves the minimized version of a Submodel, i.e. only the values of SubmodelElements are serialized and returned
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <returns></returns>
+            <response code="200">Success</response>
+            <response code="404">Submodel not found</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_GetSubmodelElements(System.String)">
+            <summary>
+            Retrieves all Submodel-Elements from the Submodel
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <returns></returns>
+            <response code="200">Returns a list of found Submodel-Elements</response>
+            <response code="404">Submodel not found</response>       
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_PutSubmodelElement(System.String,System.String,BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
+            <summary>
+            Creates or updates a Submodel-Element at the Submodel
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <param name="submodelElement">The Submodel-Element object</param>
+            <returns></returns>
+            <response code="201">Submodel-Element created successfully</response>
+            <response code="400">Bad Request</response>
+            <response code="404">Submodel not found</response>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_GetSubmodelElementByIdShort(System.String,System.String)">
+            <summary>
+            Retrieves a specific Submodel-Element from the Submodel
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <returns></returns>
+            <response code="200">Returns the requested Submodel-Element</response>
+            <response code="404">Submodel / Submodel-Element not found</response>     
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_GetSubmodelElementValueByIdShort(System.String,System.String)">
+            <summary>
+            Retrieves the value of a specific Submodel-Element from the Submodel
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
+            <returns></returns>
+            <response code="200">Returns the value of a specific Submodel-Element</response>
+            <response code="404">Submodel / Submodel-Element not found</response>  
+            <response code="405">Method not allowed</response>  
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_PutSubmodelElementValueByIdShort(System.String,System.String,System.Object)">
+            <summary>
+            Updates the Submodel-Element's value
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
             <param name="value">The new value</param>
             <returns></returns>
             <response code="200">Submodel-Element's value changed successfully</response>
             <response code="404">Submodel / Submodel-Element not found</response>     
             <response code="405">Method not allowed</response>  
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.DeleteSubmodelElementByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_DeleteSubmodelElementByIdShort(System.String,System.String)">
             <summary>
             Deletes a specific Submodel-Element from the Submodel
             </summary>
-            <param name="submodelElementIdShort">The Submodel-Element's short id</param>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="seIdShortPath">The Submodel-Element's IdShort-Path</param>
             <returns></returns>
             <response code="204">Submodel-Element deleted successfully</response>
             <response code="404">Submodel / Submodel-Element not found</response>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.InvokeOperationByIdShort(System.String,BaSyx.Models.Communication.InvocationRequest,System.Boolean)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_InvokeOperationByIdShort(System.String,System.String,BaSyx.Models.Communication.InvocationRequest,System.Boolean)">
             <summary>
             Invokes a specific operation from the Submodel synchronously or asynchronously
             </summary>
-            <param name="operationIdShort">The Operation's short id</param>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
             <param name="invocationRequest">The parameterized request object for the invocation</param>
             <param name="async">Determines whether the execution of the operation is asynchronous (true) or not (false)</param>
             <returns></returns>
@@ -302,36 +613,46 @@
             <response code="400">Bad Request</response>
             <response code="404">Submodel / Method handler not found</response>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetInvocationResultByIdShort(System.String,System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.SubmodelRepo_GetInvocationResultByIdShort(System.String,System.String,System.String)">
             <summary>
             Retrieves the result of an asynchronously started operation
             </summary>
-            <param name="operationIdShort">The Operation's short id</param>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="idShortPathToOperation">The IdShort path to the Operation</param>
             <param name="requestId">The request id</param>
             <returns></returns>
             <response code="200">Result found</response>
             <response code="400">Bad Request</response>
             <response code="404">Submodel / Operation / Request not found</response>
         </member>
-        <member name="T:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryController.IsNullOrNotFound(System.String,Microsoft.AspNetCore.Mvc.IActionResult@,BaSyx.API.Components.ISubmodelServiceProvider@)">
             <summary>
-            The Http-Controller implementation of the IAssetAdministrationShellRegistry interface
+            Checks whether submodelId is null or Submodel Service Provider cannot be found
+            </summary>
+            <param name="submodelId">The Submodel's unique id</param>
+            <param name="result">The IActionResult in case submodelId is null or the provider cannot be found</param>
+            <param name="provider">The Submodel Service Provider</param>
+            <returns></returns>
+        </member>
+        <member name="T:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController">
+            <summary>
+            The Asset Administration Shell Registry Controller
             </summary>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.#ctor(BaSyx.API.Components.IAssetAdministrationShellRegistry)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.#ctor(BaSyx.API.Components.IAssetAdministrationShellRegistry)">
             <summary>
-            The Constructor for the AssetAdministrationShellRegistry-Controller
+            The constructor for the Asset Administration Shell Registry Controller
             </summary>
             <param name="aasRegistry">The backend implementation for the IAssetAdministrationShellRegistry interface. Usually provided by the Depedency Injection mechanism.</param>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.GetAllAssetAdministrationShellDescriptors">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.GetAllAssetAdministrationShellDescriptors">
             <summary>
             Retrieves all registered Asset Administration Shells within system (e.g. Station, Line, Plant, Area, etc.) defined by the Registry
             </summary>
             <returns></returns>
             <response code="200">Returns a list of found Asset Administration Shell Descriptors</response>        
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.GetAssetAdministrationShellDescriptor(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.GetAssetAdministrationShellDescriptor(System.String)">
             <summary>
             Retrieves a specific Asset Administration Shell registration
             </summary>
@@ -341,7 +662,7 @@
             <response code="400">Bad Request</response> 
             <response code="404">No Asset Administration Shell with passed id found</response>     
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.RegisterAssetAdministrationShell(System.String,BaSyx.Models.Connectivity.Descriptors.IAssetAdministrationShellDescriptor)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.RegisterAssetAdministrationShell(System.String,BaSyx.Models.Connectivity.Descriptors.IAssetAdministrationShellDescriptor)">
             <summary>
             Creates a new or updates an existing Asset Administration Shell registration at the Registry
             </summary>
@@ -352,7 +673,7 @@
             <response code="400">The syntax of the passed Asset Administration Shell is not valid or malformed request</response>    
             <response code="404">No Asset Administration Shell with passed id found</response>      
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.UnregisterAssetAdministrationShell(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.UnregisterAssetAdministrationShell(System.String)">
             <summary>
             Deletes the Asset Administration Shell registration from the Registry
             </summary>
@@ -362,7 +683,7 @@
             <response code="400">Bad Request</response>  
             <response code="404">No Asset Administration Shell with passed id found</response>     
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.RegisterSubmodelAtAssetAdministrationShell(System.String,System.String,BaSyx.Models.Connectivity.Descriptors.ISubmodelDescriptor)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.RegisterSubmodelAtAssetAdministrationShell(System.String,System.String,BaSyx.Models.Connectivity.Descriptors.ISubmodelDescriptor)">
             <summary>
             Creates a new or updates an existing Submodel registration at a specific Asset Administration Shell registered at the Registry
             </summary>
@@ -374,7 +695,7 @@
             <response code="400">The syntax of the passed Submodel is not valid or malformed request</response>      
             <response code="404">No Asset Administration Shell with passed id found</response>   
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.GetSubmodelDescriptorFromAssetAdministrationShell(System.String,System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.GetSubmodelDescriptorFromAssetAdministrationShell(System.String,System.String)">
             <summary>
             Retrieves the Submodel registration from a specific Asset Administration Shell registered at the Registry
             </summary>
@@ -385,7 +706,7 @@
             <response code="400">Bad Request</response>
             <response code="404">No Asset Administration Shell / Submodel with passed id found</response>     
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.DeleteSubmodelDescriptorFromAssetAdministrationShell(System.String,System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.DeleteSubmodelDescriptorFromAssetAdministrationShell(System.String,System.String)">
             <summary>
             Unregisters the Submodel from a specific Asset Administration Shell registered at the Registry
             </summary>
@@ -396,7 +717,7 @@
             <response code="400">Bad Request</response>    
             <response code="404">No Asset Administration Shell / Submodel with passed id found</response>  
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.GetAllSubmodelDescriptorsFromAssetAdministrationShell(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistryController.GetAllSubmodelDescriptorsFromAssetAdministrationShell(System.String)">
             <summary>
             Retrieves all Submodel registrations from a specific Asset Administration Shell registered at the Registry
             </summary>
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistryController.cs
similarity index 94%
rename from sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistryController.cs
index af5b566..af98687 100644
--- a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistryController.cs
@@ -18,17 +18,17 @@
 namespace BaSyx.API.Http.Controllers
 {
     /// <summary>
-    /// The Http-Controller implementation of the IAssetAdministrationShellRegistry interface
+    /// The Asset Administration Shell Registry Controller
     /// </summary>
-    public class AssetAdministrationShellRegistry : Controller
+    public class AssetAdministrationShellRegistryController : Controller
     {
         private readonly IAssetAdministrationShellRegistry serviceProvider;
 
         /// <summary>
-        /// The Constructor for the AssetAdministrationShellRegistry-Controller
+        /// The constructor for the Asset Administration Shell Registry Controller
         /// </summary>
         /// <param name="aasRegistry">The backend implementation for the IAssetAdministrationShellRegistry interface. Usually provided by the Depedency Injection mechanism.</param>
-        public AssetAdministrationShellRegistry(IAssetAdministrationShellRegistry aasRegistry)
+        public AssetAdministrationShellRegistryController(IAssetAdministrationShellRegistry aasRegistry)
         {
             serviceProvider = aasRegistry;
         }
@@ -39,6 +39,7 @@
         /// <returns></returns>
         /// <response code="200">Returns a list of found Asset Administration Shell Descriptors</response>        
         [HttpGet("api/v1/registry", Name = "GetAllAssetAdministrationShellDescriptors")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(List<AssetAdministrationShellDescriptor>), 200)]
         public IActionResult GetAllAssetAdministrationShellDescriptors()
         {
@@ -54,6 +55,7 @@
         /// <response code="400">Bad Request</response> 
         /// <response code="404">No Asset Administration Shell with passed id found</response>     
         [HttpGet("api/v1/registry/{aasId}", Name = "GetAssetAdministrationShellDescriptor")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(AssetAdministrationShellDescriptor), 200)]
         public IActionResult GetAssetAdministrationShellDescriptor(string aasId)
         {
@@ -75,6 +77,8 @@
         /// <response code="400">The syntax of the passed Asset Administration Shell is not valid or malformed request</response>    
         /// <response code="404">No Asset Administration Shell with passed id found</response>      
         [HttpPut("api/v1/registry/{aasId}", Name = "RegisterAssetAdministrationShell")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
         [ProducesResponseType(typeof(Result), 204)]
         public IActionResult RegisterAssetAdministrationShell(string aasId, [FromBody] IAssetAdministrationShellDescriptor aasDescriptor)
         {
@@ -101,6 +105,7 @@
         /// <response code="400">Bad Request</response>  
         /// <response code="404">No Asset Administration Shell with passed id found</response>     
         [HttpDelete("api/v1/registry/{aasId}", Name = "UnregisterAssetAdministrationShell")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(Result), 204)]
         public IActionResult UnregisterAssetAdministrationShell(string aasId)
         {
@@ -124,6 +129,8 @@
         /// <response code="400">The syntax of the passed Submodel is not valid or malformed request</response>      
         /// <response code="404">No Asset Administration Shell with passed id found</response>   
         [HttpPut("api/v1/registry/{aasId}/submodels/{submodelId}", Name = "RegisterSubmodelAtAssetAdministrationShell")]
+        [Produces("application/json")]
+        [Consumes("application/json")]
         [ProducesResponseType(typeof(SubmodelDescriptor), 201)]
         public IActionResult RegisterSubmodelAtAssetAdministrationShell(string aasId, string submodelId, [FromBody] ISubmodelDescriptor submodelDescriptor)
         {
@@ -156,6 +163,7 @@
         /// <response code="400">Bad Request</response>
         /// <response code="404">No Asset Administration Shell / Submodel with passed id found</response>     
         [HttpGet("api/v1/registry/{aasId}/submodels/{submodelId}", Name = "GetSubmodelDescriptorFromAssetAdministrationShell")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(SubmodelDescriptor), 200)]
         public IActionResult GetSubmodelDescriptorFromAssetAdministrationShell(string aasId, string submodelId)
         {
@@ -180,6 +188,7 @@
         /// <response code="400">Bad Request</response>    
         /// <response code="404">No Asset Administration Shell / Submodel with passed id found</response>  
         [HttpDelete("api/v1/registry/{aasId}/submodels/{submodelId}", Name = "DeleteSubmodelDescriptorFromAssetAdministrationShell")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(Result), 204)]
         public IActionResult DeleteSubmodelDescriptorFromAssetAdministrationShell(string aasId, string submodelId)
         {
@@ -203,6 +212,7 @@
         /// <response code="400">Bad Request</response>  
         /// <response code="404">No Asset Administration Shell with passed id found</response>  
         [HttpGet("api/v1/registry/{aasId}/submodels", Name = "GetAllSubmodelDescriptorsFromAssetAdministrationShell")]
+        [Produces("application/json")]
         [ProducesResponseType(typeof(List<SubmodelDescriptor>), 200)]
         public IActionResult GetAllSubmodelDescriptorsFromAssetAdministrationShell(string aasId)
         {
