diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs
index fd2317803..1fc206bd3 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs
@@ -95,6 +95,10 @@ public string ReferenceV3
                 {
                     return Id;
                 }
+                if (Id.StartsWith("http"))
+                {
+                    return Id;
+                }
 
                 return "#/components/" + Type.GetDisplayName() + "/" + Id;
             }
@@ -236,6 +240,11 @@ private string GetExternalReferenceV3()
                     return ExternalResource + "#" + Id;
                 }
 
+                if (Id.StartsWith("http"))
+                {
+                    return Id;
+                }
+
                 return ExternalResource + "#/components/" + Type.GetDisplayName() + "/" + Id;
             }
 
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
index 4ee1c3fbd..66fb0fa1e 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
@@ -1,12 +1,10 @@
 // Copyright (c) Microsoft Corporation. All rights reserved.
 // Licensed under the MIT license.
 
-using Microsoft.OpenApi.Any;
 using Microsoft.OpenApi.Interfaces;
 using Microsoft.OpenApi.Writers;
 using System;
 using System.Collections.Generic;
-using System.Runtime;
 using System.Text.Json.Nodes;
 
 namespace Microsoft.OpenApi.Models.References
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs
index a56590bf1..d6c9d0fcf 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs
@@ -157,9 +157,11 @@ private static (string, string) GetReferenceIdAndExternalResource(string pointer
             string refId = !pointer.Contains('#') ? pointer : refSegments.Last();
 
             var isExternalResource = !refSegments.First().StartsWith("#");
-            string externalResource = isExternalResource
-                ? $"{refSegments.First()}/{refSegments[1].TrimEnd('#')}"
-                : null;
+            string externalResource = null;
+            if (isExternalResource && pointer.Contains('#'))
+            {
+                externalResource = $"{refSegments.First()}/{refSegments[1].TrimEnd('#')}";
+            }
 
             return (refId, externalResource);
         }
diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj
index 81991fd63..e1f54a276 100644
--- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj
+++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj
@@ -42,14 +42,14 @@
       OpenApiCallbackReferenceTests.cs
     
       
+    
+      PreserveNewest
+    
+      
     
       PreserveNewest
     
       
     
   
-
-  
-    
-  
 
\ No newline at end of file
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
index c6927fcfb..56dc228e0 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
@@ -1642,5 +1642,54 @@ public void SerializeV31DocumentWithRefsInWebhooksWorks()
             var actual = stringWriter.ToString();
             actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
         }
+
+        [Fact]
+        public void SerializeDocWithDollarIdInDollarRefSucceeds()
+        {
+            var expected = @"openapi: '3.1.0'
+info:
+  title: Simple API
+  version: 1.0.0
+paths:
+  /box:
+    get:
+      responses:
+        '200':
+          description: OK
+          content:
+            application/json:
+              schema:
+                $ref: https://foo.bar/Box
+  /circle:
+    get:
+      responses:
+        '200':
+          description: OK
+          content:
+            application/json:
+              schema:
+                $ref: https://foo.bar/Circle
+components:
+  schemas:
+    Box:
+      $id: https://foo.bar/Box
+      type: object
+      properties:
+        width:
+          type: number
+        height:
+          type: number
+    Circle:
+      $id: https://foo.bar/Circle
+      type: object
+      properties:
+        radius:
+          type: number
+";
+            var doc = OpenApiDocument.Load("Models/Samples/docWithDollarId.yaml").OpenApiDocument;
+
+            var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1);
+            actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
+        }
     }
 }
diff --git a/test/Microsoft.OpenApi.Tests/Models/Samples/docWithDollarId.yaml b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithDollarId.yaml
new file mode 100644
index 000000000..e8916f895
--- /dev/null
+++ b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithDollarId.yaml
@@ -0,0 +1,39 @@
+openapi: 3.1.0
+info:
+  title: Simple API
+  version: 1.0.0
+paths:
+  /box:
+    get:
+      responses:
+        '200':
+          description: OK
+          content:
+            application/json:
+              schema:
+                $ref: https://foo.bar/Box
+  /circle:
+    get:
+      responses:
+        '200':
+          description: OK
+          content:
+            application/json:
+              schema:
+                $ref: https://foo.bar/Circle
+components:
+  schemas:
+    Box:
+      $id: https://foo.bar/Box
+      type: object
+      properties:
+        width:
+          type: number
+        height:
+          type: number
+    Circle:
+      $id: https://foo.bar/Circle
+      type: object
+      properties:
+        radius:
+          type: number