diff --git a/src/Microsoft.AspNet.Server.WebListener/AwaitableThrottle.cs b/src/Microsoft.AspNet.Server.WebListener/AwaitableThrottle.cs
new file mode 100644
index 0000000000..dc0baa555f
--- /dev/null
+++ b/src/Microsoft.AspNet.Server.WebListener/AwaitableThrottle.cs
@@ -0,0 +1,100 @@
+//------------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+//------------------------------------------------------------------------------
+
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+
+namespace Microsoft.AspNet.Server.WebListener
+{
+ ///
+ /// Awaitable object that acts like a semaphore. The object would wait if more than maxConcurrent number of clients waits on it
+ ///
+ public class AwaitableThrottle
+ {
+ private static readonly TaskAwaiter CompletedAwaiter = Task.FromResult(true).GetAwaiter();
+
+ private int _maxConcurrent;
+ private readonly object _thislock;
+ private readonly Queue> _awaiters;
+
+ private int _count;
+
+ ///
+ /// Constructor
+ ///
+ /// maximum number of clients that can wait on this object at the same time
+ public AwaitableThrottle(int maxConcurrent)
+ {
+ _thislock = new object();
+ _awaiters = new Queue>();
+ _maxConcurrent = maxConcurrent;
+ }
+
+ ///
+ /// Maximum amount of clients who can await on this throttle
+ ///
+ public int MaxConcurrent
+ {
+ get
+ {
+ return _maxConcurrent;
+ }
+ set
+ {
+ // Note: non-thread safe
+ _maxConcurrent = value;
+ }
+ }
+
+ ///
+ /// Called by framework
+ ///
+ public TaskAwaiter GetAwaiter()
+ {
+ TaskCompletionSource awaiter;
+
+ lock (_thislock)
+ {
+ if (_count < _maxConcurrent)
+ {
+ _count++;
+ return CompletedAwaiter;
+ }
+
+ awaiter = new TaskCompletionSource();
+ _awaiters.Enqueue(awaiter);
+ }
+
+ return awaiter.Task.GetAwaiter();
+ }
+
+ ///
+ /// Release throttle
+ ///
+ public void Release()
+ {
+ TaskCompletionSource completion = null;
+
+ lock (_thislock)
+ {
+ if (_awaiters.Count > 0)
+ {
+ completion = _awaiters.Dequeue();
+ }
+ else
+ {
+ _count--;
+ }
+ }
+
+ if (completion != null)
+ {
+ completion.SetResult(true);
+ }
+ }
+ }
+}
diff --git a/src/Microsoft.AspNet.Server.WebListener/OwinWebListener.cs b/src/Microsoft.AspNet.Server.WebListener/OwinWebListener.cs
index 4220f1c4fc..f9ed3fda72 100644
--- a/src/Microsoft.AspNet.Server.WebListener/OwinWebListener.cs
+++ b/src/Microsoft.AspNet.Server.WebListener/OwinWebListener.cs
@@ -78,9 +78,9 @@ namespace Microsoft.AspNet.Server.WebListener
private List _uriPrefixes = new List();
private PumpLimits _pumpLimits;
- private int _currentOutstandingAccepts;
- private int _currentOutstandingRequests;
- private Action _offloadListenForNextRequest;
+ private int _acceptorCounts;
+ private Action