diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index f711c69e6..7e55446ae 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -80,7 +80,6 @@
-
diff --git a/MediaBrowser.Api/PinLoginService.cs b/MediaBrowser.Api/PinLoginService.cs
deleted file mode 100644
index a4957651f..000000000
--- a/MediaBrowser.Api/PinLoginService.cs
+++ /dev/null
@@ -1,243 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Globalization;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Connect;
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Session;
-using ServiceStack;
-
-namespace MediaBrowser.Api
-{
- [Route("/Auth/Pin", "POST", Summary = "Creates a pin request")]
- public class CreatePinRequest : IReturn
- {
- [ApiMember(Name = "DeviceId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string DeviceId { get; set; }
- [ApiMember(Name = "AppName", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string AppName { get; set; }
- }
-
- [Route("/Auth/Pin", "GET", Summary = "Gets pin status")]
- public class GetPinStatusRequest : IReturn
- {
- [ApiMember(Name = "DeviceId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
- public string DeviceId { get; set; }
- [ApiMember(Name = "Pin", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
- public string Pin { get; set; }
- }
-
- [Route("/Auth/Pin/Exchange", "POST", Summary = "Exchanges a pin")]
- public class ExchangePinRequest : IReturn
- {
- [ApiMember(Name = "DeviceId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string DeviceId { get; set; }
- [ApiMember(Name = "Pin", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string Pin { get; set; }
- }
-
- [Route("/Auth/Pin/Validate", "POST", Summary = "Validates a pin")]
- [Authenticated]
- public class ValidatePinRequest : IReturn
- {
- [ApiMember(Name = "Pin", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string Pin { get; set; }
- }
-
- public class PinLoginService : BaseApiService
- {
- private static readonly ConcurrentDictionary _activeRequests = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase);
- private readonly ISessionManager _sessionManager;
- private readonly IUserManager _userManager;
-
- public PinLoginService(ISessionManager sessionManager, IUserManager userManager)
- {
- _sessionManager = sessionManager;
- _userManager = userManager;
- }
-
- public object Post(CreatePinRequest request)
- {
- if (string.IsNullOrWhiteSpace(request.DeviceId))
- {
- throw new ArgumentNullException("DeviceId");
- }
- if (string.IsNullOrWhiteSpace(request.AppName))
- {
- throw new ArgumentNullException("AppName");
- }
-
- var pin = GetNewPin();
-
- var value = new MyPinStatus
- {
- CreationTimeUtc = DateTime.UtcNow,
- IsConfirmed = false,
- IsExpired = false,
- Pin = pin,
- DeviceId = request.DeviceId,
- AppName = request.AppName
- };
-
- _activeRequests.AddOrUpdate(pin, value, (k, v) => value);
-
- return ToOptimizedResult(new PinCreationResult
- {
- DeviceId = request.DeviceId,
- IsConfirmed = false,
- IsExpired = false,
- Pin = pin
- });
- }
-
- public object Get(GetPinStatusRequest request)
- {
- MyPinStatus status;
-
- if (!_activeRequests.TryGetValue(request.Pin, out status))
- {
- Logger.Debug("Pin {0} not found.", request.Pin);
- throw new ResourceNotFoundException();
- }
-
- EnsureValid(request.DeviceId, status);
-
- return ToOptimizedResult(new PinStatusResult
- {
- Pin = status.Pin,
- IsConfirmed = status.IsConfirmed,
- IsExpired = status.IsExpired
- });
- }
-
- public async Task