Added UI for Multi AAS Support
Fixed Import/Export of AASX Packages according to Spec 2.0
MimeTypes.cs added
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 fd474a3..de80d66 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/MultiStartup.cs
@@ -59,7 +59,8 @@
 
             services.UseStandardImplementation();
             services.ConfigureStandardDI();
-            
+
+
             //Check whether Asset Administration Shell Service Provider exists and bind it to the AssetAdministrationShell-Services-Controller
             services.AddTransient(ctx =>
             {
@@ -150,16 +151,23 @@
             });
 
             app.UseCors(
-                options => options.WithOrigins("*").AllowAnyMethod()
-            );
+                options => options.WithOrigins("*")
+                .AllowAnyHeader()
+                .AllowAnyMethod()
+                .AllowAnyOrigin()
+            );    
 
             app.Use((context, next) =>
             {
                 string[] pathElements = context.Request.Path.ToUriComponent()?.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
 
-                if (pathElements == null || pathElements.Length == 0 || pathElements[0] != "shells")
-                    return next();
 
+                if (pathElements == null || pathElements.Length == 0)
+                {
+                    string defaultRoute = ServerSettings.ServerConfig.DefaultRoute ?? "/MultiIndex";
+                    context.Request.Path = new PathString(defaultRoute);
+                    return next();
+                }
                 if (pathElements.Length >= 2)
                 {
                     aasId = pathElements[1];
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 2ab17a4..84ca895 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,5 +1,5 @@
 @page "ui"
-@model BaSyx.Component.REST.Pages.IndexModel
+@model BaSyx.AAS.Server.Http.Pages.IndexModel
 @using BaSyx.API.Components;
 @using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 @using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs
index d58f4c1..42ba81a 100644
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/Index.cshtml.cs
@@ -12,7 +12,7 @@
 using BaSyx.Utils.Settings.Types;
 using Microsoft.AspNetCore.Mvc.RazorPages;
 
-namespace BaSyx.Component.REST.Pages
+namespace BaSyx.AAS.Server.Http.Pages
 {
     public class IndexModel : PageModel
     {
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
new file mode 100644
index 0000000..7a067af
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml
@@ -0,0 +1,598 @@
+@page
+@model BaSyx.AAS.Server.Http.Pages.MultiIndexModel
+@using BaSyx.API.Components;
+@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;
+@using BaSyx.Models.Extensions;
+@using BaSyx.Models.Core.AssetAdministrationShell.Semantics;
+@using Microsoft.AspNetCore.Html;
+
+@{
+    ViewData["Title"] = "MultiIndex";
+    IAssetAdministrationShellAggregatorServiceProvider sp = Model.ServiceProvider;
+
+    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>
+                <div class="col-sm-10">@identifier.Id</div>
+            </div>
+        </div>
+    }
+}</text>;
+
+Func<string, IHtmlContent> ShowIdShort = @<text>@{
+var idShort = item;
+@if (!string.IsNullOrEmpty(idShort))
+{
+
+    <div class="panel-body">
+        <div class="row">
+            <div class="col-sm-2"><b>IdShort</b></div>
+            <div class="col-sm-10">@idShort</div>
+        </div>
+    </div>
+}
+}</text>;
+
+Func<IReference, IHtmlContent> ShowSemanticId = @<text>@{
+var reference = item;
+@if (reference?.First?.Value != null)
+{
+
+    <div class="panel-body">
+        <div class="row">
+            <div class="col-sm-2"><b>SemanticId</b></div>
+            @if (reference.First.IdType == KeyType.IRDI)
+            {
+                {
+                    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
+            {
+                <div class="col-sm-10">@reference.First.Value</div>
+            }
+        </div>
+    </div>
+}
+}</text>;
+
+
+Func<LangStringSet, IHtmlContent> ShowDescription = @<text>@{
+var langStringCollection = item;
+@if (langStringCollection?.Count > 0)
+{
+    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>
+    </div>
+}
+}</text>;
+
+Func<IValue, IHtmlContent> ShowValue = @<text>@{
+var value = item;
+if (value.ValueType == null)
+{
+    var serialized = Json.Serialize(value.Value).ToString();
+    @serialized
+}
+else
+{
+    @value.Value?.ToString()
+}
+}</text>;
+
+Func<string, IHtmlContent> ShowSubmodelElementHeader = @<text>@{
+var idShort = item;
+if (string.IsNullOrEmpty(idShort))
+{
+    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
+{
+    <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)" />
+                </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>
+    </div>
+}
+}</text>)(null);
+
+Func<ISubmodelElement, IHtmlContent> ShowModelElementSpecificAttributes = @<text>@{
+var submodelElement = item;
+
+if (!Enum.TryParse<KeyElements>(submodelElement.ModelType.Name, out KeyElements keyElements))
+{
+    return;
+}
+
+switch (keyElements)
+{
+    case KeyElements.GlobalReference:
+        break;
+    case KeyElements.FragmentReference:
+        break;
+    case KeyElements.AccessPermissionRule:
+        break;
+    case KeyElements.AnnotatedRelationshipElement:
+        break;
+    case KeyElements.BasicEvent:
+        break;
+    case KeyElements.Blob:
+        break;
+    case KeyElements.Capability:
+        break;
+    case KeyElements.ConceptDictionary:
+        break;
+    case KeyElements.DataElement:
+        break;
+    case KeyElements.File:
+        {
+            IFile file = submodelElement?.ToModelElement<IFile>();
+            if (file == null)
+            {
+                return;
+            }
+
+            string path = GetPath(file);
+
+            <div class="panel-body">
+                <div class="row">
+                    <div class="col-sm-2"><b>MimeType</b></div>
+                    <div class="col-sm-10">@file.MimeType</div>
+                </div>
+            </div>
+            <div class="panel-body">
+                <div class="row">
+                    <div class="col-sm-2"><b>Path</b></div>
+                    <div class="col-sm-10">@path</div>
+                </div>
+            </div>
+            string contentRoot = System.IO.Path.Combine(AppContext.BaseDirectory, Model.Settings.ServerConfig.Hosting.ContentPath);
+            var contentFileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(contentRoot);
+            @if (contentFileProvider.GetFileInfo(path).Exists)
+            {
+                <embed src="@path#navpanes=0&scrollbar=0" width="100%" />
+            }
+        }
+        return;
+    case KeyElements.Entity:
+        break;
+    case KeyElements.Event:
+        {
+            IEvent eventable = submodelElement?.ToModelElement<IEvent>();
+            if (eventable == null)
+            {
+                return;
+            }
+
+            @foreach (var element in eventable.DataElements)
+            {
+                <div class="row">
+                    @{ string valueTypeName = element.ToModelElement<IProperty>()?.ValueType?.ToString() ?? "ANY"; }
+                    <div class="col-sm-10"><b>@element.IdShort (@valueTypeName)</b></div>
+                </div>
+            }
+        }
+        return;
+    case KeyElements.MultiLanguageProperty:
+        break;
+    case KeyElements.Operation:
+        break;
+    case KeyElements.Property:
+        IProperty property = submodelElement?.ToModelElement<IProperty>();
+        if (property == null)
+        {
+            return;
+        }
+
+        string dataTypeName = property.ValueType?.ToString()?.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>
+        return;
+    case KeyElements.Range:
+        break;
+    case KeyElements.ReferenceElement:
+        break;
+    case KeyElements.RelationshipElement:
+        break;
+    case KeyElements.SubmodelElement:
+        break;
+    case KeyElements.SubmodelElementCollection:
+        break;
+    case KeyElements.View:
+        break;
+    case KeyElements.AssetAdministrationShell:
+        break;
+    case KeyElements.ConceptDescription:
+        break;
+    default:
+        break;
+}
+
+}</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)
+{
+    @foreach (var dataSpecification in embeddedDataSpecifications)
+    {
+        <div class="list-group-item" style="background:#88b8d9; color:white">
+            <div class="row">
+                <div class="col-sm-2"><b>Data-Specification</b></div>
+                <div class="col-sm-10">@dataSpecification.HasDataSpecification.First.Value</div>
+            </div>
+        </div>
+
+        @foreach (var property in dataSpecification.DataSpecificationContent.GetType().GetProperties())
+        {
+
+            @if (property.PropertyType.IsGenericType && (property.PropertyType.GetGenericTypeDefinition() == typeof(List<>)))
+            {
+                var values = property.GetValue(dataSpecification.DataSpecificationContent) as IEnumerable<object>;
+                if (values?.Count() > 0)
+                {
+                    foreach (var element in values)
+                    {
+                        foreach (var subProperty in property.PropertyType.GenericTypeArguments[0].GetProperties())
+                        {
+                            var value = subProperty.GetValue(element)?.ToString();
+                            if (value != null)
+                            {
+                                <div class="list-group-item" style="background:#88b8d9; color:white">
+                                    <div class="row">
+                                        <div class="col-sm-2"><b>@subProperty.Name</b></div>
+                                        <div class="col-sm-10">@value</div>
+                                    </div>
+                                </div>
+                            }
+                        }
+                    }
+                }
+            }
+            else
+            {
+                var value = property.GetValue(dataSpecification.DataSpecificationContent);
+                if (value != null)
+                {
+                    if (value is IReference reference)
+                    {
+                        value = reference.First.Value;
+                    }
+                    else
+                    {
+                        value = value.ToString();
+                    }
+
+                    <div class="list-group-item" style="background:#88b8d9; color:white">
+                        <div class="row">
+                            <div class="col-sm-2"><b>@property.Name</b></div>
+                            <div class="col-sm-10">@value</div>
+                        </div>
+                    </div>
+                }
+            }
+
+        }
+    }
+}
+}</text>;
+
+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;
+        
+    <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)
+            {
+                @foreach (var value in collection.Value)
+                {
+                    <div class="panel-body">
+                        @ShowSubmodelElement(new List<object>() { submodel, value })
+                    </div>
+                }
+            }
+        </div>
+    </div>
+}
+}</text>;
+}
+
+@functions
+{
+    public string GetPath(IFile file)
+    {
+        string content = file.Value;
+        if (string.IsNullOrEmpty(content))
+            return string.Empty;
+
+        content = content.Replace('\\', '/');
+        return content;
+    }
+
+    public string GetValueOrModelType(ISubmodelElement submodelElement)
+    {
+        if (submodelElement is IProperty property)
+        {
+            return property.ValueType?.ToString();
+        }
+        else
+        {
+            return submodelElement.ModelType.Name;
+        }
+    }
+}
+
+<!doctype html>
+<html>
+<head>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="~/scripts/bootstrap.min.css">
+    <title>BaSys Multi Asset Administration Shell UI</title>
+    <script src="~/scripts/jquery-3.3.1.min.js"></script>
+    <script src="~/scripts/popper.min.js"></script>
+    <script src="~/scripts/bootstrap.min.js"></script>
+
+    <style>
+        .bd-placeholder-img {
+            font-size: 1.125rem;
+            text-anchor: middle;
+        }
+
+        @@media (min-width: 768px) {
+            .bd-placeholder-img-lg {
+                font-size: 3.5rem;
+            }
+        }
+    </style>
+
+</head>
+<body>
+
+    <nav class="navbar navbar-inverse">
+        <div class="container-fluid">
+            <div class="navbar-header">
+                <img src="~/images/basyxlogo.png" width="160" height="64" />
+            </div>
+            <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>
+    </nav>
+
+    <main role="main" class="container">
+
+        <div class="starter-template">
+            <h1>Multi Asset Administration Shell UI</h1>
+            <p class="lead">Generic UI to display many Asset Administration Shells</p>
+        </div>
+    </main>
+
+
+    @if (sp.AssetAdministrationShells?.Count() > 0)
+    {
+        foreach (var aas in sp.AssetAdministrationShells)
+        {
+            <div class="container">
+                <div class="panel panel-default">
+                    <div class="panel-heading" style="background:#7ca1ce">
+                        <h4>
+                            <a style="color:white" data-toggle="collapse" href="#@aas.IdShort">@aas.IdShort</a>
+                        </h4>
+                    </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>
+                            @{
+                                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>
+                              
+                                }
+                            }
+                            @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; }
+
+                                                                            @ShowSubmodelElement(new List<object>() { submodel, submodelElement });
+
+                                                                        }
+                                                                    </div>
+                                                                </div>
+                                                            </div>
+                                                        }
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </div>
+                                }
+                            }
+                        </div>
+                    </div>
+                </div>
+            </div>
+        }
+    }
+
+</body>
+</html>
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml.cs b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml.cs
new file mode 100644
index 0000000..9b00960
--- /dev/null
+++ b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Pages/MultiIndex.cshtml.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.API.Components;
+using BaSyx.Utils.Settings.Types;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace BaSyx.AAS.Server.Http.Pages
+{
+    public class MultiIndexModel : PageModel
+    {
+        public IAssetAdministrationShellAggregatorServiceProvider ServiceProvider { get; }
+        public ServerSettings Settings { get; }
+
+        public MultiIndexModel(IAssetAdministrationShellAggregatorServiceProvider provider, ServerSettings serverSettings)
+        {
+            ServiceProvider = provider;
+            Settings = serverSettings;
+        }
+
+        public void OnGet()
+        {
+
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Properties/launchSettings.json b/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Properties/launchSettings.json
deleted file mode 100644
index 34865e6..0000000
--- a/sdks/dotnet/basyx-components/BaSyx.AAS.Server.Http/Properties/launchSettings.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "iisSettings": {
-    "windowsAuthentication": false,
-    "anonymousAuthentication": true,
-    "iisExpress": {
-      "applicationUrl": "http://localhost:51863/",
-      "sslPort": 44363
-    }
-  },
-  "profiles": {
-    "IIS Express": {
-      "commandName": "IISExpress",
-      "launchBrowser": true,
-      "environmentVariables": {
-        "ASPNETCORE_ENVIRONMENT": "Development"
-      }
-    },
-    "BaSyx.AAS.Server.Http": {
-      "commandName": "Project",
-      "launchBrowser": true,
-      "environmentVariables": {
-        "ASPNETCORE_ENVIRONMENT": "Development"
-      },
-      "applicationUrl": "https://localhost:5001;http://localhost:5000"
-    }
-  }
-}
\ No newline at end of file
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
index 56b2521..341d285 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/AASX.cs
@@ -17,6 +17,9 @@
 using BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes;
 using NLog;
 using Microsoft.AspNetCore.StaticFiles;
+using BaSyx.Utils.FileHandling;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
 
 namespace BaSyx.Models.Export
 {
@@ -181,6 +184,33 @@
             CopyFileToPackagePart(specPart, aasEnvPath);
         }
 
+        public void AddEnvironment(Identifier aasId, AssetAdministrationShellEnvironment_V2_0 environment, ExportType exportType)
+        {
+            if (aasId == null)
+                throw new ArgumentNullException(nameof(aasId));
+            if (environment == null)
+                throw new ArgumentNullException(nameof(environment));
+
+            string aasIdName = aasId.Id;
+            foreach (char invalidChar in Path.GetInvalidFileNameChars())
+                aasIdName = aasIdName.Replace(invalidChar, '_');
+
+            string aasFilePath = "/aasx/" + aasIdName + "/" + aasIdName + ".aas." + exportType.ToString().ToLower();
+
+            Uri partUri = PackUriHelper.CreatePartUri(new Uri(aasFilePath, UriKind.RelativeOrAbsolute));
+            ClearRelationshipAndPartFromPackagePart(originPart, SPEC_RELATIONSHIP_TYPE, partUri);
+
+            specPart = aasxPackage.CreatePart(partUri, GetContentType(aasFilePath), CompressionOption.Maximum);
+            originPart.CreateRelationship(specPart.Uri, TargetMode.Internal, SPEC_RELATIONSHIP_TYPE);
+
+            string environmentTemp = Path.GetRandomFileName() + "." + exportType.ToString().ToLower();
+            environment.WriteEnvironment_V2_0(exportType, environmentTemp);
+
+            CopyFileToPackagePart(specPart, environmentTemp);
+
+            File.Delete(environmentTemp);
+        }
+
         public AssetAdministrationShellEnvironment_V1_0 GetEnvironment_V1_0()
         {
             if(specPart?.Uri != null)
@@ -273,6 +303,37 @@
             }
         }
 
+        public void AddFileToAASX(string targetUri, string filePath, CompressionOption compressionOption = CompressionOption.Maximum)
+        {
+            string relativeDestination;
+            if (!targetUri.StartsWith(AASX_FOLDER))
+                relativeDestination = AASX_FOLDER + targetUri;
+            else
+                relativeDestination = targetUri;
+
+            Uri uri = PackUriHelper.CreatePartUri(new Uri(relativeDestination, UriKind.Relative));
+
+            ClearRelationshipAndPartFromPackagePart(specPart, SUPPLEMENTAL_RELATIONSHIP_TYPE, uri);
+
+            string contentType = GetContentType(filePath);
+
+            PackagePart packagePart = aasxPackage.CreatePart(uri, contentType, compressionOption);
+            specPart.CreateRelationship(packagePart.Uri, TargetMode.Internal, SUPPLEMENTAL_RELATIONSHIP_TYPE);
+
+            CopyFileToPackagePart(packagePart, filePath);
+        }
+
+        private void CopyStreamToPackagePart(PackagePart packagePart, Stream stream)
+        {
+            using (stream)
+            {
+                using (Stream destination = packagePart.GetStream())
+                {
+                    stream.CopyTo(destination);
+                }
+            }
+        }
+
         private void CopyFileToPackagePart(PackagePart packagePart, string filePath)
         {
             using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
@@ -287,7 +348,8 @@
         private static string GetContentType(string filePath)
         {
             if (!new FileExtensionContentTypeProvider().TryGetContentType(filePath, out string contentType))
-                contentType = null;
+                if (!MimeTypes.TryGetContentType(filePath, out contentType))
+                    return null;
 
             return contentType;
         }
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 8da69d1..b32506e 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
@@ -157,6 +157,7 @@
                     ExtractAndClearConceptDescriptions(submodel.SubmodelElements);
                     ExtractSupplementalFiles(submodel.SubmodelElements);
                     ResetConstraints(submodel.SubmodelElements);
+                    DeleteEvents(submodel.SubmodelElements);
                 }
             }
         }
@@ -204,8 +205,9 @@
                     IsCaseOf = conceptDescription.IsCaseOf?.ToList()?.ConvertAll(c => c.ToEnvironmentReference_V1_0()),
                     EmbeddedDataSpecification = embeddedDataSpecification
                 };
-                
-                EnvironmentConceptDescriptions.Add(environmentConceptDescription);
+
+                if (EnvironmentConceptDescriptions.Find(m => m.Identification.Id == conceptDescription.Identification.Id) == null)
+                    EnvironmentConceptDescriptions.Add(environmentConceptDescription);
             }
             foreach (var assetAdministrationShell in AssetAdministrationShells)
             {
@@ -276,7 +278,7 @@
                     (smElement as SubmodelElement).ConceptDescription = null;
                     (smElement as SubmodelElement).EmbeddedDataSpecifications = null;
                 }
-                else if (smElement.ModelType == ModelType.SubmodelElementCollection)
+                if (smElement.ModelType == ModelType.SubmodelElementCollection)
                     ExtractAndClearConceptDescriptions((smElement as SubmodelElementCollection).Value);
             }
         }
@@ -301,6 +303,13 @@
             }
         }
 
+        private void DeleteEvents(IElementContainer<ISubmodelElement> submodelElements)
+        {
+            var eventsToDelete = submodelElements.Where(s => s.ModelType == ModelType.Event || s.ModelType == ModelType.BasicEvent).ToList();
+            foreach (var eventable in eventsToDelete)
+                submodelElements.Remove(eventable);
+        }
+
         public void WriteEnvironment_V1_0(ExportType exportType, string filePath) => WriteEnvironment_V1_0(this, exportType, filePath);
 
         public static void WriteEnvironment_V1_0(AssetAdministrationShellEnvironment_V1_0 environment, ExportType exportType, string filePath)
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 0847b0e..a14dbc0 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
@@ -159,6 +159,7 @@
                     ExtractAndClearConceptDescriptions(submodel.SubmodelElements);
                     ExtractSupplementalFiles(submodel.SubmodelElements);
                     ResetConstraints(submodel.SubmodelElements);
+                    DeleteEvents(submodel.SubmodelElements);
                 }
             }
         }
@@ -208,7 +209,8 @@
                     EmbeddedDataSpecification = embeddedDataSpecification
                 };
 
-                EnvironmentConceptDescriptions.Add(environmentConceptDescription);
+                if(EnvironmentConceptDescriptions.Find(m => m.Identification.Id == conceptDescription.Identification.Id) == null)
+                    EnvironmentConceptDescriptions.Add(environmentConceptDescription);
             }
             foreach (var assetAdministrationShell in AssetAdministrationShells)
             {
@@ -255,6 +257,14 @@
         }
 
 
+        private void DeleteEvents(IElementContainer<ISubmodelElement> submodelElements)
+        {
+            var eventsToDelete = submodelElements.Where(s => s.ModelType == ModelType.Event || s.ModelType == ModelType.BasicEvent).ToList();
+            foreach (var eventable in eventsToDelete)
+                submodelElements.Remove(eventable);
+        }
+
+
         private void ExtractSupplementalFiles(IEnumerable<ISubmodelElement> submodelElements)
         {
             foreach (var smElement in submodelElements)
@@ -288,7 +298,7 @@
                     (smElement as SubmodelElement).ConceptDescription = null;
                     (smElement as SubmodelElement).EmbeddedDataSpecifications = null;
                 }
-                else if (smElement.ModelType == ModelType.SubmodelElementCollection)
+                if (smElement.ModelType == ModelType.SubmodelElementCollection)
                     ExtractAndClearConceptDescriptions((smElement as Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.SubmodelElementCollection).Value);
             }
         }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs
index 9970961..970d008 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/ConceptDescriptionConverter_V2_0.cs
@@ -50,9 +50,12 @@
             if (dataSpecificationContent == null)
                 return null;
 
+            if(!Enum.TryParse<EnvironmentDataTypeIEC61360>(dataSpecificationContent.DataType.ToString(), out EnvironmentDataTypeIEC61360 dataType))
+                dataType = EnvironmentDataTypeIEC61360.UNDEFINED;
+
             EnvironmentDataSpecificationIEC61360_V2_0 environmentDataSpecification = new EnvironmentDataSpecificationIEC61360_V2_0()
             {
-                DataType = (EnvironmentDataTypeIEC61360)Enum.Parse(typeof(EnvironmentDataTypeIEC61360), dataSpecificationContent.DataType.ToString()),
+                DataType = dataType,
                 Definition = dataSpecificationContent.Definition,
                 PreferredName = dataSpecificationContent.PreferredName,
                 ShortName = dataSpecificationContent.ShortName,
@@ -63,12 +66,12 @@
                 Value = dataSpecificationContent.Value,
                 ValueFormat = dataSpecificationContent.ValueFormat,
                 ValueId = dataSpecificationContent.ValueId?.ToEnvironmentReference_V2_0(),
-                ValueList = dataSpecificationContent.ValueList.ConvertAll(c => new EnvironmentDataSpecifications.ValueReferencePair()
+                ValueList = dataSpecificationContent.ValueList?.ConvertAll(c => new EnvironmentDataSpecifications.ValueReferencePair()
                 {
                     Value = c.Value,
-                    ValueId = c.ValueId.ToEnvironmentReference_V2_0()
+                    ValueId = c.ValueId?.ToEnvironmentReference_V2_0()
                 }),
-                LevelTypes = dataSpecificationContent.LevelTypes.ConvertAll(c => (EnvironmentLevelType)Enum.Parse(typeof(EnvironmentLevelType), c.ToString()))
+                LevelTypes = dataSpecificationContent.LevelTypes?.ConvertAll(c => (EnvironmentLevelType)Enum.Parse(typeof(EnvironmentLevelType), c.ToString()))
             };
 
             return environmentDataSpecification;
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs
index a062eda..59c5f61 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/Converter/TypeConverterExtensions_V2_0.cs
@@ -58,9 +58,15 @@
             if (environmentKey == null)
                 return null;
 
+            if (!Enum.TryParse<KeyElements>(environmentKey.Type.ToString(), out KeyElements type))
+                type = KeyElements.Undefined;
+            
+            if (!Enum.TryParse<KeyType>(environmentKey.IdType.ToString(), out KeyType idType))
+                idType = KeyType.Undefined;
+
             Key key = new Key(
-                (KeyElements)Enum.Parse(typeof(KeyElements), environmentKey.Type.ToString()),
-                (KeyType)Enum.Parse(typeof(KeyType), environmentKey.IdType.ToString()),
+                type,
+                idType,
                 environmentKey.Value,
                 environmentKey.Local);
 
@@ -73,8 +79,19 @@
                 return null;
 
             EnvironmentKey_V2_0 environmentKey = new EnvironmentKey_V2_0();
-            environmentKey.IdType = (KeyType_V2_0)Enum.Parse(typeof(KeyType_V2_0), key.IdType.ToString());
-            environmentKey.Type = (KeyElements_V2_0)Enum.Parse(typeof(KeyElements_V2_0), key.Type.ToString());
+            if(!Enum.TryParse<KeyType_V2_0>(key.IdType.ToString(), out KeyType_V2_0 keyType))
+            {
+                if (key.IdType == KeyType.URI)
+                    keyType = KeyType_V2_0.IRI;
+            }
+            if (!Enum.TryParse<KeyElements_V2_0>(key.Type.ToString(), out KeyElements_V2_0 type))
+            {
+                type = KeyElements_V2_0.Undefined;
+            }
+
+
+            environmentKey.IdType = keyType;
+            environmentKey.Type = type;
             environmentKey.Local = key.Local;
             environmentKey.Value = key.Value;
 
@@ -99,13 +116,19 @@
             else
                 return null;
 
+            if(!Enum.TryParse<KeyType_V2_0>(identifiable.Identification.IdType.ToString(), out KeyType_V2_0 idType))
+            {
+                if (identifiable.Identification.IdType == KeyType.URI)
+                    idType = KeyType_V2_0.IRI;
+            }
+
             EnvironmentReference_V2_0 reference = new EnvironmentReference_V2_0()
             {
                 Keys = new List<EnvironmentKey_V2_0>()
                 {
                     new EnvironmentKey_V2_0()
                     {
-                        IdType = (KeyType_V2_0)Enum.Parse(typeof(KeyType_V2_0), identifiable.Identification.IdType.ToString()),
+                        IdType = idType,
                         Local = true,
                         Value = identifiable.Identification.Id,
                         Type = type
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 4b17411..dad2f5c 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
@@ -101,6 +101,8 @@
 
     public enum EnvironmentDataTypeIEC61360
     {
+        [EnumMember(Value = "UNDEFINED")]
+        UNDEFINED,
         [EnumMember(Value = "DATE")]
         DATE,
         [EnumMember(Value = "STRING")]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs
index 22e6649..688fc6c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentIdentifiable_V2_0.cs
@@ -9,6 +9,7 @@
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
 using BaSyx.Models.Core.AssetAdministrationShell.Identification;
+using BaSyx.Models.Core.AssetAdministrationShell.References;
 using Newtonsoft.Json;
 using System.Xml.Serialization;
 
@@ -16,10 +17,20 @@
 {
     public class EnvironmentIdentifiable_V2_0 : EnvironmentReferable_V2_0
     {
+        private Identifier _identifier;
         [JsonProperty("identification", Order = -2)]
         [XmlElement("identification")]
-        public Identifier Identification { get; set; }
-
+        public Identifier Identification
+        {
+            get { return _identifier; }
+            set
+            {
+                if (value.IdType == KeyType.URI)
+                    _identifier = new Identifier(value.Id, KeyType.IRI);
+                else
+                    _identifier = new Identifier(value.Id, value.IdType);
+            }
+        }
         [JsonProperty("administration", Order = -1)]
         [XmlElement("administration")]
         public AdministrativeInformation Administration { get; set; }
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs
index 5081aa0..502f1cc 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentKey_V2_0.cs
@@ -26,6 +26,8 @@
 
     public enum KeyType_V2_0
     {
+        [EnumMember(Value = "Undefined")]
+        Undefined,
         [EnumMember(Value = "Custom")]
         Custom,
         [EnumMember(Value = "IRI")]
@@ -40,6 +42,8 @@
 
     public enum KeyElements_V2_0
     {
+        Undefined,
+
         GlobalReference,
         FragmentReference,
 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs
index 500b0b5..ed3f57e 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models.Export/aas-spec-v2.0/EnvironmentSubmodelElements/Operation_V2_0.cs
@@ -23,7 +23,7 @@
         public List<OperationVariable_V2_0> InputVariables { get; set; }
 
         [JsonProperty("outputVariables")]
-        [XmlElement(ElementName = "inputVariable"), JsonConverter(typeof(JsonOperationVariableConverter_V2_0))]
+        [XmlElement(ElementName = "outputVariable"), JsonConverter(typeof(JsonOperationVariableConverter_V2_0))]
         public List<OperationVariable_V2_0> OutputVariables { get; set; }
 
         [JsonProperty("inoutputVariables")]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs
index 1c5de2c..64108d9 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyElements.cs
@@ -15,6 +15,8 @@
     [DataContract]
     public enum KeyElements : int
     {
+        Undefined, 
+
         GlobalReference,
         FragmentReference,
 
diff --git a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs
index 95e58ea..c6c0f4c 100644
--- a/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs
+++ b/sdks/dotnet/basyx-core/BaSyx.Models/Core/AssetAdministrationShell/References/KeyType.cs
@@ -15,6 +15,8 @@
     [DataContract]
     public enum KeyType
     {
+        [EnumMember(Value = "Undefined")]
+        Undefined,
         [EnumMember(Value = "Custom")]
         Custom,
         [EnumMember(Value = "IRI")]
diff --git a/sdks/dotnet/basyx-core/BaSyx.Utils/FileHandling/MimeTypes.cs b/sdks/dotnet/basyx-core/BaSyx.Utils/FileHandling/MimeTypes.cs
new file mode 100644
index 0000000..f018584
--- /dev/null
+++ b/sdks/dotnet/basyx-core/BaSyx.Utils/FileHandling/MimeTypes.cs
@@ -0,0 +1,26 @@
+using System.Collections.Generic;
+using System.IO;
+
+namespace BaSyx.Utils.FileHandling
+{
+    public static class MimeTypes
+    {
+        public static Dictionary<string, string> Mappings = new Dictionary<string, string>()
+        {
+            { ".stp", "application/step" },
+            { ".3dxml", "application/3dxml" }
+        };
+
+        public static bool TryGetContentType(string filePath, out string contentType)
+        {
+            string extension = Path.GetExtension(filePath);
+            if(Mappings.ContainsKey(extension))
+            {
+                contentType = Mappings[extension];
+                return true;
+            }
+            contentType = null;
+            return false;
+        }
+    }
+}
diff --git a/sdks/dotnet/basyx-examples/BaSyx.Examples.sln b/sdks/dotnet/basyx-examples/BaSyx.Examples.sln
index f9fbd20..d149b1d 100644
--- a/sdks/dotnet/basyx-examples/BaSyx.Examples.sln
+++ b/sdks/dotnet/basyx-examples/BaSyx.Examples.sln
@@ -7,7 +7,9 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAssetAdministrationShell", "SimpleAssetAdministrationShell\SimpleAssetAdministrationShell.csproj", "{070E0AC2-9D6A-4AEB-992D-781C57E9AE22}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultiAssetAdministrationShell", "MultiAssetAdministrationShell\MultiAssetAdministrationShell.csproj", "{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MultiAssetAdministrationShell", "MultiAssetAdministrationShell\MultiAssetAdministrationShell.csproj", "{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BaSyx.AAS.Server.Http", "..\basyx-components\BaSyx.AAS.Server.Http\BaSyx.AAS.Server.Http.csproj", "{83D8FB4E-4F01-4C36-86A4-A932B505708F}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,6 +29,10 @@
 		{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{82FDA941-6905-48D5-91FD-2DCF7B97F1C5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{83D8FB4E-4F01-4C36-86A4-A932B505708F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{83D8FB4E-4F01-4C36-86A4-A932B505708F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{83D8FB4E-4F01-4C36-86A4-A932B505708F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{83D8FB4E-4F01-4C36-86A4-A932B505708F}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj
index 8b5e80e..c4234f8 100644
--- a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj
+++ b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/MultiAssetAdministrationShell.csproj
@@ -15,7 +15,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="BaSyx.AAS.Server.Http" Version="1.0.0" />
+    <ProjectReference Include="..\..\basyx-components\BaSyx.AAS.Server.Http\BaSyx.AAS.Server.Http.csproj" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs
index b115813..957df78 100644
--- a/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs
+++ b/sdks/dotnet/basyx-examples/MultiAssetAdministrationShell/Program.cs
@@ -13,8 +13,10 @@
 using BaSyx.API.Components;
 using BaSyx.Models.Connectivity;
 using BaSyx.Models.Core.AssetAdministrationShell.Enums;
+using BaSyx.Models.Core.AssetAdministrationShell.Generics;
 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.Settings.Types;
@@ -66,7 +68,14 @@
                 aas.Submodels.Create(new Submodel()
                 {
                     Identification = new Identifier("http://basys40.de/submodels/" + Guid.NewGuid().ToString(), KeyType.IRI),
-                    IdShort = "TestSubmodel"
+                    IdShort = "TestSubmodel",
+                    SubmodelElements = new ElementContainer<ISubmodelElement>()
+                    {
+                        new Property<string>()
+                        {
+                            IdShort = "Property_" + i
+                        }
+                    }
                 });
 
                 var aasServiceProvider = aas.CreateServiceProvider(true);
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg
index a688d23..49eeacb 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg
index aa930da..a3538a3 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Client.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg
index 35cef24..aa84efb 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg
index 30eb2fa..89052bf 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.AAS.Server.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg
index 8b6697c..d268bdd 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg
index 7814eaf..2ce6b02 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg
index aaca7cf..1333ac2 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg
index 73b8d99..9077495 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.nupkg
new file mode 100644
index 0000000..17f604e
--- /dev/null
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.symbols.nupkg
new file mode 100644
index 0000000..bb725b6
--- /dev/null
+++ b/sdks/dotnet/basyx-packages/BaSyx.API.Http.Controllers.AASX.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg
index f09ec32..3d949f9 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg
index eb2d6ca..8f750a6 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg
index 785e780..9bdf508 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg
index 6eabf17..68cdcc1 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Models.Export.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg
index 5210299..c914584 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg
index d73381d..31310a5 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Client.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg
index 5eb65f1..30d236c 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg
index 3c29147..b07207c 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.ReferenceImpl.FileBased.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg
index 8774045..9b374ee 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg
index be4f99c..64019f4 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Registry.Server.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg
index 1f9b352..3bec657 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg
index 4bda363..c05b310 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Client.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg
index ace60bf..719e719 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg
index 3807ab6..dd70c5a 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.Server.Http.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg
index a28f040..ff2108d 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg
index 1b97945..ab1114c 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Submodel.ServiceProvider.Distributed.1.0.0.symbols.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg
index fdf188c..00e1d6b 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.nupkg
Binary files differ
diff --git a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg
index fdd7d2e..e5ea54e 100644
--- a/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg
+++ b/sdks/dotnet/basyx-packages/BaSyx.Utils.1.0.0.symbols.nupkg
Binary files differ