diff --git a/Common.Build.props b/Common.Build.props
index d52b3e3..ed1ff79 100644
--- a/Common.Build.props
+++ b/Common.Build.props
@@ -2,7 +2,7 @@
   
   
     10
-    netstandard2.0;net8
+    netstandard2.1;net8
     disable
     ByteBard
     https://github.com/ByteBardOrg/AsyncAPI.NET
diff --git a/src/ByteBard.AsyncAPI.Readers/AsyncApiReaderSettings.cs b/src/ByteBard.AsyncAPI.Readers/AsyncApiReaderSettings.cs
index 6474323..54baa13 100644
--- a/src/ByteBard.AsyncAPI.Readers/AsyncApiReaderSettings.cs
+++ b/src/ByteBard.AsyncAPI.Readers/AsyncApiReaderSettings.cs
@@ -71,10 +71,5 @@ public ICollection>
         /// External reference reader implementation provided by users for reading external resources.
         /// 
         public IStreamLoader ExternalReferenceLoader { get; set; } = null;
-
-        /// 
-        /// URL where relative references should be resolved from if.
-        /// 
-        public Uri BaseUrl { get; set; }
     }
 }
\ No newline at end of file
diff --git a/src/ByteBard.AsyncAPI.Readers/AsyncApiReferenceHostDocumentResolver.cs b/src/ByteBard.AsyncAPI.Readers/AsyncApiReferenceHostDocumentResolver.cs
deleted file mode 100644
index c5c69ea..0000000
--- a/src/ByteBard.AsyncAPI.Readers/AsyncApiReferenceHostDocumentResolver.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-namespace ByteBard.AsyncAPI.Readers
-{
-    using System.Collections.Generic;
-    using ByteBard.AsyncAPI.Models;
-    using ByteBard.AsyncAPI.Models.Interfaces;
-    using ByteBard.AsyncAPI.Services;
-
-    internal class AsyncApiReferenceWorkspaceResolver : AsyncApiVisitorBase
-    {
-        private AsyncApiWorkspace workspace;
-
-        public AsyncApiReferenceWorkspaceResolver(
-            AsyncApiWorkspace workspace)
-        {
-            this.workspace = workspace;
-        }
-
-        public override void Visit(IAsyncApiReferenceable referenceable)
-        {
-            if (referenceable.Reference != null)
-            {
-                referenceable.Reference.Workspace = this.workspace;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/ByteBard.AsyncAPI.Readers/ByteBard.AsyncAPI.Readers.csproj b/src/ByteBard.AsyncAPI.Readers/ByteBard.AsyncAPI.Readers.csproj
index 265ee34..7bda8da 100644
--- a/src/ByteBard.AsyncAPI.Readers/ByteBard.AsyncAPI.Readers.csproj
+++ b/src/ByteBard.AsyncAPI.Readers/ByteBard.AsyncAPI.Readers.csproj
@@ -6,16 +6,15 @@
 	  ByteBard.AsyncAPI.NET.Readers
 	  ByteBard.AsyncAPI.Readers
 	  ByteBard.AsyncAPI.Readers
-	  netstandard2.0;net8
   	
 
   
-    
+    
     
       all
       runtime; build; native; contentfiles; analyzers; buildtransitive
     
-    
+    
     
   
 
diff --git a/src/ByteBard.AsyncAPI.Readers/V2/ExtensionHelpers.cs b/src/ByteBard.AsyncAPI.Readers/ExtensionHelpers.cs
similarity index 99%
rename from src/ByteBard.AsyncAPI.Readers/V2/ExtensionHelpers.cs
rename to src/ByteBard.AsyncAPI.Readers/ExtensionHelpers.cs
index beca3de..4e8da95 100644
--- a/src/ByteBard.AsyncAPI.Readers/V2/ExtensionHelpers.cs
+++ b/src/ByteBard.AsyncAPI.Readers/ExtensionHelpers.cs
@@ -38,4 +38,4 @@ public static IAsyncApiExtension LoadExtension(string name, ParseNode node)
             return node.CreateAny();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/ByteBard.AsyncAPI.Readers/ParseNodes/ListNode.cs b/src/ByteBard.AsyncAPI.Readers/ParseNodes/ListNode.cs
index 347a4db..bd87d81 100644
--- a/src/ByteBard.AsyncAPI.Readers/ParseNodes/ListNode.cs
+++ b/src/ByteBard.AsyncAPI.Readers/ParseNodes/ListNode.cs
@@ -50,6 +50,17 @@ public override List CreateSimpleList(Func map)
             return this.nodeList.Select(n => map(new ValueNode(this.Context, n))).ToList();
         }
 
+        public override HashSet CreateSimpleSet(Func map)
+        {
+            if (this.nodeList == null)
+            {
+                throw new AsyncApiReaderException(
+                    $"Expected list while parsing {typeof(T).Name}");
+            }
+
+            return this.nodeList.Select(n => map(new ValueNode(this.Context, n))).ToHashSet();
+        }
+
         public IEnumerator GetEnumerator()
         {
             return this.nodeList.Select(n => Create(this.Context, n)).ToList().GetEnumerator();
diff --git a/src/ByteBard.AsyncAPI.Readers/ParseNodes/MapNode.cs b/src/ByteBard.AsyncAPI.Readers/ParseNodes/MapNode.cs
index 05bab3e..c042de2 100644
--- a/src/ByteBard.AsyncAPI.Readers/ParseNodes/MapNode.cs
+++ b/src/ByteBard.AsyncAPI.Readers/ParseNodes/MapNode.cs
@@ -50,6 +50,42 @@ public PropertyNode this[string key]
             }
         }
 
+        public override Dictionary CreateMap(Func keySelector, Func map)
+        {
+            var jsonMap = this.node;
+            if (jsonMap == null)
+            {
+                throw new AsyncApiReaderException($"Expected map while parsing {typeof(T).Name}", this.Context);
+            }
+
+            var nodes = jsonMap.Select(
+                n =>
+                {
+                    var originalKey = n.Key;
+                    var newKey = keySelector(originalKey);
+                    T value;
+                    try
+                    {
+                        this.Context.StartObject(originalKey);
+                        value = n.Value is JsonObject
+                          ? map(new MapNode(this.Context, n.Value), originalKey)
+                          : default(T);
+                    }
+                    finally
+                    {
+                        this.Context.EndObject();
+                    }
+
+                    return new
+                    {
+                        key = newKey,
+                        value,
+                    };
+                });
+
+            return nodes.ToDictionary(k => k.key, v => v.value);
+        }
+
         public override Dictionary CreateMap(Func map)
         {
             var jsonMap = this.node;
@@ -207,7 +243,7 @@ public override AsyncApiAny CreateAny()
             return new AsyncApiAny(this.node);
         }
 
-        public void ParseFields(ref T parentInstance, IDictionary> fixedFields, IDictionary, Action> patternFields)
+        public void ParseFields(T parentInstance, IDictionary> fixedFields, IDictionary, Action> patternFields)
         {
             foreach (var propertyNode in this)
             {
@@ -215,6 +251,15 @@ public void ParseFields(ref T parentInstance, IDictionary(T parentInstance, IDictionary, Action> patternFields)
+        {
+            foreach (var propertyNode in this)
+            {
+                propertyNode.ParseField(parentInstance, patternFields);
+            }
+        }
+
         private string ToScalarValue(JsonNode node)
         {
             var scalarNode = node is JsonValue value ? value : throw new AsyncApiException($"Expected scalar value");
diff --git a/src/ByteBard.AsyncAPI.Readers/ParseNodes/ParseNode.cs b/src/ByteBard.AsyncAPI.Readers/ParseNodes/ParseNode.cs
index 0ea7fe7..6a75ddc 100644
--- a/src/ByteBard.AsyncAPI.Readers/ParseNodes/ParseNode.cs
+++ b/src/ByteBard.AsyncAPI.Readers/ParseNodes/ParseNode.cs
@@ -46,6 +46,11 @@ public virtual List CreateList(Func map)
             throw new AsyncApiReaderException("Cannot create list from this type of node.", this.Context);
         }
 
+        public virtual Dictionary CreateMap(Func keySelector, Func map)
+        {
+            throw new AsyncApiReaderException("Cannot create map from this type of node.", this.Context);
+        }
+
         public virtual Dictionary CreateMap(Func map)
         {
             throw new AsyncApiReaderException("Cannot create map from this type of node.", this.Context);
@@ -72,6 +77,11 @@ public virtual List CreateSimpleList(Func map)
             throw new AsyncApiReaderException("Cannot create simple list from this type of node.", this.Context);
         }
 
+        public virtual HashSet CreateSimpleSet(Func map)
+        {
+            throw new AsyncApiReaderException("Cannot create simple list from this type of node.", this.Context);
+        }
+
         public virtual Dictionary CreateSimpleMap(Func map)
         {
             throw new AsyncApiReaderException("Cannot create simple map from this type of node.", this.Context);
diff --git a/src/ByteBard.AsyncAPI.Readers/ParseNodes/PropertyNode.cs b/src/ByteBard.AsyncAPI.Readers/ParseNodes/PropertyNode.cs
index ab12f6a..51d8686 100644
--- a/src/ByteBard.AsyncAPI.Readers/ParseNodes/PropertyNode.cs
+++ b/src/ByteBard.AsyncAPI.Readers/ParseNodes/PropertyNode.cs
@@ -22,6 +22,32 @@ public PropertyNode(ParsingContext context, string name, JsonNode node)
 
         public ParseNode Value { get; set; }
 
+        public void ParseField(T parentInstance,  IDictionary, Action> patternFields)
+        {
+            var map = patternFields.Where(p => p.Key(this.Name)).Select(p => p.Value).FirstOrDefault();
+            if (map != null)
+            {
+                try
+                {
+                    this.Context.StartObject(this.Name);
+                    map(parentInstance, this.Name, this.Value);
+                }
+                catch (AsyncApiReaderException ex)
+                {
+                    this.Context.Diagnostic.Errors.Add(new AsyncApiError(ex));
+                }
+                catch (AsyncApiException ex)
+                {
+                    ex.Pointer = this.Context.GetLocation();
+                    this.Context.Diagnostic.Errors.Add(new AsyncApiError(ex));
+                }
+                finally
+                {
+                    this.Context.EndObject();
+                }
+            }
+        }
+
         public void ParseField(
             T parentInstance,
             IDictionary> fixedFields,
diff --git a/src/ByteBard.AsyncAPI.Readers/ParseNodes/ValueNode.cs b/src/ByteBard.AsyncAPI.Readers/ParseNodes/ValueNode.cs
index e76c19c..e36580b 100644
--- a/src/ByteBard.AsyncAPI.Readers/ParseNodes/ValueNode.cs
+++ b/src/ByteBard.AsyncAPI.Readers/ParseNodes/ValueNode.cs
@@ -27,7 +27,6 @@ public override string GetScalarValue()
         {
             if (this.cachedScalarValue == null)
             {
-                // TODO: Update this property to use the .ToString() or JsonReader. 
                 var scalarNode = this.node is JsonValue value ? value : throw new AsyncApiException($"Expected scalar value");
                 this.cachedScalarValue = Convert.ToString(scalarNode.GetValue