diff --git a/src/CodeNav.OutOfProc/TextViewMarginProvider.cs b/src/CodeNav.OutOfProc/TextViewMarginProvider.cs
new file mode 100644
index 0000000..bfa4084
--- /dev/null
+++ b/src/CodeNav.OutOfProc/TextViewMarginProvider.cs
@@ -0,0 +1,34 @@
+using CodeNav.OutOfProc.Services;
+using CodeNav.OutOfProc.ToolWindows;
+using Microsoft.VisualStudio.Extensibility;
+using Microsoft.VisualStudio.Extensibility.Editor;
+using Microsoft.VisualStudio.RpcContracts.RemoteUI;
+
+namespace CodeNav.OutOfProc;
+
+[VisualStudioContribution]
+internal class TextViewMarginProvider(CodeDocumentService codeDocumentService) : ExtensionPart, ITextViewMarginProvider
+{
+ ///
+ public TextViewExtensionConfiguration TextViewExtensionConfiguration => new()
+ {
+ AppliesTo =
+ [
+ DocumentFilter.FromDocumentType("CSharp"),
+ DocumentFilter.FromGlobPattern("**/*.cs", true),
+ ],
+ };
+
+ ///
+ public TextViewMarginProviderConfiguration TextViewMarginProviderConfiguration =>
+ new(marginContainer: ContainerMarginPlacement.KnownValues.Left)
+ {
+ Before = [MarginPlacement.KnownValues.Glyph],
+ };
+
+ ///
+ public Task CreateVisualElementAsync(ITextViewSnapshot textView, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(new CodeNavToolWindowControl(codeDocumentService.CodeDocumentViewModel));
+ }
+}
\ No newline at end of file