Interface adjustment due to current standardization activities
Massive refactoring for the better
diff --git a/sdks/dotnet/BaSyx.postman_environment.json b/sdks/dotnet/BaSyx.postman_environment.json
index a480e4f..732a4eb 100644
--- a/sdks/dotnet/BaSyx.postman_environment.json
+++ b/sdks/dotnet/BaSyx.postman_environment.json
@@ -59,6 +59,6 @@
 		}
 	],
 	"_postman_variable_scope": "environment",
-	"_postman_exported_at": "2020-08-17T12:57:56.131Z",
-	"_postman_exported_using": "Postman/7.29.1"
+	"_postman_exported_at": "2020-08-21T11:42:16.445Z",
+	"_postman_exported_using": "Postman/7.30.1"
 }
\ No newline at end of file
diff --git a/sdks/dotnet/BaSyx.sln b/sdks/dotnet/BaSyx.sln
index 67cce36..dced611 100644
--- a/sdks/dotnet/BaSyx.sln
+++ b/sdks/dotnet/BaSyx.sln
@@ -11,14 +11,6 @@
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{7789655B-5AB4-4FA7-87F5-CC75DA047427}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers", "basyx-core\BaSyx.API.Http.Controllers\BaSyx.API.Http.Controllers.csproj", "{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extended", "Extended", "{FC87953C-EE11-45AE-B74A-C477C1AAA40E}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Submodel.ServiceProvider.Distributed", "basyx-core\BaSyx.Submodel.ServiceProvider.Distributed\BaSyx.Submodel.ServiceProvider.Distributed.csproj", "{260092F5-D130-4A31-B3F9-230F08796142}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ServiceProvider", "ServiceProvider", "{11D38513-B474-4AC0-8383-1E47E250F95E}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Models.Export", "basyx-core\BaSyx.Models.Export\BaSyx.Models.Export.csproj", "{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Utils.DependencyInjection", "basyx-core\BaSyx.Utils.DependencyInjection\BaSyx.Utils.DependencyInjection.csproj", "{1809BE55-BDB5-4937-ADF3-05B9A9CCED06}"
@@ -27,8 +19,6 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Utils.Client.Mqtt", "basyx-core\BaSyx.Utils.Client.Mqtt\BaSyx.Utils.Client.Mqtt.csproj", "{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers.AASX", "basyx-core\BaSyx.API.Http.Controllers.AASX\BaSyx.API.Http.Controllers.AASX.csproj", "{51938965-A060-4F00-A5CE-4E39A2F5EF45}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Components", "Components", "{07694C71-F77F-4234-8AD7-D1950C655BE9}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.AAS.Client.Http", "basyx-components\BaSyx.AAS.Client.Http\BaSyx.AAS.Client.Http.csproj", "{3F2DB155-61ED-4590-A732-3D610364D911}"
@@ -61,6 +51,18 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAssetAdministrationShell", "basyx-examples\SimpleAssetAdministrationShell\SimpleAssetAdministrationShell.csproj", "{15289DD1-5B1A-4360-9FFD-BD9857D34782}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers", "basyx-components\BaSyx.API.Http.Controllers\BaSyx.API.Http.Controllers.csproj", "{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers.AASX", "basyx-components\BaSyx.API.Http.Controllers.AASX\BaSyx.API.Http.Controllers.AASX.csproj", "{4A3F2F8D-C202-4340-9E89-49F5A841708A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.CLI", "basyx-components\BaSyx.CLI\BaSyx.CLI.csproj", "{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Components.Tests", "basyx-components\BaSyx.Components.Tests\BaSyx.Components.Tests.csproj", "{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Core.Tests", "basyx-core\BaSyx.Core.Tests\BaSyx.Core.Tests.csproj", "{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ComplexAssetAdministrationShellScenario", "basyx-examples\ComplexAssetAdministrationShellScenario\ComplexAssetAdministrationShellScenario.csproj", "{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -86,18 +88,6 @@
 		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1}.Release|Any CPU.Build.0 = Release|Any CPU
 		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
 		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
-		{260092F5-D130-4A31-B3F9-230F08796142}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{260092F5-D130-4A31-B3F9-230F08796142}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{260092F5-D130-4A31-B3F9-230F08796142}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{260092F5-D130-4A31-B3F9-230F08796142}.Release|Any CPU.Build.0 = Release|Any CPU
-		{260092F5-D130-4A31-B3F9-230F08796142}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
-		{260092F5-D130-4A31-B3F9-230F08796142}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
 		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -122,12 +112,6 @@
 		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}.Release|Any CPU.Build.0 = Release|Any CPU
 		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Release|Any CPU.Build.0 = Release|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
 		{3F2DB155-61ED-4590-A732-3D610364D911}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{3F2DB155-61ED-4590-A732-3D610364D911}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{3F2DB155-61ED-4590-A732-3D610364D911}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -212,6 +196,42 @@
 		{15289DD1-5B1A-4360-9FFD-BD9857D34782}.Release|Any CPU.Build.0 = Release|Any CPU
 		{15289DD1-5B1A-4360-9FFD-BD9857D34782}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
 		{15289DD1-5B1A-4360-9FFD-BD9857D34782}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
+		{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
+		{4A3F2F8D-C202-4340-9E89-49F5A841708A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4A3F2F8D-C202-4340-9E89-49F5A841708A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4A3F2F8D-C202-4340-9E89-49F5A841708A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4A3F2F8D-C202-4340-9E89-49F5A841708A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4A3F2F8D-C202-4340-9E89-49F5A841708A}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4A3F2F8D-C202-4340-9E89-49F5A841708A}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
+		{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
+		{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
+		{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
+		{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
+		{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -220,13 +240,10 @@
 		{87045925-FD2C-4BC9-BA55-8B4080BBA49C} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
 		{87783EE4-52CD-4B54-B278-B61A7B9E226A} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
 		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A} = {FC87953C-EE11-45AE-B74A-C477C1AAA40E}
-		{260092F5-D130-4A31-B3F9-230F08796142} = {11D38513-B474-4AC0-8383-1E47E250F95E}
 		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
 		{1809BE55-BDB5-4937-ADF3-05B9A9CCED06} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
 		{DF38D3F1-3F2A-49C8-9FB8-1E1667FC8177} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
 		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45} = {FC87953C-EE11-45AE-B74A-C477C1AAA40E}
 		{3F2DB155-61ED-4590-A732-3D610364D911} = {07694C71-F77F-4234-8AD7-D1950C655BE9}
 		{4272B73E-A9A6-4873-B930-C38E44959246} = {07694C71-F77F-4234-8AD7-D1950C655BE9}
 		{799D648C-4924-4C19-8A8C-26D76610A219} = {07694C71-F77F-4234-8AD7-D1950C655BE9}
@@ -241,6 +258,12 @@
 		{C7563CBB-CD43-4C0A-A350-1637A63DF8C9} = {6BED1277-39C4-4335-9F69-7D995AA256EA}
 		{26324BD2-50E4-4068-8514-876FACF16EA4} = {6BED1277-39C4-4335-9F69-7D995AA256EA}
 		{15289DD1-5B1A-4360-9FFD-BD9857D34782} = {6BED1277-39C4-4335-9F69-7D995AA256EA}
+		{3043CCB3-D267-4CC0-9FF8-7BA0669C15F3} = {07694C71-F77F-4234-8AD7-D1950C655BE9}
+		{4A3F2F8D-C202-4340-9E89-49F5A841708A} = {07694C71-F77F-4234-8AD7-D1950C655BE9}
+		{3FF6AB3E-B6EC-43BA-B3F7-72FF434357E9} = {07694C71-F77F-4234-8AD7-D1950C655BE9}
+		{09DE8F6D-F9BD-42FF-B5E9-16C9047EBED7} = {07694C71-F77F-4234-8AD7-D1950C655BE9}
+		{8A3F97A9-EF97-46E1-A6B0-2FE550ED9BD5} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
+		{0B4BD74E-D216-44BF-BFE9-B7F338CDDAFC} = {6BED1277-39C4-4335-9F69-7D995AA256EA}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {B028A9A2-E37C-44AF-8032-C8F0492BDB00}
diff --git a/sdks/dotnet/Build_BaSyx_Core.bat b/sdks/dotnet/Build_BaSyx_Core.bat
new file mode 100644
index 0000000..2eac512
--- /dev/null
+++ b/sdks/dotnet/Build_BaSyx_Core.bat
@@ -0,0 +1,3 @@
+start /w Clear_Local_BaSyx_NuGet_Cache.bat
+
+dotnet build basyx-core\BaSyx.Core.sln --force
\ No newline at end of file
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Client.Http/AssetAdministrationShellHttpClient.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Client.Http/AssetAdministrationShellHttpClient.cs
index 9a78992..13b1946 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Client.Http/AssetAdministrationShellHttpClient.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Client.Http/AssetAdministrationShellHttpClient.cs
@@ -18,7 +18,6 @@
 using System.Net.Http;
 using BaSyx.Utils.PathHandling;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Connectivity.Descriptors;
 using System.Linq;
 using BaSyx.Models.Connectivity;
@@ -53,7 +52,7 @@
 
         private AssetAdministrationShellHttpClient()
         {
-            JsonSerializerSettings = new JsonStandardSettings();
+            JsonSerializerSettings = new DependencyInjectionJsonSerializerSettings();
         }
 
         public AssetAdministrationShellHttpClient(Uri endpoint) : this()
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/BaSyx.AAS.Server.Http.csproj b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/BaSyx.AAS.Server.Http.csproj
index d5f86b7..4088ca7 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/BaSyx.AAS.Server.Http.csproj
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/BaSyx.AAS.Server.Http.csproj
@@ -145,9 +145,9 @@
   
   
  <ItemGroup>
-    <PackageReference Include="BaSyx.API.Http.Controllers" Version="1.0.0" />
     <PackageReference Include="BaSyx.Utils.DependencyInjection" Version="1.0.0" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.3" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.7" />
     <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="5.2.1" />
     <PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="5.2.1" />
@@ -155,6 +155,7 @@
   
   
  <ItemGroup>
+   <ProjectReference Include="..\BaSyx.API.Http.Controllers\BaSyx.API.Http.Controllers.csproj" />
    <ProjectReference Include="..\BaSyx.Components.Common\BaSyx.Components.Common.csproj" />
  </ItemGroup>
    
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
index f0bdba6..cbe8210 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
@@ -66,7 +66,9 @@
                 .AddApplicationPart(controllerAssembly)
                 .AddControllersAsServices()
                 .AddNewtonsoftJson(options => options.GetDefaultMvcJsonOptions(services));
-            services.AddRazorPages(options => options.Conventions.AddPageRoute("/MultiIndex", "/multiui"));
+            services
+                .AddRazorPages(options => options.Conventions.AddPageRoute("/MultiIndex", "/multiui"))
+                .AddRazorRuntimeCompilation();
 
             //Check whether Asset Administration Shell Service Provider exists and bind it to the AssetAdministrationShell-Services-Controller
             services.AddTransient<IAssetAdministrationShellServiceProvider>(ctx =>
@@ -75,7 +77,7 @@
                 .GetRequiredService<IAssetAdministrationShellRepositoryServiceProvider>()
                 .GetAssetAdministrationShellServiceProvider(aasId);
 
-                return aasServiceProvider;//new AssetAdministrationShellServices(aasServiceProvider);
+                return aasServiceProvider;
             });
 
 
@@ -90,10 +92,10 @@
                 if (!submodelServiceProvider.Success || submodelServiceProvider.Entity == null)
                 {
                     SubmodelServiceProvider cssp = new SubmodelServiceProvider();
-                    return cssp;//new SubmodelServices(cssp);
+                    return cssp;
                 }
                 else
-                    return submodelServiceProvider.Entity;//new SubmodelServices(submodelServiceProvider.Entity);
+                    return submodelServiceProvider.Entity;
             });
 
             // Register the Swagger generator, defining one or more Swagger documents
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/NLog.config b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/NLog.config
index 5355546..f9bb05a 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/NLog.config
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/NLog.config
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
   <targets>
-    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message}" />
+    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}" />
     <target name="file" xsi:type="File"
-      layout="${longdate} - ${level} - ${logger} - ${message}"
+      layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}"
       fileName="${basedir}/logs/logfile.txt"
       keepFileOpen="true"
       maxArchiveFiles="10"
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml
index 9f2df80..976b83b 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml
@@ -1,8 +1,8 @@
 @page
 @model BaSyx.AAS.Server.Http.Pages.IndexModel
 @using BaSyx.API.Components;
+@using BaSyx.Models.Core.AssetAdministrationShell;
 @using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-@using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 @using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 @using BaSyx.Models.Core.AssetAdministrationShell.References;
 @using BaSyx.Models.Core.Common;
@@ -10,22 +10,24 @@
 @using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 @using BaSyx.Utils.Settings.Types;
 @using Microsoft.AspNetCore.Html;
+@using System.Security.Cryptography;
+@using System.Text;
+@using System.Text.RegularExpressions;
+
 @{
     ViewData["Title"] = "Index";
-}
-
-@{
     IAssetAdministrationShellServiceProvider sp = Model.ServiceProvider;
     IAssetAdministrationShell aas = sp.GetBinding();
+    ElementTree aasElementTree = aas.GetElementTree();
     ServerSettings settings = Model.Settings;
 
+    string pathToCompanyLogo = settings.Miscellaneous.TryGetValue("CompanyLogo", out string path) ? path : "/images/Bosch.gif";
     string eClassLink = "https://www.eclasscontent.com/index.php?action=cc2prdet&language=en&version=10.1&id=&pridatt=";
 
     Func<Identifier, IHtmlContent> ShowIdentification = @<text>@{
     var identifier = item;
     @if (identifier != null)
     {
-
         <div class="panel-body">
             <div class="row">
                 <div class="col-sm-2"><b>Identifier (@identifier.IdType.ToString())</b></div>
@@ -57,16 +59,20 @@
     <div class="panel-body">
         <div class="row">
             <div class="col-sm-2"><b>SemanticId</b></div>
-            @if (reference.First.IdType == KeyType.IRDI)
+            @if (reference.IsEClassReference())
             {
                 {
                     string link = eClassLink + Uri.EscapeDataString(reference.First.Value);
                     <div class="col-sm-10"><a target="_blank" href="@link">@reference.First.Value (eCl@ss)</a></div>
                 }
             }
+            else if (reference.IsIsoReference())
+            {
+                <div class="col-sm-10">@reference.First.Value (CDD)</div>
+            }
             else
             {
-                <div class="col-sm-10">@reference.First.Value</div>
+                <div class="col-sm-10">@reference.ToStandardizedString()</div>
             }
         </div>
     </div>
@@ -81,15 +87,13 @@
     string description = string.Empty;
     for (int i = 0; i < langStringCollection.Count; i++)
     {
-        description = langStringCollection[i].Language + ":" + langStringCollection[i].Text + (i != langStringCollection.Count - 1 ? ";" : "");
-    }
-
-    <div class="panel-body">
-        <div class="row">
-            <div class="col-sm-2"><b>Description</b></div>
-            <div class="col-sm-10">@description</div>
+        <div class="panel-body">
+            <div class="row">
+                <div class="col-sm-2"><b>Description[@langStringCollection[i].Language]</b></div>
+                <div class="col-sm-10">@langStringCollection[i].Text</div>
+            </div>
         </div>
-    </div>
+    }
 }
 }</text>;
 
@@ -106,42 +110,28 @@
 }
 }</text>;
 
-Func<string, IHtmlContent> ShowSubmodelElementHeader = @<text>@{
-var idShort = item;
-if (string.IsNullOrEmpty(idShort))
+
+Func<string, string, IProperty, IHtmlContent> ShowPropertyFooter = (submodelId, pathId, property) => new Func<object, Microsoft.AspNetCore.Mvc.Razor.HelperResult>(@<text>@{
+
+if (string.IsNullOrEmpty(submodelId) || string.IsNullOrEmpty(pathId) || property == null)
 {
     return;
 }
 else
 {
-    <div class="panel-heading">
-        <h4 class="panel-title">
-            <a data-toggle="collapse" href="#@idShort">@idShort</a>
-        </h4>
-    </div>
-}
-}</text>;
-
-Func<string, IProperty, IHtmlContent> ShowPropertyFooter = (submodelIdShort, property) => new Func<object, Microsoft.AspNetCore.Mvc.Razor.HelperResult>(@<text>@{
-
-if (string.IsNullOrEmpty(submodelIdShort) || property == null)
-{
-    return;
-}
-else
-{
+    string relativeSubmodelElementPath = string.Join("/", pathId.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).SkipWhile(p => p != submodelId).Skip(1));
     <div class="panel-footer">
         <div class="row">
             <div class="col-sm-8">
 
                 <div class="input-group">
                     <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
-                    <input id="Input_@submodelIdShort@property.IdShort" type="text" class="form-control" placeholder="Value" value="@ShowValue(property)" />
+                    <input id="@GetHashString(pathId + ";Input")" type="text" class="form-control" placeholder="Value" value="@ShowValue(property)" />
                 </div>
 
             </div>
-            <div class="col-sm-1"><button onclick="@("GetPropertyValue('" + submodelIdShort + "', '" + property.IdShort + "')")" id="@property.IdShort;Retrieve" type="button" class="btn btn-primary">Retrieve</button></div>
-            <div class="col-sm-1"><button onclick="@("SetPropertyValue('" + submodelIdShort + "', '" + property.IdShort + "', '" + property.ValueType?.ToString() + "', $('#Input_" + submodelIdShort + property.IdShort + "').val() )")" id="@property.IdShort;Update" type="button" class="btn btn-success">Update</button></div>
+            <div class="col-sm-1"><button onclick="@("GetPropertyValue('" + submodelId + "', '" + relativeSubmodelElementPath + "', '" + @GetHashString(pathId + ";Input") + "')")" id="@GetHashString(pathId + ";Retrieve")" type="button" class="btn btn-primary">Retrieve</button></div>
+            <div class="col-sm-1"><button onclick="@("SetPropertyValue('" + submodelId + "', '" + relativeSubmodelElementPath + "', '" + @GetHashString(pathId + ";Input") + "', '" + property.ValueType?.ToString() + "', $('#" + @GetHashString(pathId + ";Input") + "').val() )")" id="@GetHashString(pathId + ";Update")" type="button" class="btn btn-success">Update</button></div>
 
         </div>
     </div>
@@ -202,7 +192,11 @@
             var contentFileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(contentRoot);
             @if (contentFileProvider.GetFileInfo(path).Exists)
             {
-                <embed src="@path#navpanes=0&scrollbar=0" width="100%" />
+                <div class="panel-body">
+                    <div class="row">
+                        <object data="@path" style="height:500px; width:100%"></object>
+                    </div>
+                </div>
             }
         }
         return;
@@ -236,21 +230,52 @@
             return;
         }
 
-        string dataTypeName = property.ValueType?.ToString()?.ToUpper();
-        if (string.IsNullOrEmpty(dataTypeName))
+        string propDataTypeName = property.ValueType?.ToString()?.ToUpper();
+        if (string.IsNullOrEmpty(propDataTypeName))
         {
-            dataTypeName = property?.ModelType?.Name;
+            propDataTypeName = property?.ModelType?.Name;
         }
 
         <div class="panel-body">
             <div class="row">
                 <div class="col-sm-2"><b>ValueType</b></div>
-                <div class="col-sm-10">@dataTypeName</div>
+                <div class="col-sm-10">@propDataTypeName</div>
             </div>
         </div>
         return;
     case KeyElements.Range:
-        break;
+
+        IRange range = submodelElement?.Cast<IRange>();
+        if (range == null)
+        {
+            return;
+        }
+
+        string rangeDataTypeName = range.ValueType?.ToString()?.ToUpper();
+        if (string.IsNullOrEmpty(rangeDataTypeName))
+        {
+            rangeDataTypeName = range?.ModelType?.Name;
+        }
+
+        <div class="panel-body">
+            <div class="row">
+                <div class="col-sm-2"><b>ValueType</b></div>
+                <div class="col-sm-10">@rangeDataTypeName</div>
+            </div>
+        </div>
+        <div class="panel-body">
+            <div class="row">
+                <div class="col-sm-2"><b>Min-Value</b></div>
+                <div class="col-sm-10">@range.Min?.Value</div>
+            </div>
+        </div>
+        <div class="panel-body">
+            <div class="row">
+                <div class="col-sm-2"><b>Max-Value</b></div>
+                <div class="col-sm-10">@range.Max?.Value</div>
+            </div>
+        </div>
+        return;
     case KeyElements.ReferenceElement:
         break;
     case KeyElements.RelationshipElement:
@@ -271,29 +296,6 @@
 
 }</text>;
 
-Func<ISubmodelElement, IHtmlContent> ShowValueType = @<text>@{
-var submodelElement = item;
-if (submodelElement.GetType().GetInterfaces().Where(i => i.Name == "ISubmodelElement") == null)
-{
-    return;
-}
-else
-{
-    var property = (IProperty)submodelElement;
-    var dataTypeName = property.ValueType?.DataObjectType?.Name?.ToUpper();
-    if (string.IsNullOrEmpty(dataTypeName))
-    {
-        dataTypeName = property.ModelType?.Name;
-    }
-    <div class="panel-body">
-        <div class="row">
-            <div class="col-sm-2"><b>ValueType</b></div>
-            <div class="col-sm-10">@dataTypeName</div>
-        </div>
-    </div>
-}
-}</text>;
-
 Func<IEnumerable<IEmbeddedDataSpecification>, IHtmlContent> ShowDataSpecifications = @<text>@{
 var embeddedDataSpecifications = item;
 if (embeddedDataSpecifications?.Count() > 0)
@@ -364,87 +366,78 @@
 Func<List<object>, IHtmlContent> ShowSubmodelElement = null;
 
 ShowSubmodelElement = @<text>@{
-var submodelwithElement = item;
-if (submodelwithElement?.Count < 2)
-{
-    return;
-}
-else
-{
-    ISubmodel submodel = submodelwithElement[0] as ISubmodel;
-    ISubmodelElement submodelElement = submodelwithElement[1] as ISubmodelElement;
+string submodelId = item[0] as string;
+ElementTree submodelElementTree = item[1] as ElementTree;
+string sePathId = submodelElementTree.GetPath();
+ISubmodelElement submodelElement = submodelElementTree.Value.Cast<ISubmodelElement>();
 
-    <div class="panel panel-warning">
-        <div class="panel-heading">
-            <h4 class="panel-title">
-                <a data-toggle="collapse" href="#@submodelElement.IdShort">@submodelElement.IdShort</a>
-            </h4>
-        </div>
-        <div id="@submodelElement.IdShort" class="panel-collapse collapse">
-            @ShowDataSpecifications(submodelElement.EmbeddedDataSpecifications)
-            @ShowDescription(submodelElement.Description)
-            @ShowSemanticId(submodelElement.SemanticId)
-            @ShowModelElementSpecificAttributes(submodelElement)
-
-            @if (submodelElement is IProperty property)
-            {
-                @ShowPropertyFooter(submodel.IdShort, property)
-            }
-            else if (submodelElement is IOperation operation)
-            {
-                if (operation.InputVariables?.Count > 0)
-                {
-                    foreach (var argument in operation.InputVariables.ToElementContainer())
-                    {
-                        <div class="panel-body" style="background:#88b8d9">
-                            <div class="row">
-                                <div class="col-sm-2 argInName @submodel.IdShort @operation.IdShort"><b>@argument.IdShort</b></div>
-                                <div class="col-sm-2 argInType @submodel.IdShort @operation.IdShort">@GetValueOrModelType(argument)</div>
-                                <div class="col-sm-8">
-                                    <div class="input-group">
-                                        <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
-                                        <input id="msg" type="text" class="form-control argInValue @submodel.IdShort  @operation.IdShort" name="msg" placeholder="Argument Value">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    }
-                }
-                if (operation.OutputVariables?.Count > 0)
-                {
-                    foreach (var argument in operation.OutputVariables.ToElementContainer())
-                    {
-                        <div class="panel-body" style="background:#d68dbc">
-                            <div class="row">
-                                <div class="col-sm-2 argOutName @submodel.IdShort @operation.IdShort"><b>@argument.IdShort</b></div>
-                                <div class="col-sm-2 argOutType @submodel.IdShort @operation.IdShort">@GetValueOrModelType(argument)</div>
-                                <div class="col-sm-8">
-                                    <div class="input-group">
-                                        <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
-                                        <input id="argOutValue_@submodel.IdShort@operation.IdShort@argument.IdShort" type="text" class="form-control argOutValue @submodel.IdShort  @operation.IdShort" name="msg" placeholder="Return Value">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    }
-                }
-                <div class="panel-footer"><button onclick="@("ExecuteOperation('" + submodel.IdShort + "', '" + operation.IdShort + "')")" type="button" class="btn btn-success">Execute</button></div>
-            }
-            else if (submodelElement is ISubmodelElementCollection collection)
-            {
-                if (collection.Value?.Count > 0)
-                {
-                    @foreach (var value in collection.Value)
-                    {
-                        <div class="panel-body">
-                            @ShowSubmodelElement(new List<object>() { submodel, value })
-                        </div>
-                    }
-                }
-            }
-        </div>
+<div class="panel panel-warning">
+    <div class="panel-heading">
+        <h4 class="panel-title">
+            <a data-toggle="collapse" href="#@GetHashString(sePathId)">@submodelElementTree.Name</a>
+        </h4>
     </div>
-}
+    <div id="@GetHashString(sePathId)" class="panel-collapse collapse">
+        @ShowDataSpecifications(submodelElement.EmbeddedDataSpecifications)
+        @ShowDescription(submodelElement.Description)
+        @ShowSemanticId(submodelElement.SemanticId)
+        @ShowModelElementSpecificAttributes(submodelElement)
+
+        @if (submodelElement is IProperty property)
+        {
+            @ShowPropertyFooter(submodelId, sePathId, property)
+        }
+        else if (submodelElement is IOperation operation)
+        {
+            if (operation.InputVariables?.Count > 0)
+            {
+                foreach (var argument in operation.InputVariables.ToElementContainer())
+                {
+                    <div class="panel-body" style="background:#88b8d9">
+                        <div class="row">
+                            <div class="col-sm-2 argInName @submodelId @operation.IdShort"><b>@argument.IdShort</b></div>
+                            <div class="col-sm-2 argInType @submodelId @operation.IdShort">@GetValueOrModelType(argument)</div>
+                            <div class="col-sm-8">
+                                <div class="input-group">
+                                    <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
+                                    <input id="msg" type="text" class="form-control argInValue @submodelId  @operation.IdShort" name="msg" placeholder="Argument Value">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                }
+            }
+            if (operation.OutputVariables?.Count > 0)
+            {
+                foreach (var argument in operation.OutputVariables.ToElementContainer())
+                {
+                    <div class="panel-body" style="background:#d68dbc">
+                        <div class="row">
+                            <div class="col-sm-2 argOutName @submodelId @operation.IdShort"><b>@argument.IdShort</b></div>
+                            <div class="col-sm-2 argOutType @submodelId @operation.IdShort">@GetValueOrModelType(argument)</div>
+                            <div class="col-sm-8">
+                                <div class="input-group">
+                                    <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
+                                    <input id="argOutValue_@submodelId@operation.IdShort@argument.IdShort" type="text" class="form-control argOutValue @submodelId  @operation.IdShort" name="msg" placeholder="Return Value">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                }
+            }
+            <div class="panel-footer"><button onclick="@("ExecuteOperation('" + submodelId + "', '" + operation.IdShort + "')")" type="button" class="btn btn-success">Execute</button></div>
+        }
+        else if (submodelElementTree.HasChildren())
+        {
+            @foreach (var valueChild in submodelElementTree.Children)
+            {
+                <div class="panel-body">
+                    @ShowSubmodelElement(new List<object>() { submodelId, (ElementTree)valueChild })
+                </div>
+            }
+        }
+    </div>
+</div>
 }</text>;
 }
 
@@ -485,7 +478,9 @@
             <ul class="nav navbar-nav">
                 <li><a href="#" style="margin-top:15px">Main</a></li>
             </ul>
-            <div class="navbar-right"><img src="~/images/Bosch.gif" width="103" height="30" style="margin-top:25px; margin-right:15px" /></div>
+            <div class="navbar-right">
+                <img src="@pathToCompanyLogo" width="103" height="30" style="margin-top:25px; margin-right:15px" />
+            </div>
         </div>
     </nav>
 
@@ -543,45 +538,65 @@
                 return submodelElement.ModelType.Name;
             }
         }
+
+        private static string GetHashString(string input)
+        {
+            SHA256 shaAlgorithm = SHA256.Create();
+            byte[] data = Encoding.UTF8.GetBytes(input);
+
+            byte[] bHash = shaAlgorithm.ComputeHash(data);
+
+            string hashString = string.Empty;
+            for (int i = 0; i < bHash.Length; i++)
+            {
+                hashString += bHash[i].ToString("x2");
+            }
+            var output = Regex.Replace(hashString, @"[\d-]", string.Empty);
+            return output;
+        }
     }
 
 
-    @if (aas.Submodels?.Count > 0)
+    @if (aasElementTree.HasChildren())
     {
-        foreach (var submodel in aas.Submodels)
+        foreach (var submodelChild in aasElementTree.Children)
         {
+            ISubmodel submodel = submodelChild.Value.Cast<ISubmodel>();
+            string pathId = submodelChild.GetPath();
+
             <div class="container">
                 <div class="panel panel-default">
                     <div class="panel-heading" style="background:darkgreen">
                         <h4>
-                            <a style="color:white" data-toggle="collapse" href="#@submodel.IdShort">@submodel.IdShort</a>
+                            <a style="color:white" data-toggle="collapse" href="#@GetHashString(pathId)">@submodel.IdShort</a>
                         </h4>
                     </div>
-                    <div id="@submodel.IdShort" class="panel-collapse collapse">
+                    <div id="@GetHashString(pathId)" class="panel-collapse collapse">
                         @ShowIdShort(submodel.IdShort)
                         @ShowIdentification(submodel.Identification)
                         @ShowDescription(submodel.Description)
                         @ShowSemanticId(submodel.SemanticId)
                         <div class="panel-body">
                             <div class="panel-group">
-                                @if (submodel.SubmodelElements?.Count > 0)
-                                {
-                                    <div class="panel panel-default">
-                                        <div class="panel-heading" style="background:#005691"><h4 style="color:white">Submodel-Elements</h4></div>
-                                        <div class="panel-body">
-                                            <div class="panel-group">
-                                                @for (int i = 0; i < submodel.SubmodelElements.Count; i++)
-                                                {
-                                                    var submodelElement = submodel.SubmodelElements[i];
-                                                    if (submodelElement == null)
-                                                    { continue; }
+                                @{
+                                    @if (submodelChild.HasChildren())
+                                    {
+                                        <div class="panel panel-default">
+                                            <div class="panel-heading" style="background:#005691"><h4 style="color:white">Submodel-Elements</h4></div>
+                                            <div class="panel-body">
+                                                <div class="panel-group">
+                                                    @foreach (var submodelElementChild in submodelChild.Children)
+                                                    {
+                                                        if (submodelElementChild == null)
+                                                        { continue; }
 
-                                                    @ShowSubmodelElement(new List<object>() { submodel, submodelElement });
+                                                        @ShowSubmodelElement(new List<object>() { submodel.IdShort, (ElementTree)submodelElementChild });
 
-                                                }
+                                                    }
+                                                </div>
                                             </div>
                                         </div>
-                                    </div>
+                                    }
                                 }
                             </div>
                         </div>
@@ -594,16 +609,16 @@
 
     <script>
         function uuidv4() {
-          return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
-            (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
-          );
+            return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
+                (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
+            );
         }
 
-        function ExecuteOperation(submodelId, operationId) {
-            var argNames = document.getElementsByClassName("argInName " + submodelId + " " + operationId);
-            var argTypes = document.getElementsByClassName("argInType " + submodelId + " " + operationId);
-            var argValues = document.getElementsByClassName("argInValue " + submodelId + " " + operationId);
-           
+        function ExecuteOperation(submodelId, pathToOperation) {
+            var argNames = document.getElementsByClassName("argInName " + submodelId + " " + pathToOperation);
+            var argTypes = document.getElementsByClassName("argInType " + submodelId + " " + pathToOperation);
+            var argValues = document.getElementsByClassName("argInValue " + submodelId + " " + pathToOperation);
+
             var args = [];
             for (var i = 0; i < argNames.length; i++) {
                 var value = {
@@ -629,40 +644,42 @@
 
             var invocationRequest = {
                 requestId: uuidv4(),
-                inputArguments: args
+                inputArguments: args,
+                timeout: 30000
             }
 
             $.ajax({
                 type: 'POST',
-                url: '/aas/submodels/' + submodelId + '/submodel/operations/' + operationId,
+                url: '/aas/submodels/' + submodelId + '/submodel/submodelElements/' + pathToOperation + '/invoke?async=false',
                 contentType: 'application/json',
                 data: JSON.stringify(invocationRequest),
-                error: function () {
-                    alert("Failed to execute: " + JSON.stringify(invocationRequest));
+                error: function (jqXHR, errorType, exception) {
+                    alert("Failed to execute: " + JSON.stringify(invocationRequest));                   
+                    alert(jqXHR.responseText + " | " + errorType + " | " + exception);
                 },
                 success: function (data) {
                     for (var i = 0; i < data.outputArguments.length; i++) {
                         var argOutIdShort = data.outputArguments[i].value.idShort;
-                        $('#argOutValue_' + submodelId + operationId + argOutIdShort).val(JSON.stringify(data.outputArguments[i].value.value));
+                        $('#argOutValue_' + submodelId + pathToOperation + argOutIdShort).val(JSON.stringify(data.outputArguments[i].value.value));
                     }
                 }
             });
         }
     </script>
     <script>
-        function GetPropertyValue(submodelId, propertyId) {
+        function GetPropertyValue(submodelId, submodelElementId, hashedPathIdInput) {
             $.ajax({
                 type: 'GET',
-                url: '/aas/submodels/' + submodelId + '/submodel/properties/' + propertyId + '/value',
+                url: '/aas/submodels/' + submodelId + '/submodel/submodelElements/' + submodelElementId + '/value',
                 success: function (data) {
-                    $('#Input_' + submodelId + propertyId).val(data.value);
-                    $('#Input_' + submodelId + propertyId).css('border-color', 'green');
+                    $('#' + hashedPathIdInput).val(data);
+                    $('#' + hashedPathIdInput).css('border-color', 'green');
                 }
             });
         }
     </script>
     <script>
-        function SetPropertyValue(submodelId, propertyId, dataObjectTypeName, val) {
+        function SetPropertyValue(submodelId, submodelElementId, hashedPathIdInput, dataObjectTypeName, val) {
             var value =
             {
                 valueType: {
@@ -674,16 +691,16 @@
             };
             $.ajax({
                 type: 'PUT',
-                url: '/aas/submodels/' + submodelId + '/submodel/properties/' + propertyId + '/value',
+                url: '/aas/submodels/' + submodelId + '/submodel/submodelElements/' + submodelElementId + '/value',
                 contentType: 'application/json',
                 data: JSON.stringify(value),
                 error: function () {
-                    $('#Input_' + submodelId + propertyId).css('border-color', 'red');
+                    $('#' + hashedPathIdInput).css('border-color', 'red');
                     alert("Error updating Property-Value: " + JSON.stringify(value));
                 },
                 statusCode: {
                     204: function () {
-                        $('#Input_' + submodelId + propertyId).css('border-color', 'green');
+                        $('#' + hashedPathIdInput).css('border-color', 'green');
                     }
                 },
                 success: function () { }
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml
index 6a68070..e1da034 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml
@@ -1,8 +1,8 @@
 @page
 @model BaSyx.AAS.Server.Http.Pages.MultiIndexModel
 @using BaSyx.API.Components;
+@using BaSyx.Models.Core.AssetAdministrationShell;
 @using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-@using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 @using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 @using BaSyx.Models.Core.AssetAdministrationShell.References;
 @using BaSyx.Models.Core.Common;
@@ -368,7 +368,7 @@
 {
     ISubmodel submodel = submodelwithElement[0] as ISubmodel;
     ISubmodelElement submodelElement = submodelwithElement[1] as ISubmodelElement;
-        
+
     <div class="panel panel-warning">
         <div class="panel-heading">
             <h4 class="panel-title">
@@ -427,7 +427,7 @@
             }
             else if (submodelElement is ISubmodelElementCollection collection)
             {
-                if (collection.Value?.Count > 0)
+                if (collection.Value?.Count() > 0)
                 {
                     @foreach (var value in collection.Value)
                     {
@@ -528,66 +528,65 @@
                     </div>
                     <div id="@aas.IdShort" class="panel-collapse collapse">
                         <div class="panel-body">
-                                <div class="panel panel-default">
-                                    <div class="panel-heading" style="background:#7ca1ce"><h4 style="color:white">Asset Administration Shell</h4></div>
-                                    @ShowIdShort(aas.IdShort)
-                                    @ShowIdentification(aas.Identification)
-                                    @ShowDescription(aas.Description)
-                                </div>
+                            <div class="panel panel-default">
+                                <div class="panel-heading" style="background:#7ca1ce"><h4 style="color:white">Asset Administration Shell</h4></div>
+                                @ShowIdShort(aas.IdShort)
+                                @ShowIdentification(aas.Identification)
+                                @ShowDescription(aas.Description)
+                            </div>
                             @{
                                 var asset = aas.Asset;
                                 if (asset != null)
                                 {
-            
-                                        <div class="panel panel-default">
-                                            <div class="panel-heading" style="background:#b90276"><h4 style="color:white">Asset</h4></div>
-                                            @ShowIdShort(asset.IdShort)
-                                            @ShowIdentification(asset.Identification)
-                                            @ShowDescription(asset.Description)
-                                        </div>
-                              
+
+                                    <div class="panel panel-default">
+                                        <div class="panel-heading" style="background:#b90276"><h4 style="color:white">Asset</h4></div>
+                                        @ShowIdShort(asset.IdShort)
+                                        @ShowIdentification(asset.Identification)
+                                        @ShowDescription(asset.Description)
+                                    </div>
+
                                 }
                             }
-                            @if (aas.Submodels?.Count > 0)
+                            @if (aas.Submodels?.Count() > 0)
                             {
                                 foreach (var submodel in aas.Submodels)
                                 {
-                                        <div class="panel panel-default">
-                                            <div class="panel-heading" style="background:darkgreen">
-                                                <h4>
-                                                    <a style="color:white" data-toggle="collapse" href="#@submodel.IdShort">@submodel.IdShort</a>
-                                                </h4>
-                                            </div>
-                                            <div id="@submodel.IdShort" class="panel-collapse collapse">
-                                                @ShowIdShort(submodel.IdShort)
-                                                @ShowIdentification(submodel.Identification)
-                                                @ShowDescription(submodel.Description)
-                                                @ShowSemanticId(submodel.SemanticId)
-                                                <div class="panel-body">
-                                                    <div class="panel-group">
-                                                        @if (submodel.SubmodelElements?.Count > 0)
-                                                        {
-                                                            <div class="panel panel-default">
-                                                                <div class="panel-heading" style="background:#005691"><h4 style="color:white">Submodel-Elements</h4></div>
-                                                                <div class="panel-body">
-                                                                    <div class="panel-group">
-                                                                        @for (int i = 0; i < submodel.SubmodelElements.Count; i++)
-                                                                        {
-                                                                            var submodelElement = submodel.SubmodelElements[i];
-                                                                            if (submodelElement == null)
-                                                                            { continue; }
+                                    <div class="panel panel-default">
+                                        <div class="panel-heading" style="background:darkgreen">
+                                            <h4>
+                                                <a style="color:white" data-toggle="collapse" href="#@submodel.IdShort">@submodel.IdShort</a>
+                                            </h4>
+                                        </div>
+                                        <div id="@submodel.IdShort" class="panel-collapse collapse">
+                                            @ShowIdShort(submodel.IdShort)
+                                            @ShowIdentification(submodel.Identification)
+                                            @ShowDescription(submodel.Description)
+                                            @ShowSemanticId(submodel.SemanticId)
+                                            <div class="panel-body">
+                                                <div class="panel-group">
+                                                    @if (submodel.SubmodelElements?.Count() > 0)
+                                                    {
+                                                        <div class="panel panel-default">
+                                                            <div class="panel-heading" style="background:#005691"><h4 style="color:white">Submodel-Elements</h4></div>
+                                                            <div class="panel-body">
+                                                                <div class="panel-group">
+                                                                    @foreach (var submodelElement in submodel.SubmodelElements)
+                                                                    {
+                                                                        if (submodelElement == null)
+                                                                        { continue; }
 
-                                                                            @ShowSubmodelElement(new List<object>() { submodel, submodelElement });
+                                                                        @ShowSubmodelElement(new List<object>() { submodel, submodelElement });
 
-                                                                        }
-                                                                    </div>
+                                                                    }
                                                                 </div>
                                                             </div>
-                                                        }
-                                                    </div>
+                                                        </div>
+                                                    }
                                                 </div>
                                             </div>
                                         </div>
+                                    </div>
                                 }
                             }
                         </div>
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/ServerSettings.xml b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/ServerSettings.xml
index 829e7cb..938bb97 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/ServerSettings.xml
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/ServerSettings.xml
@@ -10,4 +10,7 @@
     </Hosting>
     <DefaultRoute/>
   </ServerConfig>
+  <Miscellaneous>
+    <CompanyLogo>/images/Bosch.gif</CompanyLogo>
+  </Miscellaneous>
 </ServerSettings>
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/SingleStartup.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/SingleStartup.cs
index b40bd16..a7f4fd0 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/SingleStartup.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/SingleStartup.cs
@@ -64,7 +64,9 @@
                 .AddApplicationPart(controllerAssembly)
                 .AddControllersAsServices()
                 .AddNewtonsoftJson(options => options.GetDefaultMvcJsonOptions(services));
-            services.AddRazorPages(options => options.Conventions.AddPageRoute("/Index", "/ui"));
+            services
+                .AddRazorPages(options => options.Conventions.AddPageRoute("/Index", "/ui"))
+                .AddRazorRuntimeCompilation();
 
             services.AddDirectoryBrowser();
            
@@ -74,12 +76,9 @@
                 var aasServiceProvider = ctx.GetRequiredService<IAssetAdministrationShellServiceProvider>();
                 var submodelServiceProvider = aasServiceProvider.SubmodelRegistry.GetSubmodelServiceProvider(submodelId);
                 if (!submodelServiceProvider.Success || submodelServiceProvider.Entity == null)
-                {
-                    SubmodelServiceProvider cssp = new SubmodelServiceProvider();
-                    return cssp; //new SubmodelServices(cssp);
-                }
+                    return new SubmodelServiceProvider();
                 else
-                    return submodelServiceProvider.Entity; //new SubmodelServices(submodelServiceProvider.Entity);
+                    return submodelServiceProvider.Entity;
             });
 
             // Register the Swagger generator, defining one or more Swagger documents
diff --git a/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/BaSyx.AASX.Server.Http.csproj b/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/BaSyx.AASX.Server.Http.csproj
index 085547e..5d50981 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/BaSyx.AASX.Server.Http.csproj
+++ b/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/BaSyx.AASX.Server.Http.csproj
@@ -17,6 +17,23 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <None Remove="NLog.config" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="NLog.config">
+      <PackagePath>contentFiles\any\$(TargetFramework)\</PackagePath>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
+      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
+      <PackageFlatten>true</PackageFlatten>
+      <PackageCopyToOutput>true</PackageCopyToOutput>
+      <Pack>true</Pack>
+    </Content>
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="BaSyx.API.Http.Controllers.AASX" Version="1.0.0" />
     <PackageReference Include="BaSyx.Models.Export" Version="1.0.0" />
   </ItemGroup>
 
diff --git a/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/NLog.config b/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/NLog.config
new file mode 100644
index 0000000..f9bb05a
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/NLog.config
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
+  <targets>
+    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}" />
+    <target name="file" xsi:type="File"
+      layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}"
+      fileName="${basedir}/logs/logfile.txt"
+      keepFileOpen="true"
+      maxArchiveFiles="10"
+      archiveAboveSize="1048576"
+      encoding="utf-8" />
+  </targets>
+  <rules>
+    <logger name="*" minlevel="Info" writeTo="console" />
+    <logger name="*" minlevel="Info" writeTo="file" />
+  </rules>
+</nlog>
\ No newline at end of file
diff --git a/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/Program.cs b/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/Program.cs
index b458bb8..ae5b033 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/Program.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AASX.Server.Http/Program.cs
@@ -16,8 +16,10 @@
 using BaSyx.Models.Export;
 using Microsoft.Extensions.DependencyInjection;
 using NLog;
+using System;
 using System.Collections.Generic;
 using System.IO;
+using System.IO.Packaging;
 using System.Linq;
 using System.Reflection;
 
@@ -37,65 +39,122 @@
                 return;
             }
             if (!string.IsNullOrEmpty(args[0]) && File.Exists(args[0]))
-            {
-                IAssetAdministrationShell shell;
-                AssetAdministrationShellHttpServer server = new AssetAdministrationShellHttpServer();
-
-                using (BaSyx.Models.Export.AASX aasx = new BaSyx.Models.Export.AASX(args[0]))
+            {              
+                using (BaSyx.Models.Export.AASX aasx = new BaSyx.Models.Export.AASX(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                 {
                     AssetAdministrationShellEnvironment_V2_0 environment = aasx.GetEnvironment_V2_0();
-                    shell = environment.AssetAdministrationShells.FirstOrDefault();
-                    if (shell == null)
+                    if(environment == null)
                     {
-                        logger.Error("Asset Administration Shell cannot be obtained from AASX-Package " + args[0]);
+                        logger.Error("Asset Administration Shell Environment cannot be obtained from AASX-Package " + args[0]);
                         return;
                     }
+
+                    logger.Info("AASX-Package successfully loaded");
+
+                    if (environment.AssetAdministrationShells.Count == 1)
+                    {
+                        LoadSingleAssetAdministrationShellServer(environment.AssetAdministrationShells.ElementAt(0), aasx.SupplementaryFiles, args);
+                    }
+                    else if (environment.AssetAdministrationShells.Count > 1)
+                    {
+                        LoadMultiAssetAdministrationShellServer(environment.AssetAdministrationShells, aasx.SupplementaryFiles, args);
+                    }
                     else
                     {
-                        logger.Info("AASX-Package successfully loaded");
-
-                        var service = shell.CreateServiceProvider(true);
-                        List<HttpEndpoint> endpoints;
-                        if (args.Length == 2 && !string.IsNullOrEmpty(args[1]))
-                        {
-                            logger.Info("Using " + args[1] + " as host url");
-                            endpoints = new List<HttpEndpoint>() { new HttpEndpoint(args[1]) };
-                        }
-                        else
-                        {                            
-                            endpoints = server.Settings.ServerConfig.Hosting.Urls.ConvertAll(c => 
-                            {
-                                string address = c.Replace("+", "127.0.0.1");
-                                logger.Info("Using " + address + " as host url");
-                                return new HttpEndpoint(address); 
-                            });
-                            
-                        }
-                        service.UseDefaultEndpointRegistration(endpoints);
-                        server.SetServiceProvider(service);
-
-                        server.ConfigureServices(services =>
-                        {
-                            Assembly controllerAssembly = Assembly.Load("BaSyx.API.Http.Controllers.AASX");
-                            services.AddMvc()
-                                .AddApplicationPart(controllerAssembly)
-                                .AddControllersAsServices();
-                        });
-
-                        foreach (var file in aasx.SupplementaryFiles)
-                        {
-                            using (Stream stream = file.GetStream())
-                            {
-                                logger.Info("Providing content on server: " + file.Uri);
-                                server.ProvideContent(file.Uri, stream);
-                            }
-                        }
-                        logger.Info("Server is starting up...");
-                        server.Run();
+                        logger.Error("No Asset Administration Shells found AASX-Package " + args[0]);
+                        return;
                     }
                 }
             }
+            Console.Read();
             logger.Info("Application shut down");
         }
+
+        private static void LoadMultiAssetAdministrationShellServer(List<IAssetAdministrationShell> assetAdministrationShells, List<PackagePart> supplementaryFiles, string[] args)
+        {
+            MultiAssetAdministrationShellHttpServer multiServer = new MultiAssetAdministrationShellHttpServer();
+            AssetAdministrationShellRepositoryServiceProvider repositoryService = new AssetAdministrationShellRepositoryServiceProvider();
+
+            foreach (var shell in assetAdministrationShells)
+            {
+                var aasServiceProvider = shell.CreateServiceProvider(true);
+                repositoryService.RegisterAssetAdministrationShellServiceProvider(shell.IdShort, aasServiceProvider);
+            }
+
+            List<HttpEndpoint> endpoints;
+            if (args.Length == 2 && !string.IsNullOrEmpty(args[1]))
+            {
+                logger.Info("Using " + args[1] + " as host url");
+                endpoints = new List<HttpEndpoint>() { new HttpEndpoint(args[1]) };
+            }
+            else
+            {
+                endpoints = multiServer.Settings.ServerConfig.Hosting.Urls.ConvertAll(c =>
+                {
+                    string address = c.Replace("+", "127.0.0.1");
+                    logger.Info("Using " + address + " as host url");
+                    return new HttpEndpoint(address);
+                });
+
+            }
+
+            repositoryService.UseDefaultEndpointRegistration(endpoints);
+            multiServer.SetServiceProvider(repositoryService);
+
+            foreach (var file in supplementaryFiles)
+            {
+                using (Stream stream = file.GetStream())
+                {
+                    logger.Info("Providing content on server: " + file.Uri);
+                    multiServer.ProvideContent(file.Uri, stream);
+                }
+            }
+            
+            multiServer.RunAsync();
+        }
+
+        private static void LoadSingleAssetAdministrationShellServer(IAssetAdministrationShell assetAdministrationShell, List<PackagePart> supplementaryFiles, string[] args)
+        {
+            AssetAdministrationShellHttpServer server = new AssetAdministrationShellHttpServer();
+            IAssetAdministrationShellServiceProvider service = assetAdministrationShell.CreateServiceProvider(true);
+
+            List<HttpEndpoint> endpoints;
+            if (args.Length == 2 && !string.IsNullOrEmpty(args[1]))
+            {
+                logger.Info("Using " + args[1] + " as host url");
+                endpoints = new List<HttpEndpoint>() { new HttpEndpoint(args[1]) };
+            }
+            else
+            {
+                endpoints = server.Settings.ServerConfig.Hosting.Urls.ConvertAll(c =>
+                {
+                    string address = c.Replace("+", "127.0.0.1");
+                    logger.Info("Using " + address + " as host url");
+                    return new HttpEndpoint(address);
+                });
+
+            }
+            service.UseDefaultEndpointRegistration(endpoints);
+            server.SetServiceProvider(service);
+
+            server.ConfigureServices(services =>
+            {
+                Assembly controllerAssembly = Assembly.Load("BaSyx.API.Http.Controllers.AASX");
+                services.AddMvc()
+                    .AddApplicationPart(controllerAssembly)
+                    .AddControllersAsServices();
+            });
+
+            foreach (var file in supplementaryFiles)
+            {
+                using (Stream stream = file.GetStream())
+                {
+                    logger.Info("Providing content on server: " + file.Uri);
+                    server.ProvideContent(file.Uri, stream);
+                }
+            }
+            logger.Info("Server is starting up...");
+            server.RunAsync();
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.csproj b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.csproj
similarity index 90%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.csproj
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.csproj
index 8434732..29d0400 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.csproj
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.csproj
@@ -31,7 +31,7 @@
 
   <ItemGroup>
     <EmbeddedResource Include="BaSyx.API.Http.Controllers.AASX.xml">
-      <CopyToOutputDirectory>Never</CopyToOutputDirectory>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </EmbeddedResource>
   </ItemGroup>
 
@@ -47,8 +47,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\BaSyx.API\BaSyx.API.csproj" />
-    <ProjectReference Include="..\BaSyx.Models.Export\BaSyx.Models.Export.csproj" />
+    <PackageReference Include="BaSyx.API" Version="1.0.0" />
+    <PackageReference Include="BaSyx.Models.Export" Version="1.0.0" />
   </ItemGroup>
 
   <Target Name="PostBuild" AfterTargets="PostBuildEvent">
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.xml b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.xml
similarity index 100%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.xml
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/BaSyx.API.Http.Controllers.AASX.xml
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/PackageService.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/PackageService.cs
similarity index 100%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/PackageService.cs
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/PackageService.cs
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/basyxlogo.png b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/basyxlogo.png
similarity index 100%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers.AASX/basyxlogo.png
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers.AASX/basyxlogo.png
Binary files differ
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
new file mode 100644
index 0000000..4fa5beb
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryServices.cs
@@ -0,0 +1,107 @@
+/*******************************************************************************
+* 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
new file mode 100644
index 0000000..ca84c6b
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellServices.cs
@@ -0,0 +1,215 @@
+/*******************************************************************************
+* 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-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs
similarity index 63%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs
index 8e557c9..68f56fb 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelRepositoryServices.cs
@@ -13,31 +13,25 @@
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Utils.ResultHandling;
 using BaSyx.API.Components;
-using BaSyx.Models.Connectivity.Descriptors;
-using BaSyx.Models.Core.Common;
 
 namespace BaSyx.API.Http.Controllers
 {
     /// <summary>
     /// The Submodel Repository Controller
     /// </summary>
-    public class SubmodelRepositoryServices : Controller, ISubmodelRepositoryServiceProvider
+    public class SubmodelRepositoryServices : Controller
     {
+        private readonly ISubmodelRepositoryServiceProvider serviceProvider;
 
-        private readonly ISubmodelRepositoryServiceProvider repository;
-
-        public IEnumerable<ISubmodel> Submodels => repository.Submodels;
-        public ISubmodelRepositoryDescriptor ServiceDescriptor { get; }
-
-
+        /// <summary>
+        /// Constructor for the Submodel Repository Services Controller
+        /// </summary>
+        /// <param name="submodelRepositoryServiceProvider"></param>
         public SubmodelRepositoryServices(ISubmodelRepositoryServiceProvider submodelRepositoryServiceProvider)
         {
-            repository = submodelRepositoryServiceProvider;
-            ServiceDescriptor = submodelRepositoryServiceProvider.ServiceDescriptor;
+            serviceProvider = submodelRepositoryServiceProvider;
         }
 
-        #region REST-Interface SubmodelRepository
-
         /// <summary>
         /// Retrieves all Submodels from the repository service endpoint
         /// </summary>
@@ -50,7 +44,7 @@
         [ProducesResponseType(typeof(List<BaSyx.Models.Core.AssetAdministrationShell.Implementations.Submodel>), 200)]
         public IActionResult GetAllSubmodelsFromRepo()
         {
-            var result = RetrieveSubmodels();
+            var result = serviceProvider.RetrieveSubmodels();
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
         /// <summary>
@@ -69,7 +63,7 @@
             if (string.IsNullOrEmpty(submodelId))
                 return ResultHandling.NullResult(nameof(submodelId));
 
-            var result = RetrieveSubmodel(submodelId);
+            var result = serviceProvider.RetrieveSubmodel(submodelId);
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
         
@@ -88,7 +82,7 @@
             if (submodel == null)
                 return ResultHandling.NullResult(nameof(submodel));
 
-            var result = CreateSubmodel(submodel);
+            var result = serviceProvider.CreateSubmodel(submodel);
             return result.CreateActionResult(CrudOperation.Create);
         }
         /// <summary>
@@ -106,70 +100,8 @@
             if (string.IsNullOrEmpty(submodelId))
                 return ResultHandling.NullResult(nameof(submodelId));
 
-            var result = DeleteSubmodel(submodelId);
+            var result = serviceProvider.DeleteSubmodel(submodelId);
             return result.CreateActionResult(CrudOperation.Delete);
         }
-
-        #endregion
-        
-        #region Helper Methods
-
-        #endregion
-
-        #region Interface Implementation SubmodelRepository
-        public void RegisterSubmodelServiceProvider(string id, ISubmodelServiceProvider submodelServiceProvider)
-        {
-            repository.RegisterSubmodelServiceProvider(id, submodelServiceProvider);
-        }
-
-        public ISubmodelServiceProvider GetSubmodelServiceProvider(string id)
-        {
-            return repository.GetSubmodelServiceProvider(id);
-        }
-
-        public IEnumerable<ISubmodelServiceProvider> GetSubmodelServiceProviders()
-        {
-            return repository.GetSubmodelServiceProviders();
-        }
-
-        public void BindTo(IEnumerable<ISubmodel> element)
-        {
-            repository.BindTo(element);
-        }
-
-        public IEnumerable<ISubmodel> GetBinding()
-        {
-            return repository.GetBinding();
-        }
-
-        public IResult<ISubmodel> CreateSubmodel(ISubmodel submodel)
-        {
-            return repository.CreateSubmodel(submodel);
-        }
-
-        public IResult<ISubmodel> RetrieveSubmodel(string submodelId)
-        {
-            return repository.RetrieveSubmodel(submodelId);
-        }
-
-        public IResult<IElementContainer<ISubmodel>> RetrieveSubmodels()
-        {
-            return repository.RetrieveSubmodels();
-        }
-
-        public IResult UpdateSubmodel(string submodelId, ISubmodel submodel)
-        {
-            return repository.UpdateSubmodel(submodelId, submodel);
-        }
-
-        public IResult DeleteSubmodel(string submodelId)
-        {
-            return repository.DeleteSubmodel(submodelId);
-        }
-
-
-
-
-        #endregion
     }
 }
diff --git a/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs
new file mode 100644
index 0000000..c67e35d
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs
@@ -0,0 +1,288 @@
+/*******************************************************************************
+* 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 System;
+using Newtonsoft.Json.Linq;
+using BaSyx.Models.Extensions;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
+using BaSyx.Models.Core.Common;
+using BaSyx.Models.Communication;
+
+namespace BaSyx.API.Http.Controllers
+{
+    /// <summary>
+    /// All Asset Administration Shell Services provided by the component
+    /// </summary>
+    public class SubmodelServices : Controller
+    {
+        private readonly ISubmodelServiceProvider serviceProvider;
+
+        /// <summary>
+        /// Constructor for the Submodel Services Controller
+        /// </summary>
+        /// <param name="submodelServiceProvider">The Submodel Service Provider implementation provided by the dependency injection</param>
+        public SubmodelServices(ISubmodelServiceProvider submodelServiceProvider)
+        {
+            serviceProvider = submodelServiceProvider;
+        }
+
+        /// <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>
+        /// <returns></returns>
+        /// <response code="200">Success</response>
+        /// <response code="404">Submodel not found</response>   
+        [HttpGet("submodel/table", Name = "GetSubmodelAsTable")]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetSubmodelAsTable([FromQuery] string columns)
+        {
+            if (string.IsNullOrEmpty(columns))
+                return ResultHandling.NullResult(nameof(columns));
+
+            var result = serviceProvider.RetrieveSubmodel();
+            if (result != null && result.Entity != null)
+            {
+                string[] columnNames = columns.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+                JToken customizedSubmodel = result.Entity.CustomizeSubmodel(columnNames);
+                return new JsonResult(customizedSubmodel);
+            }
+
+            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 GetMinimizedSubmodel()
+        {
+            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 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>       
+        [HttpGet("submodel/submodelElements", Name = "GetSubmodelElements")]
+        [ProducesResponseType(typeof(SubmodelElement[]), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetSubmodelElements()
+        {
+            var result = serviceProvider.RetrieveSubmodelElements();
+            return result.CreateActionResult(CrudOperation.Retrieve);
+        }
+
+        /// <summary>
+        /// Adds a new Submodel-Element to the Submodel
+        /// </summary>
+        /// <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")]
+        [ProducesResponseType(typeof(SubmodelElement), 201)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult PutSubmodelElement([FromBody] ISubmodelElement submodelElement)
+        {
+            if (submodelElement == null)
+                return ResultHandling.NullResult(nameof(submodelElement));
+
+            var result = serviceProvider.CreateSubmodelElement("/", submodelElement);
+            return result.CreateActionResult(CrudOperation.Create, "submodel/submodelElements/" + submodelElement.IdShort);
+        }
+
+
+        /// <summary>
+        /// Retrieves a specific Submodel-Element from the 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("submodel/submodelElements/{*submodelElementIdShort}", Name = "GetSubmodelElementByIdShort")]
+        [ProducesResponseType(typeof(SubmodelElement), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetSubmodelElementByIdShort(string submodelElementIdShort)
+        {
+            if (string.IsNullOrEmpty(submodelElementIdShort))
+                return ResultHandling.NullResult(nameof(submodelElementIdShort));
+
+            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);
+
+            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>
+        /// <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")]
+        [ProducesResponseType(typeof(object), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        [ProducesResponseType(typeof(Result), 405)]
+        public IActionResult GetSubmodelElementValueByIdShort(string submodelElementIdShort)
+        {
+            return GetSubmodelElementByIdShort(submodelElementIdShort + "/value");
+        }
+
+        /// <summary>
+        /// Updates the Asset Administration Shell's Submodel's Submodel-Element
+        /// </summary>
+        /// <param name="submodelElementIdShort">The Submodel-Element's short id</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("submodel/submodelElements/{*submodelElementIdShort}", Name = "PutSubmodelElementValueByIdShort")]
+        [ProducesResponseType(typeof(ElementValue), 200)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult PutSubmodelElementValueByIdShort(string submodelElementIdShort, [FromBody] IValue value)
+        {
+            if (submodelElementIdShort.EndsWith("/value"))
+            {
+                if (string.IsNullOrEmpty(submodelElementIdShort))
+                    return ResultHandling.NullResult(nameof(submodelElementIdShort));
+                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();
+        }
+
+        /// <summary>
+        /// Deletes a specific Submodel-Element from the 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 / Submodel-Element not found</response>
+        [HttpDelete("submodel/submodelElements/{*submodelElementIdShort}", Name = "DeleteSubmodelElementByIdShort")]
+        [ProducesResponseType(typeof(Result), 200)]
+        public IActionResult DeleteSubmodelElementByIdShort(string submodelElementIdShort)
+        {
+            if (string.IsNullOrEmpty(submodelElementIdShort))
+                return ResultHandling.NullResult(nameof(submodelElementIdShort));
+
+            var result = serviceProvider.DeleteSubmodelElement(submodelElementIdShort);
+            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="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")]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult InvokeOperationByIdShort(string operationIdShort, [FromBody] InvocationRequest invocationRequest, [FromQuery] bool async)
+        {
+            if (string.IsNullOrEmpty(operationIdShort))
+                return ResultHandling.NullResult(nameof(operationIdShort));
+            if (invocationRequest == null)
+                return ResultHandling.NullResult(nameof(invocationRequest));
+
+            if (async)
+            {
+                IResult<CallbackResponse> result = serviceProvider.InvokeOperationAsync(operationIdShort, invocationRequest);
+                return result.CreateActionResult(CrudOperation.Invoke);
+            }
+            else
+            {
+                IResult<InvocationResponse> result = serviceProvider.InvokeOperation(operationIdShort, invocationRequest);
+                return result.CreateActionResult(CrudOperation.Invoke);
+            }
+        }
+
+        /// <summary>
+        /// Retrieves the result of an asynchronously started operation
+        /// </summary>
+        /// <param name="operationIdShort">The Operation's short id</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")]
+        [ProducesResponseType(typeof(InvocationResponse), 200)]
+        [ProducesResponseType(typeof(Result), 400)]
+        [ProducesResponseType(typeof(Result), 404)]
+        public IActionResult GetInvocationResultByIdShort(string operationIdShort, string requestId)
+        {
+            if (string.IsNullOrEmpty(operationIdShort))
+                return ResultHandling.NullResult(nameof(operationIdShort));
+            if (string.IsNullOrEmpty(requestId))
+                return ResultHandling.NullResult(nameof(requestId));
+
+            IResult<InvocationResponse> result = serviceProvider.GetInvocationResult(operationIdShort, requestId);
+            return result.CreateActionResult(CrudOperation.Invoke);
+        }
+      }
+}
+
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.csproj b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.csproj
similarity index 95%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.csproj
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.csproj
index 3fa3453..d0d027d 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.csproj
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.csproj
@@ -40,6 +40,7 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="BaSyx.API" Version="1.0.0" />
     <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />
   </ItemGroup>
 
@@ -47,10 +48,6 @@
     <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
   </ItemGroup>
 
-  <ItemGroup>
-    <ProjectReference Include="..\BaSyx.API\BaSyx.API.csproj" />
-  </ItemGroup>
-
   <Target Name="PostBuild" AfterTargets="PostBuildEvent">
     <Exec Command="IF EXIST %25BASYX_REPO%25 ( dotnet pack &quot;$(ProjectPath)&quot; --no-build --include-source --include-symbols --output &quot;%25BASYX_REPO%25&quot; ) ELSE ( ECHO BASYX_REPO Environment Variable not found)" />
   </Target>
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
similarity index 70%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
index 6199a83..8ed3b60 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/BaSyx.API.Http.Controllers.xml
@@ -9,6 +9,12 @@
             The Asset Administration Shell Repository Controller
             </summary>
         </member>
+        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRepositoryServices.#ctor(BaSyx.API.Components.IAssetAdministrationShellRepositoryServiceProvider)">
+            <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
@@ -111,30 +117,6 @@
             <response code="200">Returns a list of found Submodel-Elements</response>
             <response code="404">Submodel not found / No Submodel-Elements found</response>       
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetProperties">
-            <summary>
-            Retrieves all Properties from the Submodel
-            </summary>
-            <returns></returns>
-            <response code="200">Returns a list of found Properties</response>
-            <response code="404">Submodel not found / No Properties found</response>       
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetOperations">
-            <summary>
-            Retrieves all Operations from the Submodel
-            </summary>
-            <returns></returns>
-            <response code="200">Success</response>
-            <response code="404">Submodel not found / No Operations found</response>      
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetEvents">
-            <summary>
-            Retrieves all Events from the Submodel
-            </summary>
-            <returns></returns>
-            <response code="200">Success</response>
-            <response code="404">Submodel not found / No Events found</response>      
-        </member>
         <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedPutSubmodelElement(BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
             <summary>
             Creates or updates a Submodel-Element to the Asset Administration Shell's Submodel
@@ -163,68 +145,17 @@
             <response code="204">Submodel-Element deleted successfully</response>
             <response code="404">Submodel not found</response>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetPropertyByIdShort(System.String)">
-            <summary>
-            Retrieves a specific Property from the Asset Administration Shell's Submodel
-            </summary>
-            <param name="propertyIdShort">The Property's short id</param>
-            <returns></returns>
-            <response code="200">Returns the requested Property</response>
-            <response code="404">Submodel / Property not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetPropertyValueByIdShort(System.String)">
-            <summary>
-            Retrieves the value of a specific Property from the Asset Administrations Shell's Submodel
-            </summary>
-            <param name="propertyIdShort">The Property's short id</param>
-            <returns></returns>
-            <response code="200">Returns the requested Property's value</response>
-            <response code="404">Submodel / Property not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedPutPropertyValueByIdShort(System.String,BaSyx.Models.Core.Common.IValue)">
-            <summary>
-            Updates the Asset Administration Shell's Submodel's Property's value
-            </summary>
-            <param name="propertyIdShort">The Property's short id</param>
-            <param name="value">The new value</param>
-            <returns></returns>
-            <response code="200">Property's value changed successfully</response>
-            <response code="404">Submodel/Property not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedGetOperationByIdShort(System.String)">
-            <summary>
-            Retrieves a specific Operation from the Asset Administration Shell's Submodel
-            </summary>
-            <param name="operationIdShort">The Operation's short id</param>
-            <returns></returns>
-            <response code="200">Success</response>
-            <response code="404">Submodel / Operation not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellServices.RoutedInvokeOperationByIdShort(System.String,BaSyx.Models.Communication.InvocationRequest)">
-            <summary>
-            Synchronously invokes a specific operation from the Submodel
-            </summary>
-            <param name="operationIdShort">The Operation's short id</param>
-            <param name="invocationRequest">The parameterized request object for the invocation</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.AssetAdministrationShellServices.RoutedGetEventByIdShort(System.String)">
-            <summary>
-            Retrieves a specific event from the Asset Administration Shell's Submodel
-            </summary>
-            <param name="eventIdShort">The Event's short id</param>
-            <returns></returns>
-            <response code="200">Success</response>
-            <response code="404">Submodel/Event not found</response>     
-        </member>
         <member name="T:BaSyx.API.Http.Controllers.SubmodelRepositoryServices">
             <summary>
             The Submodel Repository Controller
             </summary>
         </member>
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryServices.#ctor(BaSyx.API.Components.ISubmodelRepositoryServiceProvider)">
+            <summary>
+            Constructor for the Submodel Repository Services Controller
+            </summary>
+            <param name="submodelRepositoryServiceProvider"></param>
+        </member>
         <member name="M:BaSyx.API.Http.Controllers.SubmodelRepositoryServices.GetAllSubmodelsFromRepo">
             <summary>
             Retrieves all Submodels from the repository service endpoint
@@ -310,30 +241,6 @@
             <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.GetProperties">
-            <summary>
-            Retrieves all Properties from the current Submodel
-            </summary>
-            <returns></returns>
-            <response code="200">Returns a list of found Properties</response>
-            <response code="404">Submodel not found</response>       
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetOperations">
-            <summary>
-            Retrieves all Operations from the current 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.GetEvents">
-            <summary>
-            Retrieves all Events from the current 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.PutSubmodelElement(BaSyx.Models.Core.AssetAdministrationShell.Generics.ISubmodelElement)">
             <summary>
             Adds a new Submodel-Element to the Submodel
@@ -353,6 +260,27 @@
             <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.SubmodelServices.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>
+            <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)">
+            <summary>
+            Updates the Asset Administration Shell's Submodel's Submodel-Element
+            </summary>
+            <param name="submodelElementIdShort">The Submodel-Element's short id</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)">
             <summary>
             Deletes a specific Submodel-Element from the Submodel
@@ -362,60 +290,13 @@
             <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.GetPropertyByIdShort(System.String)">
+        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.InvokeOperationByIdShort(System.String,BaSyx.Models.Communication.InvocationRequest,System.Boolean)">
             <summary>
-            Retrieves a specific Property from the Asset Administrations's Submodel
-            </summary>
-            <param name="propertyIdShort">The Property's short id</param>
-            <returns></returns>
-            <response code="200">Returns the requested Property</response>
-            <response code="404">Submodel / Property not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetPropertyValueByIdShort(System.String)">
-            <summary>
-            Retrieves the value of a specific Property from the Asset Administrations Shell's Submodel
-            </summary>
-            <param name="propertyIdShort">The Property's short id</param>
-            <returns></returns>
-            <response code="200">Returns the requested Property's value</response>
-            <response code="404">Submodel / Property not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.PutPropertyValueByIdShort(System.String,BaSyx.Models.Core.Common.IValue)">
-            <summary>
-            Updates the Asset Administration Shell's Submodel's Property
-            </summary>
-            <param name="propertyIdShort">The Property's short id</param>
-            <param name="value">The new value</param>
-            <returns></returns>
-            <response code="200">Property's value changed successfully</response>
-            <response code="404">Submodel / Property not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetOperationByIdShort(System.String)">
-            <summary>
-            Retrieves a specific Operation from the Asset Administration Shell's Submodel
-            </summary>
-            <param name="operationIdShort">The Operation's short id</param>
-            <returns></returns>
-            <response code="200">Success</response>
-            <response code="404">Submodel / Operation not found</response>     
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.InvokeOperationByIdShort(System.String,BaSyx.Models.Communication.InvocationRequest)">
-            <summary>
-            Synchronously invokes a specific operation from the Submodel
+            Invokes a specific operation from the Submodel synchronously or asynchronously
             </summary>
             <param name="operationIdShort">The Operation's short id</param>
             <param name="invocationRequest">The parameterized request object for the invocation</param>
-            <returns></returns>
-            <response code="200">Operation invoked successfully</response>
-            <response code="400">Bad Request</response>
-            <response code="404">Submodel / Operation not found</response>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.InvokeOperationByIdShortAsync(System.String,BaSyx.Models.Communication.InvocationRequest)">
-            <summary>
-            Asynchronously invokes a specific operation from the Submodel
-            </summary>
-            <param name="operationIdShort">The Operation's short id</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>
@@ -432,15 +313,6 @@
             <response code="400">Bad Request</response>
             <response code="404">Submodel / Operation / Request not found</response>
         </member>
-        <member name="M:BaSyx.API.Http.Controllers.SubmodelServices.GetEventByIdShort(System.String)">
-            <summary>
-            Retrieves a specific event from the Asset Administration Shell's Submodel
-            </summary>
-            <param name="eventIdShort">The Event's short id</param>
-            <returns></returns>
-            <response code="200">Success</response>
-            <response code="404">Submodel / Event not found</response>     
-        </member>
         <member name="T:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry">
             <summary>
             The Http-Controller implementation of the IAssetAdministrationShellRegistry interface
@@ -534,36 +406,6 @@
             <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.RetrieveAssetAdministrationShellRegistration(System.String)">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.RetrieveSubmodelRegistration(System.String,System.String)">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.DeleteSubmodelRegistration(System.String,System.String)">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.CreateOrUpdateAssetAdministrationShellRegistration(System.String,BaSyx.Models.Connectivity.Descriptors.IAssetAdministrationShellDescriptor)">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.RetrieveAllAssetAdministrationShellRegistrations(System.Predicate{BaSyx.Models.Connectivity.Descriptors.IAssetAdministrationShellDescriptor})">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.CreateOrUpdateSubmodelRegistration(System.String,System.String,BaSyx.Models.Connectivity.Descriptors.ISubmodelDescriptor)">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.RetrieveAllSubmodelRegistrations(System.String,System.Predicate{BaSyx.Models.Connectivity.Descriptors.ISubmodelDescriptor})">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.DeleteAssetAdministrationShellRegistration(System.String)">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.RetrieveAllAssetAdministrationShellRegistrations">
-            <inheritdoc/>
-        </member>
-        <member name="M:BaSyx.API.Http.Controllers.AssetAdministrationShellRegistry.RetrieveAllSubmodelRegistrations(System.String)">
-            <inheritdoc/>
-        </member>
         <member name="T:BaSyx.API.Http.Controllers.ResultHandling">
             <summary>
             Helper class for handling Action Results for HTTP-Requests
@@ -576,6 +418,19 @@
             <param name="elementName">The name of the element which is null or empty</param>
             <returns></returns>
         </member>
+        <member name="M:BaSyx.API.Http.Controllers.ResultHandling.BadRequestResult(System.String)">
+            <summary>
+            Returns a Result-Object in an BadRequest(400)-ObjectResult and a message why it is a BadRequest
+            </summary>
+            <param name="message">The message why it is a BadRequest</param>
+            <returns></returns>
+        </member>
+        <member name="M:BaSyx.API.Http.Controllers.ResultHandling.MethodNotAllowedResult">
+            <summary>
+            Returns a Result-Object in an MethodNotAllowed(405)-ObjectResult
+            </summary>
+            <returns></returns>
+        </member>
         <member name="M:BaSyx.API.Http.Controllers.ResultHandling.CreateActionResult(BaSyx.Utils.ResultHandling.IResult,BaSyx.API.Http.Controllers.CrudOperation,System.String)">
             <summary>
             Returns a Result-Object wrapped in an ObjectResult according to the CRUD-operation
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs
similarity index 73%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs
index 44ea5c8..af5b566 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/Infrastructure/Registry/AssetAdministrationShellRegistry.cs
@@ -14,17 +14,15 @@
 using BaSyx.Utils.ResultHandling;
 using System.Web;
 using BaSyx.Models.Connectivity.Descriptors;
-using BaSyx.Models.Core.Common;
-using System;
 
 namespace BaSyx.API.Http.Controllers
 {
     /// <summary>
     /// The Http-Controller implementation of the IAssetAdministrationShellRegistry interface
     /// </summary>
-    public class AssetAdministrationShellRegistry : Controller, IAssetAdministrationShellRegistry
+    public class AssetAdministrationShellRegistry : Controller
     {
-        private readonly IAssetAdministrationShellRegistry aasRegistryImpl;
+        private readonly IAssetAdministrationShellRegistry serviceProvider;
 
         /// <summary>
         /// The Constructor for the AssetAdministrationShellRegistry-Controller
@@ -32,10 +30,9 @@
         /// <param name="aasRegistry">The backend implementation for the IAssetAdministrationShellRegistry interface. Usually provided by the Depedency Injection mechanism.</param>
         public AssetAdministrationShellRegistry(IAssetAdministrationShellRegistry aasRegistry)
         {
-            aasRegistryImpl = aasRegistry;
+            serviceProvider = aasRegistry;
         }
 
-        #region REST-Interface
         /// <summary>
         /// Retrieves all registered Asset Administration Shells within system (e.g. Station, Line, Plant, Area, etc.) defined by the Registry
         /// </summary>
@@ -45,7 +42,7 @@
         [ProducesResponseType(typeof(List<AssetAdministrationShellDescriptor>), 200)]
         public IActionResult GetAllAssetAdministrationShellDescriptors()
         {
-            var result = RetrieveAllAssetAdministrationShellRegistrations();
+            var result = serviceProvider.RetrieveAllAssetAdministrationShellRegistrations();
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
         /// <summary>
@@ -64,7 +61,7 @@
                 return ResultHandling.NullResult(nameof(aasId));
 
             aasId = HttpUtility.UrlDecode(aasId);
-            var result = RetrieveAssetAdministrationShellRegistration(aasId);
+            var result = serviceProvider.RetrieveAssetAdministrationShellRegistration(aasId);
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
 
@@ -83,9 +80,15 @@
         {
             if (string.IsNullOrEmpty(aasId))
                 return ResultHandling.NullResult(nameof(aasId));
-            
+            if(aasDescriptor.Identification == null || string.IsNullOrEmpty(aasDescriptor.Identification.Id))
+                return ResultHandling.NullResult("The identification property of the Asset Administration Shell Descriptor is null or empty");
+
             aasId = HttpUtility.UrlDecode(aasId);
-            var result = CreateOrUpdateAssetAdministrationShellRegistration(aasId, aasDescriptor);
+
+            if (aasId != aasDescriptor.Identification.Id)
+                return ResultHandling.BadRequestResult($"Path parameter {aasId} does not equal Asset Administration Shell Descriptor identification property {aasDescriptor.Identification.Id}");
+            
+            var result = serviceProvider.CreateOrUpdateAssetAdministrationShellRegistration(aasId, aasDescriptor);
             return result.CreateActionResult(CrudOperation.Create, "api/v1/registry/" + HttpUtility.UrlEncode(aasId));
         }
 
@@ -105,7 +108,7 @@
                 return ResultHandling.NullResult(nameof(aasId));
 
             aasId = HttpUtility.UrlDecode(aasId);
-            var result = DeleteAssetAdministrationShellRegistration(aasId);
+            var result = serviceProvider.DeleteAssetAdministrationShellRegistration(aasId);
             return result.CreateActionResult(CrudOperation.Delete);
         }
 
@@ -130,11 +133,16 @@
                 return ResultHandling.NullResult(nameof(submodelId));
             if (submodelDescriptor == null)
                 return ResultHandling.NullResult(nameof(submodelDescriptor));
+            if (submodelDescriptor.Identification == null || string.IsNullOrEmpty(submodelDescriptor.Identification.Id))
+                return ResultHandling.NullResult("The identification property of the Submodel Descriptor is null or empty");
 
             aasId = HttpUtility.UrlDecode(aasId);
             submodelId = HttpUtility.UrlDecode(submodelId);
 
-            var result = CreateOrUpdateSubmodelRegistration(aasId, submodelId, submodelDescriptor);
+            if (submodelId != submodelDescriptor.Identification.Id)
+                return ResultHandling.BadRequestResult($"Path parameter {aasId} does not equal Submodel Descriptor identification property {submodelDescriptor.Identification.Id}");
+
+            var result = serviceProvider.CreateOrUpdateSubmodelRegistration(aasId, submodelId, submodelDescriptor);
             return result.CreateActionResult(CrudOperation.Create, "api/v1/registry/" + HttpUtility.UrlEncode(aasId) + "/submodels/" + HttpUtility.UrlEncode(submodelId));
         }
 
@@ -159,7 +167,7 @@
             aasId = HttpUtility.UrlDecode(aasId);
             submodelId = HttpUtility.UrlDecode(submodelId);
 
-            var result = RetrieveSubmodelRegistration(aasId, submodelId);
+            var result = serviceProvider.RetrieveSubmodelRegistration(aasId, submodelId);
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
         /// <summary>
@@ -183,7 +191,7 @@
             aasId = HttpUtility.UrlDecode(aasId);
             submodelId = HttpUtility.UrlDecode(submodelId);
 
-            var result = DeleteSubmodelRegistration(aasId, submodelId);
+            var result = serviceProvider.DeleteSubmodelRegistration(aasId, submodelId);
             return result.CreateActionResult(CrudOperation.Delete);
         }
         /// <summary>
@@ -202,70 +210,8 @@
                 return ResultHandling.NullResult(nameof(aasId));
 
             aasId = HttpUtility.UrlDecode(aasId);
-            var result = RetrieveAllSubmodelRegistrations(aasId);
+            var result = serviceProvider.RetrieveAllSubmodelRegistrations(aasId);
             return result.CreateActionResult(CrudOperation.Retrieve);
         }
-        #endregion
-
-        #region InterfaceImplementation
-        ///<inheritdoc/>
-        public IResult<IAssetAdministrationShellDescriptor> RetrieveAssetAdministrationShellRegistration(string aasId)
-        {
-            return aasRegistryImpl.RetrieveAssetAdministrationShellRegistration(aasId);
-        }
-        ///<inheritdoc/>
-        public IResult<ISubmodelDescriptor> RetrieveSubmodelRegistration(string aasId, string submodelId)
-        {
-            return aasRegistryImpl.RetrieveSubmodelRegistration(aasId, submodelId);
-        }
-        ///<inheritdoc/>
-        public IResult DeleteSubmodelRegistration(string aasId, string submodelIdShort)
-        {
-            return aasRegistryImpl.DeleteSubmodelRegistration(aasId, submodelIdShort);
-        }
-        ///<inheritdoc/>
-        public IResult<IAssetAdministrationShellDescriptor> CreateOrUpdateAssetAdministrationShellRegistration(string aasId, IAssetAdministrationShellDescriptor aasDescriptor)
-        {
-            return aasRegistryImpl.CreateOrUpdateAssetAdministrationShellRegistration(aasId, aasDescriptor);
-        }
-        ///<inheritdoc/>
-        public IResult<IQueryableElementContainer<IAssetAdministrationShellDescriptor>> RetrieveAllAssetAdministrationShellRegistrations(Predicate<IAssetAdministrationShellDescriptor> predicate)
-        {
-            return aasRegistryImpl.RetrieveAllAssetAdministrationShellRegistrations(predicate);
-        }
-        ///<inheritdoc/>
-        public IResult<ISubmodelDescriptor> CreateOrUpdateSubmodelRegistration(string aasId, string submodelId, ISubmodelDescriptor submodelDescriptor)
-        {
-            return aasRegistryImpl.CreateOrUpdateSubmodelRegistration(aasId, submodelId, submodelDescriptor);
-        }
-
-        ///<inheritdoc/>
-        public IResult<IQueryableElementContainer<ISubmodelDescriptor>> RetrieveAllSubmodelRegistrations(string aasId, Predicate<ISubmodelDescriptor> predicate)
-        {
-            return aasRegistryImpl.RetrieveAllSubmodelRegistrations(aasId, predicate);
-        }
-        ///<inheritdoc/>
-        public IResult DeleteAssetAdministrationShellRegistration(string aasId)
-        {
-            return aasRegistryImpl.DeleteAssetAdministrationShellRegistration(aasId);
-        }
-        ///<inheritdoc/>
-        public IResult<IQueryableElementContainer<IAssetAdministrationShellDescriptor>> RetrieveAllAssetAdministrationShellRegistrations()
-        {
-            return aasRegistryImpl.RetrieveAllAssetAdministrationShellRegistrations();
-        }
-        ///<inheritdoc/>
-        public IResult<IQueryableElementContainer<ISubmodelDescriptor>> RetrieveAllSubmodelRegistrations(string aasId)
-        {
-            return aasRegistryImpl.RetrieveAllSubmodelRegistrations(aasId);
-        }
-
-
-        #endregion
-
-        #region Helper Methods
-
-
-        #endregion
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/ResultHandling.cs b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/ResultHandling.cs
similarity index 77%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/ResultHandling.cs
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/ResultHandling.cs
index 4129c86..eefb1cb 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/ResultHandling.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/ResultHandling.cs
@@ -16,12 +16,34 @@
         /// <returns></returns>
         public static IActionResult NullResult(string elementName)
         {
-            ObjectResult objectResult = new ObjectResult(new Result(false, new Message(MessageType.Error, $"Argument {elementName} is null or empty")))
+            BadRequestObjectResult objectResult = new BadRequestObjectResult(new Result(false, new Message(MessageType.Error, $"Argument {elementName} is null or empty")));
+            return objectResult;
+        }
+
+        /// <summary>
+        /// Returns a Result-Object in an BadRequest(400)-ObjectResult and a message why it is a BadRequest
+        /// </summary>
+        /// <param name="message">The message why it is a BadRequest</param>
+        /// <returns></returns>
+        public static IActionResult BadRequestResult(string message)
+        {
+            BadRequestObjectResult objectResult = new BadRequestObjectResult(new Result(false, new Message(MessageType.Error, message)));
+            return objectResult;
+        }
+
+        /// <summary>
+        /// Returns a Result-Object in an MethodNotAllowed(405)-ObjectResult
+        /// </summary>
+        /// <returns></returns>
+        public static IActionResult MethodNotAllowedResult()
+        {
+            ObjectResult objectResult = new ObjectResult(new Result(false, new MethodNotAllowedMessage()))
             {
-                StatusCode = 400
+                StatusCode = 405
             };
             return objectResult;
         }
+
         /// <summary>
         /// Returns a Result-Object wrapped in an ObjectResult according to the CRUD-operation
         /// </summary>
@@ -59,7 +81,7 @@
                         return new NoContentResult();
                     break;
                 case CrudOperation.Invoke:
-                    if (result.Success && result.Entity != null)
+                    if (result.Entity != null)
                         return new OkObjectResult(result.Entity);
                     break;
                 default:
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/basyxlogo.png b/sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/basyxlogo.png
similarity index 100%
rename from sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/basyxlogo.png
rename to sdks/dotnet/basyx-components/BaSyx.API.Http.Controllers/basyxlogo.png
Binary files differ
diff --git a/sdks/dotnet/basyx-components/BaSyx.Components.Common/ServerApplication.cs b/sdks/dotnet/basyx-components/BaSyx.Components.Common/ServerApplication.cs
index deae290..09a2fc4 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Components.Common/ServerApplication.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Components.Common/ServerApplication.cs
@@ -8,6 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
+using BaSyx.Utils.Settings;
 using BaSyx.Utils.Settings.Types;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
@@ -61,7 +62,7 @@
         {
             logger.Debug("Starting Server...");
 
-            WebHostBuilder.Build().Run();
+             WebHostBuilder.Build().Run();
         }
 
         public virtual async Task RunAsync(CancellationToken cancellationToken = default)
@@ -155,8 +156,14 @@
                                 logger.Warn(exp, $"Assembly {controllerAssemblyName} can finally not be loaded");
                             }                            
                         }
-                        if(controllerAssembly != null)
+                        if (controllerAssembly != null)
+                        {
                             mvcBuilder.AddApplicationPart(controllerAssembly);
+                            string xmlDocFile = $"{controllerAssembly.GetName().Name}.xml";
+                            string xmlDocFilePath = Path.Combine(AppContext.BaseDirectory, xmlDocFile);
+                            if (ResourceChecker.CheckResourceAvailability(controllerAssembly, controllerAssembly.GetName().Name, xmlDocFilePath, true))
+                                logger.Info($"{xmlDocFile} of Assembly {controllerAssembly.GetName().Name} exists or has just been created");
+                        }
                     }
                     mvcBuilder.AddControllersAsServices();
                 }
diff --git a/sdks/dotnet/basyx-components/BaSyx.Components.Tests/BaSyx.Components.Tests.csproj b/sdks/dotnet/basyx-components/BaSyx.Components.Tests/BaSyx.Components.Tests.csproj
index 6305f48..3778999 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Components.Tests/BaSyx.Components.Tests.csproj
+++ b/sdks/dotnet/basyx-components/BaSyx.Components.Tests/BaSyx.Components.Tests.csproj
@@ -7,6 +7,21 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <None Remove="RegistryClientSettings.xml" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="RegistryClientSettings.xml">
+      <PackagePath>contentFiles\any\$(TargetFramework)\</PackagePath>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
+      <PackageFlatten>true</PackageFlatten>
+      <PackageCopyToOutput>true</PackageCopyToOutput>
+      <Pack>true</Pack>
+    </Content>
+  </ItemGroup>
+
+  <ItemGroup>
     <PackageReference Include="FluentAssertions" Version="5.10.3" />
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
     <PackageReference Include="MSTest.TestAdapter" Version="2.0.0" />
diff --git a/sdks/dotnet/basyx-components/BaSyx.Components.Tests/RegistryClientSettings.xml b/sdks/dotnet/basyx-components/BaSyx.Components.Tests/RegistryClientSettings.xml
new file mode 100644
index 0000000..cbdc11b
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.Components.Tests/RegistryClientSettings.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RegistryClientSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <ClientConfig>
+    <RequestConfig>
+      <RequestTimeout>10000</RequestTimeout>
+    </RequestConfig>
+  </ClientConfig>
+  <RegistryConfig>
+    <RegistryUrl>http://localhost:4999</RegistryUrl>
+    <RepeatRegistration>10000</RepeatRegistration>
+  </RegistryConfig>
+  <ProxyConfig>
+    <UseProxy>false</UseProxy>
+    <ProxyAddress>http://localhost:3128</ProxyAddress>
+  </ProxyConfig>
+</RegistryClientSettings>
diff --git a/sdks/dotnet/basyx-components/BaSyx.Components.Tests/RegistryTest.cs b/sdks/dotnet/basyx-components/BaSyx.Components.Tests/RegistryTest.cs
index 9ff3766..bac42a4 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Components.Tests/RegistryTest.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Components.Tests/RegistryTest.cs
@@ -1,7 +1,7 @@
 using BaSyx.API.Components;
 using BaSyx.Models.Connectivity;
 using BaSyx.Models.Connectivity.Descriptors;
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
@@ -31,19 +31,16 @@
             registryHttpServer.SetRegistryProvider(new FileBasedRegistry());
             _ = registryHttpServer.RunAsync();
 
-            registryHttpClient = new RegistryHttpClient();
+            RegistryClientSettings registryClientSettings = RegistryClientSettings.LoadSettings();
+            registryHttpClient = new RegistryHttpClient(registryClientSettings);
         }
 
         
 
-        private static IAssetAdministrationShell aas = new AssetAdministrationShell()
+        private static IAssetAdministrationShell aas = new AssetAdministrationShell("MyTestAAS", new Identifier("https://www.basys40.de/shells/MyTestAAS", KeyType.IRI))
         {
-            IdShort = "MyTestAAS",
-            Identification = new Identifier("https://www.basys40.de/shells/MyTestAAS", KeyType.IRI),
-            Asset = new Asset()
+            Asset = new Asset("MyTestAsset", new Identifier("https://www.basys40.de/assets/MyTestAsset", KeyType.IRI))
             {
-                IdShort = "MyTestAsset",
-                Identification = new Identifier("https://www.basys40.de/assets/MyTestAsset", KeyType.IRI),
                 Kind = AssetKind.Instance
             },
             Administration = new AdministrativeInformation()
@@ -58,19 +55,15 @@
             },
             Submodels = new ElementContainer<ISubmodel>()
             {
-                new Models.Core.AssetAdministrationShell.Implementations.Submodel()
+                new Submodel("MyTestSubmodel", new Identifier("https://www.basys40.de/submodels/MyTestSubmodel", KeyType.IRI))
                 {
-                    IdShort = "MyTestSubmodel",
-                    Identification = new Identifier("https://www.basys40.de/submodels/MyTestSubmodel", KeyType.IRI),
                     SemanticId = new Reference(new Key(KeyElements.GlobalReference, KeyType.IRI, "urn:basys:org.eclipse.basyx:submodels:MyTestSubmodel:1.0.0", false))
                 }
             }
         };
 
-        private static ISubmodel submodel = new Models.Core.AssetAdministrationShell.Implementations.Submodel()
+        private static ISubmodel submodel = new Submodel("MyAdditionalTestSubmodel", new Identifier("https://www.basys40.de/submodels/MyAdditionalTestSubmodel", KeyType.IRI))
         {
-            IdShort = "MyAdditionalTestSubmodel",
-            Identification = new Identifier("https://www.basys40.de/submodels/MyAdditionalTestSubmodel", KeyType.IRI),
             SemanticId = new Reference(new Key(KeyElements.GlobalReference, KeyType.IRI, "urn:basys:org.eclipse.basyx:submodels:MyAdditionalTestSubmodel:1.0.0", false))
         };
 
@@ -85,18 +78,31 @@
         });
 
         [TestMethod]
-        public void Test1CreateOrUpdateAssetAdministrationShellRegistration()
+        public void Test11_CreateBlankAssetAdministrationShellRegistration()
         {
             var result = CreateOrUpdateAssetAdministrationShellRegistration(aas.Identification.Id, aasDescriptor);
             result.Entity.Should().BeEquivalentTo(aasDescriptor);
         }
+
+        [TestMethod]
+        public void Test12_UpdateAssetAdministrationShellRegistration()
+        {
+            aasDescriptor.SubmodelDescriptors.Add(new SubmodelDescriptor(aas.Submodels["MyTestSubmodel"], new List<IEndpoint>()
+            {
+                new HttpEndpoint("http://localhost:5080/aas/submodels/MyTestSubmodel/submodel")
+            }));
+
+            var updatedResult = CreateOrUpdateAssetAdministrationShellRegistration(aas.Identification.Id, aasDescriptor);
+            updatedResult.Entity.Should().BeEquivalentTo(aasDescriptor);
+        }
+
         public IResult<IAssetAdministrationShellDescriptor> CreateOrUpdateAssetAdministrationShellRegistration(string aasId, IAssetAdministrationShellDescriptor aasDescriptor)
         {
             return registryHttpClient.CreateOrUpdateAssetAdministrationShellRegistration(aasId, aasDescriptor);
         }
 
         [TestMethod]
-        public void Test2CreateOrUpdateSubmodelRegistration()
+        public void Test2_CreateOrUpdateSubmodelRegistration()
         {
             var result = CreateOrUpdateSubmodelRegistration(aas.Identification.Id, submodel.Identification.Id, submodelDescriptor);
             result.Entity.Should().BeEquivalentTo(submodelDescriptor);
@@ -109,7 +115,7 @@
         }
 
         [TestMethod]
-        public void Test3RetrieveAssetAdministrationShellRegistration()
+        public void Test3_RetrieveAssetAdministrationShellRegistration()
         {
             var result = RetrieveAssetAdministrationShellRegistration(aas.Identification.Id);
             result.Entity.Should().BeEquivalentTo(aasDescriptor);
@@ -121,7 +127,7 @@
         }
 
         [TestMethod]
-        public void Test41RetrieveAllAssetAdministrationShellRegistrations()
+        public void Test41_RetrieveAllAssetAdministrationShellRegistrations()
         {
             var result = RetrieveAllAssetAdministrationShellRegistrations();
             result.Entity.Should().ContainEquivalentOf(aasDescriptor);
@@ -133,7 +139,7 @@
         }
 
         [TestMethod]
-        public void Test42RetrieveAllAssetAdministrationShellRegistrations()
+        public void Test42_RetrieveAllAssetAdministrationShellRegistrations()
         {
             var result = RetrieveAllAssetAdministrationShellRegistrations(p => p.Identification.Id == aas.Identification.Id);
             result.Entity.Should().ContainEquivalentOf(aasDescriptor);
@@ -145,7 +151,7 @@
         }
 
         [TestMethod]
-        public void Test5RetrieveSubmodelRegistration()
+        public void Test5_RetrieveSubmodelRegistration()
         {
             var result = RetrieveSubmodelRegistration(aas.Identification.Id, submodel.Identification.Id);
             result.Entity.Should().BeEquivalentTo(submodelDescriptor);
@@ -158,7 +164,7 @@
         }
 
         [TestMethod]
-        public void Test61RetrieveAllSubmodelRegistrations()
+        public void Test61_RetrieveAllSubmodelRegistrations()
         {
             var result = RetrieveAllSubmodelRegistrations(aas.Identification.Id);
             result.Entity.Should().ContainEquivalentOf(submodelDescriptor);
@@ -170,7 +176,7 @@
         }
 
         [TestMethod]
-        public void Test62RetrieveAllSubmodelRegistrations()
+        public void Test62_RetrieveAllSubmodelRegistrations()
         {
             var result = RetrieveAllSubmodelRegistrations(aas.Identification.Id, p => p.Identification.Id == submodel.Identification.Id);
             result.Entity.Should().ContainEquivalentOf(submodelDescriptor);
@@ -182,7 +188,7 @@
         }
 
         [TestMethod]
-        public void Test7DeleteSubmodelRegistration()
+        public void Test7_DeleteSubmodelRegistration()
         {
             var deleted = DeleteSubmodelRegistration(aas.Identification.Id, submodel.Identification.Id);
             deleted.Success.Should().BeTrue();
@@ -198,7 +204,7 @@
         }
 
         [TestMethod]
-        public void Test8DeleteAssetAdministrationShellRegistration()
+        public void Test8_DeleteAssetAdministrationShellRegistration()
         {
             var deleted = DeleteAssetAdministrationShellRegistration(aas.Identification.Id);
             deleted.Success.Should().BeTrue();
diff --git a/sdks/dotnet/basyx-components/BaSyx.Components.sln b/sdks/dotnet/basyx-components/BaSyx.Components.sln
index 2d36cd9..3ce1861 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Components.sln
+++ b/sdks/dotnet/basyx-components/BaSyx.Components.sln
@@ -41,6 +41,22 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.CLI", "BaSyx.CLI\BaSyx.CLI.csproj", "{E61A0596-326A-4967-8CA4-FE31A0321603}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Controllers", "Controllers", "{4A2DD35F-BE3B-4802-8A63-07BAB4DA2007}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers", "BaSyx.API.Http.Controllers\BaSyx.API.Http.Controllers.csproj", "{9C42DEEA-5253-46CC-9674-CA138CD506C0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers.AASX", "BaSyx.API.Http.Controllers.AASX\BaSyx.API.Http.Controllers.AASX.csproj", "{D9B9B3E5-B45C-47A3-ADE5-34499D3EA9A8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAssetAdministrationShell", "..\basyx-examples\SimpleAssetAdministrationShell\SimpleAssetAdministrationShell.csproj", "{6E625BC9-AEDB-49BB-94B8-24092083B7DE}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{17391EC4-6892-45AE-9873-B6724C3CB6D2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ComplexAssetAdministrationShellScenario", "..\basyx-examples\ComplexAssetAdministrationShellScenario\ComplexAssetAdministrationShellScenario.csproj", "{5DF1DB58-F462-458D-BC92-7A123059A94F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MultiAssetAdministrationShell", "..\basyx-examples\MultiAssetAdministrationShell\MultiAssetAdministrationShell.csproj", "{F1248088-F4E1-463D-979B-72271AD4DA4F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelloAssetAdministrationShell", "..\basyx-examples\HelloAssetAdministrationShell\HelloAssetAdministrationShell.csproj", "{088964C6-FE4A-4CF3-9B47-903DF36EA890}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -99,6 +115,30 @@
 		{E61A0596-326A-4967-8CA4-FE31A0321603}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{E61A0596-326A-4967-8CA4-FE31A0321603}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E61A0596-326A-4967-8CA4-FE31A0321603}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9C42DEEA-5253-46CC-9674-CA138CD506C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9C42DEEA-5253-46CC-9674-CA138CD506C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9C42DEEA-5253-46CC-9674-CA138CD506C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9C42DEEA-5253-46CC-9674-CA138CD506C0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D9B9B3E5-B45C-47A3-ADE5-34499D3EA9A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D9B9B3E5-B45C-47A3-ADE5-34499D3EA9A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D9B9B3E5-B45C-47A3-ADE5-34499D3EA9A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D9B9B3E5-B45C-47A3-ADE5-34499D3EA9A8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E625BC9-AEDB-49BB-94B8-24092083B7DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E625BC9-AEDB-49BB-94B8-24092083B7DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6E625BC9-AEDB-49BB-94B8-24092083B7DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E625BC9-AEDB-49BB-94B8-24092083B7DE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5DF1DB58-F462-458D-BC92-7A123059A94F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5DF1DB58-F462-458D-BC92-7A123059A94F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5DF1DB58-F462-458D-BC92-7A123059A94F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5DF1DB58-F462-458D-BC92-7A123059A94F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F1248088-F4E1-463D-979B-72271AD4DA4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F1248088-F4E1-463D-979B-72271AD4DA4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F1248088-F4E1-463D-979B-72271AD4DA4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F1248088-F4E1-463D-979B-72271AD4DA4F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{088964C6-FE4A-4CF3-9B47-903DF36EA890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{088964C6-FE4A-4CF3-9B47-903DF36EA890}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{088964C6-FE4A-4CF3-9B47-903DF36EA890}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{088964C6-FE4A-4CF3-9B47-903DF36EA890}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -117,6 +157,12 @@
 		{CACC3BFB-04DF-4E46-BBBD-2A5DA27D957D} = {D3E29E3D-ECAC-4F1E-A3F7-7236ED32A4C4}
 		{A925E735-99D9-44F8-A7BE-36836D7CC1C2} = {EB38D1D3-2539-4EA3-9FA9-B91487278FC2}
 		{E61A0596-326A-4967-8CA4-FE31A0321603} = {12CD4BF1-B0A6-4DBD-AFB6-6F232C92AAFA}
+		{9C42DEEA-5253-46CC-9674-CA138CD506C0} = {4A2DD35F-BE3B-4802-8A63-07BAB4DA2007}
+		{D9B9B3E5-B45C-47A3-ADE5-34499D3EA9A8} = {4A2DD35F-BE3B-4802-8A63-07BAB4DA2007}
+		{6E625BC9-AEDB-49BB-94B8-24092083B7DE} = {17391EC4-6892-45AE-9873-B6724C3CB6D2}
+		{5DF1DB58-F462-458D-BC92-7A123059A94F} = {17391EC4-6892-45AE-9873-B6724C3CB6D2}
+		{F1248088-F4E1-463D-979B-72271AD4DA4F} = {17391EC4-6892-45AE-9873-B6724C3CB6D2}
+		{088964C6-FE4A-4CF3-9B47-903DF36EA890} = {17391EC4-6892-45AE-9873-B6724C3CB6D2}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {8DC440E9-3A4D-4D67-B741-72B8F15EB8C7}
diff --git a/sdks/dotnet/basyx-components/BaSyx.Discovery.mDNS/Discovery.cs b/sdks/dotnet/basyx-components/BaSyx.Discovery.mDNS/Discovery.cs
index a89553c..2906148 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Discovery.mDNS/Discovery.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Discovery.mDNS/Discovery.cs
@@ -11,7 +11,7 @@
         /// Returns an AssetAdministrationShell-Http-Client if found via mDNS Discovery
         /// </summary>
         /// <param name="aasId">The Asset Administration Shell's unique id to look for</param>
-        /// <param name="timeout">Timeout in ms until it stops looking</param>
+        /// <param name="timeout">Timeout in ms until it stops looking (0 = INFINITY)</param>
         /// <returns></returns>
         public static async Task<AssetAdministrationShellHttpClient> GetHttpClientByShellIdAsync(string aasId, int timeout)
         {
@@ -41,10 +41,19 @@
             discoveryServer.ServiceInstanceDiscovered += eventHandler;
             discoveryServer.Start();
 
-            Task timeoutTask = Task.Delay(timeout);
-
-            while (client == null && !timeoutTask.IsCompleted)
-                await Task.Delay(100);
+            if (timeout > 0)
+            {
+                Task timeoutTask = Task.Delay(timeout);
+                while (client == null && !timeoutTask.IsCompleted)
+                    await Task.Delay(100);
+            }
+            else if (timeout == 0)
+            {
+                while (client == null)
+                    await Task.Delay(100);
+            }
+            else
+                throw new ArgumentOutOfRangeException(nameof(timeout), "Timeout must not be negative");
 
             discoveryServer.ServiceInstanceDiscovered -= eventHandler;
             discoveryServer.Stop();
diff --git a/sdks/dotnet/basyx-components/BaSyx.Registry.Client.Http/RegistryHttpClient.cs b/sdks/dotnet/basyx-components/BaSyx.Registry.Client.Http/RegistryHttpClient.cs
index 0db377c..050c4be 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Registry.Client.Http/RegistryHttpClient.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Registry.Client.Http/RegistryHttpClient.cs
@@ -64,7 +64,7 @@
             Settings = Settings ?? throw new NullReferenceException("Settings is null");
 
             LoadSettings(Settings);
-            JsonSerializerSettings = new JsonStandardSettings();
+            JsonSerializerSettings = new DependencyInjectionJsonSerializerSettings();
         }
 
         public Uri GetUri(params string[] pathElements)
diff --git a/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/FileBasedRegistry.cs b/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/FileBasedRegistry.cs
index 2215d92..ff385e7 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/FileBasedRegistry.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/FileBasedRegistry.cs
@@ -36,7 +36,7 @@
         public FileBasedRegistry(FileBasedRegistrySettings settings = null)
         {
             Settings = settings ?? FileBasedRegistrySettings.LoadSettings();
-            JsonSerializerSettings = new JsonStandardSettings();
+            JsonSerializerSettings = new DependencyInjectionJsonSerializerSettings();
 
             FolderPath = Settings.Miscellaneous["FolderPath"];
 
@@ -84,7 +84,7 @@
                 if (!Directory.Exists(aasDirectoryPath))
                     Directory.CreateDirectory(aasDirectoryPath);
 
-                if(aasDescriptor.SubmodelDescriptors?.Count > 0)
+                if(aasDescriptor.SubmodelDescriptors?.Count() > 0)
                 {
                     foreach (var submodelDescriptor in aasDescriptor.SubmodelDescriptors)
                     {
@@ -93,7 +93,7 @@
                             return new Result<IAssetAdministrationShellDescriptor>(interimResult);
                     }
                 }
-                aasDescriptor.SubmodelDescriptors.Clear();
+                aasDescriptor.SubmodelDescriptors = new ElementContainer<ISubmodelDescriptor>();
 
                 string aasDescriptorContent = JsonConvert.SerializeObject(aasDescriptor, JsonSerializerSettings);
                 string aasFilePath = Path.Combine(aasDirectoryPath, aasIdHash) + ".json";
@@ -210,7 +210,7 @@
                     IAssetAdministrationShellDescriptor descriptor = JsonConvert.DeserializeObject<IAssetAdministrationShellDescriptor>(aasContent, JsonSerializerSettings);
 
                     var submodelDescriptors = RetrieveAllSubmodelRegistrations(aasId);
-                    if(submodelDescriptors.Success && submodelDescriptors.Entity?.Count > 0)
+                    if(submodelDescriptors.Success && submodelDescriptors.Entity?.Count() > 0)
                         descriptor.SubmodelDescriptors = submodelDescriptors.Entity;
 
                     return new Result<IAssetAdministrationShellDescriptor>(true, descriptor);
diff --git a/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/NLog.config b/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/NLog.config
index 18d6403..9ab04cf 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/NLog.config
+++ b/sdks/dotnet/basyx-components/BaSyx.Registry.ReferenceImpl.FileBased/NLog.config
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
   <targets>
-    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message}" />
+    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}" />
     <target name="file" xsi:type="File"
-      layout="${longdate} - ${level} - ${logger} - ${message}"
+      layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}"
       fileName="${basedir}/logs/logfile.txt"
       keepFileOpen="true"
       maxArchiveFiles="10"
diff --git a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/BaSyx.Registry.Server.Http.csproj b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/BaSyx.Registry.Server.Http.csproj
index 732da27..3f17e6c 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/BaSyx.Registry.Server.Http.csproj
+++ b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/BaSyx.Registry.Server.Http.csproj
@@ -150,13 +150,13 @@
 
   <ItemGroup>
     <PackageReference Include="BaSyx.API" Version="1.0.0" />
-    <PackageReference Include="BaSyx.API.Http.Controllers" Version="1.0.0" />
     <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="5.2.1" />
     <PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="5.2.1" />
   </ItemGroup>
 
   <ItemGroup>
+    <ProjectReference Include="..\BaSyx.API.Http.Controllers\BaSyx.API.Http.Controllers.csproj" />
     <ProjectReference Include="..\BaSyx.Components.Common\BaSyx.Components.Common.csproj" />
   </ItemGroup>
 
diff --git a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/NLog.config b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/NLog.config
index 5355546..f9bb05a 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/NLog.config
+++ b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/NLog.config
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
   <targets>
-    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message}" />
+    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}" />
     <target name="file" xsi:type="File"
-      layout="${longdate} - ${level} - ${logger} - ${message}"
+      layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}"
       fileName="${basedir}/logs/logfile.txt"
       keepFileOpen="true"
       maxArchiveFiles="10"
diff --git a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Pages/Index.cshtml b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Pages/Index.cshtml
index a44ba61..b422304 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Pages/Index.cshtml
+++ b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Pages/Index.cshtml
@@ -58,7 +58,7 @@
     </main>
 
 
-    @if (shells?.Count > 0)
+    @if (shells?.Count() > 0)
     {
         foreach (var aas in shells)
         {
diff --git a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Startup.cs b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Startup.cs
index a193618..9e266a3 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Startup.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Registry.Server.Http/Startup.cs
@@ -119,6 +119,10 @@
             if (ServerApplicationLifetime.ApplicationStopped != null)
                 applicationLifetime.ApplicationStopped.Register(ServerApplicationLifetime.ApplicationStopped);
 
+            // Enable middleware to serve generated Swagger as a JSON endpoint.
+            app.UseSwagger();
+
+            // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), specifying the Swagger JSON endpoint.
             app.UseSwaggerUI(c =>
             {
                 c.SwaggerEndpoint("/swagger/v1/swagger.json", "BaSyx Registry Http REST-API");
diff --git a/sdks/dotnet/basyx-components/BaSyx.Submodel.Client.Http/SubmodelHttpClient.cs b/sdks/dotnet/basyx-components/BaSyx.Submodel.Client.Http/SubmodelHttpClient.cs
index cf91b79..533407f 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Submodel.Client.Http/SubmodelHttpClient.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Submodel.Client.Http/SubmodelHttpClient.cs
@@ -15,7 +15,6 @@
 using System;
 using System.Net.Http;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Communication;
 using BaSyx.Utils.PathHandling;
 using BaSyx.Models.Connectivity.Descriptors;
@@ -43,7 +42,7 @@
 
         private SubmodelHttpClient()
         {
-            JsonSerializerSettings = new JsonStandardSettings();
+            JsonSerializerSettings = new DependencyInjectionJsonSerializerSettings();
         }
 
         public SubmodelHttpClient(Uri endpoint) : this()
@@ -187,7 +186,7 @@
             return base.EvaluateResponse(response, response.Entity);
         }
 
-        public IResult<ISubmodelElement> CreateSubmodelElement(ISubmodelElement submodelElement)
+        public IResult<ISubmodelElement> CreateSubmodelElement(string rootSubmodelElementIdShort, ISubmodelElement submodelElement)
         {
             var request = base.CreateJsonContentRequest(GetUri(SUBMODELELEMENTS), HttpMethod.Put, submodelElement);
             var response = base.SendRequest(request, REQUEST_TIMEOUT);
@@ -242,5 +241,12 @@
             var response = base.SendRequest(request, REQUEST_TIMEOUT);
             return base.EvaluateResponse<InvocationResponse>(response, response.Entity);
         }
+
+        public IResult UpdateSubmodelElementValue(string submodelElementId, IValue value)
+        {
+            var request = base.CreateJsonContentRequest(GetUri(SUBMODELELEMENTS, submodelElementId, VALUE), HttpMethod.Put, value);
+            var response = base.SendRequest(request, REQUEST_TIMEOUT);
+            return base.EvaluateResponse(response, response.Entity);
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/BaSyx.Submodel.Server.Http.csproj b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/BaSyx.Submodel.Server.Http.csproj
index 0d98cb6..2710a6d 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/BaSyx.Submodel.Server.Http.csproj
+++ b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/BaSyx.Submodel.Server.Http.csproj
@@ -139,7 +139,6 @@
  </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="BaSyx.API.Http.Controllers" Version="1.0.0" />
     <PackageReference Include="BaSyx.Utils.DependencyInjection" Version="1.0.0" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.3" />
     <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />
@@ -148,6 +147,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <ProjectReference Include="..\BaSyx.API.Http.Controllers\BaSyx.API.Http.Controllers.csproj" />
     <ProjectReference Include="..\BaSyx.Components.Common\BaSyx.Components.Common.csproj" />
   </ItemGroup>
 
diff --git a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/MultiStartup.cs b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/MultiStartup.cs
index 70b30b6..6e61438 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/MultiStartup.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/MultiStartup.cs
@@ -67,13 +67,13 @@
             services.AddRazorPages();
 
             //Check whether Submodel Service Provider exists and bind it to the Submodel-Services-Controller
-            services.AddTransient(ctx =>
+            services.AddTransient<ISubmodelServiceProvider>(ctx =>
             {
                 ISubmodelServiceProvider submodelServiceProvider = ctx
                 .GetRequiredService<ISubmodelRepositoryServiceProvider>()
                 .GetSubmodelServiceProvider(submodelId);
 
-                return new SubmodelServices(submodelServiceProvider);
+                return submodelServiceProvider;
             });
 
             // Register the Swagger generator, defining one or more Swagger documents
diff --git a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/NLog.config b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/NLog.config
index 5355546..f9bb05a 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/NLog.config
+++ b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/NLog.config
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
   <targets>
-    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message}" />
+    <target name="console" xsi:type="ColoredConsole" layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}" />
     <target name="file" xsi:type="File"
-      layout="${longdate} - ${level} - ${logger} - ${message}"
+      layout="${longdate} - ${level} - ${logger} - ${message} ${exception:format=ToString,StackTrace}${newline}"
       fileName="${basedir}/logs/logfile.txt"
       keepFileOpen="true"
       maxArchiveFiles="10"
diff --git a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/Index.cshtml b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/Index.cshtml
index bdaa01e..4e11117 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/Index.cshtml
+++ b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/Index.cshtml
@@ -1,7 +1,7 @@
 @page "ui"
 @model BaSyx.Submodel.Server.Http.Pages.IndexModel
+@using BaSyx.Models.Core.AssetAdministrationShell;
 @using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-@using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 @using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 @using BaSyx.Models.Core.AssetAdministrationShell.References;
 @using BaSyx.Models.Core.Common;
@@ -204,9 +204,11 @@
 
                 @foreach (var element in eventable.DataElements)
                 {
-                    <div class="row">
-                        @{ string valueTypeName = element.Cast<IProperty>()?.ValueType?.ToString() ?? "ANY"; }
-                        <div class="col-sm-10"><b>@element.IdShort (@valueTypeName)</b></div>
+                    <div class="panel-body">
+                        <div class="row">
+                            @{ string valueTypeName = element.Cast<IProperty>()?.ValueType?.ToString() ?? "ANY"; }
+                            <div class="col-sm-10"><b>@element.IdShort (@valueTypeName)</b></div>
+                        </div>
                     </div>
                 }
             }
@@ -436,15 +438,14 @@
                 @ShowSemanticId(submodel.SemanticId)
                 <div class="panel-body">
                     <div class="panel-group">
-                        @if (submodel.SubmodelElements?.Count > 0)
+                        @if (submodel.SubmodelElements?.Count() > 0)
                         {
                             <div class="panel panel-default">
                                 <div class="panel-heading" style="background:#005691"><h4 style="color:white">Submodel-Elements</h4></div>
                                 <div class="panel-body">
                                     <div class="panel-group">
-                                        @for (int i = 0; i < submodel.SubmodelElements.Count; i++)
+                                        @foreach (var submodelElement in submodel.SubmodelElements)
                                         {
-                                            var submodelElement = submodel.SubmodelElements[i];
                                             if (submodelElement == null)
                                             { continue; }
 
diff --git a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/MultiIndex.cshtml b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/MultiIndex.cshtml
index a4b8394..1427cf1 100644
--- a/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/MultiIndex.cshtml
+++ b/sdks/dotnet/basyx-components/BaSyx.Submodel.Server.Http/Pages/MultiIndex.cshtml
@@ -1,8 +1,8 @@
 @page "multiui"
 @model BaSyx.Submodel.Server.Http.Pages.MultiIndexModel
 @using BaSyx.API.Components;
+@using BaSyx.Models.Core.AssetAdministrationShell;
 @using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-@using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 @using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 @using BaSyx.Models.Core.AssetAdministrationShell.References;
 @using BaSyx.Models.Core.Common;
@@ -368,7 +368,7 @@
 {
     ISubmodel submodel = submodelwithElement[0] as ISubmodel;
     ISubmodelElement submodelElement = submodelwithElement[1] as ISubmodelElement;
-        
+
     <div class="panel panel-warning">
         <div class="panel-heading">
             <h4 class="panel-title">
@@ -427,7 +427,7 @@
             }
             else if (submodelElement is ISubmodelElementCollection collection)
             {
-                if (collection.Value?.Count > 0)
+                if (collection.Value?.Count() > 0)
                 {
                     @foreach (var value in collection.Value)
                     {
@@ -536,15 +536,14 @@
                                 @ShowSemanticId(submodel.SemanticId)
                                 <div class="panel-body">
                                     <div class="panel-group">
-                                        @if (submodel.SubmodelElements?.Count > 0)
+                                        @if (submodel.SubmodelElements?.Count() > 0)
                                         {
                                             <div class="panel panel-default">
                                                 <div class="panel-heading" style="background:#005691"><h4 style="color:white">Submodel-Elements</h4></div>
                                                 <div class="panel-body">
                                                     <div class="panel-group">
-                                                        @for (int i = 0; i < submodel.SubmodelElements.Count; i++)
+                                                        @foreach (var submodelElement in submodel.SubmodelElements)
                                                         {
-                                                            var submodelElement = submodel.SubmodelElements[i];
                                                             if (submodelElement == null)
                                                             { continue; }
 
@@ -557,7 +556,7 @@
                                         }
                                     </div>
                                 </div>
-                            </div>                            
+                            </div>
                         </div>
                     </div>
                 </div>
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryServices.cs b/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryServices.cs
deleted file mode 100644
index 0a67a42..0000000
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellRepositoryServices.cs
+++ /dev/null
@@ -1,197 +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;
-using BaSyx.Models.Connectivity.Descriptors;
-using BaSyx.Models.Core.Common;
-
-namespace BaSyx.API.Http.Controllers
-{
-    /// <summary>
-    /// The Asset Administration Shell Repository Controller
-    /// </summary>
-    public class AssetAdministrationShellRepositoryServices : Controller, IAssetAdministrationShellRepositoryServiceProvider
-    {
-
-        private readonly IAssetAdministrationShellRepositoryServiceProvider repository;
-
-        public IEnumerable<IAssetAdministrationShell> AssetAdministrationShells => repository.AssetAdministrationShells;
-        public IAssetAdministrationShellRepositoryDescriptor ServiceDescriptor { get; }
-
-
-        public AssetAdministrationShellRepositoryServices(IAssetAdministrationShellRepositoryServiceProvider assetAdministrationShellRepositoryServiceProvider)
-        {
-            repository = assetAdministrationShellRepositoryServiceProvider;
-            ServiceDescriptor = assetAdministrationShellRepositoryServiceProvider.ServiceDescriptor;
-        }
-
-        #region REST-Interface AssetAdministrationShellRepository
-
-        /// <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 = 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 = 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 = 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 = DeleteAssetAdministrationShell(aasId);
-            return result.CreateActionResult(CrudOperation.Delete);
-        }
-
-        #endregion
-        
-        #region Helper Methods
-
-        private static IActionResult AggregateResultHandling(IResult result)
-        {
-            if (result != null)
-            {
-                var objResult = new ObjectResult(result);
-
-                if (result.Success)
-                {
-                    if (result.Entity == null)
-                        objResult.StatusCode = 404;
-                    else
-                        objResult.StatusCode = 200;
-                }
-                else if (Utils.ResultHandling.Utils.TryParseStatusCode(result, out int httpStatusCode))
-                    objResult.StatusCode = httpStatusCode;
-                else
-                    objResult.StatusCode = 502;
-
-                return objResult;
-            }
-            return new BadRequestResult();
-        }
-        #endregion
-
-        #region Interface Implementation AssetAdministrationShellRepository
-        public void RegisterAssetAdministrationShellServiceProvider(string id, IAssetAdministrationShellServiceProvider assetAdministrationShellServiceProvider)
-        {
-            repository.RegisterAssetAdministrationShellServiceProvider(id, assetAdministrationShellServiceProvider);
-        }
-
-        public IAssetAdministrationShellServiceProvider GetAssetAdministrationShellServiceProvider(string id)
-        {
-            return repository.GetAssetAdministrationShellServiceProvider(id);
-        }
-
-        public IEnumerable<IAssetAdministrationShellServiceProvider> GetAssetAdministrationShellServiceProviders()
-        {
-            return repository.GetAssetAdministrationShellServiceProviders();
-        }
-
-        public void BindTo(IEnumerable<IAssetAdministrationShell> element)
-        {
-            repository.BindTo(element);
-        }
-
-        public IEnumerable<IAssetAdministrationShell> GetBinding()
-        {
-            return repository.GetBinding();
-        }
-
-        public IResult<IAssetAdministrationShell> CreateAssetAdministrationShell(IAssetAdministrationShell aas)
-        {
-            return repository.CreateAssetAdministrationShell(aas);
-        }
-
-        public IResult<IAssetAdministrationShell> RetrieveAssetAdministrationShell(string aasId)
-        {
-            return repository.RetrieveAssetAdministrationShell(aasId);
-        }
-
-        public IResult<IElementContainer<IAssetAdministrationShell>> RetrieveAssetAdministrationShells()
-        {
-            return repository.RetrieveAssetAdministrationShells();
-        }
-
-        public IResult UpdateAssetAdministrationShell(string aasId, IAssetAdministrationShell aas)
-        {
-            return repository.UpdateAssetAdministrationShell(aasId, aas);
-        }
-
-        public IResult DeleteAssetAdministrationShell(string aasId)
-        {
-            return repository.DeleteAssetAdministrationShell(aasId);
-        }
-
-
-
-
-        #endregion
-    }
-}
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellServices.cs b/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellServices.cs
deleted file mode 100644
index 83245c7..0000000
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/AssetAdministrationShellServices.cs
+++ /dev/null
@@ -1,407 +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;
-using BaSyx.Models.Connectivity;
-using System.Linq;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using Microsoft.Extensions.DependencyInjection;
-using BaSyx.Models.Connectivity.Descriptors;
-using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
-using BaSyx.Models.Communication;
-
-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;
-        }
-
-        #region REST-Interface AssetAdministrationShell
-
-        /// <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);
-        }
-
-        #region Submodel - REST-Calls
-        /// <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);
-        }
-
-        #endregion
-
-        #endregion
-
-        #region REST-Interface Submodel
-
-        /// <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>
-        /// Retrieves all Properties from the Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Returns a list of found Properties</response>
-        /// <response code="404">Submodel not found / No Properties found</response>       
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/properties", Name = "RoutedGetProperties")]
-        [ProducesResponseType(typeof(Property[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetProperties()
-        {
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetProperties();            
-        }
-
-        /// <summary>
-        /// Retrieves all Operations from the Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel not found / No Operations found</response>      
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/operations", Name = "RoutedGetOperations")]
-        [ProducesResponseType(typeof(Operation[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetOperations()
-        {
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetOperations();
-        }
-
-        /// <summary>
-        /// Retrieves all Events from the Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel not found / No Events found</response>      
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/events", Name = "RoutedGetEvents")]
-        [ProducesResponseType(typeof(Event[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetEvents()
-        {
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetEvents();
-        }
-
-        #region SubmodelElement - REST-Calls
-        /// <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);
-        }
-        #endregion
-        #region Property - REST-Calls
-        /// <summary>
-        /// Retrieves a specific Property from the Asset Administration Shell's Submodel
-        /// </summary>
-        /// <param name="propertyIdShort">The Property's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Returns the requested Property</response>
-        /// <response code="404">Submodel / Property not found</response>     
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/properties/{propertyIdShort}", Name = "RoutedGetPropertyByIdShort")]
-        [ProducesResponseType(typeof(Property), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetPropertyByIdShort(string propertyIdShort)
-        {
-            if (string.IsNullOrEmpty(propertyIdShort))
-                return ResultHandling.NullResult(nameof(propertyIdShort));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetPropertyByIdShort(propertyIdShort);
-        }
-
-        /// <summary>
-        /// Retrieves the value of a specific Property from the Asset Administrations Shell's Submodel
-        /// </summary>
-        /// <param name="propertyIdShort">The Property's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Returns the requested Property's value</response>
-        /// <response code="404">Submodel / Property not found</response>     
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/properties/{propertyIdShort}/value", Name = "RoutedGetPropertyValueByIdShort")]
-        [ProducesResponseType(typeof(ElementValue), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetPropertyValueByIdShort(string propertyIdShort)
-        {
-            if (string.IsNullOrEmpty(propertyIdShort))
-                return ResultHandling.NullResult(nameof(propertyIdShort));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetPropertyValueByIdShort(propertyIdShort);
-        }
-
-        /// <summary>
-        /// Updates the Asset Administration Shell's Submodel's Property's value
-        /// </summary>
-        /// <param name="propertyIdShort">The Property's short id</param>
-        /// <param name="value">The new value</param>
-        /// <returns></returns>
-        /// <response code="200">Property's value changed successfully</response>
-        /// <response code="404">Submodel/Property not found</response>     
-        [HttpPut("aas/submodels/{submodelIdShort}/submodel/properties/{propertyIdShort}/value", Name = "RoutedPutPropertyValueByIdShort")]
-        [ProducesResponseType(typeof(ElementValue), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedPutPropertyValueByIdShort(string propertyIdShort, [FromBody] IValue value)
-        {
-            if (string.IsNullOrEmpty(propertyIdShort))
-                return ResultHandling.NullResult(nameof(propertyIdShort));
-            if (value == null)
-                return ResultHandling.NullResult(nameof(value));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.PutPropertyValueByIdShort(propertyIdShort, value);
-        }
-
-        #endregion
-        #region Operation - REST-Calls
-        /// <summary>
-        /// Retrieves a specific Operation from the Asset Administration Shell's Submodel
-        /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel / Operation not found</response>     
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/operations/{operationIdShort}", Name = "RoutedGetOperationByIdShort")]
-        [ProducesResponseType(typeof(Operation), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetOperationByIdShort(string operationIdShort)
-        {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetOperationByIdShort(operationIdShort);
-        }
-        /// <summary>
-        /// Synchronously invokes a specific operation from the Submodel
-        /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</param>
-        /// <param name="invocationRequest">The parameterized request object for the invocation</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/operations/{operationIdShort}", Name = "RoutedInvokeOperationByIdShort")]
-        [ProducesResponseType(typeof(InvocationResponse), 200)]
-        [ProducesResponseType(typeof(Result), 400)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedInvokeOperationByIdShort(string operationIdShort, [FromBody] InvocationRequest invocationRequest)
-        {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
-            if (invocationRequest == null)
-                return ResultHandling.NullResult(nameof(invocationRequest));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.InvokeOperationByIdShort(operationIdShort, invocationRequest);
-        }
-
-        #endregion
-        #region Event - REST-Calls
-        /// <summary>
-        /// Retrieves a specific event from the Asset Administration Shell's Submodel
-        /// </summary>
-        /// <param name="eventIdShort">The Event's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel/Event not found</response>     
-        [HttpGet("aas/submodels/{submodelIdShort}/submodel/events/{eventIdShort}", Name = "RoutedGetEventByIdShort")]
-        [ProducesResponseType(typeof(Event), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult RoutedGetEventByIdShort(string eventIdShort)
-        {
-            if (string.IsNullOrEmpty(eventIdShort))
-                return ResultHandling.NullResult(nameof(eventIdShort));
-
-            var controller = HttpContext.RequestServices.GetService<SubmodelServices>();
-            return controller.GetEventByIdShort(eventIdShort);
-        }
-        #endregion
-        #endregion
-
-        #region Helper Methods
-
-        #endregion
-    }
-}
diff --git a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs b/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs
deleted file mode 100644
index 7a98690..0000000
--- a/sdks/dotnet/basyx-core/BaSyx.API.Http.Controllers/AssetAdministrationShell/SubmodelServices.cs
+++ /dev/null
@@ -1,405 +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 System;
-using Newtonsoft.Json.Linq;
-using BaSyx.Models.Extensions;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
-using BaSyx.Models.Core.Common;
-using BaSyx.Models.Communication;
-
-namespace BaSyx.API.Http.Controllers
-{
-    /// <summary>
-    /// All Asset Administration Shell Services provided by the component
-    /// </summary>
-    public class SubmodelServices : Controller
-    {
-        private readonly ISubmodelServiceProvider serviceProvider;
-
-        /// <summary>
-        /// Constructor for the Submodel Services Controller
-        /// </summary>
-        /// <param name="submodelServiceProvider">The Submodel Service Provider implementation provided by the dependency injection</param>
-        public SubmodelServices(ISubmodelServiceProvider submodelServiceProvider)
-        {
-            serviceProvider = submodelServiceProvider;
-        }
-
-        #region REST-Interface Submodel
-
-
-        /// <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>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel not found</response>   
-        [HttpGet("submodel/table", Name = "GetSubmodelAsTable")]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodelAsTable([FromQuery] string columns)
-        {
-            if (string.IsNullOrEmpty(columns))
-                return ResultHandling.NullResult(nameof(columns));
-
-            var result = serviceProvider.RetrieveSubmodel();
-            if (result != null && result.Entity != null)
-            {
-                string[] columnNames = columns.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
-                JToken customizedSubmodel = result.Entity.CustomizeSubmodel(columnNames);
-                return new JsonResult(customizedSubmodel);
-            }
-
-            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 GetMinimizedSubmodel()
-        {
-            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 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>       
-        [HttpGet("submodel/submodelElements", Name = "GetSubmodelElements")]
-        [ProducesResponseType(typeof(SubmodelElement[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodelElements()
-        {
-            var result = serviceProvider.RetrieveSubmodelElements();
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Retrieves all Properties from the current Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Returns a list of found Properties</response>
-        /// <response code="404">Submodel not found</response>       
-        [HttpGet("submodel/properties", Name = "GetProperties")]
-        [ProducesResponseType(typeof(Property[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetProperties()
-        {
-            var result = serviceProvider.RetrieveProperties();
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Retrieves all Operations from the current Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel not found</response>      
-        [HttpGet("submodel/operations", Name = "GetOperations")]
-        [ProducesResponseType(typeof(Operation[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetOperations()
-        {
-            var result = serviceProvider.RetrieveOperations();
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Retrieves all Events from the current Submodel
-        /// </summary>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel not found</response>      
-        [HttpGet("submodel/events", Name = "GetEvents")]
-        [ProducesResponseType(typeof(Event[]), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetEvents()
-        {
-            var result = serviceProvider.RetrieveEvents();
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-
-        #region SubmodelElement - REST-Calls
-        /// <summary>
-        /// Adds a new Submodel-Element to the Submodel
-        /// </summary>
-        /// <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")]
-        [ProducesResponseType(typeof(SubmodelElement), 201)]
-        [ProducesResponseType(typeof(Result), 400)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult PutSubmodelElement([FromBody] ISubmodelElement submodelElement)
-        {
-            if(submodelElement == null)
-                return ResultHandling.NullResult(nameof(submodelElement));
-
-            var result = serviceProvider.CreateSubmodelElement(submodelElement);
-            return result.CreateActionResult(CrudOperation.Create, "submodel/submodelElements/" + submodelElement.IdShort);
-        }
-                
-
-        /// <summary>
-        /// Retrieves a specific Submodel-Element from the 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("submodel/submodelElements/{*submodelElementIdShort}", Name = "GetSubmodelElementByIdShort")]
-        [ProducesResponseType(typeof(Property), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetSubmodelElementByIdShort(string submodelElementIdShort)
-        {
-            if (string.IsNullOrEmpty(submodelElementIdShort))
-                return ResultHandling.NullResult(nameof(submodelElementIdShort));
-
-            var result = serviceProvider.RetrieveSubmodelElement(submodelElementIdShort);                     
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Deletes a specific Submodel-Element from the 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 / Submodel-Element not found</response>
-        [HttpDelete("submodel/submodelElements/{*submodelElementIdShort}", Name = "DeleteSubmodelElementByIdShort")]
-        [ProducesResponseType(typeof(Result), 200)]
-        public IActionResult DeleteSubmodelElementByIdShort(string submodelElementIdShort)
-        {
-            if (string.IsNullOrEmpty(submodelElementIdShort))
-                return ResultHandling.NullResult(nameof(submodelElementIdShort));
-
-            var result = serviceProvider.DeleteSubmodelElement(submodelElementIdShort);
-            return result.CreateActionResult(CrudOperation.Delete);
-        }
-        #endregion
-        /// <summary>
-        /// Retrieves a specific Property from the Asset Administrations's Submodel
-        /// </summary>
-        /// <param name="propertyIdShort">The Property's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Returns the requested Property</response>
-        /// <response code="404">Submodel / Property not found</response>     
-        [HttpGet("submodel/properties/{propertyIdShort}", Name = "GetPropertyByIdShort")]
-        [ProducesResponseType(typeof(Property), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetPropertyByIdShort(string propertyIdShort)
-        {
-            if (string.IsNullOrEmpty(propertyIdShort))
-                return ResultHandling.NullResult(nameof(propertyIdShort));
-
-            var result = serviceProvider.RetrieveProperty(propertyIdShort);
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Retrieves the value of a specific Property from the Asset Administrations Shell's Submodel
-        /// </summary>
-        /// <param name="propertyIdShort">The Property's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Returns the requested Property's value</response>
-        /// <response code="404">Submodel / Property not found</response>     
-        [HttpGet("submodel/properties/{propertyIdShort}/value", Name = "GetPropertyValueByIdShort")]
-        [ProducesResponseType(typeof(ElementValue), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetPropertyValueByIdShort(string propertyIdShort)
-        {
-            if (string.IsNullOrEmpty(propertyIdShort))
-                return ResultHandling.NullResult(nameof(propertyIdShort));
-
-            var result = serviceProvider.RetrievePropertyValue(propertyIdShort);
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        /// <summary>
-        /// Updates the Asset Administration Shell's Submodel's Property
-        /// </summary>
-        /// <param name="propertyIdShort">The Property's short id</param>
-        /// <param name="value">The new value</param>
-        /// <returns></returns>
-        /// <response code="200">Property's value changed successfully</response>
-        /// <response code="404">Submodel / Property not found</response>     
-        [HttpPut("submodel/properties/{propertyIdShort}/value", Name = "PutPropertyValueByIdShort")]
-        [ProducesResponseType(typeof(ElementValue), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult PutPropertyValueByIdShort(string propertyIdShort, [FromBody] IValue value)
-        {
-            if (string.IsNullOrEmpty(propertyIdShort))
-                return ResultHandling.NullResult(nameof(propertyIdShort));
-
-            var result = serviceProvider.UpdatePropertyValue(propertyIdShort, value);
-            return result.CreateActionResult(CrudOperation.Update);
-        }
-
-        #endregion
-        #region Operation - REST-Calls
-        /// <summary>
-        /// Retrieves a specific Operation from the Asset Administration Shell's Submodel
-        /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel / Operation not found</response>     
-        [HttpGet("submodel/operations/{operationIdShort}", Name = "GetOperationByIdShort")]
-        [ProducesResponseType(typeof(Operation), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetOperationByIdShort(string operationIdShort)
-        {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
-
-            var result = serviceProvider.RetrieveOperation(operationIdShort);
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-        /// <summary>
-        /// Synchronously invokes a specific operation from the Submodel
-        /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</param>
-        /// <param name="invocationRequest">The parameterized request object for the invocation</param>
-        /// <returns></returns>
-        /// <response code="200">Operation invoked successfully</response>
-        /// <response code="400">Bad Request</response>
-        /// <response code="404">Submodel / Operation not found</response>
-        [HttpPost("submodel/operations/{operationIdShort}", Name = "InvokeOperationByIdShort")]
-        [ProducesResponseType(typeof(InvocationResponse), 200)]
-        [ProducesResponseType(typeof(Result), 400)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult InvokeOperationByIdShort(string operationIdShort, [FromBody] InvocationRequest invocationRequest)
-        {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
-            if (invocationRequest == null)
-                return ResultHandling.NullResult(nameof(invocationRequest));
-
-            IResult<InvocationResponse> result = serviceProvider.InvokeOperation(operationIdShort, invocationRequest);
-            return result.CreateActionResult(CrudOperation.Invoke);
-        }
-
-        /// <summary>
-        /// Asynchronously invokes a specific operation from the Submodel
-        /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</param>
-        /// <param name="invocationRequest">The parameterized request object for the invocation</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/operations/{operationIdShort}/async", Name = "InvokeOperationByIdShortAsync")]
-        [ProducesResponseType(typeof(CallbackResponse), 200)]
-        [ProducesResponseType(typeof(Result), 400)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult InvokeOperationByIdShortAsync(string operationIdShort, [FromBody] InvocationRequest invocationRequest)
-        {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
-            if (invocationRequest == null)
-                return ResultHandling.NullResult(nameof(invocationRequest));
-
-            IResult<CallbackResponse> result = serviceProvider.InvokeOperationAsync(operationIdShort, invocationRequest);
-            return result.CreateActionResult(CrudOperation.Invoke);
-        }
-
-        /// <summary>
-        /// Retrieves the result of an asynchronously started operation
-        /// </summary>
-        /// <param name="operationIdShort">The Operation's short id</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/operations/{operationIdShort}/invocationList/{requestId}", Name = "GetInvocationResultByIdShort")]
-        [ProducesResponseType(typeof(InvocationResponse), 200)]
-        [ProducesResponseType(typeof(Result), 400)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetInvocationResultByIdShort(string operationIdShort, string requestId)
-        {
-            if (string.IsNullOrEmpty(operationIdShort))
-                return ResultHandling.NullResult(nameof(operationIdShort));
-            if (string.IsNullOrEmpty(requestId))
-                return ResultHandling.NullResult(nameof(requestId));
-
-            IResult<InvocationResponse> result = serviceProvider.GetInvocationResult(operationIdShort, requestId);
-            return result.CreateActionResult(CrudOperation.Invoke);
-        }
-
-        #endregion
-        #region Event - REST-Calls
-        /// <summary>
-        /// Retrieves a specific event from the Asset Administration Shell's Submodel
-        /// </summary>
-        /// <param name="eventIdShort">The Event's short id</param>
-        /// <returns></returns>
-        /// <response code="200">Success</response>
-        /// <response code="404">Submodel / Event not found</response>     
-        [HttpGet("submodel/events/{eventIdShort}", Name = "GetEventByIdShort")]
-        [ProducesResponseType(typeof(Event), 200)]
-        [ProducesResponseType(typeof(Result), 404)]
-        public IActionResult GetEventByIdShort(string eventIdShort)
-        {
-            if (string.IsNullOrEmpty(eventIdShort))
-                return ResultHandling.NullResult(nameof(eventIdShort));
-
-            var result = serviceProvider.RetrieveEvent(eventIdShort);
-            return result.CreateActionResult(CrudOperation.Retrieve);
-        }
-
-        #endregion
-
-        #region Helper Methods
-
-
-        #endregion
-    }
-}
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/EventHandler.cs b/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/EventHandler.cs
index a4e2f4a..4aec42e 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/EventHandler.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/EventHandler.cs
@@ -9,7 +9,7 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.API.Components;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 
 namespace BaSyx.API.AssetAdministrationShell
 {
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/Extensions/AssetAdministrationShellExtensions.cs b/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/Extensions/AssetAdministrationShellExtensions.cs
index 7c043f8..e5932ad 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/Extensions/AssetAdministrationShellExtensions.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/Extensions/AssetAdministrationShellExtensions.cs
@@ -10,6 +10,7 @@
 *******************************************************************************/
 using BaSyx.API.Components;
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using System.Linq;
 
 namespace BaSyx.API.AssetAdministrationShell.Extensions
 {
@@ -19,8 +20,8 @@
         {
             InternalAssetAdministationShellServiceProvider sp = new InternalAssetAdministationShellServiceProvider(aas);            
 
-            if(includeSubmodels && aas.Submodels?.Count > 0)
-                foreach (var submodel in aas.Submodels)
+            if(includeSubmodels && aas.Submodels?.Count() > 0)
+                foreach (var submodel in aas.Submodels.Values)
                 {
                     var submodelSp = submodel.CreateServiceProvider();
                     sp.RegisterSubmodelServiceProvider(submodel.IdShort, submodelSp);
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/PropertyHandler.cs b/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/PropertyHandler.cs
deleted file mode 100644
index a704a95..0000000
--- a/sdks/dotnet/basyx-core/BaSyx.API/AssetAdministrationShell/PropertyHandler.cs
+++ /dev/null
@@ -1,35 +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 BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
-using System.Reflection;
-
-namespace BaSyx.API.AssetAdministrationShell
-{
-    public class PropertyHandler
-    {
-        public GetPropertyValueHandler GetHandler { get; }
-        public SetPropertyValueHandler SetHandler { get; private set; }
-        public PropertyHandler(GetPropertyValueHandler getHandler, SetPropertyValueHandler setHandler)
-        {
-            GetHandler = getHandler;
-            SetHandler = setHandler;
-        }
-
-        public PropertyHandler(MethodInfo getMethodInfo, MethodInfo setMethodInfo, object target)
-        {
-            if(getMethodInfo != null)
-                GetHandler = (GetPropertyValueHandler)getMethodInfo.CreateDelegate(typeof(GetPropertyValueHandler), target);
-            if(setMethodInfo != null)
-                SetHandler = (SetPropertyValueHandler)setMethodInfo.CreateDelegate(typeof(SetPropertyValueHandler), target);
-        }
-    }
-
-}
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Clients/ISubmodelClient.cs b/sdks/dotnet/basyx-core/BaSyx.API/Clients/ISubmodelClient.cs
index 1632dee..1a57f48 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Clients/ISubmodelClient.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Clients/ISubmodelClient.cs
@@ -11,7 +11,6 @@
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Utils.ResultHandling;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Communication;
 
 namespace BaSyx.API.Clients
@@ -20,57 +19,42 @@
     {
         IResult<ISubmodel> RetrieveSubmodel();
 
-        #region SubmodelElement - CRUD-Operations
-        IResult<ISubmodelElement> CreateSubmodelElement(ISubmodelElement submodelElement);
+        IResult<ISubmodelElement> CreateSubmodelElement(string rootSubmodelElementPath, ISubmodelElement submodelElement);
 
         IResult<IElementContainer<ISubmodelElement>> RetrieveSubmodelElements();
 
-        IResult<ISubmodelElement> RetrieveSubmodelElement(string submodelElementId);
+        IResult<ISubmodelElement> RetrieveSubmodelElement(string pathToSubmodelElement);
 
-        IResult<IValue> RetrieveSubmodelElementValue(string submodelElementId);
+        IResult<IValue> RetrieveSubmodelElementValue(string pathToSubmodelElement);
 
-        IResult UpdateSubmodelElement(string submodelElementId, ISubmodelElement submodelElement);
+        IResult UpdateSubmodelElementValue(string pathToSubmodelElement, IValue value);
 
-        IResult DeleteSubmodelElement(string submodelElementId);
-        #endregion
+        IResult UpdateSubmodelElement(string pathToSubmodelElement, ISubmodelElement submodelElement);
 
-        #region Operation - CRUD-Operations
-        IResult<IOperation> CreateOperation(IOperation operation);
+        IResult DeleteSubmodelElement(string pathToSubmodelElement);
 
-        IResult<IElementContainer<IOperation>> RetrieveOperations();
+        /// <summary>
+        /// Invokes a specific Operation synchronously
+        /// </summary>
+        /// <param name="pathToOperation">IdShort-Path to the Operation</param>
+        /// <param name="invocationRequest">Request-Parameters for the invocation</param>
+        /// <returns></returns>
+        IResult<InvocationResponse> InvokeOperation(string pathToOperation, InvocationRequest invocationRequest);
 
-        IResult<IOperation> RetrieveOperation(string operationId);
+        /// <summary>
+        /// Invokes a specific Operation asynchronously
+        /// </summary>
+        /// <param name="pathToOperation">IdShort-Path to the Operation</param>
+        /// <param name="invocationRequest">Request-Parameters for the invocation</param>
+        /// <returns></returns>
+        IResult<CallbackResponse> InvokeOperationAsync(string pathToOperation, InvocationRequest invocationRequest);
 
-        IResult DeleteOperation(string operationId);
-
-        IResult<InvocationResponse> InvokeOperation(string operationId, InvocationRequest invocationRequest);
-        IResult<CallbackResponse> InvokeOperationAsync(string operationId, InvocationRequest invocationRequest);
-        IResult<InvocationResponse> GetInvocationResult(string operationId, string requestId);
-
-        #endregion
-
-        #region Property - CRUD-Operations
-        IResult<IProperty> CreateProperty(IProperty property);
-
-        IResult<IElementContainer<IProperty>> RetrieveProperties();
-
-        IResult<IProperty> RetrieveProperty(string propertyId);
-
-        IResult<IValue> RetrievePropertyValue(string propertyId);
-
-        IResult UpdatePropertyValue(string propertyId, IValue propertyValue);
-
-        IResult DeleteProperty(string propertyId);
-        #endregion
-
-        #region Event - CRUD-Operations
-        IResult<IEvent> CreateEvent(IEvent eventable);
-
-        IResult<IElementContainer<IEvent>> RetrieveEvents();
-
-        IResult<IEvent> RetrieveEvent(string eventId);
-
-        IResult DeleteEvent(string eventId);
-        #endregion
+        /// <summary>
+        /// Returns the Invocation Result of specific Operation
+        /// </summary>
+        /// <param name="pathToOperation">IdShort-Path to the Operation</param>
+        /// <param name="requestId">Request-Id</param>
+        /// <returns></returns>
+        IResult<InvocationResponse> GetInvocationResult(string pathToOperation, string requestId);
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellRepositoryServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellRepositoryServiceProvider.cs
index 2152cae..68c4518 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellRepositoryServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellRepositoryServiceProvider.cs
@@ -129,7 +129,7 @@
 
         public IResult<IElementContainer<IAssetAdministrationShell>> RetrieveAssetAdministrationShells()
         {
-            return new Result<IElementContainer<IAssetAdministrationShell>>(true, new ElementContainer<IAssetAdministrationShell>(AssetAdministrationShells));
+            return new Result<IElementContainer<IAssetAdministrationShell>>(true, new ElementContainer<IAssetAdministrationShell>(null, AssetAdministrationShells));
         }
 
         public IResult UpdateAssetAdministrationShell(string aasId, IAssetAdministrationShell aas)
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellServiceProvider.cs
index 1625421..57a16fd 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/AssetAdministrationShellServiceProvider.cs
@@ -19,9 +19,35 @@
 {
     public abstract class AssetAdministrationShellServiceProvider : IAssetAdministrationShellServiceProvider, ISubmodelServiceProviderRegistry
     {
-        public abstract IAssetAdministrationShell AssetAdministrationShell { get; protected set; }
+        private IAssetAdministrationShell _assetAdministrationShell;
+
+        /// <summary>
+        /// Stores the Asset Administration Shell built by the BuildAssetAdministationShell() function
+        /// </summary>
+        public virtual IAssetAdministrationShell AssetAdministrationShell 
+        { 
+            get
+            {
+                if (_assetAdministrationShell == null)
+                {
+                    IAssetAdministrationShell assetAdministrationShell = BuildAssetAdministrationShell();
+                    BindTo(assetAdministrationShell);
+                }
+                return _assetAdministrationShell;
+            }
+        }
+        /// <summary>
+        /// Custom function to build the Asset Administration Shell to be provided by the ServiceProvider. 
+        /// Within this function you can import data (e.g. from AASX-packages, databases, etc.) to build your Asset Administration Shell.
+        /// </summary>
+        /// <returns>The built Asset Administration Shell</returns>
+        public abstract IAssetAdministrationShell BuildAssetAdministrationShell();
 
         private IAssetAdministrationShellDescriptor _serviceDescriptor;
+        
+        /// <summary>
+        /// The Asset Administration Shell Descriptor containing the information to register the Service Provider at the next higher instance (e.g. AssetAdministrationShellRepository, AssetAdministrationShellRegistry)
+        /// </summary>
         public IAssetAdministrationShellDescriptor ServiceDescriptor
         {
             get
@@ -29,7 +55,7 @@
                 if (_serviceDescriptor == null)
                     _serviceDescriptor = new AssetAdministrationShellDescriptor(AssetAdministrationShell, null);
 
-                if (_serviceDescriptor.SubmodelDescriptors?.Count == 0 && SubmodelServiceProviders != null)
+                if (_serviceDescriptor.SubmodelDescriptors?.Count() == 0 && SubmodelServiceProviders != null)
                     foreach (var submodelServiceProvider in SubmodelServiceProviders)
                     {
                         if (submodelServiceProvider.Value?.ServiceDescriptor != null)
@@ -46,27 +72,26 @@
         public ISubmodelServiceProviderRegistry SubmodelRegistry => this;
         private Dictionary<string, ISubmodelServiceProvider> SubmodelServiceProviders { get; } = new Dictionary<string, ISubmodelServiceProvider>();
 
-        public AssetAdministrationShellServiceProvider(IAssetAdministrationShellDescriptor assetAdministrationShellDescriptor) : this()
+        /// <summary>
+        /// Base implementation for IAssetAdministrationShellServiceProvider
+        /// </summary>
+        protected AssetAdministrationShellServiceProvider()
+        { }
+
+        protected AssetAdministrationShellServiceProvider(IAssetAdministrationShellDescriptor assetAdministrationShellDescriptor) : this()
         {
             ServiceDescriptor = assetAdministrationShellDescriptor;
         }
-        public AssetAdministrationShellServiceProvider(IAssetAdministrationShell assetAdministrationShell)
+
+        protected AssetAdministrationShellServiceProvider(IAssetAdministrationShell assetAdministrationShell)
         {
             BindTo(assetAdministrationShell);
         }
 
-        public AssetAdministrationShellServiceProvider()
-        {
-            AssetAdministrationShell = GenerateAssetAdministrationShell();
-            BindTo(AssetAdministrationShell);
-        }
-
-        public abstract IAssetAdministrationShell GenerateAssetAdministrationShell();
-
         public virtual void BindTo(IAssetAdministrationShell element)
         {
-            AssetAdministrationShell = element;
-            ServiceDescriptor = ServiceDescriptor ?? new AssetAdministrationShellDescriptor(element, null);
+            _assetAdministrationShell = element;
+            ServiceDescriptor = ServiceDescriptor ?? new AssetAdministrationShellDescriptor(_assetAdministrationShell, null);
         }
         public virtual IAssetAdministrationShell GetBinding()
         {
@@ -75,7 +100,7 @@
 
         public virtual void UseDefaultSubmodelServiceProvider()
         {
-            foreach (var submodel in AssetAdministrationShell.Submodels)
+            foreach (var submodel in AssetAdministrationShell.Submodels.Values)
             {
                 var submodelServiceProvider = submodel.CreateServiceProvider();
                 RegisterSubmodelServiceProvider(submodel.IdShort, submodelServiceProvider);
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/DefaultEndpointRegistration.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/DefaultEndpointRegistration.cs
index b10416d..c3fd940 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/DefaultEndpointRegistration.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/DefaultEndpointRegistration.cs
@@ -130,7 +130,7 @@
 
             serviceProvider.ServiceDescriptor.AddEndpoints(repositoryEndpoints);
             var aasRepositoryDescriptor = serviceProvider.ServiceDescriptor;
-            foreach (var aasDescriptor in aasRepositoryDescriptor.AssetAdministrationShellDescriptors)
+            foreach (var aasDescriptor in aasRepositoryDescriptor.AssetAdministrationShellDescriptors.Values)
             {
                 List<IEndpoint> aasEndpoints = new List<IEndpoint>();
                 foreach (var endpoint in repositoryEndpoints)
@@ -140,7 +140,7 @@
                 }
                 aasDescriptor.AddEndpoints(aasEndpoints);
 
-                foreach (var submodelDescriptor in aasDescriptor.SubmodelDescriptors)
+                foreach (var submodelDescriptor in aasDescriptor.SubmodelDescriptors.Values)
                 {
                     List<IEndpoint> submodelEndpoints = new List<IEndpoint>();
                     foreach (var endpoint in aasEndpoints)
@@ -167,7 +167,7 @@
 
             serviceProvider.ServiceDescriptor.AddEndpoints(repositoryEndpoints);
             var submodelRepositoryDescriptor = serviceProvider.ServiceDescriptor;
-            foreach (var submodelDescriptor in submodelRepositoryDescriptor.SubmodelDescriptors)
+            foreach (var submodelDescriptor in submodelRepositoryDescriptor.SubmodelDescriptors.Values)
             {
                 List<IEndpoint> submodelEndpoints = new List<IEndpoint>();
                 foreach (var endpoint in repositoryEndpoints)
@@ -193,7 +193,7 @@
 
             serviceProvider.ServiceDescriptor.AddEndpoints(aasEndpoints);
             var aasDescriptor = serviceProvider.ServiceDescriptor;
-            foreach (var submodel in aasDescriptor.SubmodelDescriptors)
+            foreach (var submodel in aasDescriptor.SubmodelDescriptors.Values)
             {
                 List<IEndpoint> spEndpoints = new List<IEndpoint>();
                 foreach (var endpoint in aasEndpoints)
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/DistributedSubmodelServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/DistributedSubmodelServiceProvider.cs
index eb36e40..93975da 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/DistributedSubmodelServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/DistributedSubmodelServiceProvider.cs
@@ -16,7 +16,6 @@
 using System;
 using BaSyx.Models.Connectivity.Descriptors;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Communication;
 
 namespace BaSyx.API.Components
@@ -50,22 +49,22 @@
             throw new NotImplementedException();
         }
 
-        public PropertyHandler RetrievePropertyHandler(string propertyId)
+        public SubmodelElementHandler RetrieveSubmodelElementHandler(string submodelElementIdShort)
         {
             throw new NotImplementedException();
         }
 
-        public void RegisterPropertyHandler(string propertyId, PropertyHandler handler)
+        public void RegisterSubmodelElementHandler(string submodelElementIdShort, SubmodelElementHandler handler)
         {
             throw new NotImplementedException();
         }
 
-        public Delegate RetrieveMethodDelegate(string operationId)
+        public MethodCalledHandler RetrieveMethodCalledHandler(string pathToOperation)
         {
             throw new NotImplementedException();
         }
 
-        public void RegisterMethodCalledHandler(string operationId, Delegate handler)
+        public void RegisterMethodCalledHandler(string pathToOperation, MethodCalledHandler methodCalledHandler)
         {
             throw new NotImplementedException();
         }
@@ -91,81 +90,12 @@
         {
             return submodelClient.RetrieveSubmodel();
         }
-
-        public IResult<IOperation> CreateOperation(IOperation operation)
-        {
-            return submodelClient.CreateOperation(operation);
-        }
-
-        public IResult<IElementContainer<IOperation>> RetrieveOperations()
-        {
-            return submodelClient.RetrieveOperations();
-        }
-
-        public IResult<IOperation> RetrieveOperation(string operationId)
-        {
-            return submodelClient.RetrieveOperation(operationId);
-        }
-
-        public IResult DeleteOperation(string operationId)
-        {
-            return submodelClient.DeleteOperation(operationId);
-        }
-
+        
         public IResult<InvocationResponse> InvokeOperation(string operationId, InvocationRequest invocationRequest)
         {
             return submodelClient.InvokeOperation(operationId, invocationRequest);
         }
-
-        public IResult<IProperty> CreateProperty(IProperty Property)
-        {
-            return submodelClient.CreateProperty(Property);
-        }
-
-        public IResult<IElementContainer<IProperty>> RetrieveProperties()
-        {
-            return submodelClient.RetrieveProperties();
-        }
-
-        public IResult<IProperty> RetrieveProperty(string propertyId)
-        {
-            return submodelClient.RetrieveProperty(propertyId);
-        }
-
-        public IResult<IValue> RetrievePropertyValue(string propertyId)
-        {
-            return submodelClient.RetrievePropertyValue(propertyId);
-        }
-
-        public IResult UpdatePropertyValue(string propertyId, IValue value)
-        {
-            return submodelClient.UpdatePropertyValue(propertyId, value);
-        }
-
-        public IResult DeleteProperty(string propertyId)
-        {
-            return submodelClient.DeleteProperty(propertyId);
-        }
-
-        public IResult<IEvent> CreateEvent(IEvent eventable)
-        {
-            return submodelClient.CreateEvent(eventable);
-        }
-
-        public IResult<IElementContainer<IEvent>> RetrieveEvents()
-        {
-            return submodelClient.RetrieveEvents();
-        }
-
-        public IResult<IEvent> RetrieveEvent(string eventId)
-        {
-            return submodelClient.RetrieveEvent(eventId);
-        }
-
-        public IResult DeleteEvent(string eventId)
-        {
-            return submodelClient.DeleteEvent(eventId);
-        }
+        
 
         public IResult ThrowEvent(IPublishableEvent publishableEvent, string topic, Action<IMessagePublishedEventArgs> MessagePublished, byte qosLevel, bool retain)
         {
@@ -187,9 +117,9 @@
             throw new NotImplementedException();
         }
 
-        public IResult<ISubmodelElement> CreateSubmodelElement(ISubmodelElement submodelElement)
+        public IResult<ISubmodelElement> CreateSubmodelElement(string rootSubmodelElementPath, ISubmodelElement submodelElement)
         {
-            return submodelClient.CreateSubmodelElement(submodelElement);
+            return submodelClient.CreateSubmodelElement(rootSubmodelElementPath, submodelElement);
         }
 
         public IResult<IElementContainer<ISubmodelElement>> RetrieveSubmodelElements()
@@ -226,5 +156,10 @@
         {
             return submodelClient.GetInvocationResult(operationId, requestId);
         }
+
+        public IResult UpdateSubmodelElementValue(string submodelElementId, IValue value)
+        {
+            return submodelClient.UpdateSubmodelElementValue(submodelElementId, value);
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/ISubmodelServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/ISubmodelServiceProvider.cs
index 683c5c4..c2fb3eb 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/ISubmodelServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/ISubmodelServiceProvider.cs
@@ -15,23 +15,79 @@
 using BaSyx.API.AssetAdministrationShell;
 using BaSyx.API.Clients;
 using BaSyx.Models.Connectivity.Descriptors;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.Common;
 
 namespace BaSyx.API.Components
 {
+    /// <summary>
+    /// Provides basic functions for a Submodel
+    /// </summary>
     public interface ISubmodelServiceProvider : IServiceProvider<ISubmodel, ISubmodelDescriptor>, ISubmodelClient
     {
-        void SubscribeUpdates(string propertyId, Action<IValue> updateFunction);
-        void PublishUpdate(string propertyId, IValue value);
+        /// <summary>
+        /// Subscribe to value updates of a specific SubmodelElement
+        /// </summary>
+        /// <param name="pathToSubmodelElement">IdShort-Path to the SubmodelElement</param>
+        /// <param name="updateFunction">Callback function</param>
+        void SubscribeUpdates(string pathToSubmodelElement, Action<IValue> updateFunction);
+
+        /// <summary>
+        /// Publishes value updates to subscribers
+        /// </summary>
+        /// <param name="pathToSubmodelElement">IdShort-Path to the SubmodelElement</param>
+        /// <param name="value">New value</param>
+        void PublishUpdate(string pathToSubmodelElement, IValue value);
+
+        /// <summary>
+        /// Throws an Event
+        /// </summary>
+        /// <param name="publishableEvent">The event to publish</param>
+        /// <param name="topic">Message-Topic (default=/)</param>
+        /// <param name="MessagePublished">Message-Published-Callback (default=null)</param>
+        /// <param name="qosLevel">QoS Level of the event to be sent (default=2)</param>
+        /// <param name="retain">Shall the event be persisted at the Message Broker? (default=false)</param>
+        /// <returns></returns>
         IResult ThrowEvent(IPublishableEvent publishableEvent, string topic, Action<IMessagePublishedEventArgs> MessagePublished, byte qosLevel, bool retain);
 
+        /// <summary>
+        /// Returns the SubmodelElementHandler for a specific SubmodelElement
+        /// </summary>
+        /// <param name="pathToElement">IdShort-Path to the SubmodelElement</param>
+        /// <returns></returns>
+        SubmodelElementHandler RetrieveSubmodelElementHandler(string pathToElement);
 
-        PropertyHandler RetrievePropertyHandler(string propertyId);
-        void RegisterPropertyHandler(string propertyId, PropertyHandler handler);
-        Delegate RetrieveMethodDelegate(string operationId);
-        void RegisterMethodCalledHandler(string operationId, Delegate handler);
-        void RegisterEventDelegate(string eventId, EventDelegate handler);
+        /// <summary>
+        /// Registers a new SubmodelElementHandler for a specific SubmodelElement
+        /// </summary>
+        /// <param name="pathToElement">IdShort-Path to the SubmodelElement</param>
+        /// <param name="elementHandler">SubmodelElementHandler</param>
+        void RegisterSubmodelElementHandler(string pathToElement, SubmodelElementHandler elementHandler);
+
+        /// <summary>
+        /// Returns the MethodCalledHandler for a specific Operation
+        /// </summary>
+        /// <param name="pathToOperation">IdShort-Path to the Operation</param>
+        /// <returns></returns>
+        MethodCalledHandler RetrieveMethodCalledHandler(string pathToOperation);
+
+        /// <summary>
+        /// Registers a new MethodCalledHandler for a specific Operation
+        /// </summary>
+        /// <param name="pathToOperation">IdShort-Path to the Operation</param>
+        /// <param name="methodCalledHandler">MethodCalledHandler</param>
+        void RegisterMethodCalledHandler(string pathToOperation, MethodCalledHandler methodCalledHandler);
+
+        /// <summary>
+        /// Registers a new EventDelegate for a specific Event
+        /// </summary>
+        /// <param name="pathToEvent">IdShort-Path to the Event</param>
+        /// <param name="eventDelegate">EventDelegate</param>
+        void RegisterEventDelegate(string pathToEvent, EventDelegate eventDelegate);
+
+        /// <summary>
+        /// Configures the SubmodelServiceProvider with a MessageClient for the Events
+        /// </summary>
+        /// <param name="messageClient">MessageClient</param>
         void ConfigureEventHandler(IMessageClient messageClient);
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalAssetAdministationShellServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalAssetAdministationShellServiceProvider.cs
index a5f960b..acfb941 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalAssetAdministationShellServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalAssetAdministationShellServiceProvider.cs
@@ -14,15 +14,10 @@
 {
     internal sealed class InternalAssetAdministationShellServiceProvider : AssetAdministrationShellServiceProvider
     {
-
         internal InternalAssetAdministationShellServiceProvider(IAssetAdministrationShell aas) : base(aas)
-        {
-            AssetAdministrationShell = aas;
-        }
+        { }
 
-        public override IAssetAdministrationShell AssetAdministrationShell { get; protected set; }
-
-        public override IAssetAdministrationShell GenerateAssetAdministrationShell()
+        public override IAssetAdministrationShell BuildAssetAdministrationShell()
         {
             return AssetAdministrationShell;
         }
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalSubmodelServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalSubmodelServiceProvider.cs
index 9443034..51562e6 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalSubmodelServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/InternalSubmodelServiceProvider.cs
@@ -16,7 +16,7 @@
     {
         internal InternalSubmodelServiceProvider(ISubmodel submodel) : base(submodel)
         {
-            UseInMemoryPropertyHandler();
+            UseInMemorySubmodelElementHandler();
         }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelRepositoryServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelRepositoryServiceProvider.cs
index 646e838..b63ed78 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelRepositoryServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelRepositoryServiceProvider.cs
@@ -129,7 +129,7 @@
 
         public IResult<IElementContainer<ISubmodel>> RetrieveSubmodels()
         {
-            return new Result<IElementContainer<ISubmodel>>(true, new ElementContainer<ISubmodel>(Submodels));
+            return new Result<IElementContainer<ISubmodel>>(true, new ElementContainer<ISubmodel>(null, Submodels));
         }
 
         public IResult UpdateSubmodel(string submodelId, ISubmodel submodel)
diff --git a/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelServiceProvider.cs b/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelServiceProvider.cs
index 02804c1..3ea1ef9 100644
--- a/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelServiceProvider.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.API/Components/SubmodelServiceProvider.cs
@@ -10,259 +10,331 @@
 *******************************************************************************/
 using BaSyx.API.AssetAdministrationShell;
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
 using BaSyx.Utils.ResultHandling;
 using BaSyx.Utils.Client;
 using System.Collections.Generic;
 using System;
 using Newtonsoft.Json;
-using System.Reflection;
-using System.Linq.Expressions;
 using System.Linq;
 using BaSyx.Models.Connectivity.Descriptors;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Communication;
 using System.Threading.Tasks;
-using BaSyx.Models.Extensions;
+using NLog;
+using System.Threading;
 
 namespace BaSyx.API.Components
 {
+    /// <summary>
+    /// Reference implementation of ISubmodelServiceProvider interface
+    /// </summary>
     public class SubmodelServiceProvider : ISubmodelServiceProvider
     {
-        public ISubmodel Submodel { get; protected set; }
+        private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
+
+        private ISubmodel _submodel;
+
         public ISubmodelDescriptor ServiceDescriptor { get; internal set; }
 
-        private readonly Dictionary<string, Delegate> methodCalledHandler;
-        private readonly Dictionary<string, PropertyHandler> propertyHandler;
+        private readonly Dictionary<string, MethodCalledHandler> methodCalledHandler;
+        private readonly Dictionary<string, SubmodelElementHandler> submodelElementHandler;
         private readonly Dictionary<string, Action<IValue>> updateFunctions;
         private readonly Dictionary<string, EventDelegate> eventDelegates;
         private readonly Dictionary<string, InvocationResponse> invocationResults;
 
         private IMessageClient messageClient;
 
-        private readonly GetPropertyValueHandler GenericPropertyGetHandler = de => { return new ElementValue(de.Value, de.ValueType); };
-        private readonly SetPropertyValueHandler GenericPropertySetHandler = (de, val) => { de.Value = val.Value; };
-
+        /// <summary>
+        /// Constructor for SubmodelServiceProvider
+        /// </summary>
         public SubmodelServiceProvider()
         {
-            methodCalledHandler = new Dictionary<string, Delegate>();
-            propertyHandler = new Dictionary<string, PropertyHandler>();
+            methodCalledHandler = new Dictionary<string, MethodCalledHandler>();
+            submodelElementHandler = new Dictionary<string, SubmodelElementHandler>();
             updateFunctions = new Dictionary<string, Action<IValue>>();
             eventDelegates = new Dictionary<string, EventDelegate>();
             invocationResults = new Dictionary<string, InvocationResponse>();
         }
-
+        /// <summary>
+        /// Contructor for SubmodelServiceProvider with a Submodel object to bind to
+        /// </summary>
+        /// <param name="submodel">Submodel object</param>
         public SubmodelServiceProvider(ISubmodel submodel) : this()
         {
             BindTo(submodel);
         }
+        /// <summary>
+        /// Contructor for SubmodelServiceProvider with a Submodel object to bind to and a SubmodelDescriptor as ServiceDescriptor
+        /// </summary>
+        /// <param name="submodel">Submodel object</param>
+        /// <param name="submodelDescriptor">SubmodelDescriptor object</param>
         public SubmodelServiceProvider(ISubmodel submodel, ISubmodelDescriptor submodelDescriptor) : this()
         {
-            Submodel = submodel;
+            _submodel = submodel;
             ServiceDescriptor = submodelDescriptor;
         }
 
-        public void BindTo(ISubmodel element)
+        /// <summary>
+        /// Bind this SubmodelServiceProvider to a specific Submodel
+        /// </summary>
+        /// <param name="submodel">Submodel object</param>
+        public void BindTo(ISubmodel submodel)
         {
-            Submodel = element;
-            ServiceDescriptor = new SubmodelDescriptor(element, null);
+            _submodel = submodel;
+            ServiceDescriptor = new SubmodelDescriptor(submodel, null);
         }
+
+        /// <summary>
+        /// Returns the model binding of this SubmodelServiceProvider
+        /// </summary>
+        /// <returns>Submodel object</returns>
         public ISubmodel GetBinding()
         {
-            return Submodel;
+            return _submodel;
         }
 
-        public void UseInMemoryPropertyHandler()
+        public void UseInMemorySubmodelElementHandler()
         {
-            if(Submodel.Properties?.Count() > 0)
-                foreach (var property in Submodel.Properties)
+            UseInMemorySubmodelElementHandlerInternal(_submodel.SubmodelElements);
+        }
+        private void UseInMemorySubmodelElementHandlerInternal(IElementContainer<ISubmodelElement> submodelElements)
+        {
+            if (submodelElements.HasChildren())
+            {
+                foreach (var child in submodelElements.Children)
                 {
-                    RegisterPropertyHandler(property.IdShort,
-                        new PropertyHandler(property.Get ?? GenericPropertyGetHandler, property.Set ?? GenericPropertySetHandler));
+                    UseInMemorySubmodelElementHandlerInternal(child);
                 }
+            }
+            if(submodelElements.Value != null)
+            {
+                if (submodelElements.Value.ModelType != ModelType.Operation)
+                    RegisterSubmodelElementHandler(submodelElements.Path, new SubmodelElementHandler(submodelElements.Value.Get, submodelElements.Value.Set));                
+            }
         }
 
-        public void UsePropertyHandler(PropertyHandler propertyHandler)
+        /// <summary>
+        /// Use as specific SubmodelElementHandler for all SubmodelElements
+        /// </summary>
+        /// <param name="elementHandler">SubmodelElementHandler</param>
+        public void UseSubmodelElementHandler(SubmodelElementHandler elementHandler)
         {
-            if (Submodel.Properties?.Count() > 0)
-                foreach (var property in Submodel.Properties)
-                    RegisterPropertyHandler(property.IdShort, propertyHandler);
+            UseSubmodelElementHandlerInternal(_submodel.SubmodelElements, elementHandler, null);
+        }
+        /// <summary>
+        /// Use a specific SubmodelElementHandler for all SubmodelElements of a specific ModelType (e.g. Property) except Operations
+        /// </summary>
+        /// <param name="elementHandler">SubmodelElementHandler</param>
+        /// <param name="modelType">ModelType</param>
+        public void UseSubmodelElementHandlerForModelType(SubmodelElementHandler elementHandler, ModelType modelType)
+        {
+            UseSubmodelElementHandlerInternal(_submodel.SubmodelElements, elementHandler, modelType);
         }
 
+        private void UseSubmodelElementHandlerInternal(IElementContainer<ISubmodelElement> submodelElements, SubmodelElementHandler elementHandler, ModelType modelType = null)
+        {
+            if (submodelElements.HasChildren())
+            {
+                foreach (var child in submodelElements.Children)
+                {
+                    UseSubmodelElementHandlerInternal(child, elementHandler, modelType);
+                }
+            }
+            if (submodelElements.Value != null)
+            {
+                if (modelType == null)
+                    RegisterSubmodelElementHandler(submodelElements.Path, elementHandler);
+                else if (submodelElements.Value.ModelType == modelType)
+                    RegisterSubmodelElementHandler(submodelElements.Path, elementHandler);
+                else
+                    return;
+            }
+        }
+        /// <summary>
+        /// Use a specific MethodCalledHandler for all Operations
+        /// </summary>
+        /// <param name="methodCalledHandler"></param>
         public void UseOperationHandler(MethodCalledHandler methodCalledHandler)
         {
-            if (Submodel.Operations?.Count() > 0)
-                foreach (var operation in Submodel.Operations)
-                    RegisterMethodCalledHandler(operation.IdShort, methodCalledHandler);
+            UseOperationHandlerInternal(_submodel.SubmodelElements, methodCalledHandler);
         }
 
-        public IResult<IEvent> CreateEvent(IEvent eventable)
+        private void UseOperationHandlerInternal(IElementContainer<ISubmodelElement> submodelElements, MethodCalledHandler methodCalledHandler)
         {
-            if (Submodel == null)
-                return new Result<IEvent>(false, new NotFoundMessage("Submodel"));
-
-            return Submodel.SubmodelElements.Create(eventable);
-        }
-
-        public IResult<IOperation> CreateOperation(IOperation operation)
-        {
-            if (Submodel == null)
-                return new Result<IOperation>(false, new NotFoundMessage("Submodel"));
-
-            return Submodel.SubmodelElements.Create(operation);
-        }
-
-        public IResult<IProperty> CreateProperty(IProperty property)
-        {
-            if (Submodel == null)
-                return new Result<IProperty>(false, new NotFoundMessage("Submodel"));
-
-            RegisterPropertyHandler(property.IdShort, 
-                new PropertyHandler(property.Get ?? GenericPropertyGetHandler, property.Set ?? GenericPropertySetHandler));
-
-            return Submodel.SubmodelElements.Create(property);
-        }
-
-        public IResult DeleteEvent(string eventId)
-        {
-            if (Submodel == null)
-                return new Result(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Events == null)
-                return new Result(false, new NotFoundMessage(eventId));
-            return Submodel.SubmodelElements.Delete(eventId);
-        }
-
-        public IResult DeleteOperation(string operationId)
-        {
-            if (Submodel == null)
-                return new Result(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Operations == null)
-                return new Result(false, new NotFoundMessage(operationId));
-            return Submodel.SubmodelElements.Delete(operationId);
-        }
-
-        public IResult DeleteProperty(string propertyId)
-        {
-            if (Submodel == null)
-                return new Result(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Properties == null)
-                return new Result(false, new NotFoundMessage(propertyId));
-
-            if (propertyHandler.ContainsKey(propertyId))
-                propertyHandler.Remove(propertyId);
-
-            return Submodel.SubmodelElements.Delete(propertyId);
-        }
-
-        public MethodCalledHandler RetrieveMethodCalledHandler(string operationId)
-        {
-            if (methodCalledHandler.TryGetValue(operationId, out Delegate handler))
-                return (MethodCalledHandler)handler;
+            if (submodelElements.HasChildren())
+            {
+                foreach (var child in submodelElements.Children)
+                {
+                    UseOperationHandlerInternal(child, methodCalledHandler);
+                }
+            }
             else
-                return null;
+            {
+                if (submodelElements.Value is IOperation)
+                    RegisterMethodCalledHandler(submodelElements.Path, methodCalledHandler);
+                else
+                    return;
+            }
         }
-
-        public Delegate RetrieveMethodDelegate(string operationId)
+        
+        public MethodCalledHandler RetrieveMethodCalledHandler(string pathToOperation)
         {
-            if (methodCalledHandler.TryGetValue(operationId, out Delegate handler))
+            if (methodCalledHandler.TryGetValue(pathToOperation, out MethodCalledHandler handler))
                 return handler;
             else
                 return null;
         }
-
-        public PropertyHandler RetrievePropertyHandler(string propertyId)
+       
+        public SubmodelElementHandler RetrieveSubmodelElementHandler(string pathToElement)
         {
-            if (propertyHandler.TryGetValue(propertyId, out PropertyHandler handler))
-                return handler;
+            if (submodelElementHandler.TryGetValue(pathToElement, out SubmodelElementHandler elementHandler))
+                return elementHandler;
             else
                 return null;
         }
-
-        public void RegisterPropertyHandler(string propertyId, PropertyHandler handler)
+      
+        public void RegisterSubmodelElementHandler(string pathToElement, SubmodelElementHandler elementHandler)
         {
-            if (!propertyHandler.ContainsKey(propertyId))
-                propertyHandler.Add(propertyId, handler);
+            if (!submodelElementHandler.ContainsKey(pathToElement))
+                submodelElementHandler.Add(pathToElement, elementHandler);
             else
-                propertyHandler[propertyId] = handler;
+                submodelElementHandler[pathToElement] = elementHandler;
         }
-
-        public void RegisterMethodCalledHandler(string operationId, MethodCalledHandler handler)
+        
+        public void RegisterMethodCalledHandler(string pathToOperation, MethodCalledHandler handler)
         {
-            if (!methodCalledHandler.ContainsKey(operationId))
-                methodCalledHandler.Add(operationId, handler);
+            if (!methodCalledHandler.ContainsKey(pathToOperation))
+                methodCalledHandler.Add(pathToOperation, handler);
             else
-                methodCalledHandler[operationId] = handler;
+                methodCalledHandler[pathToOperation] = handler;
         }
-
-        public void RegisterMethodCalledHandler(string operationId, Delegate handler)
+          
+        public void RegisterEventDelegate(string pathToEvent, EventDelegate eventDelegate)
         {
-            if (!methodCalledHandler.ContainsKey(operationId))
-                methodCalledHandler.Add(operationId, handler);
+            if (!eventDelegates.ContainsKey(pathToEvent))
+                eventDelegates.Add(pathToEvent, eventDelegate);
             else
-                methodCalledHandler[operationId] = handler;
+                eventDelegates[pathToEvent] = eventDelegate;
         }
 
-        public void RegisterEventDelegate(string eventId, EventDelegate eventDelegate)
+        public IResult<InvocationResponse> InvokeOperation(string pathToOperation, InvocationRequest invocationRequest)
         {
-            if (!eventDelegates.ContainsKey(eventId))
-                eventDelegates.Add(eventId, eventDelegate);
-            else
-                eventDelegates[eventId] = eventDelegate;
+            if (_submodel == null)
+                return new Result<InvocationResponse>(false, new NotFoundMessage("Submodel"));
+
+            var operation_Retrieved = _submodel.SubmodelElements.Retrieve<IOperation>(pathToOperation);
+            if (operation_Retrieved.Success && operation_Retrieved.Entity != null)
+            {
+                MethodCalledHandler methodHandler;
+                if (operation_Retrieved.Entity.OnMethodCalled != null)
+                    methodHandler = operation_Retrieved.Entity.OnMethodCalled;
+                else if (methodCalledHandler.TryGetValue(pathToOperation, out MethodCalledHandler handler))
+                    methodHandler = handler;
+                else
+                    return new Result<InvocationResponse>(false, new NotFoundMessage($"MethodHandler for {pathToOperation}"));
+
+                InvocationResponse invocationResponse = new InvocationResponse(invocationRequest.RequestId);
+                invocationResponse.InOutputArguments = invocationRequest.InOutputArguments;
+
+                using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource())
+                {
+                    Task<OperationResult> runner = Task.Run(async () =>
+                    {
+                        try
+                        {
+                            invocationResponse.ExecutionState = ExecutionState.Running;
+                            var result = await methodHandler.Invoke(operation_Retrieved.Entity, invocationRequest.InputArguments, invocationResponse.InOutputArguments, invocationResponse.OutputArguments, cancellationTokenSource.Token);
+                            invocationResponse.ExecutionState = ExecutionState.Completed;
+                            return result;
+                        }
+                        catch (Exception e)
+                        {
+                            invocationResponse.ExecutionState = ExecutionState.Failed;
+                            return new OperationResult(e);
+                        }
+
+                    }, cancellationTokenSource.Token);
+
+                    if (Task.WhenAny(runner, Task.Delay(invocationRequest.Timeout.Value, cancellationTokenSource.Token)).Result == runner)
+                    {
+                        cancellationTokenSource.Cancel();
+                        invocationResponse.OperationResult = runner.Result;
+                        return new Result<InvocationResponse>(true, invocationResponse);
+                    }
+                    else
+                    {
+                        cancellationTokenSource.Cancel();
+                        invocationResponse.OperationResult = new OperationResult(false, new TimeoutMessage());
+                        invocationResponse.ExecutionState = ExecutionState.Timeout;
+                        return new Result<InvocationResponse>(false, invocationResponse);
+                    }
+                }
+            }
+            return new Result<InvocationResponse>(operation_Retrieved);
         }
 
-        public void RegisterMethodCalledHandler(string operationId, MethodInfo methodInfo, object target)
+        public IResult<CallbackResponse> InvokeOperationAsync(string pathToOperation, InvocationRequest invocationRequest)
         {
-            var parameters = from parameter in methodInfo.GetParameters() select parameter.ParameterType;
-            Delegate del = methodInfo.CreateDelegate(Expression.GetDelegateType(parameters.Concat(new[] { methodInfo.ReturnType }).ToArray()), target);
-            RegisterMethodCalledHandler(operationId, del);
-        }
-
-        public IResult<CallbackResponse> InvokeOperationAsync(string operationId, InvocationRequest invocationRequest)
-        {
-            if (Submodel == null)
+            if (_submodel == null)
                 return new Result<CallbackResponse>(false, new NotFoundMessage("Submodel"));
             if (invocationRequest == null)
                 return new Result<CallbackResponse>(new ArgumentNullException(nameof(invocationRequest)));
 
-            var operation_Retrieved = RetrieveOperation(operationId);
+            var operation_Retrieved = _submodel.SubmodelElements.Retrieve<IOperation>(pathToOperation);
             if (operation_Retrieved.Success && operation_Retrieved.Entity != null)
             {
-                Delegate methodDelegate;
+                MethodCalledHandler methodHandler;
                 if (operation_Retrieved.Entity.OnMethodCalled != null)
-                    methodDelegate = operation_Retrieved.Entity.OnMethodCalled;
-                else if (methodCalledHandler.TryGetValue(operationId, out Delegate handler))
-                    methodDelegate = handler;
+                    methodHandler = operation_Retrieved.Entity.OnMethodCalled;
+                else if (methodCalledHandler.TryGetValue(pathToOperation, out MethodCalledHandler handler))
+                    methodHandler = handler;
                 else
-                    return new Result<CallbackResponse>(false, new NotFoundMessage($"MethodHandler for {operationId}"));
+                    return new Result<CallbackResponse>(false, new NotFoundMessage($"MethodHandler for {pathToOperation}"));
 
-                var invocationTask = Task.Run(() =>
+                Task invocationTask = Task.Run(async() =>
                 {
                     InvocationResponse invocationResponse = new InvocationResponse(invocationRequest.RequestId);
-                    SetInvocationResult(operationId, invocationRequest.RequestId, ref invocationResponse);
+                    invocationResponse.InOutputArguments = invocationRequest.InOutputArguments;
+                    SetInvocationResult(pathToOperation, invocationRequest.RequestId, ref invocationResponse);
 
-                    try
+                    using (var cancellationTokenSource = new CancellationTokenSource())
                     {
-                        invocationResponse.ExecutionState = ExecutionState.Running;
-                        Task<OperationResult> taskResult = (Task<OperationResult>)methodDelegate.DynamicInvoke(operation_Retrieved.Entity, invocationRequest.InputArguments, invocationResponse.OutputArguments);
-                        invocationResponse.OperationResult = taskResult.Result;
-                        invocationResponse.ExecutionState = ExecutionState.Completed;
-                    }
-                    catch (Exception e)
-                    {
-                        invocationResponse.ExecutionState = ExecutionState.Failed;
-                        invocationResponse.OperationResult = new OperationResult(e);
+                        Task<OperationResult> runner = Task.Run(async () =>
+                        {
+                            try
+                            {
+                                invocationResponse.ExecutionState = ExecutionState.Running;
+                                var result = await methodHandler.Invoke(operation_Retrieved.Entity, invocationRequest.InputArguments, invocationResponse.InOutputArguments, invocationResponse.OutputArguments, cancellationTokenSource.Token);
+                                invocationResponse.ExecutionState = ExecutionState.Completed;
+                                return result;
+                            }
+                            catch (Exception e)
+                            {
+                                invocationResponse.ExecutionState = ExecutionState.Failed;
+                                return new OperationResult(e);
+                            }
+                        }, cancellationTokenSource.Token);
+
+                        if (await Task.WhenAny(runner, Task.Delay(invocationRequest.Timeout.Value, cancellationTokenSource.Token)) == runner)
+                        {
+                            cancellationTokenSource.Cancel();
+                            invocationResponse.OperationResult = runner.Result;
+                        }
+                        else
+                        {
+                            cancellationTokenSource.Cancel();
+                            invocationResponse.OperationResult = new OperationResult(false, new TimeoutMessage());
+                            invocationResponse.ExecutionState = ExecutionState.Timeout;
+                        }
                     }
                 });
+         
                 string endpoint = ServiceDescriptor?.Endpoints?.FirstOrDefault()?.Address;
                 CallbackResponse callbackResponse = new CallbackResponse(invocationRequest.RequestId);
                 if (string.IsNullOrEmpty(endpoint))
-                    callbackResponse.CallbackUrl = new Uri($"/operations/{operationId}/invocationList/{invocationRequest.RequestId}", UriKind.Relative);
+                    callbackResponse.CallbackUrl = new Uri($"/submodelElements/{pathToOperation}/invocationList/{invocationRequest.RequestId}", UriKind.Relative);
                 else
-                    callbackResponse.CallbackUrl = new Uri($"{endpoint}/operations/{operationId}/invocationList/{invocationRequest.RequestId}", UriKind.Absolute);
+                    callbackResponse.CallbackUrl = new Uri($"{endpoint}/submodelElements/{pathToOperation}/invocationList/{invocationRequest.RequestId}", UriKind.Absolute);
                 return new Result<CallbackResponse>(true, callbackResponse);
             }
             return new Result<CallbackResponse>(operation_Retrieved);
@@ -280,10 +352,10 @@
                 invocationResults.Add(key, invocationResponse);
             }
         }
-
-        public IResult<InvocationResponse> GetInvocationResult(string operationId, string requestId)
+      
+        public IResult<InvocationResponse> GetInvocationResult(string pathToOperation, string requestId)
         {
-            string key = string.Join("_", operationId, requestId);
+            string key = string.Join("_", pathToOperation, requestId);
             if (invocationResults.ContainsKey(key))
             {
                 return new Result<InvocationResponse>(true, invocationResults[key]);
@@ -292,42 +364,8 @@
             {
                return new Result<InvocationResponse>(false, new NotFoundMessage($"Request with id {requestId}"));
             }
-        }
-
-
-        public IResult<InvocationResponse> InvokeOperation(string operationId, InvocationRequest invocationRequest)
-        {
-            if (Submodel == null)
-                return new Result<InvocationResponse>(false, new NotFoundMessage("Submodel"));
-
-            var operation_Retrieved = RetrieveOperation(operationId);
-            if (operation_Retrieved.Success && operation_Retrieved.Entity != null)
-            {
-                Delegate methodDelegate;
-                if (operation_Retrieved.Entity.OnMethodCalled != null)
-                    methodDelegate = operation_Retrieved.Entity.OnMethodCalled;
-                else if (methodCalledHandler.TryGetValue(operationId, out Delegate handler))
-                    methodDelegate = handler;
-                else
-                    return new Result<InvocationResponse>(false, new NotFoundMessage($"MethodHandler for {operationId}"));
-                try
-                {
-                    InvocationResponse invocationResponse = new InvocationResponse(invocationRequest.RequestId);
-                    invocationResponse.ExecutionState = ExecutionState.Running;
-                    Task<OperationResult> taskResult = (Task<OperationResult>)methodDelegate.DynamicInvoke(operation_Retrieved.Entity, invocationRequest.InputArguments, invocationResponse.OutputArguments);
-                    invocationResponse.OperationResult = taskResult.Result;
-                    invocationResponse.ExecutionState = ExecutionState.Completed;
-
-                    return new Result<InvocationResponse>(true, invocationResponse);
-                }
-                catch (Exception e)
-                {
-                    return new Result<InvocationResponse>(e);
-                }
-            }
-            return new Result<InvocationResponse>(operation_Retrieved);
-        }
-
+        }              
+       
         public IResult ThrowEvent(IPublishableEvent publishableEvent, string topic = "/", Action<IMessagePublishedEventArgs> MessagePublished = null, byte qosLevel = 2, bool retain = false)
         {
             if (messageClient == null || !messageClient.IsConnected)
@@ -343,229 +381,117 @@
             return messageClient.Publish(topic, message, MessagePublished, qosLevel, retain);
         }
 
-        public IResult<IEvent> RetrieveEvent(string eventId)
-        {
-            if (Submodel == null)
-                return new Result<IEvent>(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Events == null)
-                return new Result<IEvent>(false, new NotFoundMessage(eventId));
-            return Submodel.SubmodelElements.Retrieve<IEvent>(eventId);
-        }
-
-        public IResult<IElementContainer<IEvent>> RetrieveEvents()
-        {
-            if (Submodel == null)
-                return new Result<ElementContainer<IEvent>>(false, new NotFoundMessage("Submodel"));
-
-            if(Submodel.Events == null)
-                return new Result<ElementContainer<IEvent>>(false, new NotFoundMessage("Events"));
-            return Submodel.SubmodelElements.RetrieveAll<IEvent>();
-        }
-
-        public IResult<IOperation> RetrieveOperation(string operationId)
-        {
-            if (Submodel == null)
-                return new Result<IOperation>(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Operations == null)
-                return new Result<IOperation>(false, new NotFoundMessage(operationId));
-            return Submodel.SubmodelElements.Retrieve<IOperation>(operationId);
-        }
-
-        public IResult<IElementContainer<IOperation>> RetrieveOperations()
-        {
-            if (Submodel == null)
-                return new Result<ElementContainer<IOperation>>(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Operations == null)
-                return new Result<ElementContainer<IOperation>>(false, new NotFoundMessage("Operations"));
-            return Submodel.SubmodelElements.RetrieveAll<IOperation>();
-        }
-
-        public IResult<IElementContainer<IProperty>> RetrieveProperties()
-        {
-            if (Submodel == null)
-                return new Result<ElementContainer<IProperty>>(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Properties == null)
-                return new Result<ElementContainer<IProperty>>(false, new NotFoundMessage("Properties"));
-            return Submodel.SubmodelElements.RetrieveAll<IProperty>();
-        }
-
-        public IResult<IProperty> RetrieveProperty(string propertyId)
-        {
-            if (Submodel == null)
-                return new Result<IProperty>(false, new NotFoundMessage("Submodel"));
-
-            if (Submodel.Properties == null)
-                return new Result<IProperty>(false, new NotFoundMessage(propertyId));
-            return Submodel.SubmodelElements.Retrieve<IProperty>(propertyId);
-        }
-
-        public IResult<IValue> RetrievePropertyValue(string propertyId)
-        {
-            if (Submodel == null)
-                return new Result<IValue>(false, new NotFoundMessage("Submodel"));
-
-            if (propertyHandler.TryGetValue(propertyId, out PropertyHandler handler) && handler.GetHandler != null)
-            {
-                var property = RetrieveProperty(propertyId);
-                if(property.Success && property.Entity != null)
-                    return new Result<IValue>(true, handler.GetHandler.Invoke(property.Entity));
-                else
-                    return new Result<IValue>(false, new Message(MessageType.Error, "property not found"));
-            }
-            else
-                return new Result<IValue>(false, new Message(MessageType.Error, "propertyHandler or GetHandler not found"));
-        }
-
-
-        public IResult UpdatePropertyValue(string propertyId, IValue value)
-        {
-            if (Submodel == null)
-                return new Result(false, new NotFoundMessage("Submodel"));
-
-            if (propertyHandler.TryGetValue(propertyId, out PropertyHandler handler) && handler.SetHandler != null)
-            {
-                var property = RetrieveProperty(propertyId);
-                if (property.Success && property.Entity != null)
-                {
-                    handler.SetHandler.Invoke(property.Entity, value);
-                    return new Result(true);
-                }
-                else
-                    return new Result<IValue>(false, new Message(MessageType.Error, "property not found"));
-            }
-            else
-                return new Result<IValue>(false, new Message(MessageType.Error, "propertyHandler or SetHandler not found"));
-        }
-
+       
         public virtual void ConfigureEventHandler(IMessageClient messageClient)
         {
             this.messageClient = messageClient;
         }
-
-        public virtual void SubscribeUpdates(string propertyId, Action<IValue> updateFunction)
+       
+        public virtual void SubscribeUpdates(string pathToSubmodelElement, Action<IValue> updateFunction)
         {
-            if (!updateFunctions.ContainsKey(propertyId))
-                updateFunctions.Add(propertyId, updateFunction);
+            if (!updateFunctions.ContainsKey(pathToSubmodelElement))
+                updateFunctions.Add(pathToSubmodelElement, updateFunction);
             else
-                updateFunctions[propertyId] = updateFunction;
+                updateFunctions[pathToSubmodelElement] = updateFunction;
         }
-
-        public virtual void PublishUpdate(string propertyId, IValue value)
+       
+        public virtual void PublishUpdate(string pathToSubmodelElement, IValue value)
         {
-            if (updateFunctions.TryGetValue(propertyId, out Action<IValue> updateFunction))
+            if (updateFunctions.TryGetValue(pathToSubmodelElement, out Action<IValue> updateFunction))
                 updateFunction.Invoke(value);
 
         }
 
         public IResult<ISubmodel> RetrieveSubmodel()
         {
-            var submodel = GetBinding();
-            return new Result<ISubmodel>(submodel != null, submodel);
+            return new Result<ISubmodel>(_submodel != null, _submodel);
         }
 
-        public IResult<ISubmodelElement> CreateSubmodelElement(ISubmodelElement submodelElement)
+        public IResult<ISubmodelElement> CreateSubmodelElement(string pathToSubmodelElement, ISubmodelElement submodelElement)
         {
-            if (Submodel == null)
+            if (_submodel == null)
                 return new Result<ISubmodelElement>(false, new NotFoundMessage("Submodel"));
 
-            return Submodel.SubmodelElements.Create(submodelElement);
+            return _submodel.SubmodelElements.Create(submodelElement);
         }
 
         public IResult<IElementContainer<ISubmodelElement>> RetrieveSubmodelElements()
         {
-            if (Submodel == null)
+            if (_submodel == null)
                 return new Result<ElementContainer<ISubmodelElement>>(false, new NotFoundMessage("Submodel"));
 
-            if (Submodel.SubmodelElements == null)
+            if (_submodel.SubmodelElements == null)
                 return new Result<ElementContainer<ISubmodelElement>>(false, new NotFoundMessage("SubmodelElements"));
-            return Submodel.SubmodelElements.RetrieveAll();
+            return _submodel.SubmodelElements.RetrieveAll();
         }
 
         public IResult<ISubmodelElement> RetrieveSubmodelElement(string submodelElementId)
         {
-            if (Submodel == null)
+            if (_submodel == null)
                 return new Result<ISubmodelElement>(false, new NotFoundMessage("Submodel"));
 
-            if (Submodel.SubmodelElements == null)
+            if (_submodel.SubmodelElements == null)
                 return new Result<ISubmodelElement>(false, new NotFoundMessage(submodelElementId));
 
-            IResult<ISubmodelElement> result;
-            if(submodelElementId.Contains("/"))
-            {
-                string[] smeIds = submodelElementId.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
-                IResult<ISubmodelElement> firstElement = Submodel.SubmodelElements.Retrieve(smeIds[0]);
-                result = RetrieveSubordinateElement(firstElement, smeIds.Skip(1));
-            }
-            else
-            {
-                result = Submodel.SubmodelElements.Retrieve(submodelElementId);
-            }
-            return result;
+            return _submodel.SubmodelElements.Retrieve(submodelElementId);
         }
-
-        private IResult<ISubmodelElement> RetrieveSubordinateElement(IResult<ISubmodelElement> smElement, IEnumerable<string> idShorts)
-        {
-            if(smElement.Success && smElement.Entity != null)
-            {
-                if(smElement.Entity.ModelType == ModelType.SubmodelElementCollection)
-                {
-                    ISubmodelElementCollection smeCollection = smElement.Entity.Cast<ISubmodelElementCollection>();
-                    if(idShorts?.Count() > 0 && smeCollection.Value?.Count > 0)
-                    {
-                        IResult<ISubmodelElement> nextElement = smeCollection.Value.Retrieve(idShorts.First());
-                        if (idShorts.Count() > 1)
-                            return RetrieveSubordinateElement(nextElement, idShorts.Skip(1));
-                        else
-                            return nextElement;
-                    }
-                }
-                else
-                {
-                    if (idShorts.Count() > 0)
-                        return new Result<ISubmodelElement>(false, new NotFoundMessage(string.Join("/", idShorts)));
-                }
-            }
-            return smElement;
-        }
-
         public IResult<IValue> RetrieveSubmodelElementValue(string submodelElementId)
         {
-            if (Submodel == null)
+            if (_submodel == null)
                 return new Result<IValue>(false, new NotFoundMessage("Submodel"));
 
-            if (Submodel.SubmodelElements == null)
-                return new Result<IValue>(false, new NotFoundMessage(submodelElementId));
-
-            return new Result<IValue>(true, 
-                new ElementValue(
-                    (Submodel.SubmodelElements[submodelElementId] as dynamic).Value, 
-                    (Submodel.SubmodelElements[submodelElementId] as dynamic).ValueType as DataType));
+            if (submodelElementHandler.TryGetValue(submodelElementId, out SubmodelElementHandler elementHandler) && elementHandler.GetValueHandler != null)
+            {
+                var submodelElement = _submodel.SubmodelElements.Retrieve<ISubmodelElement>(submodelElementId);
+                if (submodelElement.Success && submodelElement.Entity != null)
+                    return new Result<IValue>(true, elementHandler.GetValueHandler.Invoke(submodelElement.Entity));
+                else
+                    return new Result<IValue>(false, new Message(MessageType.Error, "SubmodelElement not found"));
+            }
+            else
+                return new Result<IValue>(false, new Message(MessageType.Error, "SubmodelElementHandler not found"));
         }
 
         public IResult UpdateSubmodelElement(string submodelElementId, ISubmodelElement submodelElement)
         {
-            if (Submodel == null)
+            if (_submodel == null)
                 return new Result(false, new NotFoundMessage("Submodel"));
 
-            if (Submodel.SubmodelElements == null)
+            if (_submodel.SubmodelElements == null)
                 return new Result(false, new NotFoundMessage(submodelElementId));
 
-            return Submodel.SubmodelElements.Update(submodelElementId, submodelElement);
+            return _submodel.SubmodelElements.Update(submodelElementId, submodelElement);
+        }
+
+        public IResult UpdateSubmodelElementValue(string submodelElementId, IValue value)
+        {
+            if (_submodel == null)
+                return new Result(false, new NotFoundMessage("Submodel"));
+
+            if (submodelElementHandler.TryGetValue(submodelElementId, out SubmodelElementHandler elementHandler) && elementHandler.SetValueHandler != null)
+            {
+                var submodelElement = _submodel.SubmodelElements.Retrieve<ISubmodelElement>(submodelElementId);
+                if (submodelElement.Success && submodelElement.Entity != null)
+                {
+                    elementHandler.SetValueHandler.Invoke(submodelElement.Entity, value);
+                    return new Result(true);
+                }
+                else
+                    return new Result<IValue>(false, new Message(MessageType.Error, "property not found"));
+            }
+            else
+                return new Result<IValue>(false, new Message(MessageType.Error, "SubmodelElementHandler not found"));
         }
 
         public IResult DeleteSubmodelElement(string submodelElementId)
         {
-            if (Submodel == null)
+            if (_submodel == null)
                 return new Result(false, new NotFoundMessage("Submodel"));
 
-            if (Submodel.SubmodelElements == null)
+            if (_submodel.SubmodelElements == null)
                 return new Result(false, new NotFoundMessage(submodelElementId));
 
-            return Submodel.SubmodelElements.Delete(submodelElementId);
+            return _submodel.SubmodelElements.Delete(submodelElementId);
         }        
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Core.Tests/BaSyx.Core.Tests.csproj b/sdks/dotnet/basyx-core/BaSyx.Core.Tests/BaSyx.Core.Tests.csproj
new file mode 100644
index 0000000..da664d5
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Core.Tests/BaSyx.Core.Tests.csproj
@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+
+    <IsPackable>false</IsPackable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="FluentAssertions" Version="5.10.3" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
+    <PackageReference Include="MSTest.TestAdapter" Version="2.0.0" />
+    <PackageReference Include="MSTest.TestFramework" Version="2.0.0" />
+    <PackageReference Include="coverlet.collector" Version="1.0.1" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\BaSyx.Models\BaSyx.Models.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/sdks/dotnet/basyx-core/BaSyx.Core.Tests/ModelUnitTest.cs b/sdks/dotnet/basyx-core/BaSyx.Core.Tests/ModelUnitTest.cs
new file mode 100644
index 0000000..f378314
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Core.Tests/ModelUnitTest.cs
@@ -0,0 +1,89 @@
+using BaSyx.Models.Core.AssetAdministrationShell;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
+using BaSyx.Models.Core.AssetAdministrationShell.References;
+using BaSyx.Models.Core.Common;
+using FluentAssertions;
+using FluentAssertions.Equivalency;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System.Globalization;
+
+namespace BaSyx.Core.Tests
+{
+    [TestClass]
+    public class ModelUnitTest
+    {
+
+        private static IAssetAdministrationShell shell = new AssetAdministrationShell("MyTestAAS", new Identifier("https://www.basys40.de/shells/MyTestAAS", KeyType.IRI))
+        {
+            Asset = new Asset("MyTestAsset", new Identifier("https://www.basys40.de/assets/MyTestAsset", KeyType.IRI))
+            {
+                Kind = AssetKind.Instance
+            },
+            Administration = new AdministrativeInformation()
+            {
+                Version = "1.0.0",
+                Revision = "0.0.1"
+            },
+            Description = new LangStringSet()
+            {
+                new LangString(new CultureInfo("de").TwoLetterISOLanguageName, "Meine Test-Verwaltungsschale"),
+                new LangString(new CultureInfo("en").TwoLetterISOLanguageName, "My Test Asset Administration Shell"),
+            },
+            Submodels = new ElementContainer<ISubmodel>()
+            {
+                new Submodel("MyTestSubmodel", new Identifier("https://www.basys40.de/submodels/MyTestSubmodel", KeyType.IRI))
+                {
+                    SemanticId = new Reference(new Key(KeyElements.GlobalReference, KeyType.IRI, "urn:basys:org.eclipse.basyx:submodels:MyTestSubmodel:1.0.0", false)),
+                    SubmodelElements =
+                    {
+                        new Property<string>("Prop1") { Value = "Prop1_TestValue" },
+                        GetProperty<int>("Prop2", 2),
+                        new SubmodelElementCollection("MySubmodelElementCollection")
+                        {
+                            Value =
+                            {
+                                new Property<string>("SubProp1") { Value = "SubProp1_TestValue" },
+                                GetProperty<int>("SubProp2", 2),
+                                new Property<int>("SubProp2") { Value = 2 },
+                                new SubmodelElementCollection("MySubSubmodelElementCollection")
+                                {
+                                    Value =
+                                    {
+                                        new Property<string>("SubSubProp1") { Value = "SubSubProp1_TestValue" },
+                                        GetProperty<int>("SubSubProp2", 2)                           
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        };
+
+        private static Property<T> GetProperty<T>(string idShort, T value)
+        {
+            return new Property<T>(idShort) { Value = value };
+        }
+
+        [TestMethod]
+        public void TestMethod1_Flatten()
+        {
+            var flattened = shell.Submodels["MyTestSubmodel"].SubmodelElements.Flatten();
+            flattened.Should().HaveCount(8);
+        }
+        [TestMethod]
+        public void TestMethod2_CheckPath()
+        {
+            EquivalencyAssertionOptions<Property<int>> options = new EquivalencyAssertionOptions<Property<int>>();
+            options.Including(o => o.IdShort);
+            options.Including(o => o.Value);
+            options.Including(o => o.ValueType);
+
+            shell.Submodels["MyTestSubmodel"].SubmodelElements.Retrieve<Property<int>>("Prop2").Entity.Should().BeEquivalentTo(GetProperty<int>("Prop2", 2), opts => options);
+            shell.Submodels["MyTestSubmodel"].SubmodelElements.Retrieve<Property<int>>("MySubmodelElementCollection/SubProp2").Entity.Should().BeEquivalentTo(GetProperty<int>("SubProp2", 2), opts => options);
+            shell.Submodels["MyTestSubmodel"].SubmodelElements.Retrieve<Property<int>>("MySubmodelElementCollection/MySubSubmodelElementCollection/SubSubProp2").Entity.Should().BeEquivalentTo(GetProperty<int>("SubSubProp2", 2), opts => options);
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Core.sln b/sdks/dotnet/basyx-core/BaSyx.Core.sln
index 32a8784..8a909c5 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Core.sln
+++ b/sdks/dotnet/basyx-core/BaSyx.Core.sln
@@ -9,12 +9,6 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Models", "BaSyx.Models\BaSyx.Models.csproj", "{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{7789655B-5AB4-4FA7-87F5-CC75DA047427}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers", "BaSyx.API.Http.Controllers\BaSyx.API.Http.Controllers.csproj", "{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extended", "Extended", "{FC87953C-EE11-45AE-B74A-C477C1AAA40E}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Models.Export", "BaSyx.Models.Export\BaSyx.Models.Export.csproj", "{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Utils.DependencyInjection", "BaSyx.Utils.DependencyInjection\BaSyx.Utils.DependencyInjection.csproj", "{1809BE55-BDB5-4937-ADF3-05B9A9CCED06}"
@@ -23,7 +17,7 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Utils.Client.Mqtt", "BaSyx.Utils.Client.Mqtt\BaSyx.Utils.Client.Mqtt.csproj", "{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.API.Http.Controllers.AASX", "BaSyx.API.Http.Controllers.AASX\BaSyx.API.Http.Controllers.AASX.csproj", "{51938965-A060-4F00-A5CE-4E39A2F5EF45}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.Core.Tests", "BaSyx.Core.Tests\BaSyx.Core.Tests.csproj", "{49C8589D-DBE0-40DD-A4BF-3B948F65793F}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -50,12 +44,6 @@
 		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1}.Release|Any CPU.Build.0 = Release|Any CPU
 		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
 		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
 		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -80,27 +68,16 @@
 		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}.Release|Any CPU.Build.0 = Release|Any CPU
 		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.Release|Any CPU.Build.0 = Release|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
+		{49C8589D-DBE0-40DD-A4BF-3B948F65793F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{49C8589D-DBE0-40DD-A4BF-3B948F65793F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{49C8589D-DBE0-40DD-A4BF-3B948F65793F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{49C8589D-DBE0-40DD-A4BF-3B948F65793F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{49C8589D-DBE0-40DD-A4BF-3B948F65793F}.RemoteDebug|Any CPU.ActiveCfg = Debug|Any CPU
+		{49C8589D-DBE0-40DD-A4BF-3B948F65793F}.RemoteDebug|Any CPU.Build.0 = Debug|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
-	GlobalSection(NestedProjects) = preSolution
-		{87045925-FD2C-4BC9-BA55-8B4080BBA49C} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{87783EE4-52CD-4B54-B278-B61A7B9E226A} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{BDC1FBE1-5F0F-4AEB-B8B0-D10A0922A3C1} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{EC5C4CF5-86D6-48D6-A149-42C7F0FC1B3A} = {FC87953C-EE11-45AE-B74A-C477C1AAA40E}
-		{47F87FC5-0CA9-4C4E-83DB-F886E7CDB543} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{1809BE55-BDB5-4937-ADF3-05B9A9CCED06} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{DF38D3F1-3F2A-49C8-9FB8-1E1667FC8177} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{CBA318C0-06E2-4AB7-B4A1-A5AC63A761EE} = {7789655B-5AB4-4FA7-87F5-CC75DA047427}
-		{51938965-A060-4F00-A5CE-4E39A2F5EF45} = {FC87953C-EE11-45AE-B74A-C477C1AAA40E}
-	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {B028A9A2-E37C-44AF-8032-C8F0492BDB00}
 	EndGlobalSection
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
index 15f1614..1084b04 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
@@ -14,7 +14,7 @@
 using System.IO.Packaging;
 using System.Linq;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using NLog;
 using BaSyx.Utils.FileHandling;
 
@@ -409,9 +409,25 @@
             return contentType;
         }
 
+        #region IDisposable Support
+        private bool disposedValue = false;
+
+        void Dispose(bool disposing)
+        {
+            if (!disposedValue)
+            {
+                if (disposing)
+                {
+                    aasxPackage.Close();
+                }
+                disposedValue = true;
+            }
+        }
+
         public void Dispose()
         {
-            aasxPackage.Close();
+            Dispose(true);
         }
+        #endregion
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs
index 1730b16..6fb2d44 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/AssetAdministrationShellEnvironment_V1_0.cs
@@ -9,9 +9,7 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
@@ -30,7 +28,7 @@
 using System.Xml;
 using System.Xml.Schema;
 using System.Xml.Serialization;
-using File = BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.File;
+using File = BaSyx.Models.Core.AssetAdministrationShell.Implementations.File;
 
 namespace BaSyx.Models.Export
 {
@@ -138,10 +136,10 @@
         {
             AssetAdministrationShells.Add(aas);
             Assets.Add(aas.Asset);
-            if (aas.Submodels?.Count > 0)
+            if (aas.Submodels?.Count() > 0)
             {
-                Submodels.AddRange(aas.Submodels);
-                foreach (var submodel in aas.Submodels)
+                Submodels.AddRange(aas.Submodels.Values);
+                foreach (var submodel in aas.Submodels.Values)
                 {
                     ExtractAndClearConceptDescriptions(submodel.SubmodelElements);
                     ExtractSupplementalFiles(submodel.SubmodelElements);
@@ -190,7 +188,6 @@
                     Description = conceptDescription.Description,
                     Identification = conceptDescription.Identification,
                     IdShort = conceptDescription.IdShort,
-                    Parent = conceptDescription.Parent?.First?.Value,
                     IsCaseOf = conceptDescription.IsCaseOf?.ToList()?.ConvertAll(c => c.ToEnvironmentReference_V1_0()),
                     EmbeddedDataSpecification = embeddedDataSpecification
                 };
@@ -224,7 +221,6 @@
                     Identification = submodel.Identification,
                     IdShort = submodel.IdShort,
                     Kind = submodel.Kind,
-                    Parent = submodel.Parent?.First?.Value,
                     Qualifier = null,
                     SemanticId = submodel.SemanticId?.ToEnvironmentReference_V1_0(),
                     SubmodelElements = submodel.SubmodelElements.ToList().ConvertAll(c => c.ToEnvironmentSubmodelElement_V1_0())
@@ -296,7 +292,7 @@
         {
             var eventsToDelete = submodelElements.Where(s => s.ModelType == ModelType.Event || s.ModelType == ModelType.BasicEvent).ToList();
             foreach (var eventable in eventsToDelete)
-                submodelElements.Remove(eventable);
+                submodelElements.Delete(eventable.IdShort);
         }
 
         public void WriteEnvironment_V1_0(ExportType exportType, string filePath) => WriteEnvironment_V1_0(this, exportType, filePath);
@@ -419,13 +415,11 @@
         {
             foreach (var envAsset in environment.EnvironmentAssets)
             {
-                Asset asset = new Asset
+                Asset asset = new Asset(envAsset.IdShort, envAsset.Identification)
                 {
                     Administration = envAsset.Administration,
                     Category = envAsset.Category,
                     Description = envAsset.Description,
-                    Identification = envAsset.Identification,
-                    IdShort = envAsset.IdShort,
                     Kind = envAsset.Kind,
                     AssetIdentificationModel = envAsset.AssetIdentificationModelReference?.ToReference_V1_0<ISubmodel>()                  
                 };
@@ -457,31 +451,27 @@
             }
             foreach (var envSubmodel in environment.EnvironmentSubmodels)
             {
-                Submodel submodel = new Submodel()
+                Submodel submodel = new Submodel(envSubmodel.IdShort, envSubmodel.Identification)
                 {
                     Administration = envSubmodel.Administration,
                     Category = envSubmodel.Category,
                     Description = envSubmodel.Description,
-                    Identification = envSubmodel.Identification,
-                    IdShort = envSubmodel.IdShort,
                     Kind = envSubmodel.Kind,
                     SemanticId = envSubmodel.SemanticId?.ToReference_V1_0(),
                     ConceptDescription = null,                    
                 };
-                submodel.SubmodelElements.AddRange(envSubmodel.SubmodelElements.ConvertAll(c => c.submodelElement?.ToSubmodelElement(environment.ConceptDescriptions)));
+                submodel.SubmodelElements.AddRange(envSubmodel.SubmodelElements.ConvertAll(c => c.submodelElement?.ToSubmodelElement(environment.ConceptDescriptions, submodel)));
 
                 environment.Submodels.Add(submodel);
             }
             foreach (var envAssetAdministrationShell in environment.EnvironmentAssetAdministationShells)
             {
-                AssetAdministrationShell assetAdministrationShell = new AssetAdministrationShell()
+                AssetAdministrationShell assetAdministrationShell = new AssetAdministrationShell(envAssetAdministrationShell.IdShort, envAssetAdministrationShell.Identification)
                 {
                     Administration = envAssetAdministrationShell.Administration,
                     Category = envAssetAdministrationShell.Category,
                     DerivedFrom = envAssetAdministrationShell.DerivedFrom?.ToReference_V1_0<IAssetAdministrationShell>(),
-                    Description = envAssetAdministrationShell.Description,
-                    Identification = envAssetAdministrationShell.Identification,
-                    IdShort = envAssetAdministrationShell.IdShort                   
+                    Description = envAssetAdministrationShell.Description                 
                 };
 
                 IAsset asset = environment.Assets.Find(a => a.Identification.Id == envAssetAdministrationShell.AssetReference?.Keys?.FirstOrDefault()?.Value);
@@ -491,7 +481,7 @@
                 {
                     ISubmodel submodel = environment.Submodels.Find(s => s.Identification.Id == envSubmodelRef.Keys?.FirstOrDefault()?.Value);
                     if (submodel != null)
-                        assetAdministrationShell.Submodels.Add(submodel);
+                        assetAdministrationShell.Submodels.Create(submodel);
                 }
 
                 environment.AssetAdministrationShells.Add(assetAdministrationShell);
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/Converter/ConceptDescriptionConverter_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/Converter/ConceptDescriptionConverter_V1_0.cs
index 8d04a72..326377f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/Converter/ConceptDescriptionConverter_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/Converter/ConceptDescriptionConverter_V1_0.cs
@@ -10,8 +10,8 @@
 *******************************************************************************/
 using BaSyx.Models.Extensions.Semantics.DataSpecifications;
 using BaSyx.Models.Export.EnvironmentDataSpecifications;
-using BaSyx.Models.Core.Common;
 using System;
+using BaSyx.Models.Core.AssetAdministrationShell;
 
 namespace BaSyx.Models.Export.Converter
 {
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentAsset_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentAsset_V1_0.cs
index 9cb3fe1..da53757 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentAsset_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentAsset_V1_0.cs
@@ -8,7 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
@@ -46,6 +47,6 @@
         public IReference<ISubmodel> BillOfMaterial => throw new System.NotImplementedException();
 
         [XmlIgnore]
-        IReference IReferable.Parent => null;
+        IReferable IReferable.Parent { get; set; }
     }
 }
\ No newline at end of file
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V1_0.cs
index d4369ff..3be8d32 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V1_0.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.Common;
+using BaSyx.Models.Core.AssetAdministrationShell;
 using Newtonsoft.Json;
 using System.Xml.Serialization;
 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentReferable_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentReferable_V1_0.cs
index 44e6f70..de7e7df 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentReferable_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentReferable_V1_0.cs
@@ -8,6 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using Newtonsoft.Json;
 using System.Xml.Serialization;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElement_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElement_V1_0.cs
index a8cdf4b..576df2c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElement_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElement_V1_0.cs
@@ -8,7 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using Newtonsoft.Json;
 using System.Collections.Generic;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V1_0.cs
index de16a87..2e47841 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V1_0.cs
@@ -9,7 +9,6 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Export.Converter;
@@ -19,7 +18,6 @@
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
 using NLog;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
 
 namespace BaSyx.Models.Export.EnvironmentSubmodelElements
 {
@@ -27,7 +25,7 @@
     {
         public static readonly ILogger logger = LogManager.GetCurrentClassLogger();
 
-        public static ISubmodelElement ToSubmodelElement(this SubmodelElementType_V1_0 envSubmodelElement, List<IConceptDescription> conceptDescriptions)
+        public static ISubmodelElement ToSubmodelElement(this SubmodelElementType_V1_0 envSubmodelElement, List<IConceptDescription> conceptDescriptions, IReferable parent)
         {
             if (envSubmodelElement == null)
             {
@@ -48,12 +46,12 @@
                 Property property;
                 if (DataObjectType.TryParse(castedProperty.ValueType, out DataObjectType dataObjectType))
                 {
-                    property = new Property(new DataType(dataObjectType));
+                    property = new Property(castedProperty.IdShort, new DataType(dataObjectType));
                 }
                 else
                 {
                     logger.Warn("Unable to parse ValueType of Property " + castedProperty.IdShort + " - ValueType: " + castedProperty.ValueType);
-                    property = new Property();
+                    property = new Property(castedProperty.IdShort);
                 }
 
                 property.Value = castedProperty.Value;
@@ -63,7 +61,7 @@
             }
             else if (modelType == ModelType.File && envSubmodelElement is File_V1_0 castedFile)
             {
-                File file = new File
+                File file = new File(castedFile.IdShort)
                 {
                     MimeType = castedFile.MimeType,
                     Value = castedFile.Value
@@ -73,7 +71,7 @@
             }
             else if (modelType == ModelType.Blob && envSubmodelElement is Blob_V1_0 castedBlob)
             {
-                Blob blob = new Blob
+                Blob blob = new Blob(castedBlob.IdShort)
                 {
                     MimeType = castedBlob.MimeType,
                     Value = Convert.FromBase64String(castedBlob.Value)
@@ -83,7 +81,7 @@
             }
             else if (modelType == ModelType.RelationshipElement && envSubmodelElement is RelationshipElement_V1_0 castedRelationshipElement)
             {
-                RelationshipElement relationshipElement = new RelationshipElement
+                RelationshipElement relationshipElement = new RelationshipElement(castedRelationshipElement.IdShort)
                 {
                     First = castedRelationshipElement.First?.ToReference_V1_0<IReferable>(),
                     Second = castedRelationshipElement.Second?.ToReference_V1_0<IReferable>()
@@ -93,7 +91,7 @@
             }
             else if (modelType == ModelType.ReferenceElement && envSubmodelElement is ReferenceElement_V1_0 castedReferenceElement)
             {
-                ReferenceElement referenceElement = new ReferenceElement
+                ReferenceElement referenceElement = new ReferenceElement(castedReferenceElement.IdShort)
                 {
                     Value = castedReferenceElement.Value?.ToReference_V1_0()
                 };
@@ -102,24 +100,24 @@
             }
             else if (modelType == ModelType.Event && envSubmodelElement is Event_V1_0 castedEvent)
             {
-               Event eventable = new Event();
+               Event eventable = new Event(castedEvent.IdShort);
 
                 submodelElement = eventable;
             }
             else if (modelType == ModelType.Operation && envSubmodelElement is Operation_V1_0 castedOperation)
             {
-                Operation operation = new Operation
+                Operation operation = new Operation(castedOperation.IdShort)
                 {
                     InputVariables = new OperationVariableSet(),
                     OutputVariables = new OperationVariableSet()
                 };
 
-                var operationInElements = castedOperation.In?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions));
+                var operationInElements = castedOperation.In?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions, parent));
                 if(operationInElements?.Count > 0)
                     foreach (var element in operationInElements)
                         operation.InputVariables.Add(element);
 
-                var operationOutElements = castedOperation.Out?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions));
+                var operationOutElements = castedOperation.Out?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions, parent));
                 if (operationOutElements?.Count > 0)
                     foreach (var element in operationOutElements)
                         operation.OutputVariables.Add(element);
@@ -128,14 +126,14 @@
             }
             else if (modelType == ModelType.SubmodelElementCollection && envSubmodelElement is SubmodelElementCollection_V1_0 castedSubmodelElementCollection)
             {
-               SubmodelElementCollection submodelElementCollection = new SubmodelElementCollection();
+               SubmodelElementCollection submodelElementCollection = new SubmodelElementCollection(castedSubmodelElementCollection.IdShort);
 
                 if (castedSubmodelElementCollection.Value?.Count > 0)
                 {
-                    submodelElementCollection.Value = new ElementContainer<ISubmodelElement>();
-                    List<ISubmodelElement> smElements = castedSubmodelElementCollection.Value?.ConvertAll(c => c.submodelElement?.ToSubmodelElement(conceptDescriptions));
+                    submodelElementCollection.Value = new ElementContainer<ISubmodelElement>(parent, submodelElementCollection, null);
+                    List<ISubmodelElement> smElements = castedSubmodelElementCollection.Value?.ConvertAll(c => c.submodelElement?.ToSubmodelElement(conceptDescriptions, parent));
                     foreach (var smElement in smElements)
-                        submodelElementCollection.Value.Add(smElement);
+                        submodelElementCollection.Value.Create(smElement);
                 }
 
                 submodelElement = submodelElementCollection;
@@ -183,7 +181,6 @@
                 Description = element.Description,
                 IdShort = element.IdShort,
                 Kind = element.Kind,
-                Parent = element.Parent?.First?.Value,
                 Qualifier = null,
                 SemanticId = element.SemanticId?.ToEnvironmentReference_V1_0(),
             };
@@ -240,7 +237,7 @@
             {
                 environmentSubmodelElement.submodelElement = new SubmodelElementCollection_V1_0(submodelElementType);
                 List<EnvironmentSubmodelElement_V1_0> environmentSubmodelElements = new List<EnvironmentSubmodelElement_V1_0>();
-                if (castedSubmodelElementCollection.Value?.Count > 0)
+                if (castedSubmodelElementCollection.Value?.Count() > 0)
                     foreach (var smElement in castedSubmodelElementCollection.Value)
                         environmentSubmodelElements.Add(smElement.ToEnvironmentSubmodelElement_V1_0());
                 (environmentSubmodelElement.submodelElement as SubmodelElementCollection_V1_0).Value = environmentSubmodelElements;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodel_V1_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodel_V1_0.cs
index d37674e..c15949c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodel_V1_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v1.0/EnvironmentSubmodel_V1_0.cs
@@ -8,7 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using BaSyx.Models.Export.Converter;
 using Newtonsoft.Json;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs
index 28abc1b..db0d4a0 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/AssetAdministrationShellEnvironment_V2_0.cs
@@ -9,7 +9,6 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
@@ -139,10 +138,10 @@
         {
             AssetAdministrationShells.Add(aas);
             Assets.Add(aas.Asset);
-            if (aas.Submodels?.Count > 0)
+            if (aas.Submodels?.Count() > 0)
             {
-                Submodels.AddRange(aas.Submodels);
-                foreach (var submodel in aas.Submodels)
+                Submodels.AddRange(aas.Submodels.Values);
+                foreach (var submodel in aas.Submodels.Values)
                 {
                     ExtractAndClearConceptDescriptions(submodel.SubmodelElements);
                     ExtractSupplementalFiles(submodel.SubmodelElements);
@@ -165,7 +164,6 @@
                     Identification = asset.Identification,
                     IdShort = asset.IdShort,
                     Kind = asset.Kind,
-                    Parent = asset.Parent?.First?.Value
                 };
                 EnvironmentAssets.Add(envAsset);
             }
@@ -192,7 +190,6 @@
                     Description = conceptDescription.Description,
                     Identification = conceptDescription.Identification,
                     IdShort = conceptDescription.IdShort,
-                    Parent = conceptDescription.Parent?.First?.Value,
                     IsCaseOf = conceptDescription.IsCaseOf?.ToList()?.ConvertAll(c => c.ToEnvironmentReference_V2_0()),
                     EmbeddedDataSpecification = embeddedDataSpecification
                 };
@@ -209,7 +206,6 @@
                     Description = assetAdministrationShell.Description,
                     IdShort = assetAdministrationShell.IdShort,
                     Identification = assetAdministrationShell.Identification,
-                    Parent = assetAdministrationShell.Parent?.First?.Value,
                     AssetReference = assetAdministrationShell.Asset?.ToEnvironmentReference_V2_0(),
                     Views = null,
                     ConceptDictionaries = null
@@ -230,7 +226,6 @@
                     Identification = submodel.Identification,
                     IdShort = submodel.IdShort,
                     Kind = submodel.Kind,
-                    Parent = submodel.Parent?.First?.Value,
                     Qualifier = null,
                     SemanticId = submodel.SemanticId?.ToEnvironmentReference_V2_0()
                 };
@@ -249,15 +244,15 @@
         {
             var eventsToDelete = submodelElements.Where(s => s.ModelType == ModelType.Event || s.ModelType == ModelType.BasicEvent).ToList();
             foreach (var eventable in eventsToDelete)
-                submodelElements.Remove(eventable);
+                submodelElements.Delete(eventable.IdShort);
         }
 
 
-        private void ExtractSupplementalFiles(IEnumerable<ISubmodelElement> submodelElements)
+        private void ExtractSupplementalFiles(IElementContainer<ISubmodelElement> submodelElements)
         {
             foreach (var smElement in submodelElements)
             {
-                if (smElement is Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.File file)
+                if (smElement is Core.AssetAdministrationShell.Implementations.File file)
                 {
                     string filePath = ContentRoot + file.Value.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
                     if (System.IO.File.Exists(filePath))
@@ -271,11 +266,11 @@
                     }
                 }
                 else if (smElement.ModelType == ModelType.SubmodelElementCollection)
-                    ExtractSupplementalFiles((smElement as Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.SubmodelElementCollection).Value);
+                    ExtractSupplementalFiles((smElement as SubmodelElementCollection).Value);
             }
         }
 
-        private void ExtractAndClearConceptDescriptions(IEnumerable<ISubmodelElement> submodelElements)
+        private void ExtractAndClearConceptDescriptions(IElementContainer<ISubmodelElement> submodelElements)
         {
             foreach (var smElement in submodelElements)
             {
@@ -287,13 +282,13 @@
                     (smElement as SubmodelElement).EmbeddedDataSpecifications = null;
                 }
                 if (smElement.ModelType == ModelType.SubmodelElementCollection)
-                    ExtractAndClearConceptDescriptions((smElement as Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.SubmodelElementCollection).Value);
+                    ExtractAndClearConceptDescriptions((smElement as SubmodelElementCollection).Value);
             }
         }
 
         public void SetContentRoot(string contentRoot) => ContentRoot = contentRoot;
 
-        private void ResetConstraints(IEnumerable<ISubmodelElement> submodelElements)
+        private void ResetConstraints(IElementContainer<ISubmodelElement> submodelElements)
         {
             foreach (var smElement in submodelElements)
             {
@@ -307,7 +302,7 @@
                         ResetConstraints((smElement as IOperation).OutputVariables.ToElementContainer());
                 }
                 else if (smElement.ModelType == ModelType.SubmodelElementCollection)
-                    ResetConstraints((smElement as Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.SubmodelElementCollection).Value);
+                    ResetConstraints((smElement as SubmodelElementCollection).Value);
             }
         }
 
@@ -431,13 +426,11 @@
         {
             foreach (var envAsset in environment.EnvironmentAssets)
             {
-                Asset asset = new Asset
+                Asset asset = new Asset(envAsset.IdShort, envAsset.Identification)
                 {
                     Administration = envAsset.Administration,
                     Category = envAsset.Category,
                     Description = envAsset.Description,
-                    Identification = envAsset.Identification,
-                    IdShort = envAsset.IdShort,
                     Kind = envAsset.Kind,
                     AssetIdentificationModel = envAsset.AssetIdentificationModelReference?.ToReference_V2_0<ISubmodel>()                    
                 };
@@ -469,36 +462,29 @@
             }
             foreach (var envSubmodel in environment.EnvironmentSubmodels)
             {
-                Submodel submodel = new Submodel()
+                Submodel submodel = new Submodel(envSubmodel.IdShort, envSubmodel.Identification)
                 {
                     Administration = envSubmodel.Administration,
                     Category = envSubmodel.Category,
                     Description = envSubmodel.Description,
-                    Identification = envSubmodel.Identification,
-                    IdShort = envSubmodel.IdShort,
                     Kind = envSubmodel.Kind,
-                    Parent = string.IsNullOrEmpty(envSubmodel.Parent) ? null :
-                    new Reference(
-                        new Key(KeyElements.AssetAdministrationShell, KeyType.IRI, envSubmodel.Parent, true)),
                     SemanticId = envSubmodel.SemanticId?.ToReference_V2_0(),
-                    ConceptDescription = null,
+                    ConceptDescription = null
                 };
-                List<ISubmodelElement> smElements = envSubmodel.SubmodelElements.ConvertAll(c => c.submodelElement?.ToSubmodelElement(environment.ConceptDescriptions));
+                List<ISubmodelElement> smElements = envSubmodel.SubmodelElements.ConvertAll(c => c.submodelElement?.ToSubmodelElement(environment.ConceptDescriptions, submodel));
                 foreach (var smElement in smElements)
-                    submodel.SubmodelElements.Add(smElement);
+                    submodel.SubmodelElements.Create(smElement);
 
                 environment.Submodels.Add(submodel);
             }
             foreach (var envAssetAdministrationShell in environment.EnvironmentAssetAdministationShells)
             {
-                AssetAdministrationShell assetAdministrationShell = new AssetAdministrationShell()
+                AssetAdministrationShell assetAdministrationShell = new AssetAdministrationShell(envAssetAdministrationShell.IdShort, envAssetAdministrationShell.Identification)
                 {
                     Administration = envAssetAdministrationShell.Administration,
                     Category = envAssetAdministrationShell.Category,
                     DerivedFrom = envAssetAdministrationShell.DerivedFrom?.ToReference_V2_0<IAssetAdministrationShell>(),
-                    Description = envAssetAdministrationShell.Description,
-                    Identification = envAssetAdministrationShell.Identification,
-                    IdShort = envAssetAdministrationShell.IdShort
+                    Description = envAssetAdministrationShell.Description
                 };
 
                 IAsset asset = environment.Assets.Find(a => a.Identification.Id == envAssetAdministrationShell.AssetReference?.Keys?.FirstOrDefault()?.Value);
@@ -508,7 +494,7 @@
                 {
                     ISubmodel submodel = environment.Submodels.Find(s => s.Identification.Id == envSubmodelRef.Keys?.FirstOrDefault()?.Value);
                     if (submodel != null)
-                        assetAdministrationShell.Submodels.Add(submodel);
+                        assetAdministrationShell.Submodels.Create(submodel);
                 }
 
                 environment.AssetAdministrationShells.Add(assetAdministrationShell);
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentAsset_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentAsset_V2_0.cs
index 26e4511..9e9a953 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentAsset_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentAsset_V2_0.cs
@@ -8,7 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using Newtonsoft.Json;
 using System.Xml.Serialization;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs
index 490f68f..b77872f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentDataSpecifications/EnvironmentDataSpecificationIEC61360_V2_0.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.Common;
+using BaSyx.Models.Core.AssetAdministrationShell;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentReferable_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentReferable_V2_0.cs
index 37d4cd8..1465e54 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentReferable_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentReferable_V2_0.cs
@@ -8,6 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using Newtonsoft.Json;
 using System.Xml.Serialization;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElement_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElement_V2_0.cs
index d2e0897..8cf2381 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElement_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElement_V2_0.cs
@@ -8,7 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using Newtonsoft.Json;
 using System.Collections.Generic;
@@ -20,10 +21,15 @@
     public class EnvironmentSubmodelElement_V2_0
     {
         [XmlElement(ElementName = "property", Type = typeof(Property_V2_0))]
+        [XmlElement(ElementName = "multiLanguageProperty", Type = typeof(MultiLanguageProperty_V2_0))]
         [XmlElement(ElementName = "file", Type = typeof(File_V2_0))]
         [XmlElement(ElementName = "blob", Type = typeof(Blob_V2_0))]
         [XmlElement(ElementName = "event", Type = typeof(Event_V2_0))]
+        [XmlElement(ElementName = "basicEvent", Type = typeof(BasicEvent_V2_0))]
+        [XmlElement(ElementName = "range", Type = typeof(Range_V2_0))]
+        [XmlElement(ElementName = "entity", Type = typeof(Entity_V2_0))]
         [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement_V2_0))]
+        [XmlElement(ElementName = "annotatedRelationshipElement", Type = typeof(AnnotatedRelationshipElement_V2_0))]
         [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement_V2_0))]
         [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection_V2_0))]
         [XmlElement(ElementName = "operation", Type = typeof(Operation_V2_0))]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V2_0.cs
index c049862..c9c442c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/EnvironmentSubmodelElementFactory_V2_0.cs
@@ -9,9 +9,7 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Export.Converter;
 using System;
@@ -19,14 +17,13 @@
 using System.Linq;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
-using Range = BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.Range;
+using Range = BaSyx.Models.Core.AssetAdministrationShell.Implementations.Range;
 
 namespace BaSyx.Models.Export.EnvironmentSubmodelElements
 {
     public static class EnvironmentSubmodelElementFactory_V2_0
     {
-        public static ISubmodelElement ToSubmodelElement(this SubmodelElementType_V2_0 envSubmodelElement, List<IConceptDescription> conceptDescriptions)
+        public static ISubmodelElement ToSubmodelElement(this SubmodelElementType_V2_0 envSubmodelElement, List<IConceptDescription> conceptDescriptions, IReferable parent)
         {
             if (envSubmodelElement == null)
                 return null;
@@ -46,7 +43,7 @@
                 else if (!DataObjectType.TryParse(castedProperty.ValueType, out dataObjectType))
                     return null;
 
-                Property property = new Property(new DataType(dataObjectType))
+                Property property = new Property(castedProperty.IdShort, new DataType(dataObjectType))
                 {
                     Value = castedProperty.Value,
                     ValueId = castedProperty.ValueId?.ToReference_V2_0()
@@ -56,7 +53,7 @@
             }
             else if (modelType == ModelType.MultiLanguageProperty && envSubmodelElement is MultiLanguageProperty_V2_0 castedMultiLanguageProperty)
             {
-                MultiLanguageProperty multiLanguageProperty = new MultiLanguageProperty
+                MultiLanguageProperty multiLanguageProperty = new MultiLanguageProperty(castedMultiLanguageProperty.IdShort)
                 {
                     Value = castedMultiLanguageProperty.Value,
                     ValueId = castedMultiLanguageProperty.ValueId?.ToReference_V2_0()
@@ -69,7 +66,7 @@
                 if (!DataObjectType.TryParse(castedRange.ValueType, out DataObjectType dataObjectType))
                     return null;
 
-                Range range = new Range()
+                Range range = new Range(castedRange.IdShort)
                 {
                     Min = new ElementValue(castedRange.Min, new DataType(dataObjectType)),
                     Max = new ElementValue(castedRange.Max, new DataType(dataObjectType)),
@@ -80,7 +77,7 @@
             }            
             else if (modelType == ModelType.File && envSubmodelElement is File_V2_0 castedFile)
             {
-                File file = new File
+                File file = new File(castedFile.IdShort)
                 {
                     MimeType = castedFile.MimeType,
                     Value = castedFile.Value
@@ -90,7 +87,7 @@
             }
             else if (modelType == ModelType.Blob && envSubmodelElement is Blob_V2_0 castedBlob)
             {
-                Blob blob = new Blob
+                Blob blob = new Blob(castedBlob.IdShort)
                 {
                     MimeType = castedBlob.MimeType,
                     Value = Convert.FromBase64String(castedBlob.Value)
@@ -100,7 +97,7 @@
             }
             else if (modelType == ModelType.RelationshipElement && envSubmodelElement is RelationshipElement_V2_0 castedRelationshipElement)
             {
-                RelationshipElement relationshipElement = new RelationshipElement
+                RelationshipElement relationshipElement = new RelationshipElement(castedRelationshipElement.IdShort)
                 {
                     First = castedRelationshipElement.First?.ToReference_V2_0<IReferable>(),
                     Second = castedRelationshipElement.Second?.ToReference_V2_0<IReferable>()
@@ -110,7 +107,7 @@
             }
             else if (modelType == ModelType.AnnotatedRelationshipElement && envSubmodelElement is AnnotatedRelationshipElement_V2_0 castedAnnotatedRelationshipElement)
             {
-                AnnotatedRelationshipElement annotatedRelationshipElement = new AnnotatedRelationshipElement()
+                AnnotatedRelationshipElement annotatedRelationshipElement = new AnnotatedRelationshipElement(castedAnnotatedRelationshipElement.IdShort)
                 {
                     First = castedAnnotatedRelationshipElement.First?.ToReference_V2_0<IReferable>(),
                     Second = castedAnnotatedRelationshipElement.Second?.ToReference_V2_0<IReferable>(),
@@ -121,7 +118,7 @@
             }
             else if (modelType == ModelType.ReferenceElement && envSubmodelElement is ReferenceElement_V2_0 castedReferenceElement)
             {
-                ReferenceElement referenceElement = new ReferenceElement
+                ReferenceElement referenceElement = new ReferenceElement(castedReferenceElement.IdShort)
                 {
                     Value = castedReferenceElement.Value?.ToReference_V2_0()
                 };
@@ -130,13 +127,13 @@
             }
             else if (modelType == ModelType.Event && envSubmodelElement is Event_V2_0 castedEvent)
             {
-                Event eventable = new Event();
+                Event eventable = new Event(castedEvent.IdShort);
 
                 submodelElement = eventable;
             }
             else if (modelType == ModelType.BasicEvent && envSubmodelElement is BasicEvent_V2_0 castedBasicEvent)
             {
-                BasicEvent basicEvent = new BasicEvent()
+                BasicEvent basicEvent = new BasicEvent(castedBasicEvent.IdShort)
                 {
                     Observed = castedBasicEvent.Observed.ToReference_V2_0<IReferable>()
                 };
@@ -145,39 +142,39 @@
             }
             else if (modelType == ModelType.Entity && envSubmodelElement is Entity_V2_0 castedEntity)
             {
-                Entity entity = new Entity()
+                Entity entity = new Entity(castedEntity.IdShort)
                 {
                     EntityType = (EntityType)Enum.Parse(typeof(EntityType), castedEntity.EntityType.ToString()),
                     Asset = castedEntity.AssetReference.ToReference_V2_0<IAsset>()
                 };
 
-                var statements = castedEntity.Statements?.ConvertAll(c => c.submodelElement.ToSubmodelElement(conceptDescriptions));
+                var statements = castedEntity.Statements?.ConvertAll(c => c.submodelElement.ToSubmodelElement(conceptDescriptions, parent));
                 if (statements?.Count > 0)
                     foreach (var element in statements)
-                        entity.Statements.Add(element);
+                        entity.Statements.Create(element);
 
                 submodelElement = entity;
             }
             else if (modelType == ModelType.Operation && envSubmodelElement is Operation_V2_0 castedOperation)
             {
-                Operation operation = new Operation
+                Operation operation = new Operation(castedOperation.IdShort)
                 {
                     InputVariables = new OperationVariableSet(),
                     OutputVariables = new OperationVariableSet(),
                     InOutputVariables = new OperationVariableSet()
                 };
 
-                var operationInElements = castedOperation.InputVariables?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions));
+                var operationInElements = castedOperation.InputVariables?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions, parent));
                 if(operationInElements?.Count > 0)
                     foreach (var element in operationInElements)
                         operation.InputVariables.Add(element);
                 
-                var operationOutElements = castedOperation.OutputVariables?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions));
+                var operationOutElements = castedOperation.OutputVariables?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions, parent));
                 if (operationOutElements?.Count > 0)
                     foreach (var element in operationOutElements)
                         operation.OutputVariables.Add(element);
 
-                var operationInOutElements = castedOperation.InOutputVariables?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions));
+                var operationInOutElements = castedOperation.InOutputVariables?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions, parent));
                 if (operationInOutElements?.Count > 0)
                     foreach (var element in operationInOutElements)
                         operation.InOutputVariables.Add(element);
@@ -186,14 +183,14 @@
             }
             else if (modelType == ModelType.SubmodelElementCollection && envSubmodelElement is SubmodelElementCollection_V2_0 castedSubmodelElementCollection)
             {
-                SubmodelElementCollection submodelElementCollection = new SubmodelElementCollection();
+                SubmodelElementCollection submodelElementCollection = new SubmodelElementCollection(castedSubmodelElementCollection.IdShort);
 
                 if (castedSubmodelElementCollection.Value?.Count > 0)
                 {
-                    submodelElementCollection.Value = new ElementContainer<ISubmodelElement>();
-                    List<ISubmodelElement> smElements = castedSubmodelElementCollection.Value?.ConvertAll(c => c.submodelElement?.ToSubmodelElement(conceptDescriptions));
+                    submodelElementCollection.Value = new ElementContainer<ISubmodelElement>(parent, submodelElementCollection, null);
+                    List<ISubmodelElement> smElements = castedSubmodelElementCollection.Value?.ConvertAll(c => c.submodelElement?.ToSubmodelElement(conceptDescriptions, parent));
                     foreach (var smElement in smElements)
-                        submodelElementCollection.Value.Add(smElement);
+                        submodelElementCollection.Value.Create(smElement);
                 }
 
                 submodelElement = submodelElementCollection;
@@ -208,9 +205,6 @@
             submodelElement.IdShort = envSubmodelElement.IdShort;
             submodelElement.Kind = envSubmodelElement.Kind;
             submodelElement.SemanticId = envSubmodelElement.SemanticId?.ToReference_V2_0();
-            submodelElement.Parent = string.IsNullOrEmpty(envSubmodelElement.Parent) ? null :
-                    new Reference(
-                        new Key(KeyElements.AssetAdministrationShell, KeyType.IRI, envSubmodelElement.Parent, true));
             submodelElement.Constraints = null;
 
             string semanticId = envSubmodelElement.SemanticId?.Keys?.FirstOrDefault()?.Value;
@@ -241,7 +235,6 @@
                 Description = element.Description,
                 IdShort = element.IdShort,
                 Kind = element.Kind,
-                Parent = element.Parent?.First?.Value,
                 Qualifier = null,
                 SemanticId = element.SemanticId?.ToEnvironmentReference_V2_0(),
             };
@@ -309,7 +302,7 @@
                 };
 
                 List<EnvironmentSubmodelElement_V2_0> statements = new List<EnvironmentSubmodelElement_V2_0>();
-                if (castedEntity.Statements?.Count > 0)
+                if (castedEntity.Statements?.Count() > 0)
                     foreach (var smElement in castedEntity.Statements)
                         statements.Add(smElement.ToEnvironmentSubmodelElement_V2_0());
                 (environmentSubmodelElement.submodelElement as Entity_V2_0).Statements = statements;
@@ -350,7 +343,7 @@
             {
                 environmentSubmodelElement.submodelElement = new SubmodelElementCollection_V2_0(submodelElementType);
                 List<EnvironmentSubmodelElement_V2_0> environmentSubmodelElements = new List<EnvironmentSubmodelElement_V2_0>();
-                if (castedSubmodelElementCollection.Value?.Count > 0)
+                if (castedSubmodelElementCollection.Value?.Count() > 0)
                     foreach (var smElement in castedSubmodelElementCollection.Value)
                         environmentSubmodelElements.Add(smElement.ToEnvironmentSubmodelElement_V2_0());
                 (environmentSubmodelElement.submodelElement as SubmodelElementCollection_V2_0).Value = environmentSubmodelElements;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/MultiLanguageProperty_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/MultiLanguageProperty_V2_0.cs
index 49cbd42..f8a6144 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/MultiLanguageProperty_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/MultiLanguageProperty_V2_0.cs
@@ -8,6 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using Newtonsoft.Json;
 using System.Xml.Serialization;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodel_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodel_V2_0.cs
index c448ae1..bec5bd0 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodel_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodel_V2_0.cs
@@ -8,7 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.Common;
 using BaSyx.Models.Export.Converter;
 using Newtonsoft.Json;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/BaSyx.Models.csproj b/sdks/dotnet/basyx-core/BaSyx.Models/BaSyx.Models.csproj
index 3e45716..7699776 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/BaSyx.Models.csproj
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/BaSyx.Models.csproj
@@ -14,6 +14,9 @@
     <PackageLicenseExpression>EPL-2.0</PackageLicenseExpression>
     <PackageIcon>basyxlogo.png</PackageIcon>
   </PropertyGroup>
+  <ItemGroup>
+    <Compile Remove="Core\Common\SubmodelElementContainer.cs" />
+  </ItemGroup>
 
   <ItemGroup>
     <None Include="basyxlogo.png" Pack="true" PackagePath="\" />
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Communication/ExecutionState.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Communication/ExecutionState.cs
index 571e6b4..26abd1a 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Communication/ExecutionState.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Communication/ExecutionState.cs
@@ -10,12 +10,35 @@
 *******************************************************************************/
 namespace BaSyx.Models.Communication
 {
+    /// <summary>
+    /// Defines the execution state of an invoked operation
+    /// </summary>
     public enum ExecutionState
     {
+        /// <summary>
+        /// Initial state of execution
+        /// </summary>
         Initiated,
+        /// <summary>
+        /// The operation is running
+        /// </summary>
         Running,
+        /// <summary>
+        /// The operation execution has been completed
+        /// </summary>
         Completed,
+        /// <summary>
+        /// The operation execution has been canceled
+        /// </summary>
         Canceled,
-        Failed
+        /// <summary>
+        /// The operation execution has been failed
+        /// </summary>
+        Failed,
+        /// <summary>
+        /// The operation execution has timed out
+        /// </summary>
+        Timeout
+
     }
 }
\ No newline at end of file
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationRequest.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationRequest.cs
index a4967af..8a5acaf 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationRequest.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationRequest.cs
@@ -22,6 +22,9 @@
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "inputArguments")]
         public IOperationVariableSet InputArguments { get; set; }
 
+        [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "inoutputArguments")]
+        public IOperationVariableSet InOutputArguments { get; set; }
+
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "timeout")]
         public int? Timeout { get; set; }
 
@@ -29,6 +32,7 @@
         {
             RequestId = requestId;
             InputArguments = new OperationVariableSet();
+            InOutputArguments = new OperationVariableSet();
         }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationResponse.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationResponse.cs
index 272be84..e0b4b86 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationResponse.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Communication/InvocationResponse.cs
@@ -20,6 +20,9 @@
         [DataMember(EmitDefaultValue = false, IsRequired = true, Name = "requestId")]
         public string RequestId { get; private set; }
 
+        [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "inoutputArguments")]
+        public IOperationVariableSet InOutputArguments { get; set; }
+
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "outputArguments")]
         public IOperationVariableSet OutputArguments { get; set; }
 
@@ -32,6 +35,7 @@
         public InvocationResponse(string requestId)
         {
             RequestId = requestId;
+            InOutputArguments = new OperationVariableSet();
             OutputArguments = new OperationVariableSet();
             ExecutionState = ExecutionState.Initiated;
         }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellDescriptor.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellDescriptor.cs
index 1033ae5..0b46338 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellDescriptor.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellDescriptor.cs
@@ -9,7 +9,6 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using Newtonsoft.Json;
 using System.Collections.Generic;
@@ -17,6 +16,7 @@
 using BaSyx.Models.Core.Common;
 using System.Collections;
 using System.Linq;
+using BaSyx.Models.Core.AssetAdministrationShell;
 
 namespace BaSyx.Models.Connectivity.Descriptors
 {
@@ -30,20 +30,21 @@
         public IEnumerable<IEndpoint> Endpoints { get; internal set; }
 
         [IgnoreDataMember]
-        public IReference Parent => null;
+        public IReferable Parent { get; set; }
         [IgnoreDataMember]
         public string Category => null;
 
         public ModelType ModelType => ModelType.AssetAdministrationShellDescriptor;
 
         public IAsset Asset { get; set; }
+
         public IElementContainer<ISubmodelDescriptor> SubmodelDescriptors { get; set; }
 
         [JsonConstructor]
         public AssetAdministrationShellDescriptor(IEnumerable<IEndpoint> endpoints) 
         {
             Endpoints = endpoints ?? new List<IEndpoint>();
-            SubmodelDescriptors = new ElementContainer<ISubmodelDescriptor>();
+            SubmodelDescriptors = new ElementContainer<ISubmodelDescriptor>(this);
         }
 
         public AssetAdministrationShellDescriptor(IAssetAdministrationShell aas, IEnumerable<IEndpoint> endpoints) : this(endpoints)
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellRepositoryDescriptor.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellRepositoryDescriptor.cs
index 2add044..50ba26f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellRepositoryDescriptor.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/AssetAdministrationShellRepositoryDescriptor.cs
@@ -9,7 +9,6 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using Newtonsoft.Json;
 using System.Collections.Generic;
@@ -17,6 +16,7 @@
 using BaSyx.Models.Core.Common;
 using System.Linq;
 using System.Collections;
+using BaSyx.Models.Core.AssetAdministrationShell;
 
 namespace BaSyx.Models.Connectivity.Descriptors
 {
@@ -34,7 +34,7 @@
         public IEnumerable<IEndpoint> Endpoints { get; internal set; }
 
         [IgnoreDataMember]
-        public IReference Parent => null;
+        public IReferable Parent { get; set; }
         [IgnoreDataMember]
         public string Category => null;
 
@@ -45,7 +45,7 @@
         public AssetAdministrationShellRepositoryDescriptor(IEnumerable<IEndpoint> endpoints) 
         {
             Endpoints = endpoints ?? new List<IEndpoint>();
-            AssetAdministrationShellDescriptors = new ElementContainer<IAssetAdministrationShellDescriptor>();
+            AssetAdministrationShellDescriptors = new ElementContainer<IAssetAdministrationShellDescriptor>(this);
         }
      
         [JsonConstructor]
@@ -61,8 +61,8 @@
         public void AddAssetAdministrationShell(IAssetAdministrationShell aas)
         {
             AssetAdministrationShellDescriptor assetAdministrationShellDescriptor = new AssetAdministrationShellDescriptor(aas, Endpoints.ToList());
-            if (aas.Submodels?.Count > 0)
-                foreach (var submodel in aas.Submodels)
+            if (aas.Submodels?.Count() > 0)
+                foreach (var submodel in aas.Submodels.Values)
                 {
                     assetAdministrationShellDescriptor.SubmodelDescriptors.Create(new SubmodelDescriptor(submodel, Endpoints.ToList()));
                 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelDescriptor.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelDescriptor.cs
index 6fc8398..c09d906 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelDescriptor.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelDescriptor.cs
@@ -16,6 +16,7 @@
 using System.Collections.Generic;
 using System.Runtime.Serialization;
 using BaSyx.Models.Core.Common;
+using BaSyx.Models.Core.AssetAdministrationShell;
 
 namespace BaSyx.Models.Connectivity.Descriptors
 {
@@ -32,7 +33,7 @@
         public IEnumerable<IEndpoint> Endpoints { get; private set; }
 
         [IgnoreDataMember]
-        public IReference Parent => null;
+        public IReferable Parent { get; set; }
         [IgnoreDataMember]
         public string Category => null;
 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelRepositoryDescriptor.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelRepositoryDescriptor.cs
index 6a3b870..9cbe5d6 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelRepositoryDescriptor.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Connectivity/Descriptors/SubmodelRepositoryDescriptor.cs
@@ -17,6 +17,7 @@
 using BaSyx.Models.Core.Common;
 using System.Linq;
 using System.Collections;
+using BaSyx.Models.Core.AssetAdministrationShell;
 
 namespace BaSyx.Models.Connectivity.Descriptors
 {
@@ -34,7 +35,7 @@
         public IEnumerable<IEndpoint> Endpoints { get; internal set; }
 
         [IgnoreDataMember]
-        public IReference Parent => null;
+        public IReferable Parent { get; set; }
         [IgnoreDataMember]
         public string Category => null;
 
@@ -45,7 +46,7 @@
         public SubmodelRepositoryDescriptor(IEnumerable<IEndpoint> endpoints) 
         {
             Endpoints = endpoints ?? new List<IEndpoint>();
-            SubmodelDescriptors = new ElementContainer<ISubmodelDescriptor>();
+            SubmodelDescriptors = new ElementContainer<ISubmodelDescriptor>(this);
         }
      
         [JsonConstructor]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/AssetKind.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/AssetKind.cs
index efbe8c1..98a9c20 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/AssetKind.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/AssetKind.cs
@@ -11,7 +11,7 @@
 using System.Runtime.Serialization;
 using System.Xml.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Enums
+namespace BaSyx.Models.Core.AssetAdministrationShell
 {
     [DataContract]
     public enum AssetKind : int
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/ModelingKind.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/ModelingKind.cs
index 9efcf9a..f8d8226 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/ModelingKind.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/ModelingKind.cs
@@ -11,7 +11,7 @@
 using System.Runtime.Serialization;
 using System.Xml.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Enums
+namespace BaSyx.Models.Core.AssetAdministrationShell
 {
     [DataContract]
     public enum ModelingKind : int
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/SchemaType.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/SchemaType.cs
index 6eaf1f4..b0ad79e 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/SchemaType.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Enums/SchemaType.cs
@@ -10,14 +10,14 @@
 *******************************************************************************/
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Enums
+namespace BaSyx.Models.Core.AssetAdministrationShell
 {
     [DataContract]
     public enum SchemaType : int
     {
-        None = 0,
+        NONE = 0,
         XSD = 1,
         RDFS = 2,
-        JSchema = 3
+        JSON = 3
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/IAsset.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/IAsset.cs
index ccd27b4..409e3a1 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/IAsset.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/IAsset.cs
@@ -12,7 +12,7 @@
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using System.Runtime.Serialization;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
 using BaSyx.Models.Core.Common;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodel.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodel.cs
index 43fe92c..78e8303 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodel.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodel.cs
@@ -9,7 +9,7 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Constraints;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
@@ -25,15 +25,6 @@
     /// </summary>
     public interface ISubmodel : IIdentifiable, IHasKind, IHasSemantics, IModelElement, IHasDataSpecification, IQualifiable
     {
-        [IgnoreDataMember]
-        IEnumerable<IProperty> Properties { get; }
-
-        [IgnoreDataMember]
-        IEnumerable<IOperation> Operations { get; }
-
-        [IgnoreDataMember]
-        IEnumerable<IEvent> Events { get; }
-
         /// <summary>
         /// A submodel consists of zero or more submodel elements. 
         /// </summary>
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodelElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodelElement.cs
index c9ab57e..1cafec6 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodelElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/ISubmodelElement.cs
@@ -14,10 +14,22 @@
 using BaSyx.Models.Extensions;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
+using System.Runtime.Serialization;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
+    public delegate IValue GetValueHandler(ISubmodelElement submodelElement);
+    public delegate void SetValueHandler(ISubmodelElement submodelElement, IValue value);
+
+    public delegate TValue GetValueHandler<TValue>(ISubmodelElement submodelElement);
+    public delegate void SetValueHandler<TValue>(ISubmodelElement submodelElement, TValue value);
+
     [JsonConverter(typeof(SubmodelElementConverter))]
     public interface ISubmodelElement : IHasSemantics, IQualifiable, IReferable, IHasKind, IModelElement, IHasDataSpecification
-    { }
+    {
+        [IgnoreDataMember]
+        GetValueHandler Get { get; }
+        [IgnoreDataMember]
+        SetValueHandler Set { get; }
+    }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementHandler.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementHandler.cs
new file mode 100644
index 0000000..54d7ab1
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementHandler.cs
@@ -0,0 +1,34 @@
+/*******************************************************************************
+* 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.Reflection;
+
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
+{
+    public class SubmodelElementHandler
+    {
+        public GetValueHandler GetValueHandler { get; private set; }
+        public SetValueHandler SetValueHandler { get; private set; }
+        public SubmodelElementHandler(GetValueHandler getHandler, SetValueHandler setHandler)
+        {
+            GetValueHandler = getHandler;
+            SetValueHandler = setHandler;
+        }
+
+        public SubmodelElementHandler(MethodInfo getMethodInfo, MethodInfo setMethodInfo, object target)
+        {
+            if(getMethodInfo != null)
+                GetValueHandler = (GetValueHandler)getMethodInfo.CreateDelegate(typeof(GetValueHandler), target);
+            if(setMethodInfo != null)
+                SetValueHandler = (SetValueHandler)setMethodInfo.CreateDelegate(typeof(SetValueHandler), target);
+        }
+    }
+
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IAnnotatedRelationshipElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IAnnotatedRelationshipElement.cs
index 8df429d..c57497f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IAnnotatedRelationshipElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IAnnotatedRelationshipElement.cs
@@ -11,7 +11,7 @@
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// An annotated relationship element is a relationship element that can be annotated with additional data elements. 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBasicEvent.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBasicEvent.cs
index a7d148b..35ac422 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBasicEvent.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBasicEvent.cs
@@ -12,7 +12,7 @@
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A basic event
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBlob.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBlob.cs
index f5df1ba..beee511 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBlob.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IBlob.cs
@@ -11,7 +11,7 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A BLOB is a data element that represents a file that is contained with its source code in the value attribute.
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ICapability.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ICapability.cs
index 50a5fd5..dd43738 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ICapability.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ICapability.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     public interface ICapability : ISubmodelElement
     { }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEntity.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEntity.cs
index a88d592..25c9975 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEntity.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEntity.cs
@@ -12,7 +12,7 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// An entity is a submodel element that is used to model entities. 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEvent.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEvent.cs
index c84c753..6833575 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEvent.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IEvent.cs
@@ -11,7 +11,7 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     public interface IEvent : ISubmodelElement
     {
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IFile.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IFile.cs
index 4207d9c..8cff209 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IFile.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IFile.cs
@@ -10,7 +10,7 @@
 *******************************************************************************/
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A File is a data element that represents an address to a file. The value is an URI that can represent an absolute or relative path. 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IMultiLanguageProperty.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IMultiLanguageProperty.cs
index f55e302..32bf2e0 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IMultiLanguageProperty.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IMultiLanguageProperty.cs
@@ -12,7 +12,7 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A property is a data element that has a multi language value. 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IOperation.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IOperation.cs
index a96de7e..c45d95c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IOperation.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IOperation.cs
@@ -11,11 +11,17 @@
 using BaSyx.Models.Core.Common;
 using BaSyx.Utils.ResultHandling;
 using System.Runtime.Serialization;
+using System.Threading;
 using System.Threading.Tasks;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
-    public delegate Task<OperationResult> MethodCalledHandler(IOperation operation, IOperationVariableSet inputArguments, IOperationVariableSet outputArguments);
+    public delegate Task<OperationResult> MethodCalledHandler(
+        IOperation operation,
+        IOperationVariableSet inputArguments, 
+        IOperationVariableSet inoutputArguments, 
+        IOperationVariableSet outputArguments, 
+        CancellationToken cancellationToken);
 
     /// <summary>
     /// An operation is a submodel element with input and output variables. 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IProperty.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IProperty.cs
index 4823e92..311ff37 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IProperty.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IProperty.cs
@@ -12,24 +12,13 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
-    public delegate IValue GetPropertyValueHandler(IProperty property);
-    public delegate void SetPropertyValueHandler(IProperty property, IValue value);
-
-    public delegate TValue GetPropertyValueHandler<TValue>(IProperty property);
-    public delegate void SetPropertyValueHandler<TValue>(IProperty property, TValue value);
-
     /// <summary>
     /// A property is a data element that has a single value. 
     /// </summary>
     public interface IProperty : ISubmodelElement, IValue
     {
-        [IgnoreDataMember]
-        GetPropertyValueHandler Get { get; }
-        [IgnoreDataMember]
-        SetPropertyValueHandler Set { get; }
-
         /// <summary>
         /// Reference to the global unqiue id of a coded value.  
         /// </summary>
@@ -37,11 +26,12 @@
         IReference ValueId { get; set; }
     }
 
+    ///<inheritdoc cref="IProperty"/>
     public interface IProperty<TValue> : IProperty, IValue<TValue>
     {
         [IgnoreDataMember]
-        new GetPropertyValueHandler<TValue> Get { get; }
+        new GetValueHandler<TValue> Get { get; }
         [IgnoreDataMember]
-        new SetPropertyValueHandler<TValue> Set { get; }
+        new SetValueHandler<TValue> Set { get; }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IPublishableEvent.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IPublishableEvent.cs
index 15a667c..6edc956 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IPublishableEvent.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IPublishableEvent.cs
@@ -11,7 +11,7 @@
 using System.Runtime.Serialization;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     public interface IPublishableEvent
     {
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRange.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRange.cs
index 4027727..379e8b6 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRange.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRange.cs
@@ -11,7 +11,7 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A range data element is a data element that defines a range with min and max
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IReferenceElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IReferenceElement.cs
index 7c1fc5e..731e439 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IReferenceElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IReferenceElement.cs
@@ -13,7 +13,7 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A reference element is a data element that defines a logical reference to another element within the same or another AAS or a reference to an external object or entity. 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRelationshipElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRelationshipElement.cs
index 15e4af7..0386f3c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRelationshipElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/IRelationshipElement.cs
@@ -12,7 +12,7 @@
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A relationship element is used to define a relationship between two referable elements.
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ISubmodelElementCollection.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ISubmodelElementCollection.cs
index 5300626..eb89295 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ISubmodelElementCollection.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Generics/SubmodelElementTypes/ISubmodelElementCollection.cs
@@ -11,7 +11,7 @@
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Generics
 {
     /// <summary>
     /// A submodel element collection is a set or list of submodel elements.
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxAssetIdentifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxAssetIdentifier.cs
new file mode 100644
index 0000000..6a640ea
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxAssetIdentifier.cs
@@ -0,0 +1,23 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification.BaSyx
+{
+    public class BaSyxAssetIdentifier : UniformResourceName
+    {
+        public BaSyxAssetIdentifier(string assetName, string version)
+            : this(assetName, version, null, null, null)
+        { }
+
+        public BaSyxAssetIdentifier(string assetName, string version, string revision, string elementId, string instanceNumber) 
+            : base(BaSyxUrnConstants.BASYX_NAMESPACE, BaSyxUrnConstants.BASYX_ASSETS, assetName, version, revision, elementId, instanceNumber)
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxEventIdentifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxEventIdentifier.cs
new file mode 100644
index 0000000..46beb9a
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxEventIdentifier.cs
@@ -0,0 +1,23 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification.BaSyx
+{
+    public class BaSyxEventIdentifier : UniformResourceName
+    {
+        public BaSyxEventIdentifier(string eventName, string version)
+            : this(eventName, version, null, null, null)
+        { }
+
+        public BaSyxEventIdentifier(string eventName, string version, string revision, string elementId, string instanceNumber) 
+            : base(BaSyxUrnConstants.BASYX_NAMESPACE, BaSyxUrnConstants.BASYX_EVENTS, eventName, version, revision, elementId, instanceNumber)
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxOperationIdentifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxOperationIdentifier.cs
new file mode 100644
index 0000000..5201c8b
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxOperationIdentifier.cs
@@ -0,0 +1,23 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification.BaSyx
+{
+    public class BaSyxOperationIdentifier : UniformResourceName
+    {
+        public BaSyxOperationIdentifier(string operationName, string version)
+            : this(operationName, version, null, null, null)
+        { }
+
+        public BaSyxOperationIdentifier(string operationName, string version, string revision, string elementId, string instanceNumber) 
+            : base(BaSyxUrnConstants.BASYX_NAMESPACE, BaSyxUrnConstants.BASYX_OPERATIONS, operationName, version, revision, elementId, instanceNumber)
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxPropertyIdentifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxPropertyIdentifier.cs
new file mode 100644
index 0000000..0141333
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxPropertyIdentifier.cs
@@ -0,0 +1,23 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification.BaSyx
+{
+    public class BaSyxPropertyIdentifier : UniformResourceName
+    {
+        public BaSyxPropertyIdentifier(string propertyName, string version)
+            : this(propertyName, version, null, null, null)
+        { }
+
+        public BaSyxPropertyIdentifier(string propertyName, string version, string revision, string elementId, string instanceNumber) 
+            : base(BaSyxUrnConstants.BASYX_NAMESPACE, BaSyxUrnConstants.BASYX_PROPERTIES, propertyName, version, revision, elementId, instanceNumber)
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxShellIdentifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxShellIdentifier.cs
new file mode 100644
index 0000000..17c1f11
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxShellIdentifier.cs
@@ -0,0 +1,23 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification.BaSyx
+{
+    public class BaSyxShellIdentifier : UniformResourceName
+    {
+        public BaSyxShellIdentifier(string shellName, string version)
+            : this(shellName, version, null, null, null)
+        { }
+
+        public BaSyxShellIdentifier(string shellName, string version, string revision, string elementId, string instanceNumber) 
+            : base(BaSyxUrnConstants.BASYX_NAMESPACE, BaSyxUrnConstants.BASYX_SHELLS, shellName, version, revision, elementId, instanceNumber)
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxSubmodelIdentifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxSubmodelIdentifier.cs
new file mode 100644
index 0000000..57a6d70
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxSubmodelIdentifier.cs
@@ -0,0 +1,23 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification.BaSyx
+{
+    public class BaSyxSubmodelIdentifier : UniformResourceName
+    {
+        public BaSyxSubmodelIdentifier(string submodelName, string version)
+            : this(submodelName, version, null, null, null)
+        { }
+
+        public BaSyxSubmodelIdentifier(string submodelName, string version, string revision, string elementId, string instanceNumber) 
+            : base(BaSyxUrnConstants.BASYX_NAMESPACE, BaSyxUrnConstants.BASYX_SUBMODELS, submodelName, version, revision, elementId, instanceNumber)
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxUrnConstants.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxUrnConstants.cs
new file mode 100644
index 0000000..ad63c95
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/BaSyx/BaSyxUrnConstants.cs
@@ -0,0 +1,23 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification.BaSyx
+{
+    public static class BaSyxUrnConstants
+    {
+        public const string BASYX_NAMESPACE = "org.eclipse.basyx";
+        public const string BASYX_SHELLS = "shells";
+        public const string BASYX_ASSETS = "assets";
+        public const string BASYX_SUBMODELS = "submodels";
+        public const string BASYX_PROPERTIES = "properties";
+        public const string BASYX_OPERATIONS = "operations";
+        public const string BASYX_EVENTS = "events";
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IHasKind.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IHasKind.cs
index 4525743..17bc3b8 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IHasKind.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IHasKind.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
 using System.Runtime.Serialization;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Identification
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IReferable.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IReferable.cs
index e46e886..4a8c5b1 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IReferable.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/IReferable.cs
@@ -8,10 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.References;
 using Newtonsoft.Json;
 using System.Runtime.Serialization;
-using BaSyx.Models.Core.Common;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Identification
 {
@@ -38,10 +36,7 @@
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "description")]
         LangStringSet Description { get; }
 
-        /// <summary>
-        /// Reference to the next referable parent element of the element.
-        /// </summary>
-        [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "parent")]
-        IReference Parent { get; }
+        [IgnoreDataMember]
+        IReferable Parent { get; set; }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/Identifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/Identifier.cs
index 0d54fbd..574531b 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/Identifier.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/Identifier.cs
@@ -43,84 +43,7 @@
         {
             Id = id;
             IdType = idType;
-        }
-
-
-        public class UniformResourceIdentifier : Identifier
-        {
-            public string Organisation { get; internal set; }
-            public string SubUnit { get; internal set; }
-            public string DomainId { get; internal set; }
-            public string Version { get; internal set; }
-            public string Revision { get; internal set; }
-            public string ElementId { get; internal set; }
-            public string InstanceNumber { get; internal set; }
-
-            public UniformResourceIdentifier(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
-                : base(ToUrn(organisation, subUnit, domainId, version, revision, elementId, instanceNumber), KeyType.IRI)
-            {
-                Organisation = organisation;
-                SubUnit = subUnit;
-                DomainId = domainId;
-                Version = version;
-                Revision = revision;
-                ElementId = elementId;
-                InstanceNumber = instanceNumber;
-            }
-
-            public string ToUri() => ToUri(Organisation, SubUnit, DomainId, Version, Revision, ElementId, InstanceNumber);
-            public string ToUrn() => ToUrn(Organisation, SubUnit, DomainId, Version, Revision, ElementId, InstanceNumber);
-
-            public static string ToUri(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
-            {
-                string uri = "http://";
-
-                uri += organisation + "/";
-
-                if (!string.IsNullOrEmpty(subUnit))
-                    uri += subUnit + "/";
-                if (!string.IsNullOrEmpty(domainId))
-                    uri += domainId + "/";
-                if (!string.IsNullOrEmpty(version))
-                    uri += version + "/";
-                if (!string.IsNullOrEmpty(revision))
-                    uri += revision + "/";
-                if (!string.IsNullOrEmpty(elementId))
-                    uri += elementId + "/";
-
-                if (!string.IsNullOrEmpty(instanceNumber))
-                {
-                    uri = uri.Substring(0, uri.Length - 2);
-                    uri += "#" + instanceNumber;
-                }
-                return uri;
-            }
-            public static string ToUrn(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
-            {
-                string urn = "urn:";
-
-                urn += organisation + ":";
-
-                if (!string.IsNullOrEmpty(subUnit))
-                    urn += subUnit + ":";
-                if (!string.IsNullOrEmpty(domainId))
-                    urn += domainId + ":";
-                if (!string.IsNullOrEmpty(version))
-                    urn += version + ":";
-                if (!string.IsNullOrEmpty(revision))
-                    urn += revision + ":";
-                if (!string.IsNullOrEmpty(elementId))
-                    urn += elementId + ":";
-
-                if (!string.IsNullOrEmpty(instanceNumber))
-                {
-                    urn = urn.Substring(0, urn.Length - 2);
-                    urn += "#" + instanceNumber;
-                }
-                return urn;
-            }
-        }
-
+        }        
     }
 
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResource.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResource.cs
new file mode 100644
index 0000000..600dfb3
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResource.cs
@@ -0,0 +1,88 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification
+{
+    public abstract class UniformResource
+    {
+        public virtual string Organisation { get; set; }
+        public virtual string SubUnit { get; set; }
+        public virtual string DomainId { get; set; }
+        public virtual string Version { get; set; }
+        public virtual string Revision { get; set; }
+        public virtual string ElementId { get; set; }
+        public virtual string InstanceNumber { get; set; }
+
+        protected UniformResource(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
+        {
+            Organisation = organisation;
+            SubUnit = subUnit;
+            DomainId = domainId;
+            Version = version;
+            Revision = revision;
+            ElementId = elementId;
+            InstanceNumber = instanceNumber;
+        }
+
+        public abstract Identifier ToIdentifier();
+        public virtual string ToUri() => ToUri(Organisation, SubUnit, DomainId, Version, Revision, ElementId, InstanceNumber);
+        public virtual string ToUrn() => ToUrn(Organisation, SubUnit, DomainId, Version, Revision, ElementId, InstanceNumber);
+
+        public static string ToUri(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
+        {
+            string uri = "http://";
+
+            uri += organisation + "/";
+
+            if (!string.IsNullOrEmpty(subUnit))
+                uri += subUnit + "/";
+            if (!string.IsNullOrEmpty(domainId))
+                uri += domainId + "/";
+            if (!string.IsNullOrEmpty(version))
+                uri += version + "/";
+            if (!string.IsNullOrEmpty(revision))
+                uri += revision + "/";
+            if (!string.IsNullOrEmpty(elementId))
+                uri += elementId + "/";
+
+            if (!string.IsNullOrEmpty(instanceNumber))
+            {
+                uri = uri.Substring(0, uri.Length - 2);
+                uri += "#" + instanceNumber;
+            }
+            return uri;
+        }
+        public static string ToUrn(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
+        {
+            string urn = "urn:";
+
+            urn += organisation + ":";
+
+            if (!string.IsNullOrEmpty(subUnit))
+                urn += subUnit + ":";
+            if (!string.IsNullOrEmpty(domainId))
+                urn += domainId + ":";
+            if (!string.IsNullOrEmpty(version))
+                urn += version + ":";
+            if (!string.IsNullOrEmpty(revision))
+                urn += revision + ":";
+            if (!string.IsNullOrEmpty(elementId))
+                urn += elementId + ":";
+
+            if (!string.IsNullOrEmpty(instanceNumber))
+            {
+                urn = urn.Substring(0, urn.Length - 2);
+                urn += "#" + instanceNumber;
+            }
+            return urn;
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResourceIdentifier.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResourceIdentifier.cs
new file mode 100644
index 0000000..42aadf9
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResourceIdentifier.cs
@@ -0,0 +1,26 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.References;
+
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification
+{
+    public class UniformResourceIdentifier : UniformResource
+    {
+        public UniformResourceIdentifier(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
+            :base(organisation, subUnit, domainId, version, revision, elementId, instanceNumber)
+        { }
+
+        public override Identifier ToIdentifier()
+        {
+            return new Identifier(ToUri(), KeyType.IRI);
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResourceName.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResourceName.cs
new file mode 100644
index 0000000..cfa295e
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Identification/UniformResourceName.cs
@@ -0,0 +1,26 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.References;
+
+namespace BaSyx.Models.Core.AssetAdministrationShell.Identification
+{
+    public class UniformResourceName : UniformResource
+    {
+        public UniformResourceName(string organisation, string subUnit, string domainId, string version, string revision, string elementId, string instanceNumber)
+            :base(organisation, subUnit, domainId, version, revision, elementId, instanceNumber)
+        { }
+
+        public override Identifier ToIdentifier()
+        {
+            return new Identifier(ToUrn(), KeyType.IRI);
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Asset.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Asset.cs
index 53bc189..9c52e79 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Asset.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Asset.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
@@ -21,25 +21,18 @@
 namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
-    public class Asset : IAsset
+    public class Asset : Identifiable, IAsset
     {
-        public string IdShort { get; set; }
-        public Identifier Identification { get; set; }
         public AssetKind Kind { get; set; } = AssetKind.Instance;
-        public LangStringSet Description { get; set; }
-        public IReference Parent { get; set; }
-        public Dictionary<string, string> MetaData { get; set; }
         public IReference<ISubmodel> AssetIdentificationModel { get; set; }
         public IReference<ISubmodel> BillOfMaterial { get; set; }
-        public AdministrativeInformation Administration { get; set; }
-        public string Category { get; set; }
         public IReference SemanticId { get; set; }
         public IEnumerable<IEmbeddedDataSpecification> EmbeddedDataSpecifications { get; }
         public IConceptDescription ConceptDescription { get; set; }
         public ModelType ModelType => ModelType.Asset;
 
         [JsonConstructor]
-        public Asset()
+        public Asset(string idShort, Identifier identification) : base(idShort, identification)
         {
             EmbeddedDataSpecifications = new List<IEmbeddedDataSpecification>();
         }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/AssetAdministrationShell.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/AssetAdministrationShell.cs
index 1382569..cc41c83 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/AssetAdministrationShell.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/AssetAdministrationShell.cs
@@ -21,34 +21,25 @@
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
-    [DataContract, XmlType]
-    public class AssetAdministrationShell : IAssetAdministrationShell
+    [DataContract]
+    public class AssetAdministrationShell : Identifiable, IAssetAdministrationShell
     {
-        [XmlElement]
-        public string IdShort { get; set; }
-        [XmlElement]
-        public Identifier Identification { get; set; }
         public IAsset Asset { get; set; }
-        public IElementContainer<ISubmodel> Submodels { get; set; }
-        public IReference Parent { get; set; }
-        public LangStringSet Description { get; set; }
-        public Dictionary<string, string> MetaData { get; set; }        
+        public IElementContainer<ISubmodel> Submodels { get; set; }   
         public IReference<IAssetAdministrationShell> DerivedFrom { get; set; }     
         public IElementContainer<IView> Views { get; set; }
-        public AdministrativeInformation Administration { get; set; }
-        public string Category { get; set; }
         public ModelType ModelType => ModelType.AssetAdministationShell;
         public IEnumerable<IEmbeddedDataSpecification> EmbeddedDataSpecifications { get; }
         public IElementContainer<IConceptDictionary> ConceptDictionaries { get; set; }
         public IConceptDescription ConceptDescription { get; set; }
 
         [JsonConstructor]
-        public AssetAdministrationShell()
+        public AssetAdministrationShell(string idShort, Identifier identification) : base(idShort, identification)
         {
-            Submodels = new ElementContainer<ISubmodel>();
-            Views = new ElementContainer<IView>();
+            Submodels = new ElementContainer<ISubmodel>(this);
+            Views = new ElementContainer<IView>(this);
             MetaData = new Dictionary<string, string>();
-            ConceptDictionaries = new ElementContainer<IConceptDictionary>();
+            ConceptDictionaries = new ElementContainer<IConceptDictionary>(this);
             EmbeddedDataSpecifications = new List<IEmbeddedDataSpecification>();
         }
     }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Identifiable.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Identifiable.cs
new file mode 100644
index 0000000..89661ce
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Identifiable.cs
@@ -0,0 +1,28 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using System.Runtime.Serialization;
+
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
+{
+    [DataContract]
+    public abstract class Identifiable : Referable, IIdentifiable
+    {
+        public Identifier Identification { get; set; }
+        public AdministrativeInformation Administration { get; set; }
+
+        protected Identifiable(string idShort, Identifier identification) : base(idShort)
+        {
+            Identification = identification;
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Referable.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Referable.cs
new file mode 100644
index 0000000..29d555c
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Referable.cs
@@ -0,0 +1,33 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
+{
+    [DataContract]
+    public abstract class Referable : IReferable
+    {
+        public string IdShort { get; set; }
+        public string Category { get; set; }
+        public LangStringSet Description { get; set; }
+        public IReferable Parent { get; set; }
+        public Dictionary<string, string> MetaData { get; set; }
+                 
+        protected Referable(string idShort)
+        {
+            IdShort = idShort;
+            MetaData = new Dictionary<string, string>();
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Submodel.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Submodel.cs
index 1f09e71..8579ed7 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Submodel.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/Submodel.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.Constraints;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
@@ -18,35 +18,24 @@
 using System.Runtime.Serialization;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
-    public class Submodel : ISubmodel
+    public class Submodel : Identifiable, ISubmodel
     {
-        public string IdShort { get; set; }
-        public Identifier Identification { get; set; }
-        public IReference Parent { get; set; }
         public ModelingKind Kind { get; set; }
         public IReference SemanticId { get; set; }
-        public LangStringSet Description { get; set; }
-        public IEnumerable<IProperty> Properties => SubmodelElements.FilterAsReference<IProperty>(ModelType.Property);
-        public IEnumerable<IOperation> Operations => SubmodelElements.FilterAsReference<IOperation>(ModelType.Operation);
-        public IEnumerable<IEvent> Events => SubmodelElements.FilterAsReference<IEvent>(ModelType.Event);
         public IElementContainer<ISubmodelElement> SubmodelElements { get; set; }
-        public Dictionary<string, string> MetaData { get; set; }
-        public AdministrativeInformation Administration { get; set; }
-        public string Category { get; set; }
         public ModelType ModelType => ModelType.Submodel;
         public IEnumerable<IEmbeddedDataSpecification> EmbeddedDataSpecifications { get; set; }
         public IConceptDescription ConceptDescription { get; set; }
         public List<IConstraint> Constraints { get; set; }
 
         [JsonConstructor]
-        public Submodel()
+        public Submodel(string idShort, Identifier identification) : base(idShort, identification)
         {
-            SubmodelElements = new ElementContainer<ISubmodelElement>();
+            SubmodelElements = new ElementContainer<ISubmodelElement>(this);
             MetaData = new Dictionary<string, string>();
             EmbeddedDataSpecifications = new List<IEmbeddedDataSpecification>();
             Constraints = new List<IConstraint>();
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElement.cs
index 042f30e..e26f77e 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElement.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.Constraints;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
@@ -19,30 +19,28 @@
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using NLog;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
-    public abstract class SubmodelElement : ISubmodelElement
+    public abstract class SubmodelElement : Referable, ISubmodelElement
     {
+        private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
+
         public IReference SemanticId { get; set; }
 
         public List<IConstraint> Constraints { get; set; }
 
-        public string IdShort { get; set; }
-
-        public string Category { get; set; }
-
-        public LangStringSet Description { get; set; }
-
-        public IReference Parent { get; set; }
-
-        public Dictionary<string, string> MetaData { get; set; }
-
         public ModelingKind Kind { get; set; }
 
         public abstract ModelType ModelType { get; }
 
+        [IgnoreDataMember]
+        public virtual GetValueHandler Get { get; set; }
+        [IgnoreDataMember]
+        public virtual SetValueHandler Set { get; set; }
+
         public IEnumerable<IEmbeddedDataSpecification> EmbeddedDataSpecifications { get; set; }
 
         private IConceptDescription conceptDescription;
@@ -61,9 +59,11 @@
                 }
             }
         }
+
+
         [JsonConstructor]
-        public SubmodelElement()
-        {
+        protected SubmodelElement(string idShort) : base(idShort)
+        {            
             Constraints = new List<IConstraint>();
             MetaData = new Dictionary<string, string>();
             EmbeddedDataSpecifications = new List<IEmbeddedDataSpecification>();
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementFactory.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementFactory.cs
index 8341914..1bf6798 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementFactory.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementFactory.cs
@@ -8,41 +8,40 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
 using BaSyx.Models.Core.Common;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     public static class SubmodelElementFactory
     {
-        public static SubmodelElement CreateSubmodelElement(DataObjectType modelType, DataType valueType = null)
+        public static SubmodelElement CreateSubmodelElement(string idShort, DataObjectType modelType, DataType valueType = null)
         {
             if (modelType == ModelType.Property)
-                return new Property(valueType);
+                return new Property(idShort, valueType);
             if (modelType == ModelType.Operation)
-                return new Operation();
+                return new Operation(idShort);
             if (modelType == ModelType.Event)
-                return new Event();
+                return new Event(idShort);
             if (modelType == ModelType.BasicEvent)
-                return new BasicEvent();
+                return new BasicEvent(idShort);
             else if (modelType == ModelType.Blob)
-                return new Blob();
+                return new Blob(idShort);
             else if (modelType == ModelType.File)
-                return new File();
+                return new File(idShort);
             else if (modelType == ModelType.MultiLanguageProperty)
-                return new MultiLanguageProperty();
+                return new MultiLanguageProperty(idShort);
             else if (modelType == ModelType.ReferenceElement)
-                return new ReferenceElement();
+                return new ReferenceElement(idShort);
             else if (modelType == ModelType.RelationshipElement)
-                return new RelationshipElement();
+                return new RelationshipElement(idShort);
             else if (modelType == ModelType.SubmodelElementCollection)
-                return new SubmodelElementCollection();
+                return new SubmodelElementCollection(idShort);
             else if (modelType == ModelType.AnnotatedRelationshipElement)
-                return new AnnotatedRelationshipElement();
+                return new AnnotatedRelationshipElement(idShort);
             else if (modelType == ModelType.Entity)
-                return new Entity();
+                return new Entity(idShort);
             if (modelType == ModelType.Range)
-                return new Range();
+                return new Range(idShort);
             else
                 return null;
         }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/AnnotatedRelationshipElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/AnnotatedRelationshipElement.cs
index 0f66c2b..891005e 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/AnnotatedRelationshipElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/AnnotatedRelationshipElement.cs
@@ -10,17 +10,19 @@
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     public class AnnotatedRelationshipElement : RelationshipElement, IAnnotatedRelationshipElement
     {
         public override ModelType ModelType => ModelType.AnnotatedRelationshipElement;
-
         public IReference<ISubmodelElement> Annotation { get; set; }
 
-        public AnnotatedRelationshipElement() : base() { }     
+        public AnnotatedRelationshipElement(string idShort) : base(idShort) 
+        {
+            Get = element => { return new ElementValue(Annotation, new DataType(DataObjectType.AnyType)); };
+            Set = (element, value) => { Annotation = value.Value as IReference<ISubmodelElement>; };
+        }     
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/BasicEvent.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/BasicEvent.cs
index 455c97a..8edfc03 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/BasicEvent.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/BasicEvent.cs
@@ -8,13 +8,13 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class BasicEvent : Event, IBasicEvent
@@ -22,8 +22,10 @@
         public override ModelType ModelType => ModelType.BasicEvent;
 
         public IReference<IReferable> Observed { get; set; }
-
-        public BasicEvent() : base()
-        { }
+        public BasicEvent(string idShort) : base(idShort)
+        {
+            Get = element => { return new ElementValue(Observed, new DataType(DataObjectType.AnyType)); };
+            Set = (element, value) => { Observed = value.Value as IReference<IReferable>; };
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Blob.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Blob.cs
index b38788a..d6ef4cb 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Blob.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Blob.cs
@@ -8,11 +8,11 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class Blob : SubmodelElement, IBlob
@@ -21,6 +21,10 @@
         public string MimeType { get; set; }
         public byte[] Value { get; set; }
 
-        public Blob() : base() { }
+        public Blob(string idShort) : base(idShort) 
+        {
+            Get = element => { return new ElementValue(Value, new DataType(DataObjectType.Base64Binary)); };
+            Set = (element, value) => { Value = value.Value as byte[]; };
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Entity.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Entity.cs
index b693343..47ecb66 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Entity.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Entity.cs
@@ -9,12 +9,11 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class Entity : SubmodelElement, IEntity
@@ -27,9 +26,12 @@
 
         public IReference<IAsset> Asset { get; set; }
 
-        public Entity() : base()
+        public Entity(string idShort) : base(idShort)
         {
-            Statements = new ElementContainer<ISubmodelElement>();
+            Statements = new ElementContainer<ISubmodelElement>(this);
+
+            Get = element => { return new ElementValue(new { Statements, EntityType, Asset }, new DataType(DataObjectType.AnyType)); };
+            Set = (element, value) => { dynamic dVal = value?.Value; Statements = dVal?.Statements; EntityType = dVal?.EntityType; Asset = dVal?.Asset; };
         }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Event.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Event.cs
index 2b76262..a553f4a 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Event.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Event.cs
@@ -9,11 +9,10 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class Event : SubmodelElement, IEvent
@@ -22,9 +21,9 @@
 
         public IElementContainer<ISubmodelElement> DataElements { get; set; }
 
-        public Event() : base()
+        public Event(string idShort) : base(idShort)
         {
-            DataElements = new ElementContainer<ISubmodelElement>();
+            DataElements = new ElementContainer<ISubmodelElement>(this);
         }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/File.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/File.cs
index 8632a45..18f49c8 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/File.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/File.cs
@@ -8,11 +8,11 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class File : SubmodelElement, IFile
@@ -20,7 +20,10 @@
         public override ModelType ModelType => ModelType.File;
         public string MimeType { get; set; }
         public string Value { get; set; }
-
-        public File() : base() { }
+        public File(string idShort) : base(idShort)
+        {
+            Get = element => { return new ElementValue(Value, new DataType(DataObjectType.String)); };
+            Set = (element, value) => { Value = value.Value as string; };
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/MultiLanguageProperty.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/MultiLanguageProperty.cs
index e4bdfe3..266326d 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/MultiLanguageProperty.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/MultiLanguageProperty.cs
@@ -8,12 +8,12 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class MultiLanguageProperty : SubmodelElement, IMultiLanguageProperty
@@ -21,7 +21,10 @@
         public override ModelType ModelType => ModelType.MultiLanguageProperty;
         public IReference ValueId { get; set; }
         public LangStringSet Value { get; set; }
-
-        public MultiLanguageProperty() : base() { }
+        public MultiLanguageProperty(string idShort) : base(idShort)
+        {
+            Get = element => { return new ElementValue(Value, new DataType(DataObjectType.LangString, true)); };
+            Set = (element, value) => { Value = value?.Value as LangStringSet; };
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Operation.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Operation.cs
index 8425e0e..cc1164f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Operation.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Operation.cs
@@ -10,9 +10,9 @@
 *******************************************************************************/
 using System.Runtime.Serialization;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class Operation : SubmodelElement, IOperation
@@ -22,10 +22,8 @@
         public IOperationVariableSet InOutputVariables { get; set; }
         [IgnoreDataMember]
         public MethodCalledHandler OnMethodCalled { get; set; }
-
         public override ModelType ModelType => ModelType.Operation;
-        
-        public Operation() : base() 
+        public Operation(string idShort) : base(idShort) 
         {
             InputVariables = new OperationVariableSet();
             OutputVariables = new OperationVariableSet();
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs
index 5bea7c0..6fa552f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Property.cs
@@ -8,60 +8,65 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
 using Newtonsoft.Json;
 using System;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
+    ///<inheritdoc cref="IProperty"/>
     [DataContract]
     public class Property : SubmodelElement, IProperty
     {
         public override ModelType ModelType => ModelType.Property;
-        
-        internal object _value;
+
+        private object _value;
         public virtual object Value
         {
-            get => _value;
+            get => _value;            
             set
             {
                 ValueChanged?.Invoke(this, new ValueChangedArgs(this.IdShort, value, ValueType));
                 _value = value;
             }
         }
+
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "valueType")]
         public virtual DataType ValueType { get; set; }
         public IReference ValueId { get; set; }
 
         public event EventHandler<ValueChangedArgs> ValueChanged;
 
-        [IgnoreDataMember]
-        public virtual GetPropertyValueHandler Get { get; set; }
-        [IgnoreDataMember]
-        public virtual SetPropertyValueHandler Set { get; set; }
-
-        public Property() : this(null, null)
+        public Property(string idShort) : this(idShort, null, null)
         { }
 
-        public Property(DataType valueType) : this(valueType, null)
+        public Property(string idShort, DataType valueType) : this(idShort, valueType, null)
         { }
 
         [JsonConstructor]
-        public Property(DataType valueType, object value) : base()
+        public Property(string idShort, DataType valueType, object value) : base(idShort)
         {
             ValueType = valueType;
             Value = value;
+
+            Get = element  => { return new ElementValue(Value, ValueType); };
+            Set = (element, val) => { Value = val.Value; };
         }
 
         public T ToObject<T>()
         {
             return new ElementValue(Value, ValueType).ToObject<T>();
         }
-    }
 
+        public object ToObject(Type type)
+        {
+            return new ElementValue(Value, ValueType).ToObject(type);
+        }
+    }
+    ///<inheritdoc cref="IProperty"/>
     [DataContract]
     public class Property<TInnerType> : Property, IProperty<TInnerType>
     {
@@ -79,34 +84,37 @@
             }
             set => base.Value = value;
         }
-        public override DataType ValueType => DataType.GetDataTypeFromSystemType(typeof(TInnerType));
+        public override DataType ValueType => typeof(TInnerType);
 
         [IgnoreDataMember]
-        public new GetPropertyValueHandler<TInnerType> Get
+        public new GetValueHandler<TInnerType> Get
         {
             get
             {
                 if (base.Get != null)
-                    return new GetPropertyValueHandler<TInnerType>(de => { return base.Get.Invoke(de).ToObject<TInnerType>(); });
+                    return new GetValueHandler<TInnerType>(element => { return base.Get.Invoke(element).ToObject<TInnerType>(); });
                 else
                     return null;
             }
-            set => base.Get = new GetPropertyValueHandler(de => new PropertyValue<TInnerType>(value.Invoke(de)));
+            set => base.Get = new GetValueHandler(de => new ElementValue<TInnerType>(value.Invoke(de)));
         }
         [IgnoreDataMember]
-        public new SetPropertyValueHandler<TInnerType> Set
+        public new SetValueHandler<TInnerType> Set
         {
             get
             {
                 if (base.Set != null)
-                    return new SetPropertyValueHandler<TInnerType>((de, val) => { base.Set.Invoke(de, new PropertyValue<TInnerType>(val)); });
+                    return new SetValueHandler<TInnerType>((element, val) => { base.Set.Invoke(element, new ElementValue<TInnerType>(val)); });
                 else
                     return null;
             }
-            set => base.Set = new SetPropertyValueHandler((de, val) => value.Invoke(de, val.ToObject<TInnerType>()));
+            set => base.Set = new SetValueHandler((element, val) => value.Invoke(element, val.ToObject<TInnerType>()));
         }
 
-        public Property() : base(DataType.GetDataTypeFromSystemType(typeof(TInnerType))) { }
+        public Property(string idShort) : base(idShort, typeof(TInnerType)) { }
+
+        [JsonConstructor]
+        public Property(string idShort, TInnerType value) : base(idShort, typeof(TInnerType), value) { }
 
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/PublishableEvent.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/PublishableEvent.cs
index a5b6386..c2db92d 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/PublishableEvent.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/PublishableEvent.cs
@@ -9,10 +9,9 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     public class PublishableEvent : IPublishableEvent
     {
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Range.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Range.cs
index 613cf97..93ea9f4 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Range.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/Range.cs
@@ -8,12 +8,12 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class Range : SubmodelElement, IRange
@@ -24,6 +24,10 @@
         public IValue Max { get; set; }
         public DataType ValueType { get; set; }
 
-        public Range() : base() { }
+        public Range(string idShort) : base(idShort) 
+        {            
+            Get = element => { return new ElementValue(new { Min = Min?.Value, Max = Max?.Value}, new DataType(DataObjectType.AnyType)); };
+            Set = (element, value) => { dynamic dVal = value?.Value; Min = new ElementValue(dVal?.Min, ValueType); Max = new ElementValue(dVal?.Max, ValueType); };
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/ReferenceElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/ReferenceElement.cs
index 27cfcee..3598a26 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/ReferenceElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/ReferenceElement.cs
@@ -8,12 +8,12 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     [DataContract]
     public class ReferenceElement : SubmodelElement, IReferenceElement
@@ -21,6 +21,10 @@
         public override ModelType ModelType => ModelType.ReferenceElement;
         public IReference Value { get; set; }
 
-        public ReferenceElement() : base() { }
+        public ReferenceElement(string idShort) : base(idShort) 
+        {
+            Get = element => { return new ElementValue(Value, new DataType(DataObjectType.AnyType)); };
+            Set = (element, value) => { Value = value?.Value as IReference; };
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/RelationshipElement.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/RelationshipElement.cs
index 50e6d40..3240d61 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/RelationshipElement.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/RelationshipElement.cs
@@ -12,9 +12,8 @@
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Core.Common;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
     public class RelationshipElement : SubmodelElement, IRelationshipElement
     {
@@ -22,8 +21,12 @@
 
         public IReference<IReferable> First { get; set; }
 
-        public IReference<IReferable> Second { get; set; }
+        public IReference<IReferable> Second { get; set; }      
 
-        public RelationshipElement() : base() { }     
+        public RelationshipElement(string idShort) : base(idShort) 
+        {
+            Get = element => { return new ElementValue(new { First, Second }, new DataType(DataObjectType.AnyType)); };
+            Set = (element, value) => { dynamic dVal = value?.Value; First = dVal?.First; Second = dVal?.Second; };
+        }     
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/SubmodelElementCollection.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/SubmodelElementCollection.cs
index ca0d9c0..3b340f4 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/SubmodelElementCollection.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Implementations/SubmodelElementTypes/SubmodelElementCollection.cs
@@ -9,23 +9,168 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.Common;
+using BaSyx.Utils.ResultHandling;
+using Newtonsoft.Json;
+using System;
+using System.Collections;
+using System.Collections.Generic;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes
+namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
 {
-    [DataContract]
-    public class SubmodelElementCollection : SubmodelElement, ISubmodelElementCollection
+    [DataContract, JsonObject]
+    public class SubmodelElementCollection : SubmodelElement, ISubmodelElementCollection, IElementContainer<ISubmodelElement>
     {
         public override ModelType ModelType => ModelType.SubmodelElementCollection;
         public IElementContainer<ISubmodelElement> Value { get; set; }
         public bool AllowDuplicates { get; set; } = false;
         public bool Ordered { get; set; } = false;
 
-        public SubmodelElementCollection() : base() 
+        [IgnoreDataMember, JsonIgnore]
+        public IEnumerable<IElementContainer<ISubmodelElement>> Children => Value.Children;
+        [IgnoreDataMember, JsonIgnore]
+        public IEnumerable<ISubmodelElement> Values => Value.Values;
+        [IgnoreDataMember, JsonIgnore]
+        ISubmodelElement IElementContainer<ISubmodelElement>.Value { get => this; set { } }
+        [IgnoreDataMember, JsonIgnore]
+        public string Path
         {
-            Value = new ElementContainer<ISubmodelElement>();
-        }    
+            get
+            {
+                if (string.IsNullOrEmpty(Value.Path))
+                    return IdShort;
+                else
+                    return Value.Path;
+            }
+            set { Value.Path = value; }
+        }
+        [IgnoreDataMember, JsonIgnore]
+        public bool IsRoot => Value.IsRoot;
+        [IgnoreDataMember, JsonIgnore]
+        public IElementContainer<ISubmodelElement> ParentContainer { get => this; set { } }
+
+        [IgnoreDataMember, JsonIgnore]
+        public ISubmodelElement this[string idShort] => Value[idShort];
+        [IgnoreDataMember, JsonIgnore]
+        public ISubmodelElement this[int i] => Value[i];
+
+        public SubmodelElementCollection(string idShort) : base(idShort) 
+        {
+            Value = new ElementContainer<ISubmodelElement>(this.Parent, this, null);
+
+            Get = element => { return new ElementValue(Value, new DataType(DataObjectType.AnyType)); };
+            Set = (element, value) => { Value = value?.Value as IElementContainer<ISubmodelElement>; };
+        }
+
+        public IResult<IQueryableElementContainer<ISubmodelElement>> RetrieveAll()
+        {
+            return Value.RetrieveAll();
+        }
+
+        public IResult<IQueryableElementContainer<ISubmodelElement>> RetrieveAll(Predicate<ISubmodelElement> predicate)
+        {
+            return Value.RetrieveAll(predicate);
+        }
+
+        public bool HasChildren()
+        {
+            return Value.HasChildren();
+        }
+
+        public bool HasChild(string idShort)
+        {
+            return Value.HasChild(idShort);
+        }
+
+        public bool HasChildPath(string idShortPath)
+        {
+            return Value.HasChildPath(idShortPath);
+        }
+
+        public void Traverse(Action<ISubmodelElement> action)
+        {
+            Value.Traverse(action);
+        }
+
+        public void Add(ISubmodelElement element)
+        {
+            Value.Add(element);
+        }
+
+        public void AddRange(IEnumerable<ISubmodelElement> elements)
+        {
+            Value.AddRange(elements);
+        }
+
+        IResult<T> ICrudContainer<string, ISubmodelElement>.Create<T>(T element)
+        {
+            return Value.Create(element);
+        }
+
+        public IResult<ISubmodelElement> Retrieve(string id)
+        {
+            return Value.Retrieve(id);
+        }
+
+        IResult<T> ICrudContainer<string, ISubmodelElement>.Retrieve<T>(string id)
+        {
+            return Value.Retrieve<T>(id);
+        }
+
+        IResult<IQueryableElementContainer<T>> ICrudContainer<string, ISubmodelElement>.RetrieveAll<T>()
+        {
+            return Value.RetrieveAll<T>();
+        }
+
+        IResult<IQueryableElementContainer<T>> ICrudContainer<string, ISubmodelElement>.RetrieveAll<T>(Predicate<T> predicate)
+        {
+            return Value.RetrieveAll(predicate);
+        }
+
+        public IResult<ISubmodelElement> CreateOrUpdate(string id, ISubmodelElement element)
+        {
+            return Value.CreateOrUpdate(id, element);
+        }
+
+        public IResult<ISubmodelElement> Update(string id, ISubmodelElement element)
+        {
+            return Value.Update(id, element);
+        }
+
+        public IResult Delete(string id)
+        {
+            return Value.Delete(id);
+        }
+
+        public IEnumerator<ISubmodelElement> GetEnumerator()
+        {
+            return Value.GetEnumerator();
+        }
+
+        IEnumerator IEnumerable.GetEnumerator()
+        {
+            return Value.GetEnumerator();
+        }
+
+        public IElementContainer<ISubmodelElement> GetChild(string idShortPath)
+        {
+            return Value.GetChild(idShortPath);
+        }
+
+        public void Remove(string idShort)
+        {
+            Value.Remove(idShort);
+        }
+
+        public void AppendRootPath(string rootPath)
+        {
+            Value.AppendRootPath(rootPath);
+        }
+
+        public IEnumerable<ISubmodelElement> Flatten()
+        {
+            return Value.Flatten();
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/Key.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/Key.cs
index a532865..595ad13 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/Key.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/Key.cs
@@ -9,7 +9,6 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.AssetAdministrationShell.Views;
 using Newtonsoft.Json;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDescription.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDescription.cs
index 8dafc61..5a86659 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDescription.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDescription.cs
@@ -31,7 +31,7 @@
 
         public LangStringSet Description { get; set; }
 
-        public IReference Parent { get; set; }
+        public IReferable Parent { get; set; }
 
         public Dictionary<string, string> MetaData { get; set; }
 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDictionary.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDictionary.cs
index 1aaae2b..7427501 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDictionary.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Semantics/ConceptDictionary.cs
@@ -11,6 +11,7 @@
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using System.Collections.Generic;
 using BaSyx.Models.Core.Common;
+using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 
 namespace BaSyx.Models.Core.AssetAdministrationShell.Semantics
 {
@@ -22,7 +23,7 @@
 
         public LangStringSet Description { get; set; }
 
-        public IReference Parent { get; set; }
+        public IReferable Parent { get; set; }
 
         public Dictionary<string, string> MetaData { get; set; }
 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Views/View.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Views/View.cs
index b5711d9..a6f2668 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Views/View.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/Views/View.cs
@@ -30,7 +30,7 @@
 
         public LangStringSet Description { get; set; }
 
-        public IReference Parent { get; set; }
+        public IReferable Parent { get; set; }
         public Dictionary<string, string> MetaData { get; set; }
 
         public ModelType ModelType => ModelType.View;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/PropertyAttribute.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/PropertyAttribute.cs
index 74b351a..a22f78f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/PropertyAttribute.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/PropertyAttribute.cs
@@ -8,7 +8,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using System;
 using BaSyx.Models.Core.Common;
@@ -34,17 +34,13 @@
 
         public PropertyAttribute(string idShort, DataObjectTypes propertyType)
         {
-            Property = new Property(new DataType(DataObjectType.Parse(propertyType)))
-            {
-                IdShort = idShort
-            };
+            Property = new Property(idShort, new DataType(DataObjectType.Parse(propertyType)));
         }
 
         public PropertyAttribute(string idShort, DataObjectTypes propertyType, string semanticId, KeyElements semanticKeyElement, KeyType semanticKeyType, bool semanticIdLocal)
         {
-            Property = new Property(new DataType(DataObjectType.Parse(propertyType)))
+            Property = new Property(idShort, new DataType(DataObjectType.Parse(propertyType)))
             {
-                IdShort = idShort,
                 SemanticId = new Reference(new Key(semanticKeyElement, semanticKeyType, semanticId, semanticIdLocal)) 
             };
         }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/SubmodelElementCollectionAttribute.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/SubmodelElementCollectionAttribute.cs
index d209991..a3b56fb 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/SubmodelElementCollectionAttribute.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Attributes/SubmodelElementCollectionAttribute.cs
@@ -10,7 +10,7 @@
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using System;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
 
 namespace BaSyx.Models.Core.Attributes
 {
@@ -57,17 +57,13 @@
 
         public SubmodelElementCollectionAttribute(string idShort)
         {
-            SubmodelElementCollection = new SubmodelElementCollection()
-            {
-                IdShort = idShort
-            };
+            SubmodelElementCollection = new SubmodelElementCollection(idShort);
         }
 
         public SubmodelElementCollectionAttribute(string idShort, string semanticId, KeyElements semanticKeyElement, KeyType semanticKeyType, bool semanticIdLocal)
         {
-            SubmodelElementCollection = new SubmodelElementCollection()
+            SubmodelElementCollection = new SubmodelElementCollection(idShort)
             {
-                IdShort = idShort,
                 SemanticId = new Reference(new Key(semanticKeyElement, semanticKeyType, semanticId, semanticIdLocal)) 
             };
         }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataObjectType.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataObjectType.cs
index 5f1c20f..4216e1f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataObjectType.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataObjectType.cs
@@ -94,16 +94,15 @@
         public static readonly DataObjectType Base64Binary = new DataObjectType("base64binary");
         public static readonly DataObjectType HexBinary = new DataObjectType("hexBinary");
 
-        private static Dictionary<string, DataObjectType> DataObjectTypes;
+        private static readonly Dictionary<string, DataObjectType> _dataObjectTypes;
         static DataObjectType()
         {
             var fields = typeof(DataObjectType).GetFields(BindingFlags.Public | BindingFlags.Static);
-            DataObjectTypes = fields.ToDictionary(k => ((DataObjectType)k.GetValue(null)).Name, v => ((DataObjectType)v.GetValue(null)));
+            _dataObjectTypes = fields.ToDictionary(k => ((DataObjectType)k.GetValue(null)).Name, v => ((DataObjectType)v.GetValue(null)));
         }
 
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "name")]
         public string Name { get; }
-
        
         [JsonConstructor]
         protected DataObjectType(string name)
@@ -113,7 +112,7 @@
 
         public static DataObjectType Parse(DataObjectTypes dataObjectTypeEnum)
         {
-            if (DataObjectTypes.TryGetValue(Enum.GetName(typeof(DataObjectTypes), dataObjectTypeEnum), out DataObjectType dataObjectType))
+            if (_dataObjectTypes.TryGetValue(Enum.GetName(typeof(DataObjectTypes), dataObjectTypeEnum), out DataObjectType dataObjectType))
                 return dataObjectType;
             else
                 throw new InvalidOperationException("Cannot parse " + dataObjectType);
@@ -121,7 +120,7 @@
 
         public static bool TryParse(string s, out DataObjectType dataObjectType)
         {
-            if (DataObjectTypes.TryGetValue(s, out dataObjectType))
+            if (_dataObjectTypes.TryGetValue(s, out dataObjectType))
                 return true;
             else
                 return false;
@@ -193,6 +192,16 @@
         {
             return !(x == y);
         }
+
+        public static implicit operator Type(DataObjectType dataObjectType)
+        {
+            return DataType.GetSystemTypeFromDataType(dataObjectType);
+        }
+
+        public static implicit operator DataObjectType(Type type)
+        {
+            return DataType.GetDataTypeFromSystemType(type).DataObjectType;
+        }
     }
 
     
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataType.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataType.cs
index 36ef924..edf7ec1 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataType.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/DataType.cs
@@ -8,8 +8,8 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Enums;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
+
+using BaSyx.Models.Core.AssetAdministrationShell;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using Newtonsoft.Json;
@@ -20,54 +20,54 @@
 
 namespace BaSyx.Models.Core.Common
 {
-
     [DataContract]
     public class DataType : IHasSemantics, IEquatable<DataType>
     {
-        [IgnoreDataMember]
-        public bool? IsCollection { get; internal set; }
-
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "dataObjectType")]
         public DataObjectType DataObjectType { get; internal set; }
 
-        [IgnoreDataMember]
-        public Type SystemType { get; internal set; }
-
-        public IReference SemanticId { get; internal set; }
-
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "schemaType")]
         public SchemaType? SchemaType { get; internal set; }
 
         [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "schema")]
         public string Schema { get; internal set; }
 
-        //[DataMember(EmitDefaultValue = false, IsRequired = false, Name = "valueRank")]
-        //public ValueRank? ValueRank { get; }
+        [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "semanticId")]
+        public IReference SemanticId { get; internal set; }
+
+        [IgnoreDataMember]
+        public Type SystemType { get; internal set; }
+
+        [IgnoreDataMember]
+        public bool IsCollection { get; internal set; }
 
         internal DataType() { }
 
-        public DataType(DataObjectType dataObjectType) : this(dataObjectType, false, null)
-        { }
 
         [JsonConstructor]
-        public DataType(DataObjectType dataObjectType, bool? isCollection, IReference semanticId = null)
+        public DataType(DataObjectType dataObjectType) : this(dataObjectType, false)
+        { }
+
+        public DataType(DataObjectType dataObjectType, bool isCollection) : this(dataObjectType, isCollection, null)
+        { }
+
+        public DataType(DataObjectType dataObjectType, bool isCollection, IReference semanticId) 
+            : this(dataObjectType, isCollection, semanticId, AssetAdministrationShell.SchemaType.NONE, null)
+        { }
+
+        public DataType(DataObjectType dataObjectType, bool isCollection, IReference semanticId, SchemaType schemaType, string schema)
         {
-            DataObjectType = dataObjectType;
+            DataObjectType = dataObjectType ?? throw new ArgumentNullException(nameof(dataObjectType));
+            SystemType = GetSystemTypeFromDataType(dataObjectType) ??
+                throw new ArgumentOutOfRangeException(nameof(dataObjectType), $"Unable to get system type from DataObjectType '{dataObjectType}'");
+
+            IsCollection = isCollection;
             SemanticId = semanticId;
 
-            SystemType = GetSystemTypeFromDataType(dataObjectType);
-
-            
-            if (isCollection.HasValue)
-                IsCollection = isCollection;
+            if (schemaType == AssetAdministrationShell.SchemaType.NONE)
+                SchemaType = null;
             else
-                IsCollection = false;
-            
-        }
-        public DataType(IReference semanticId, SchemaType schemaType, string schema)
-            :this(DataObjectType.AnyType, false, semanticId)
-        {
-            SchemaType = schemaType;
+                SchemaType = schemaType;
             Schema = schema;
         }
 
@@ -76,15 +76,6 @@
             return DataObjectType?.Name;
         }
 
-        /*
-        public enum ValueRank : int
-        {
-            Scalar = -1,
-            OneDimensional = 1,
-            TwoDimensional = 2,
-            ScalarOrOneDimensional = 3
-        }
-        */
         public static DataType GetDataTypeFromSystemType(Type type)
         {
             DataType dataType = new DataType();
@@ -205,16 +196,6 @@
                 return typeof(TimeSpan);
             else if (dataObjectType == DataObjectType.YearMonthDuration)
                 return typeof(TimeSpan);
-            else if (dataObjectType == ModelType.Property)
-                return typeof(Property);
-            else if (dataObjectType == ModelType.Blob)
-                return typeof(Blob);
-            else if (dataObjectType == ModelType.File)
-                return typeof(File);
-            else if (dataObjectType == ModelType.ReferenceElement)
-                return typeof(ReferenceElement);
-            else if (dataObjectType == ModelType.SubmodelElementCollection)
-                return typeof(SubmodelElementCollection);
             else
                 return null;
         }
@@ -268,7 +249,7 @@
             {
                 var result = 0;
                 result = (result * 397) ^ DataObjectType.GetHashCode();
-                result = (result * 397) ^ (IsCollection.Value ? 1 : 0);
+                result = (result * 397) ^ (IsCollection ? 1 : 0);
                 return result;
             }
         }
@@ -298,6 +279,21 @@
         }
         #endregion
 
+        public static implicit operator Type(DataType dataType)
+        {
+            if(dataType.IsCollection)
+            {
+                Type outerTypeDefinition = typeof(List<>).GetGenericTypeDefinition();
+                Type containerType = outerTypeDefinition.MakeGenericType(dataType.SystemType);
+                return containerType;
+            }
+            return dataType.SystemType;
+        }
+
+        public static implicit operator DataType(Type type)
+        {
+            return GetDataTypeFromSystemType(type);
+        }
     }
 
 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainer.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainer.cs
index 7c814bb..1499210 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainer.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainer.cs
@@ -8,61 +8,125 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
-using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
 using BaSyx.Models.Extensions;
 using BaSyx.Utils.ResultHandling;
 using Newtonsoft.Json;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
-using System.Linq.Expressions;
 
 namespace BaSyx.Models.Core.Common
 {
-    public class QueryableElementContainer<TElement> : ElementContainer<TElement>, IQueryableElementContainer<TElement> where TElement : IReferable, IModelElement
+
+    public class ElementContainer<TElement> : IElementContainer<TElement> where TElement : IReferable, IModelElement
     {
-        private readonly IQueryable<TElement> _queryable;
-        public QueryableElementContainer(IEnumerable<TElement> list) : base(list)
+        public const string PATH_SEPERATOR = "/";
+
+        private readonly List<IElementContainer<TElement>> _children;
+
+        public string IdShort { get; private set; }
+        public TElement Value { get; set;  }
+        public string Path { get; set; }
+        public bool IsRoot => ParentContainer == null;
+        public IReferable Parent { get; set; }
+        public IElementContainer<TElement> ParentContainer { get; set; }
+
+        [JsonConstructor]
+        public ElementContainer() : this(null)
         {
-            _queryable = list.AsQueryable();
+            _children = new List<IElementContainer<TElement>>();
         }
 
-        public Type ElementType => _queryable.ElementType;
-
-        public Expression Expression => _queryable.Expression;
-
-        public IQueryProvider Provider => _queryable.Provider;
-    }
-
-    public class ElementContainer<TElement> : List<TElement>, IElementContainer<TElement> where TElement : IReferable, IModelElement
-    {
-        public TElement this[string idShort] => this.Find(e => e.IdShort == idShort);
-
-        public ElementContainer()
+        public ElementContainer(IReferable parent) : this(parent, default(TElement), null)
         { }
 
-        public ElementContainer(IEnumerable<TElement> list) : base(list) { }
+        public ElementContainer(IReferable parent, TElement rootElement, IElementContainer<TElement> parentContainer)
+        {
+            _children = new List<IElementContainer<TElement>>();
 
-        public virtual IResult<TElement> Create(TElement element)
+            Parent = parent;
+            ParentContainer = parentContainer;
+
+            IdShort = rootElement?.IdShort;
+            Value = rootElement;
+
+            if (ParentContainer != null && !string.IsNullOrEmpty(ParentContainer.Path))
+            {
+                Path = ParentContainer.Path + PATH_SEPERATOR + IdShort;
+            }
+            else
+            {
+                Path = IdShort;
+            }
+        }
+
+        public ElementContainer(IReferable parent, IEnumerable<TElement> list)
+        {
+            _children = new List<IElementContainer<TElement>>();
+
+            Parent = parent;
+            Value = default;
+            IdShort = null;
+
+            AddRange(list);
+        }
+        public TElement this[int i]
+        {
+            get
+            {
+                if (i < this.Count())
+                    return _children[i].Value;
+                else
+                    return default;
+            }
+        }
+
+        public TElement this[string idShortPath]
+        {
+            get
+            {
+                var child = _children.FirstOrDefault(c => c.IdShort == idShortPath);
+                if (child != null && child.Value != null)
+                    return child.Value;
+                else 
+                    return default;
+            }
+        }
+
+        public IEnumerable<TElement> Values
+        {
+            get => _children.Select(s => s.Value);
+        }
+
+        public IEnumerable<IElementContainer<TElement>> Children
+        {
+            get => _children;
+        }
+
+        public IResult<TElement> Create(TElement element)
         {
             if (element == null)
                 return new Result<TElement>(new ArgumentNullException(nameof(element)));
+            if (string.IsNullOrEmpty(element.IdShort))
+                return new Result<TElement>(new ArgumentNullException(nameof(element.IdShort)));
 
             if (this[element.IdShort] == null)
-            {                
+            {
                 Add(element);
                 return new Result<TElement>(true, element);
             }
             else
                 return new Result<TElement>(false, new ConflictMessage(element.IdShort));
         }
+
         public IResult<T> Create<T>(T element) where T : class, TElement
         {
             if (element == null)
                 return new Result<T>(new ArgumentNullException(nameof(element)));
+            if (string.IsNullOrEmpty(element.IdShort))
+                return new Result<T>(new ArgumentNullException(nameof(element.IdShort)));
 
             if (this[element.IdShort] == null)
             {
@@ -73,10 +137,149 @@
                 return new Result<T>(false, new ConflictMessage(element.IdShort));
         }
 
+        public void Add(TElement element)
+        {
+            if (element == null)
+                throw new ArgumentNullException(nameof(element));
+            if (string.IsNullOrEmpty(element.IdShort))
+                throw new ArgumentNullException(nameof(element.IdShort));
+
+            if (this[element.IdShort] == null)
+            {
+                element.Parent = this.Parent;
+
+                IElementContainer<TElement> node;
+                if (element is IElementContainer<TElement> subElements)
+                {
+                    subElements.Parent = this.Parent;
+                    subElements.ParentContainer = this;
+                    subElements.AppendRootPath(this.Path);
+                    node = subElements;
+                }
+                else
+                    node = new ElementContainer<TElement>(Parent, element, this);
+                
+                this._children.Add(node);
+            }
+        }
+
+        public void AppendRootPath(string rootPath)
+        {
+            if (!string.IsNullOrEmpty(rootPath))
+                this.Path = rootPath + PATH_SEPERATOR + this.Path;
+
+            foreach (var child in _children)
+            {
+                if (child.HasChildren())
+                {
+                    foreach (var subChild in child.Children)
+                    {
+                        subChild.AppendRootPath(rootPath);
+                    }
+                }
+                if (!string.IsNullOrEmpty(rootPath))
+                    child.Path = rootPath + PATH_SEPERATOR + child.Path;
+            }
+        }
+
+        public bool HasChildren()
+        {
+            if (_children == null)
+                return false;
+            else
+            {
+                if (_children.Count == 0)
+                    return false;
+                else
+                    return true;
+            }
+        }
+
+        public bool HasChild(string idShort)
+        {
+            if (_children == null || _children.Count == 0)
+                return false;
+            else
+            {
+                var child = _children.FirstOrDefault(c => c.IdShort == idShort);
+                if (child == null)
+                    return false;
+                else
+                    return true;
+            }
+        }
+
+        public bool HasChildPath(string idShortPath)
+        {
+            if (string.IsNullOrEmpty(idShortPath))
+                return false;
+
+            if (_children == null || _children.Count == 0)
+                return false;
+            else
+            {
+                if (idShortPath.Contains(PATH_SEPERATOR))
+                {
+                    string[] splittedPath = idShortPath.Split(new char[] { PATH_SEPERATOR[0] }, StringSplitOptions.RemoveEmptyEntries);
+                    if (!HasChild(splittedPath[0]))
+                        return false;
+                    else
+                    {
+                        var child = GetChild(splittedPath[0]);
+                        return (child.HasChildPath(string.Join(PATH_SEPERATOR, splittedPath.Skip(1))));
+                    }
+                }
+                else
+                    return HasChild(idShortPath);
+            }
+        }
+
+        public IElementContainer<TElement> GetChild(string idShortPath)
+        {
+            if (string.IsNullOrEmpty(idShortPath))
+                return null;
+
+            if (_children == null || _children.Count == 0)
+                return null;
+            else
+            {
+                IElementContainer<TElement> superChild;
+                if (idShortPath.Contains(PATH_SEPERATOR))
+                {
+                    string[] splittedPath = idShortPath.Split(new char[] { PATH_SEPERATOR[0] }, StringSplitOptions.RemoveEmptyEntries);
+                    if (HasChild(splittedPath[0]))                      
+                    {
+                        var child = GetChild(splittedPath[0]);
+                        superChild = child.GetChild(string.Join(PATH_SEPERATOR, splittedPath.Skip(1)));
+                    }
+                    else
+                        superChild = null;
+                }
+                else
+                    superChild = _children.FirstOrDefault(c => c.IdShort == idShortPath);
+
+                return superChild;
+            }
+        }
+
+        public IEnumerable<TElement> Flatten()
+        {
+            if (Value != null)
+                return new[] { Value }.Concat(_children.SelectMany(c => c.Flatten()));
+            else
+                return _children.SelectMany(c => c.Flatten());
+        }
+
+        public void Traverse(Action<TElement> action)
+        {
+            action(Value);
+            foreach (var child in _children)
+                child.Traverse(action);
+        }
 
         public virtual IResult<IQueryableElementContainer<TElement>> RetrieveAll()
         {
-            if (Count == 0)
+            if (this.Count() == 0)
                 return new Result<IQueryableElementContainer<TElement>>(true, new EmptyMessage());
             else
                 return new Result<IQueryableElementContainer<TElement>>(true, this.AsQueryableElementContainer());
@@ -84,7 +287,7 @@
 
         public virtual IResult<IQueryableElementContainer<T>> RetrieveAll<T>() where T : class, TElement
         {
-            if (Count == 0)
+            if (this.Count() == 0)
                 return new Result<IQueryableElementContainer<T>>(true, new EmptyMessage());
             else
             {
@@ -96,7 +299,7 @@
                         container.Add(tElement);
                 }
 
-                if(container.Count > 0)
+                if(container.Count() > 0)
                     return new Result<IQueryableElementContainer<T>>(true, container.AsQueryableElementContainer());
                 else
                     return new Result<IQueryableElementContainer<T>>(true, new EmptyMessage());
@@ -105,16 +308,16 @@
 
         public IResult<IQueryableElementContainer<TElement>> RetrieveAll(Predicate<TElement> predicate)
         {
-            if (Count == 0)
+            if (this.Count() == 0)
                 return new Result<IQueryableElementContainer<TElement>>(true, new EmptyMessage());
             else
             {
                 ElementContainer<TElement> container = new ElementContainer<TElement>();
-                var elements = this.FindAll(predicate);
+                var elements = Values.ToList().FindAll(predicate);
                 if(elements?.Count() > 0)
                     container.AddRange(elements);
 
-                if (container.Count > 0)
+                if (container.Count() > 0)
                     return new Result<IQueryableElementContainer<TElement>>(true, container.AsQueryableElementContainer());
                 else
                     return new Result<IQueryableElementContainer<TElement>>(true, new EmptyMessage());
@@ -123,7 +326,7 @@
 
         public virtual IResult<IQueryableElementContainer<T>> RetrieveAll<T>(Predicate<T> predicate) where T : class, TElement
         {
-            if (Count == 0)
+            if (this.Count() == 0)
                 return new Result<IQueryableElementContainer<T>>(true, new EmptyMessage());
             else
             {
@@ -135,48 +338,47 @@
                         container.Add(tElement);
                 }
 
-                if (container.Count > 0)
+                if (container.Count() > 0)
                     return new Result<IQueryableElementContainer<T>>(true, container.AsQueryableElementContainer());
                 else
                     return new Result<IQueryableElementContainer<T>>(true, new EmptyMessage());
             }
         }
 
-
-        public virtual IResult<TElement> Retrieve(string id)
+        public virtual IResult<TElement> Retrieve(string idShortPath)
         {
-            if (string.IsNullOrEmpty(id))
-                return new Result<TElement>(new ArgumentNullException(nameof(id)));
+            if (string.IsNullOrEmpty(idShortPath))
+                return new Result<TElement>(new ArgumentNullException(nameof(idShortPath)));
 
-            var element = this[id];
-            if (element != null)
-                return new Result<TElement>(true, element);
+            var child = GetChild(idShortPath);
+            if (child != null)
+                return new Result<TElement>(true, child.Value);
             else
                 return new Result<TElement>(false, new NotFoundMessage());
         }
-        public IResult<T> Retrieve<T>(string id) where T : class, TElement
+        public IResult<T> Retrieve<T>(string idShortPath) where T : class, TElement
         {
-            if (string.IsNullOrEmpty(id))
-                return new Result<T>(new ArgumentNullException(nameof(id)));
+            if (string.IsNullOrEmpty(idShortPath))
+                return new Result<T>(new ArgumentNullException(nameof(idShortPath)));
 
-            T element = this[id].Cast<T>();
+            T element = GetChild(idShortPath)?.Value?.Cast<T>();
             if (element != null)
                 return new Result<T>(true, element);
             else
                 return new Result<T>(false, new NotFoundMessage());
         }
 
-        public virtual IResult<TElement> CreateOrUpdate(string id, TElement element)
+        public virtual IResult<TElement> CreateOrUpdate(string idShortPath, TElement element)
         {
-            if (string.IsNullOrEmpty(id))
-                return new Result<TElement>(new ArgumentNullException(nameof(id)));
+            if (string.IsNullOrEmpty(idShortPath))
+                return new Result<TElement>(new ArgumentNullException(nameof(idShortPath)));
             if (element == null)
                 return new Result<TElement>(new ArgumentNullException(nameof(element)));
 
-            var index = FindIndex(e => e.IdShort == id);
-            if (index != -1)
+            var child = GetChild(idShortPath);
+            if (child != null)
             {
-                this[index] = element;
+                child.Value = element;
                 return new Result<TElement>(true, element);
             }
             else
@@ -184,104 +386,56 @@
         }
 
 
-        public virtual IResult<TElement> Update(string id, TElement element)
+        public virtual IResult<TElement> Update(string idShortPath, TElement element)
         {
-            if (string.IsNullOrEmpty(id))
-                return new Result<TElement>(new ArgumentNullException(nameof(id)));
+            if (string.IsNullOrEmpty(idShortPath))
+                return new Result<TElement>(new ArgumentNullException(nameof(idShortPath)));
             if (element == null)
                 return new Result<TElement>(new ArgumentNullException(nameof(element)));
 
-            var index = FindIndex(e => e.IdShort == id);
-            if (index != -1)
+            var child = GetChild(idShortPath);
+            if (child != null)
             {
-                this[index] = element;
+                child.Value = element;
                 return new Result<TElement>(true, element);
             }
             return new Result<TElement>(false, new NotFoundMessage());
         }
 
-        public virtual IResult Delete(string id)
+        public virtual IResult Delete(string idShortPath)
         {
-            if (string.IsNullOrEmpty(id))
-                return new Result<TElement>(new ArgumentNullException(nameof(id)));
+            if (string.IsNullOrEmpty(idShortPath))
+                return new Result<TElement>(new ArgumentNullException(nameof(idShortPath)));
 
-            var index = FindIndex(e => e.IdShort == id);
-            if (index != -1)
+            var child = GetChild(idShortPath);
+            if (child != null)
             {
-                RemoveAt(index);
-                return new Result(true);
+                child.ParentContainer.Remove(child.IdShort);
             }
             return new Result(false, new NotFoundMessage());
         }
 
-        public IElementContainer<TModelElementType> Filter<TModelElementType>(ModelType modelType) 
-            where TModelElementType : IReferable, IModelElement, TElement
+        public void Remove(string idShort)
         {
-            List<TModelElementType> modelElements = FindAll(p => p.ModelType == modelType)?.ConvertAll(c => (TModelElementType)c);
-            if (modelElements != null)
-                return new ElementContainer<TModelElementType>(modelElements);
-            else
-                return new ElementContainer<TModelElementType>();
+            _children.RemoveAll(c => c.IdShort == idShort);
         }
 
-        public IEnumerable<TModelElementType> FilterAsReference<TModelElementType>(ModelType modelType)
-            where TModelElementType : IReferable, IModelElement, TElement
+        public void AddRange(IEnumerable<TElement> collection)
         {
-            return this.Where(w => w.ModelType == modelType).Cast<TModelElementType>();              
+            foreach (var item in collection)
+            {
+                Add(item);
+            }
         }
 
-        IElementContainer<TOutput> IElementContainer<TElement>.ConvertAll<TOutput>(Converter<TElement, TOutput> converter)
+        public IEnumerator<TElement> GetEnumerator()
         {
-            return new ElementContainer<TOutput>(this.ConvertAll(converter));
+            return Values.GetEnumerator();
         }
 
-        
-    }
-
-    public class PropertyContainer : ElementContainer<IProperty>
-    {
-        private readonly IElementContainer<ISubmodelElement> submodelElements;
-        public PropertyContainer(IElementContainer<ISubmodelElement> submodelElementContainer)
+        IEnumerator IEnumerable.GetEnumerator()
         {
-            submodelElements = submodelElementContainer;
-        }
-
-        public override IResult<IProperty> Create(IProperty element)
-        {
-            return submodelElements.Create(element);
-        }
-    }
-    [JsonConverter(typeof(OperationVariableSetConverter))]
-    public interface IOperationVariableSet : IList<IOperationVariable>
-    {
-        void Add(ISubmodelElement submodelElement);
-        ISubmodelElement Get(string idShort);
-        IElementContainer<ISubmodelElement> ToElementContainer();
-        ISubmodelElement this[string idShort] { get; }
-    }
-
-    public class OperationVariableSet : List<IOperationVariable>, IOperationVariableSet
-    {
-        public OperationVariableSet()
-        { }
-
-        public OperationVariableSet(IEnumerable<IOperationVariable> list) : base(list) { }
-
-        public ISubmodelElement this[string idShort] => this.Find(e => e.Value.IdShort == idShort)?.Value;
-
-        public void Add(ISubmodelElement submodelElement)
-        {
-            base.Add(new OperationVariable() { Value = submodelElement });
-        }
-
-        public ISubmodelElement Get(string idShort)
-        {
-            return this[idShort];
-        }
-
-        public IElementContainer<ISubmodelElement> ToElementContainer()
-        {
-            return new ElementContainer<ISubmodelElement>(this.Cast<IOperationVariable>().Select(s => s.Value));
+            return Values.GetEnumerator();
         }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainerExtensions.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainerExtensions.cs
index b4ce0cd..152dd81 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainerExtensions.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementContainerExtensions.cs
@@ -15,9 +15,9 @@
 {
     public static class ElementContainerExtensions
     {
-        public static IQueryableElementContainer<T> AsQueryableElementContainer<T>(this IEnumerable<T> enumerable) where T: IReferable, IModelElement
+        public static IQueryableElementContainer<T> AsQueryableElementContainer<T>(this IEnumerable<T> enumerable, IReferable parent = null) where T: IReferable, IModelElement
         {
-            return new QueryableElementContainer<T>(enumerable);
-        }
+            return new QueryableElementContainer<T>(parent, enumerable);
+        }        
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementTree.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementTree.cs
new file mode 100644
index 0000000..68ed40f
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementTree.cs
@@ -0,0 +1,11 @@
+using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using BaSyx.Utils.ModelHandling;
+
+namespace BaSyx.Models.Core.Common
+{
+    public class ElementTree : TreeBuilder<IReferable>
+    {
+        public ElementTree(IReferable referable) : base(referable.IdShort, referable)
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementValue.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementValue.cs
index 632c764..39a9881 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementValue.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/ElementValue.cs
@@ -41,6 +41,30 @@
             ValueType = valueType;
         }
 
+        public object ToObject(Type type)
+        {
+            if (Value == null || type == null)
+                return null;
+
+            try
+            {
+                Value = Convert.ChangeType(Value, type);
+                return Value;
+            }
+            catch
+            {
+                try
+                {
+                    JToken jVal = JToken.Parse(Value.ToString());
+                    object convertedVal = jVal.ToObject(type);
+                    return convertedVal;
+                }
+                catch
+                {
+                    throw new InvalidCastException("Cannot convert " + Value?.GetType() + " to " + type.Name);
+                }
+            }
+        }
 
         public T ToObject<T>()
         {
@@ -59,8 +83,8 @@
                 {
                     try
                     {
-                        var jVal = JValue.Parse(Value.ToString());
-                        var convertedVal = jVal.ToObject<T>();
+                        JToken jVal = JToken.Parse(Value.ToString());
+                        T convertedVal = jVal.ToObject<T>();
                         return convertedVal;
                     }
                     catch
@@ -71,27 +95,28 @@
             }
         }
     }
+
     [DataContract]
-    public class PropertyValue<TValue> : ElementValue, IValue<TValue>
+    public class ElementValue<TValue> : ElementValue, IValue<TValue>
     {
         [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
         public new TValue Value { get; set; }
 
-        public PropertyValue() : this(default, DataType.GetDataTypeFromSystemType(typeof(TValue)))
+        public ElementValue() : this(default, DataType.GetDataTypeFromSystemType(typeof(TValue)))
         { }
 
-        public PropertyValue(TValue value) : this(value, DataType.GetDataTypeFromSystemType(typeof(TValue)))
+        public ElementValue(TValue value) : this(value, DataType.GetDataTypeFromSystemType(typeof(TValue)))
         { }
 
-        public PropertyValue(TValue value, DataType valueType) : base(value, valueType)
+        public ElementValue(TValue value, DataType valueType) : base(value, valueType)
         {
             Value = value;
             ValueType = valueType;
         }
 
-        public static implicit operator PropertyValue<TValue>(TValue value)
+        public static implicit operator ElementValue<TValue>(TValue value)
         {
-            return new PropertyValue<TValue>(value);
+            return new ElementValue<TValue>(value);
         }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IElementContainer.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IElementContainer.cs
index abf19d7..e92acf7 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IElementContainer.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IElementContainer.cs
@@ -14,16 +14,11 @@
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
-using System.Linq;
 
 namespace BaSyx.Models.Core.Common
 {
-    public interface IGenericElementContainer<TIdentifier, TElement> : IList<TElement>
+    public interface ICrudContainer<TIdentifier, TElement>
     {
-        TElement this[TIdentifier id] { get; }
-
-        IResult<TElement> Create(TElement element);
-
         IResult<T> Create<T>(T element) where T : class, TElement;
 
         IResult<TElement> Retrieve(TIdentifier id);
@@ -39,23 +34,37 @@
         IResult<TElement> Update(TIdentifier id, TElement element);
 
         IResult Delete(TIdentifier id);
-        
-        void AddRange(IEnumerable<TElement> collection);
-    }
-
-    public interface IQueryableElementContainer<TElement> : IElementContainer<TElement>, IQueryable<TElement>
-    {
-
+       
     }
 
     [JsonConverter(typeof(ElementContainerConverter))]
-    public interface IElementContainer<TElement> : IGenericElementContainer<string, TElement>
+    public interface IElementContainer<TElement> : ICrudContainer<string, TElement>, IEnumerable<TElement>
     {
+        TElement this[int i] { get; }
+        TElement this[string idShort] { get; }
+
         IResult<IQueryableElementContainer<TElement>> RetrieveAll();
         IResult<IQueryableElementContainer<TElement>> RetrieveAll(Predicate<TElement> predicate);
 
-        IElementContainer<TOutput> ConvertAll<TOutput>(Converter<TElement, TOutput> converter) where TOutput : IReferable, IModelElement;
-        IElementContainer<TModelElementType> Filter<TModelElementType>(ModelType modelType) where TModelElementType : IReferable, IModelElement, TElement;
-        IEnumerable<TModelElementType> FilterAsReference<TModelElementType>(ModelType modelType) where TModelElementType : IReferable, IModelElement, TElement;
+        IEnumerable<IElementContainer<TElement>> Children { get; }
+        IEnumerable<TElement> Values { get; }
+        IElementContainer<TElement> ParentContainer { get; set; }
+
+        IReferable Parent { get; set; }
+        TElement Value { get; set; }
+        string Path { get; set; }
+        string IdShort { get; }
+        bool IsRoot { get; }
+
+        bool HasChildren();
+        bool HasChild(string idShort);
+        bool HasChildPath(string idShortPath);
+        void Traverse(Action<TElement> action);
+        IEnumerable<TElement> Flatten();
+        IElementContainer<TElement> GetChild(string idShortPath);
+        void AppendRootPath(string rootPath);
+        void Add(TElement element);
+        void Remove(string idShort);
+        void AddRange(IEnumerable<TElement> elements);
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IOperationVariableSet.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IOperationVariableSet.cs
new file mode 100644
index 0000000..1e15421
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IOperationVariableSet.cs
@@ -0,0 +1,26 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Models.Extensions;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+
+namespace BaSyx.Models.Core.Common
+{
+    [JsonConverter(typeof(OperationVariableSetConverter))]
+    public interface IOperationVariableSet : IList<IOperationVariable>
+    {
+        void Add(ISubmodelElement submodelElement);
+        ISubmodelElement Get(string idShort);
+        IElementContainer<ISubmodelElement> ToElementContainer();
+        ISubmodelElement this[string idShort] { get; }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IQueryableElementContainer.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IQueryableElementContainer.cs
new file mode 100644
index 0000000..4a53017
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IQueryableElementContainer.cs
@@ -0,0 +1,19 @@
+/*******************************************************************************
+* 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.Linq;
+
+namespace BaSyx.Models.Core.Common
+{
+    public interface IQueryableElementContainer<TElement> : IElementContainer<TElement>, IQueryable<TElement>
+    {
+
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IValue.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IValue.cs
index 0dccaed..2dbaf98 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IValue.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/IValue.cs
@@ -21,6 +21,7 @@
         DataType ValueType { get; }
         event EventHandler<ValueChangedArgs> ValueChanged;
         T ToObject<T>();
+        object ToObject(Type type);
     }
 
     public interface IValue<out T> : IValue
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangString.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangString.cs
index 96d1254..63dad0c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangString.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangString.cs
@@ -11,7 +11,7 @@
 using System.Runtime.Serialization;
 using System.Xml.Serialization;
 
-namespace BaSyx.Models.Core.Common
+namespace BaSyx.Models.Core.AssetAdministrationShell
 {
     [DataContract]
     public class LangString
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangStringSet.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangStringSet.cs
index 3f50050..f090582 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangStringSet.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/LangStringSet.cs
@@ -12,7 +12,7 @@
 using System.Collections.Generic;
 using System.Runtime.Serialization;
 
-namespace BaSyx.Models.Core.Common
+namespace BaSyx.Models.Core.AssetAdministrationShell
 {
     [DataContract]
     public class LangStringSet : List<LangString>
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/OperationVariableSet.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/OperationVariableSet.cs
new file mode 100644
index 0000000..0c390b5
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/OperationVariableSet.cs
@@ -0,0 +1,43 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
+using BaSyx.Models.Extensions;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace BaSyx.Models.Core.Common
+{
+    public class OperationVariableSet : List<IOperationVariable>, IOperationVariableSet
+    {
+        public OperationVariableSet()
+        { }
+
+        public OperationVariableSet(IEnumerable<IOperationVariable> list) : base(list) { }
+
+        public ISubmodelElement this[string idShort] => this.Find(e => e.Value.IdShort == idShort)?.Value;
+
+        public void Add(ISubmodelElement submodelElement)
+        {
+            base.Add(new OperationVariable() { Value = submodelElement });
+        }
+
+        public ISubmodelElement Get(string idShort)
+        {
+            return this[idShort];
+        }
+
+        public IElementContainer<ISubmodelElement> ToElementContainer()
+        {
+            return new ElementContainer<ISubmodelElement>(null, this.Cast<IOperationVariable>().Select(s => s.Value));
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/QueryableElementContainer.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/QueryableElementContainer.cs
new file mode 100644
index 0000000..eb7e7ff
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/QueryableElementContainer.cs
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BaSyx.Models.Core.Common
+{
+    public class QueryableElementContainer<TElement> : ElementContainer<TElement>, IQueryableElementContainer<TElement> where TElement : IReferable, IModelElement
+    {
+        private readonly IQueryable<TElement> _queryable;
+        public QueryableElementContainer(IReferable parent, IEnumerable<TElement> list) : base(parent, list)
+        {
+            _queryable = list.AsQueryable();
+        }
+
+        public Type ElementType => _queryable.ElementType;
+
+        public Expression Expression => _queryable.Expression;
+
+        public IQueryProvider Provider => _queryable.Provider;
+
+        IEnumerator<TElement> IEnumerable<TElement>.GetEnumerator()
+        {
+            return _queryable.GetEnumerator();
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/SubmodelElementContainer.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/SubmodelElementContainer.cs
new file mode 100644
index 0000000..2512279
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/Common/SubmodelElementContainer.cs
@@ -0,0 +1,178 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+namespace BaSyx.Models.Core.Common
+{
+    public class SubmodelElementContainer : ElementContainer<ISubmodelElement>
+    {
+        public const string PATH_SEPERATOR = "/";
+
+        private readonly IList<SubmodelElementContainer> _children;
+
+        public string IdShort { get; }
+        public ISubmodelElement Value { get; }
+        public string Path { get; } = string.Empty;
+        public bool IsRoot { get; }
+
+        public SubmodelElementContainer ParentContainer { get; protected set; }
+        public SubmodelElementContainer(IReferable parent) : base(parent)
+        {
+            _children = new List<SubmodelElementContainer>();
+
+            IdShort = null;
+            Value = null;
+            Path = PATH_SEPERATOR;
+            IsRoot = true;
+        }
+
+        public SubmodelElementContainer(ISubmodelElement rootElement) : base(rootElement)
+        {
+            _children = new List<SubmodelElementContainer>();
+
+            IdShort = rootElement.IdShort;
+            Value = rootElement;
+
+            if (ParentContainer != null)
+            {
+                Path = ParentContainer.Path + PATH_SEPERATOR + IdShort;
+                IsRoot = false;
+            }
+            else
+            {
+                Path = PATH_SEPERATOR + IdShort;
+                IsRoot = true;
+            }
+        }
+
+        public new SubmodelElementContainer this[int i]
+        {
+            get { return _children[i]; }
+        }
+
+        public new SubmodelElementContainer this[string idShortPath]
+        {
+            get { return _children.FirstOrDefault(c => c.IdShort == idShortPath); }
+        }
+        public ReadOnlyCollection<SubmodelElementContainer> Children
+        {
+            get { return new ReadOnlyCollection<SubmodelElementContainer>(_children); }
+        }
+
+        public SubmodelElementContainer AddChild(ISubmodelElement submodelElement)
+        {
+            SubmodelElementContainer node = new SubmodelElementContainer(submodelElement) 
+                { ParentContainer = this };
+
+            node.ParentContainer = this;           
+            this._children.Add(node);
+            return this;
+        }
+
+        public SubmodelElementContainer AddChild(SubmodelElementContainer submodelElements)
+        {
+            submodelElements.ParentContainer = this;
+            this._children.Add(submodelElements);
+            return this;
+        }
+
+        public bool HasChildren()
+        {
+            if (_children == null)
+                return false;
+            else
+            {
+                if (_children.Count == 0)
+                    return false;
+                else
+                    return true;
+            }
+        }
+        public bool HasChild(string idShort)
+        {
+            if (_children == null || _children.Count == 0)
+                return false;
+            else
+            {
+                var child = _children.FirstOrDefault(c => c.IdShort == idShort);
+                if (child == null)
+                    return false;
+                else
+                    return true;
+            }
+        }
+
+        public bool HasChildPath(string idShortPath)
+        {
+            if (string.IsNullOrEmpty(idShortPath))
+                return false;
+
+            if (_children == null || _children.Count == 0)
+                return false;
+            else
+            {
+                if (idShortPath.Contains("/"))
+                {
+                    string[] splittedPath = idShortPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
+                    if (!HasChild(splittedPath[0]))
+                        return false;
+                    else
+                    {
+                        var child = this[splittedPath[0]];
+                        return (child.HasChildPath(string.Join("/", splittedPath.Skip(1))));
+                    }
+                }
+                else
+                    return HasChild(idShortPath);
+            }
+        }
+
+        public void Traverse(Action<ISubmodelElement> action)
+        {
+            action(Value);
+            foreach (var child in _children)
+                child.Traverse(action);
+        }
+
+        public SubmodelElementContainer GetChild(string idShortPath)
+        {
+            if (string.IsNullOrEmpty(idShortPath))
+                return null;
+
+            if (_children == null || _children.Count == 0)
+                return null;
+            else
+            {
+                SubmodelElementContainer superChild;
+                if (idShortPath.Contains("/"))
+                {
+                    string[] splittedPath = idShortPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
+                    if (!HasChild(splittedPath[0]))
+                        superChild = null;
+                    else
+                    {
+                        var child = this[splittedPath[0]];
+                        superChild = child.GetChild(string.Join("/", splittedPath.Skip(1)));
+                    }
+                }
+                else
+                    superChild = this[idShortPath];
+
+                return superChild;
+            }
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ElementContainerConverter.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ElementContainerConverter.cs
index 02def6b..325f0da 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ElementContainerConverter.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ElementContainerConverter.cs
@@ -9,7 +9,6 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Utils.DependencyInjection.Abstractions;
-using BaSyx.Utils.JsonHandling;
 using Newtonsoft.Json;
 using NLog;
 using System;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ModelElementExtensions.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ModelElementExtensions.cs
new file mode 100644
index 0000000..277a355
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ModelElementExtensions.cs
@@ -0,0 +1,25 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.Common;
+using BaSyx.Utils.JsonHandling;
+using Newtonsoft.Json;
+
+namespace BaSyx.Models.Extensions
+{
+    public static class ModelElementExtensions
+    {
+        public static string ToJson(this IModelElement modelElement, JsonSerializerSettings jsonSerializerSettings = null)
+        {
+            jsonSerializerSettings = jsonSerializerSettings ?? new DefaultJsonSerializerSettings();
+            return JsonConvert.SerializeObject(modelElement, jsonSerializerSettings);
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ReferableExtensions.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ReferableExtensions.cs
new file mode 100644
index 0000000..5e926c2
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ReferableExtensions.cs
@@ -0,0 +1,103 @@
+/*******************************************************************************
+* 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 BaSyx.Models.Core.AssetAdministrationShell.Generics;
+using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using BaSyx.Models.Core.Common;
+using BaSyx.Utils.ModelHandling;
+using System.Linq;
+
+namespace BaSyx.Models.Extensions
+{
+    public static class ReferableExtensions
+    {
+        public static ElementTree GetElementTree(this IReferable referable)
+        {
+            ElementTree elementTree = new ElementTree(referable);
+            if (referable is IAssetAdministrationShell shell)
+            {
+                if(shell.Submodels?.Count() > 0)
+                {
+                    foreach (var submodel in shell.Submodels.Values)
+                    {
+                        ElementTree submodelTree = GetElementTree(submodel);
+                        elementTree.AddChild(submodelTree);
+                    }
+                }
+            }
+            else if (referable is ISubmodel submodel)
+            {
+                if (submodel.SubmodelElements?.Count() > 0)
+                {
+                    foreach (var submodelElement in submodel.SubmodelElements.Values)
+                    {
+                        ElementTree submodelElementTree = GetElementTree(submodelElement);
+                        elementTree.AddChild(submodelElementTree);
+                    }
+                }
+            }
+            else if (referable is ISubmodelElementCollection seCollection)
+            {
+                foreach (var subElement in seCollection.Value.Values)
+                {
+                    ElementTree subElementTree = GetElementTree(subElement);
+                    elementTree.AddChild(subElementTree);
+                }
+            }
+            return elementTree;
+        }
+
+        public static IReferable GetReferable(this TreeBuilder<IReferable> elementTree)
+        {
+            IReferable referable = null;
+            if(elementTree.Value is IAssetAdministrationShell shell)
+            {
+                referable = shell;
+                if (elementTree.HasChildren())
+                {
+                    foreach (var child in elementTree.Children)
+                    {
+                        ISubmodel submodelChild = (ISubmodel)GetReferable(child);
+                        shell.Submodels.Create(submodelChild);
+                    }
+                }
+            }
+            else if (elementTree.Value is ISubmodel submodel)
+            {
+                referable = submodel;
+                if (elementTree.HasChildren())
+                {
+                    foreach (var child in elementTree.Children)
+                    {
+                        ISubmodelElement submodelElementChild = (ISubmodelElement)GetReferable(child);
+                        submodel.SubmodelElements.Create(submodelElementChild);
+                    }
+                }
+            }
+            else if (elementTree.Value is ISubmodelElementCollection seCollection)
+            {
+                referable = seCollection;
+                if (elementTree.HasChildren())
+                {
+                    foreach (var child in elementTree.Children)
+                    {
+                        ISubmodelElement submodelElementChild = (ISubmodelElement)GetReferable(child);
+                        seCollection.Value.Create(submodelElementChild);
+                    }
+                }
+            }
+            else if (elementTree.Value is ISubmodelElement submodelElement)
+            {
+                referable = submodelElement;                
+            }
+            return referable;
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ReferenceExtensions.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ReferenceExtensions.cs
index 99e3642..77beed4 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ReferenceExtensions.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/ReferenceExtensions.cs
@@ -15,10 +15,47 @@
 {
     public static class ReferenceExtensions
     {
-        public static IReference CreateReference<T>(this T referable) where T : class, IReferable
+        public const string eClass_ICD = "0173";
+        public const string ISO_ICD = "0112";
+        public const string GTIN_ICD = "0160";
+
+        public static IReference<T> CreateReference<T>(this T referable) where T : class, IReferable
         {
             IReference<T> reference = new Reference<T>(referable);
             return reference;
         }
+
+        public static bool IsEClassReference(this IReference reference)
+        {
+            if (reference == null || reference.First == null || string.IsNullOrEmpty(reference.First.Value) || reference.First.IdType != KeyType.IRDI)
+                return false;
+
+            if (reference.First.Value.StartsWith(eClass_ICD))
+                return true;
+
+            return false;
+        }
+
+        public static bool IsIsoReference(this IReference reference)
+        {
+            if (reference == null || reference.First == null || string.IsNullOrEmpty(reference.First.Value) || reference.First.IdType != KeyType.IRDI)
+                return false;
+
+            if (reference.First.Value.StartsWith(ISO_ICD))
+                return true;
+
+            return false;
+        }
+
+        public static bool IsGtinReference(this IReference reference)
+        {
+            if (reference == null || reference.First == null || string.IsNullOrEmpty(reference.First.Value) || reference.First.IdType != KeyType.IRDI)
+                return false;
+
+            if (reference.First.Value.StartsWith(GTIN_ICD))
+                return true;
+
+            return false;
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/Semantics/DataSpecifications/DataSpecificationIEC61360.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/Semantics/DataSpecifications/DataSpecificationIEC61360.cs
index 1aa294c..0ad951f 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/Semantics/DataSpecifications/DataSpecificationIEC61360.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/Semantics/DataSpecifications/DataSpecificationIEC61360.cs
@@ -14,6 +14,7 @@
 using System.Runtime.Serialization;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.Common;
+using BaSyx.Models.Core.AssetAdministrationShell;
 
 namespace BaSyx.Models.Extensions.Semantics.DataSpecifications
 {
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementConverter.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementConverter.cs
index 217b482..26a81ab 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementConverter.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementConverter.cs
@@ -105,7 +105,7 @@
 
             if (modelTypeToken != null)
             {
-                submodelElement = SubmodelElementFactory.CreateSubmodelElement(modelTypeToken, valueTypeToken);
+                submodelElement = SubmodelElementFactory.CreateSubmodelElement(string.Empty, modelTypeToken, valueTypeToken);
                 submodelElement.EmbeddedDataSpecifications = embeddedDataSpecifications;
                 submodelElement.ConceptDescription = conceptDescription;
             }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementExtensions.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementExtensions.cs
index 60d9aa0..e46fd0b 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementExtensions.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelElementExtensions.cs
@@ -9,10 +9,10 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
+using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
 using BaSyx.Models.Core.Common;
+using NLog;
 using System;
 using System.Collections.Generic;
 using System.Reflection;
@@ -21,59 +21,93 @@
 {
     public static class SubmodelElementExtensions
     {
+        private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
+
         public static T Cast<T>(this IReferable referable) where T : class, IReferable
         {
             return referable as T;
         }
 
-        [Obsolete("Use Cast<T>(IReferable referable) instead")]
-        public static T ToModelElement<T>(this IReferable referable) where T : class, IReferable
+        public static IValue GetValue(this ISubmodelElement submodelElement)
         {
-            return referable as T;
+            return submodelElement?.Get?.Invoke(submodelElement);
+        }
+
+        public static T GetValue<T>(this ISubmodelElement submodelElement)
+        {
+            IValue value = submodelElement?.Get?.Invoke(submodelElement);
+            if (value != null)
+                return value.ToObject<T>();
+            else
+                return default;
+        }
+
+        public static void SetValue<T>(this ISubmodelElement submodelElement, T value)
+        {
+            submodelElement?.Set?.Invoke(submodelElement, new ElementValue<T>(value));
+        }
+
+        public static void SetValue(this ISubmodelElement submodelElement, IValue value)
+        {
+            submodelElement?.Set?.Invoke(submodelElement, value);
         }
 
         public static ISubmodelElementCollection CreateSubmodelElementCollection<T>(this IEnumerable<T> enumerable, string idShort)
         {
-            SubmodelElementCollection smCollection = new SubmodelElementCollection()
-            {
-                IdShort = idShort
-            };
+            SubmodelElementCollection smCollection = new SubmodelElementCollection(idShort);
             Type type = typeof(T);
             foreach (var item in enumerable)
             {
                 foreach (var property in type.GetProperties())
-                {
+                {                    
                     ISubmodelElement smElement = CreateSubmodelElement(property, item);
-                    smCollection.Value.Add(smElement);
+                    smCollection.Value.Create(smElement);
                 }
             }
             return smCollection;
         }
 
-        public static ISubmodelElement CreateSubmodelElement(this PropertyInfo property, object target)
+        public static ISubmodelElementCollection CreateSubmodelElementCollection(this Type type, string idShort)
         {
+            SubmodelElementCollection smCollection = new SubmodelElementCollection(idShort);
+
+            foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
+            {
+                ISubmodelElement smElement = CreateSubmodelElement(property);
+                smCollection.Value.Create(smElement);
+            }
+            return smCollection;
+        }
+
+        public static ISubmodelElement CreateSubmodelElement(this PropertyInfo property, object target = null)
+        {
+            DataType dataType = DataType.GetDataTypeFromSystemType(property.PropertyType);
+            if(dataType == null)
+            {
+                logger.Warn($"Unable to convert system type {property.PropertyType} to DataType");
+                return null;
+            }
+
             if (DataType.IsSimpleType(property.PropertyType))
             {
-                DataType dataType = DataType.GetDataTypeFromSystemType(property.PropertyType);
-                Property smProp = new Property(dataType)
-                {
-                    IdShort = property.Name,
-                    Value = property.GetValue(target)
-                };
+                Property smProp = new Property(property.Name, dataType);
+                if (target != null)
+                    smProp.Value = property.GetValue(target);
+
                 return smProp;
             }
             else
             {
-                SubmodelElementCollection smCollection = new SubmodelElementCollection()
+                SubmodelElementCollection smCollection = new SubmodelElementCollection(property.Name);
+
+                object subTarget = null;
+                if(target != null)
+                    subTarget = property.GetValue(target);
+
+                foreach (var subProperty in dataType.SystemType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
                 {
-                    IdShort = property.Name
-                };
-                object value = property.GetValue(target);
-                Type valueType = value.GetType();
-                foreach (var subProperty in valueType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
-                {
-                    ISubmodelElement smElement = CreateSubmodelElement(subProperty, value);
-                    smCollection.Value.Add(smElement);
+                    ISubmodelElement smElement = CreateSubmodelElement(subProperty, subTarget);
+                    smCollection.Value.Create(smElement);
                 }
                 return smCollection;
             }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelExtensions.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelExtensions.cs
index c824432..ec548f8 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelExtensions.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Extensions/SubmodelExtensions.cs
@@ -9,10 +9,8 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.Common;
 using BaSyx.Utils.StringOperations;
@@ -32,15 +30,11 @@
                 return null;
 
             Type type = target.GetType();
-            Submodel submodel = new Submodel()
-            {
-                IdShort = type.Name,
-                Identification = new Identifier(type.FullName, KeyType.Custom)
-            };
+            Submodel submodel = new Submodel(type.Name, new Identifier(type.FullName, KeyType.Custom));
             foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
             {
                 ISubmodelElement smElement = property.CreateSubmodelElement(target);
-                submodel.SubmodelElements.Add(smElement);
+                submodel.SubmodelElements.Create(smElement);
             }
             return submodel;
         }
@@ -54,9 +48,9 @@
         public static JArray CustomizeSubmodel(this ISubmodel submodel, string[] columns)
         {
             JArray jArray = new JArray();
-            if (submodel.SubmodelElements.Count > 0)
+            if (submodel.SubmodelElements?.Count() > 0)
             {
-                foreach (var element in submodel.SubmodelElements)
+                foreach (var element in submodel.SubmodelElements.Values)
                 {
                     JArray elementJArray = CustomizeSubmodelElement(element, columns);
                     jArray.Merge(elementJArray, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union } );
@@ -74,7 +68,7 @@
             if (element.ModelType == ModelType.SubmodelElementCollection)
             {
                 var valueContainer = element as SubmodelElementCollection;
-                foreach (var subElement in valueContainer.Value)
+                foreach (var subElement in valueContainer.Value.Values)
                 {
                     JArray subJArray = CustomizeSubmodelElement(subElement, columns);
                     jArray.Merge(subJArray, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union });
@@ -104,9 +98,9 @@
         public static JObject MinimizeSubmodel(this ISubmodel submodel)
         {
             JObject jObject = new JObject();
-            if (submodel.SubmodelElements.Count > 0)
+            if (submodel.SubmodelElements?.Count() > 0)
             {
-                JObject submodelElementsObject = MinimizeSubmodelElements(submodel.SubmodelElements);
+                JObject submodelElementsObject = MinimizeSubmodelElements(submodel.SubmodelElements.Values);
                 jObject.Merge(submodelElementsObject, JsonMergeSettings);
             }
             return jObject;
@@ -119,7 +113,7 @@
             {
                 if (smElement.ModelType == ModelType.SubmodelElementCollection)
                 {
-                    JObject subObjects = MinimizeSubmodelElements((smElement as SubmodelElementCollection).Value);
+                    JObject subObjects = MinimizeSubmodelElements((smElement as SubmodelElementCollection).Value.Values);
                     jObject.Add(smElement.IdShort, subObjects);
                 }
                 else
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/StandardImplementation.cs b/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DefaultImplementation.cs
similarity index 86%
rename from sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/StandardImplementation.cs
rename to sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DefaultImplementation.cs
index 3ad8be6..3e1962b 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/StandardImplementation.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DefaultImplementation.cs
@@ -10,19 +10,18 @@
 *******************************************************************************/
 using BaSyx.Models.Connectivity.Descriptors;
 using BaSyx.Models.Core.AssetAdministrationShell.Generics;
-using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.Implementations;
-using BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes;
 using BaSyx.Models.Core.AssetAdministrationShell.References;
 using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
 using BaSyx.Models.Core.AssetAdministrationShell.Views;
 using BaSyx.Models.Core.Common;
 using BaSyx.Utils.ResultHandling;
 using Microsoft.Extensions.DependencyInjection;
+using System;
 
 namespace BaSyx.Utils.DependencyInjection
 {
-    public static class StandardImplementation
+    public static class DefaultImplementation
     {
         public static IServiceCollection AddStandardImplementation(this IServiceCollection services)
         {
@@ -74,5 +73,19 @@
 
             return services;
         }
+
+        public static IServiceCollection GetStandardServiceCollection()
+        {
+            IServiceCollection services = new ServiceCollection();
+            services.AddStandardImplementation();
+            return services;
+        }
+
+        public static IServiceProvider GetStandardServiceProvider()
+        {
+            IServiceCollection standardServiceCollection = GetStandardServiceCollection();
+            DefaultServiceProviderFactory serviceProviderFactory = new DefaultServiceProviderFactory();
+            return serviceProviderFactory.CreateServiceProvider(standardServiceCollection);
+        }
     }
 }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DependencyInjectionActivator.cs b/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DependencyInjectionActivator.cs
new file mode 100644
index 0000000..70bbd5a
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DependencyInjectionActivator.cs
@@ -0,0 +1,42 @@
+using Microsoft.Extensions.DependencyInjection;
+using System;
+
+namespace BaSyx.Utils.DependencyInjection
+{
+    public static class DependencyInjectionActivator
+    {
+        public static object CreateInstance(IServiceProvider serviceProvider, Type interfaceType)
+        {
+            if (serviceProvider == null || interfaceType == null || !interfaceType.IsInterface)
+                return null;
+
+            object instance = ActivatorUtilities.CreateInstance(serviceProvider, interfaceType);
+            return instance;
+        }
+
+        public static object CreateStandardInstance(Type interfaceType)
+        {
+            IServiceProvider serviceProvider = DefaultImplementation.GetStandardServiceProvider();
+            object instance = CreateInstance(serviceProvider, interfaceType);
+            return instance;
+        }
+        
+        public static T CreateStandardInstance<T>()
+        {
+            object instance = CreateStandardInstance(typeof(T));
+            if (instance is T castedInstance)
+                return castedInstance;
+            else
+                return default;
+        }
+
+        public static T CreateInstance<T>(IServiceProvider serviceProvider)
+        {
+            object instance = CreateInstance(serviceProvider, typeof(T));
+            if (instance is T castedInstance)
+                return castedInstance;
+            else
+                return default;            
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DependencyInjectionJsonSerializerSettings.cs b/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DependencyInjectionJsonSerializerSettings.cs
new file mode 100644
index 0000000..c53e18f
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/DependencyInjectionJsonSerializerSettings.cs
@@ -0,0 +1,34 @@
+/*******************************************************************************
+* 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 BaSyx.Utils.JsonHandling;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+
+namespace BaSyx.Utils.DependencyInjection
+{
+    public class DependencyInjectionJsonSerializerSettings : DefaultJsonSerializerSettings
+    {
+        public IServiceProvider ServicePovider { get; }
+        public IServiceCollection Services { get; }
+
+        public DependencyInjectionJsonSerializerSettings() :
+            this(new ServiceCollection().AddStandardImplementation())
+        { }
+
+        public DependencyInjectionJsonSerializerSettings(IServiceCollection services) : base()
+        {
+            Services = services;
+            DefaultServiceProviderFactory serviceProviderFactory = new DefaultServiceProviderFactory();
+            ServicePovider = serviceProviderFactory.CreateServiceProvider(Services);
+            ContractResolver = new DependencyInjectionContractResolver(new DependencyInjectionExtension(Services));
+        }        
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/JsonStandardSettings.cs b/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/JsonStandardSettings.cs
deleted file mode 100644
index d345f5b..0000000
--- a/sdks/dotnet/basyx-core/BaSyx.Utils.DependencyInjection/JsonStandardSettings.cs
+++ /dev/null
@@ -1,60 +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.Extensions.DependencyInjection;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
-using System;
-
-namespace BaSyx.Utils.DependencyInjection
-{
-    public class JsonStandardSettings : JsonSerializerSettings
-    {
-        public IServiceProvider ServicePovider { get; }
-        public IServiceCollection Services { get; }
-        public JsonStandardSettings() : base()
-        {
-            Services = new ServiceCollection();
-            Services.AddStandardImplementation();
-
-            var serviceProviderFactory = new DefaultServiceProviderFactory();
-            ServicePovider = serviceProviderFactory.CreateServiceProvider(Services);
-
-            NullValueHandling = NullValueHandling.Include;
-            DefaultValueHandling = DefaultValueHandling.Include;
-
-            Formatting = Formatting.Indented;
-            Converters.Add(new StringEnumConverter());
-            ContractResolver = new DependencyInjectionContractResolver(new DependencyInjectionExtension(Services));
-        }
-
-        public JsonStandardSettings(IServiceCollection services) : base()
-        {
-            Services = services;
-
-            var serviceProviderFactory = new DefaultServiceProviderFactory();
-            ServicePovider = serviceProviderFactory.CreateServiceProvider(Services);
-
-            NullValueHandling = NullValueHandling.Include;
-            DefaultValueHandling = DefaultValueHandling.Include;
-
-            Formatting = Formatting.Indented;
-            Converters.Add(new StringEnumConverter());
-            ContractResolver = new DependencyInjectionContractResolver(new DependencyInjectionExtension(Services));
-        }
-
-        public static IServiceCollection GetStandardServiceCollection()
-        {
-            IServiceCollection services = new ServiceCollection();
-            services.AddStandardImplementation();
-            return services;
-        }
-    }
-}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils/Client/Http/SimpleHttpClient.cs b/sdks/dotnet/basyx-core/BaSyx.Utils/Client/Http/SimpleHttpClient.cs
index 5ff5de6..0752cf3 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Utils/Client/Http/SimpleHttpClient.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils/Client/Http/SimpleHttpClient.cs
@@ -8,12 +8,11 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
+using BaSyx.Utils.JsonHandling;
 using BaSyx.Utils.ResultHandling;
 using BaSyx.Utils.Settings.Sections;
 using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
 using System;
-using System.Collections;
 using System.Collections.Generic;
 using System.Net;
 using System.Net.Http;
@@ -35,13 +34,7 @@
             HttpClientHandler = new HttpClientHandler() { MaxConnectionsPerServer = 100, UseProxy = false };
             HttpClient = new HttpClient(HttpClientHandler);
 
-            JsonSerializerSettings = new JsonSerializerSettings() 
-            { 
-                NullValueHandling = NullValueHandling.Ignore, 
-                Formatting = Formatting.Indented, 
-                DefaultValueHandling = DefaultValueHandling.Include,
-                MissingMemberHandling = MissingMemberHandling.Ignore
-            };
+            JsonSerializerSettings = new DefaultJsonSerializerSettings();
         }
 
         protected virtual void LoadProxy(ProxyConfiguration proxyConfiguration)
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils/JsonHandling/DefaultJsonSerializerSettings.cs b/sdks/dotnet/basyx-core/BaSyx.Utils/JsonHandling/DefaultJsonSerializerSettings.cs
new file mode 100644
index 0000000..61b0127
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils/JsonHandling/DefaultJsonSerializerSettings.cs
@@ -0,0 +1,27 @@
+/*******************************************************************************
+* 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 Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
+
+namespace BaSyx.Utils.JsonHandling
+{
+    public class DefaultJsonSerializerSettings : JsonSerializerSettings
+    {
+        public DefaultJsonSerializerSettings() : base()
+        {
+            NullValueHandling = NullValueHandling.Ignore;
+            Formatting = Formatting.Indented;
+            DefaultValueHandling = DefaultValueHandling.Include;
+            MissingMemberHandling = MissingMemberHandling.Ignore;
+            Converters.Add(new StringEnumConverter());
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils/ModelHandling/TreeBuilder.cs b/sdks/dotnet/basyx-core/BaSyx.Utils/ModelHandling/TreeBuilder.cs
index 818b290..c535266 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Utils/ModelHandling/TreeBuilder.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils/ModelHandling/TreeBuilder.cs
@@ -15,193 +15,83 @@
 
 namespace BaSyx.Utils.ModelHandling
 {
-    public class ObjectTreeBuilder : TreeBuilder<object>
-    {
-        protected new List<ObjectTreeBuilder> children;
-        public ObjectTreeBuilder(string rootObjectName, object rootObjectValue) : this(rootObjectName, new List<object>() { rootObjectValue })
-        { }
-        public ObjectTreeBuilder(string rootObjectName, List<object> rootObjectValues) : base(rootObjectName, rootObjectValues)
-        {
-            this.children = new List<ObjectTreeBuilder>();
-        }
-
-        public T GetValue<T>()
-        {
-            if (value != null)
-                return (T)value.FirstOrDefault(c => c.GetType().IsSubclassOf(typeof(T)) || c.GetType() == typeof(T));
-            else
-                return default(T);
-        }
-
-        public new ObjectTreeBuilder AddValue(object value)
-        {
-            this.value.Add(value);
-            return this;
-        }
-
-        public ObjectTreeBuilder AddChild(ObjectTreeBuilder child)
-        {
-            child.Parent = this;
-            this.children.Add(child);
-            return this;
-        }
-
-        public new ObjectTreeBuilder AddChild(string name, params object[] value)
-        {
-            return (AddChild(name, value.ToList()));
-        }
-
-        public new ObjectTreeBuilder AddChild(string name, List<object> value)
-        {
-            var node = new ObjectTreeBuilder(name, value) { Parent = this };
-            children.Add(node);
-            return node;
-        }
-
-        public new ObjectTreeBuilder this[int i]
-        {
-            get { return children[i]; }
-        }
-       
-        public new ObjectTreeBuilder this[string name]
-        {
-            get { return children.FirstOrDefault(s => s.Name == name); }
-        }
-
-        public new ReadOnlyCollection<ObjectTreeBuilder> Children => children.AsReadOnly();
-
-        public new bool HasChild(string childName)
-        {
-            if (children == null || children.Count == 0)
-                return false;
-            else
-            {
-                var child = children.Find(c => c.Name == childName);
-                if (child == null)
-                    return false;
-                else
-                    return true;
-            }
-        }
-
-        public new bool HasChildPath(string childPath)
-        {
-            if (string.IsNullOrEmpty(childPath))
-                return false;
-
-            if (children == null || children.Count == 0)
-                return false;
-            else
-            {
-                if (childPath.Contains("/"))
-                {
-                    string[] splittedPath = childPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
-                    if (!HasChild(splittedPath[0]))
-                        return false;
-                    else
-                    {
-                        var child = this[splittedPath[0]];
-                        return (child.HasChildPath(string.Join("/", splittedPath.Skip(1))));
-                    }
-                }
-                else
-                    return HasChild(childPath);
-            }
-        }
-
-        public new ObjectTreeBuilder GetChild(string childPath)
-        {
-            if (string.IsNullOrEmpty(childPath))
-                return null;
-
-            if (children == null || children.Count == 0)
-                return null;
-            else
-            {
-                ObjectTreeBuilder superChild = null;
-                if (childPath.Contains("/"))
-                {
-                    string[] splittedPath = childPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
-                    if (!HasChild(splittedPath[0]))
-                        return null;
-                    else
-                    {
-                        var child = this[splittedPath[0]];
-                        superChild = child.GetChild(string.Join("/", splittedPath.Skip(1)));
-                    }
-                }
-                else
-                    superChild = this[childPath];
-
-                return superChild;
-            }
-        }
-
-        public new bool HasChildren()
-        {
-            if (children == null)
-                return false;
-            else
-            {
-                if (children.Count == 0)
-                    return false;
-                else
-                    return true;
-            }
-        }
-
-       
-
-        public new void Traverse(Action<List<object>> action)
-        {
-            action(Value);
-            foreach (var child in children)
-                child.Traverse(action);
-        }
-    }
     public class TreeBuilder<T>
     {
-        protected List<T> value;
-        protected List<TreeBuilder<T>> children;
+        protected T _value;
+        protected List<object> _additionalValues;
+        protected List<TreeBuilder<T>> _children;
+        protected string _name;
+        protected string _path;
+
+        public const string PATH_SEPERATOR = "/";
+
         public TreeBuilder<T> Parent { get; protected set; }
-        public List<T> Value { get { return value; } }
-        public string Name { get; protected set; }
+        public List<object> AdditionalValues { get { return _additionalValues; } }
+        public T Value { get { return _value; } }
+        public string Name { get { return _name; } }
+        public string Path { get { return _path; } }
 
-        public TreeBuilder(string name, T data) : this (name, new List<T>() { data })
-        { }
-
-        public TreeBuilder(string name, List<T> data)
+        public TreeBuilder(string name, T value)
         {
-            this.Name = name;
-            this.value = data;
-            this.children = new List<TreeBuilder<T>>();
+            this._name = name;
+            this._value = value;
+            this._children = new List<TreeBuilder<T>>();
+            this._additionalValues = new List<object>();
+
+            if (this.Parent != null)
+                _path += PATH_SEPERATOR + this._name;
+            else
+                _path = this._name;
         }
 
         public ReadOnlyCollection<TreeBuilder<T>> Children
         {
-            get { return children.AsReadOnly(); }
+            get { return _children.AsReadOnly(); }
         }
 
-        public TreeBuilder<T> AddValue(T value)
+        public TreeBuilder<T> ReplaceValue(T value)
         {
-            this.value.Add(value);
+            this._value = value;
+            return this;
+        }
+
+        public TreeBuilder<T> AddAdditionalValue(object value)
+        {
+            this._additionalValues.Add(value);
             return this;
         } 
 
+        public bool TryGetAdditionalValue<U>(out U obj)
+        {
+            obj = GetAdditionalValue<U>();
+            if (obj != null)
+                return true;
+            else
+                return false;
+        }
+
+        public U GetAdditionalValue<U>()
+        {
+            object obj =_additionalValues.Find(o => o is U);
+            if(obj != null)
+                return (U)obj;
+            return default;
+        }
+
         public TreeBuilder<T> this[int i]
         {
-            get { return children[i]; }
+            get { return _children[i]; }
         }
 
         public TreeBuilder<T> this[string name]
         {
-            get { return children.FirstOrDefault(s => s.Name == name); }
+            get { return _children.FirstOrDefault(s => s.Name == name); }
         }
 
-        public void Traverse(Action<List<T>> action)
+        public void Traverse(Action<T> action)
         {
-            action(Value);
-            foreach (var child in children)
+            action(_value);
+            foreach (var child in _children)
                 child.Traverse(action);
         }
 
@@ -209,27 +99,44 @@
         public TreeBuilder<T> AddChild(TreeBuilder<T> child)
         {
             child.Parent = this;
-            this.children.Add(child);
+            this._children.Add(child);
             return this;
         }
 
-        public TreeBuilder<T> AddChild(string name, params T[] value)
+        public TreeBuilder<T> AddChild(string name, T value)
         {
-            return (AddChild(name, value.ToList()));
+            TreeBuilder<T> node = new TreeBuilder<T>(name, value) { Parent = this };
+            _children.Add(node);
+            return node;
         }
 
-        public TreeBuilder<T> AddChild(string name, List<T> value)
+        public string GetPath()
         {
-            var node = new TreeBuilder<T>(name, value) { Parent = this };
-            children.Add(node);
-            return node;
+            List<string> path = GetInternalPath();
+            if(path != null)
+            {
+                path.Reverse();
+                return string.Join("/", path);
+            }
+            return null;
+        }
+
+        private List<string> GetInternalPath()
+        {
+            List<string> path = new List<string>() { this.Name };
+            if (Parent != null)
+            {
+                List<string> parentPath = Parent.GetInternalPath();
+                path.AddRange(parentPath);
+            }
+            return path;
         }
         public bool HasChildPath(string childPath)
         {
             if (string.IsNullOrEmpty(childPath))
                 return false;
 
-            if (children == null || children.Count == 0)
+            if (_children == null || _children.Count == 0)
                 return false;
             else
             {
@@ -250,11 +157,11 @@
         }
         public bool HasChildren()
         {
-            if (children == null)
+            if (_children == null)
                 return false;
             else
             {
-                if (children.Count == 0)
+                if (_children.Count == 0)
                     return false;
                 else
                     return true;
@@ -262,11 +169,11 @@
         }
         public bool HasChild(string childName)
         {
-            if (children == null || children.Count == 0)
+            if (_children == null || _children.Count == 0)
                 return false;
             else
             {
-                var child = children.Find(c => c.Name == childName);
+                var child = _children.Find(c => c.Name == childName);
                 if (child == null)
                     return false;
                 else
@@ -279,16 +186,16 @@
             if (string.IsNullOrEmpty(childPath))
                 return null;
 
-            if (children == null || children.Count == 0)
+            if (_children == null || _children.Count == 0)
                 return null;
             else
             {
-                TreeBuilder<T> superChild = null;
+                TreeBuilder<T> superChild;
                 if (childPath.Contains("/"))
                 {
                     string[] splittedPath = childPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                     if (!HasChild(splittedPath[0]))
-                        return null;
+                        superChild = null;
                     else
                     {
                         var child = this[splittedPath[0]];
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils/ResultHandling/MessageTypes/MethodNotAllowedMessage.cs b/sdks/dotnet/basyx-core/BaSyx.Utils/ResultHandling/MessageTypes/MethodNotAllowedMessage.cs
new file mode 100644
index 0000000..349b558
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils/ResultHandling/MessageTypes/MethodNotAllowedMessage.cs
@@ -0,0 +1,22 @@
+/*******************************************************************************
+* 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
+*******************************************************************************/
+
+namespace BaSyx.Utils.ResultHandling
+{
+    public class MethodNotAllowedMessage : Message
+    {
+        public MethodNotAllowedMessage() : base(MessageType.Information, "MethodNotAllowed", "405")
+        { }
+
+        public MethodNotAllowedMessage(string method, string onWhat) : base(MessageType.Information, $"{method} on {onWhat} is not allowed", "405")
+        { }
+    }
+}
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils/ResultHandling/MessageTypes/TimeoutMessage.cs