diff --git a/eng/Dependencies.props b/eng/Dependencies.props
index 2e11857b1b9ad3d9e5131979922da279ade4c487..097673484fcb060759332bf414f23d9712f03a36 100644
--- a/eng/Dependencies.props
+++ b/eng/Dependencies.props
@@ -23,6 +23,7 @@ and are generated based on the last package release.
     <LatestPackageReference Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="$(MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion)" />
     <LatestPackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="$(MicrosoftAspNetCoreRazorLanguagePackageVersion)" />
     <LatestPackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftBclAsyncInterfacesPackageVersion)" />
+    <LatestPackageReference Include="Microsoft.Azure.SignalR" Version="$(MicrosoftAzureSignalRPackageVersion)" />
     <LatestPackageReference Include="Microsoft.CodeAnalysis.Common" Version="$(MicrosoftCodeAnalysisCommonPackageVersion)" />
     <LatestPackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="$(MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion)" />
     <LatestPackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="$(MicrosoftCodeAnalysisCSharpPackageVersion)" />
diff --git a/eng/Versions.props b/eng/Versions.props
index c27a506f3293314ae7a7dbe3fd2772d6e065af40..ff8bc1a52c3d91d56f62feb8d0456bb177175ebe 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -206,6 +206,7 @@
     <MicrosoftAzureKeyVaultPackageVersion>2.3.2</MicrosoftAzureKeyVaultPackageVersion>
     <MicrosoftAzureStorageBlobPackageVersion>10.0.1</MicrosoftAzureStorageBlobPackageVersion>
     <MicrosoftBuildPackageVersion>15.8.166</MicrosoftBuildPackageVersion>
+    <MicrosoftAzureSignalRPackageVersion>1.2.0</MicrosoftAzureSignalRPackageVersion>
     <MicrosoftBuildFrameworkPackageVersion>15.8.166</MicrosoftBuildFrameworkPackageVersion>
     <MicrosoftBuildLocatorPackageVersion>1.2.6</MicrosoftBuildLocatorPackageVersion>
     <MicrosoftBuildUtilitiesCorePackageVersion>15.8.166</MicrosoftBuildUtilitiesCorePackageVersion>
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs b/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs
index cb1ef585b6612699c3f3d67a0fb5d8c2bdfbaad6..738d3232fdba22da546ce9cea2de9c2672779713 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs
@@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Logging;
 using Microsoft.AspNetCore.SignalR.Crankier.Server;
+using System.Collections.Generic;
 
 namespace Microsoft.AspNetCore.SignalR.Crankier.Commands
 {
@@ -21,6 +22,7 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Commands
             app.Command("server", cmd =>
             {
                 var logLevelOption = cmd.Option("--log <LOG_LEVEL>", "The LogLevel to use.", CommandOptionType.SingleValue);
+                var azureSignalRConnectionString = cmd.Option("--azure-signalr-connectionstring <CONNECTION_STRING>", "Azure SignalR Connection string to use", CommandOptionType.SingleValue);
 
                 cmd.OnExecute(() =>
                 {
@@ -30,18 +32,31 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Commands
                     {
                         return InvalidArg(logLevelOption);
                     }
-                    return Execute(logLevel);
+
+                    if (azureSignalRConnectionString.HasValue() && string.IsNullOrWhiteSpace(azureSignalRConnectionString.Value()))
+                    {
+                        return InvalidArg(azureSignalRConnectionString);
+                    }
+
+                    return Execute(logLevel, azureSignalRConnectionString.Value());
                 });
             });
         }
 
-        private static int Execute(LogLevel logLevel)
+        private static int Execute(LogLevel logLevel, string azureSignalRConnectionString)
         {
             Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}");
 
-            var config = new ConfigurationBuilder()
-                .AddEnvironmentVariables(prefix: "ASPNETCORE_")
-                .Build();
+            var configBuilder = new ConfigurationBuilder()
+                .AddEnvironmentVariables(prefix: "ASPNETCORE_");
+
+            if (azureSignalRConnectionString != null)
+            {
+                configBuilder.AddInMemoryCollection(new [] { new KeyValuePair<string, string>("Azure:SignalR:ConnectionString", azureSignalRConnectionString) });
+                Console.WriteLine("Using Azure SignalR");
+            }
+            
+            var config = configBuilder.Build();
 
             var host = new WebHostBuilder()
                 .UseConfiguration(config)
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj b/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj
index 1bc1e98bd68fb235832c57cb729064089a6e9b77..23ae6b00273362753e41109f822a3db66bace2de 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Crankier.csproj
@@ -4,6 +4,7 @@
     <OutputType>Exe</OutputType>
     <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
     <RootNamespace>Microsoft.AspNetCore.SignalR.CranksRevenge</RootNamespace>
+    <DisableTransitiveFrameworkReferences>true</DisableTransitiveFrameworkReferences>
   </PropertyGroup>
 
   <ItemGroup>
@@ -15,6 +16,7 @@
     <Reference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" />
     <Reference Include="Microsoft.Extensions.Logging.Console" />
     <Reference Include="Newtonsoft.Json" />
+    <Reference Include="Microsoft.Azure.SignalR" />
   </ItemGroup>
 
 </Project>
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Readme.md b/src/SignalR/perf/benchmarkapps/Crankier/Readme.md
index 7b0a95fbe90af24e94d1fda47ee4cc05563624fb..dc783bcc9e66f1a3aaa63518f84320c549ff296a 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Readme.md
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Readme.md
@@ -14,7 +14,9 @@ The `server` command runs a web host exposing a single SignalR `Hub` endpoint on
 Usage:  server [options]
 
 Options:
-  --log <LOG_LEVEL>  The LogLevel to use.
+  --log <LOG_LEVEL>                                     The LogLevel to use.
+  --azure-signalr-connectionstring <CONNECTION_STRING>  Azure SignalR Connection string to use
+  
 ```
 
 Notes:
@@ -55,6 +57,12 @@ Run the server:
 dotnet run -- server
 ```
 
+Run the server using Azure SignalR:
+
+```
+dotnet run -- server --azure-signalr-connectionstring Endpoint=https://your-url.service.signalr.net;AccessKey=yourAccessKey;Version=1.0;
+```
+
 Attempt to make 10,000 connections to the server using WebSockets and 10 workers:
 
 ```
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs b/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs
index d8d5efc5bf0eb400d3dc745ed025a2b3a301d0aa..6b3154416c863fb70019c9ab8ac881e961633e7d 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Server/Startup.cs
@@ -1,6 +1,7 @@
 // Copyright (c) .NET Foundation. All rights reserved.
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
+using System;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Configuration;
@@ -11,15 +12,23 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Server
     public class Startup
     {
         private readonly IConfiguration _config;
+        private readonly string _azureSignalrConnectionString;
         public Startup(IConfiguration configuration)
         {
             _config = configuration;
+            _azureSignalrConnectionString = configuration.GetSection("Azure:SignalR").GetValue<string>("ConnectionString", null);    
         }
 
         public void ConfigureServices(IServiceCollection services)
         {
-            var signalrBuilder = services.AddSignalR()
-                .AddMessagePackProtocol();
+            var signalrBuilder = services.AddSignalR();
+
+            if (_azureSignalrConnectionString != null)
+            {
+                signalrBuilder.AddAzureSignalR();
+            }
+
+            signalrBuilder.AddMessagePackProtocol();
 
             services.AddSingleton<ConnectionCounter>();
 
@@ -30,10 +39,19 @@ namespace Microsoft.AspNetCore.SignalR.Crankier.Server
         {
             app.UseRouting();
 
-            app.UseEndpoints(endpoints =>
+            if (_azureSignalrConnectionString != null)
+            {
+                app.UseAzureSignalR(routes => {
+                    routes.MapHub<EchoHub>("/echo");
+                });
+            }
+            else
             {
-                endpoints.MapHub<EchoHub>("/echo");
-            });
+                app.UseEndpoints(endpoints =>
+                {
+                    endpoints.MapHub<EchoHub>("/echo");
+                });
+            }
         }
     }
 }