diff --git a/src/Tgstation.Server.Api/Models/Byond.cs b/src/Tgstation.Server.Api/Models/Byond.cs
index d9a87d4643..b0b1647831 100644
--- a/src/Tgstation.Server.Api/Models/Byond.cs
+++ b/src/Tgstation.Server.Api/Models/Byond.cs
@@ -9,12 +9,6 @@ namespace Tgstation.Server.Api.Models
[Model(RightsType.Byond, RequiresInstance = true)]
public sealed class Byond
{
- ///
- /// The for the installation
- ///
- [Permissions(DenyWrite = true, ReadRight = ByondRights.ReadStatus)]
- public ByondStatus ByondStatus { get; set; }
-
///
/// The of the installation used for new compiles. Will be if the user does not have permission to view it or there is no BYOND version installed. Only considers the and numbers
///
diff --git a/src/Tgstation.Server.Api/Models/ByondStatus.cs b/src/Tgstation.Server.Api/Models/ByondStatus.cs
deleted file mode 100644
index 638a91e475..0000000000
--- a/src/Tgstation.Server.Api/Models/ByondStatus.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-namespace Tgstation.Server.Api.Models
-{
- ///
- /// The status of a update job
- ///
-#pragma warning disable CA1717 // Only FlagsAttribute enums should have plural names
- public enum ByondStatus
-#pragma warning restore CA1717 // Only FlagsAttribute enums should have plural names
- {
- ///
- /// No update in progress
- ///
- Idle,
- ///
- /// Preparing to update
- ///
- Starting,
- ///
- /// Revision is downloading
- ///
- Downloading,
- ///
- /// Revision is deflating
- ///
- Staging,
- ///
- /// Revision is ready and waiting for DreamDaemon reboot
- ///
- Staged,
- ///
- /// Revision is being applied
- ///
- Updating,
- ///
- /// User does not have permission to view the
- ///
- Hidden,
- }
-}
diff --git a/src/Tgstation.Server.Host/Components/Byond.cs b/src/Tgstation.Server.Host/Components/Byond.cs
deleted file mode 100644
index 1e3e5e39df..0000000000
--- a/src/Tgstation.Server.Host/Components/Byond.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using Microsoft.Extensions.Logging;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Tgstation.Server.Host.IO;
-
-namespace Tgstation.Server.Host.Components
-{
- ///
- sealed class Byond : IByond
- {
- ///
- /// The for
- ///
- readonly IIOManager ioManager;
-
- ///
- /// The for
- ///
- readonly ILogger logger;
-
- ///
- /// List of installed BYOND s
- ///
- readonly List installedVersions;
-
- ///
- /// Construct
- ///
- /// The value of
- /// The value of
- public Byond(IIOManager ioManager, ILogger logger)
- {
- this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
- this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
- }
-
- ///
- public Task ChangeVersion(Version version, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
-
- ///
- public Task ClearCache(CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
-
- ///
- public Task GetVersion(CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
- }
-
- ///
- public IByondExecutableLock UseExecutables(Version requiredVersion)
- {
- throw new NotImplementedException();
- }
- }
-}
diff --git a/src/Tgstation.Server.Host/Components/ByondManager.cs b/src/Tgstation.Server.Host/Components/ByondManager.cs
new file mode 100644
index 0000000000..aff60de879
--- /dev/null
+++ b/src/Tgstation.Server.Host/Components/ByondManager.cs
@@ -0,0 +1,113 @@
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.IO.Compression;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Tgstation.Server.Host.IO;
+
+namespace Tgstation.Server.Host.Components
+{
+ ///
+ sealed class ByondManager : IByondManager
+ {
+ const string VersionFileName = "Version.txt";
+
+ ///
+ /// The for the
+ ///
+ readonly IIOManager ioManager;
+
+ ///
+ /// The for the
+ ///
+ readonly IByondInstaller byondInstaller;
+
+ ///
+ /// The for the
+ ///
+ readonly ILogger logger;
+
+ ///
+ /// Map of byond s to s that complete when they are installed
+ ///
+ readonly Dictionary installedVersions;
+
+ ///
+ /// Construct a
+ ///
+ /// The value of
+ /// The value of
+ /// The value of
+ public ByondManager(IIOManager ioManager, IByondInstaller byondInstaller, ILogger logger)
+ {
+ this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
+ this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
+ this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
+ }
+
+ static string VersionKey(Version version) => new Version(version.Major, version.Minor).ToString();
+
+ async Task InstallVersion(Version version, CancellationToken cancellationToken)
+ {
+ var ourTcs = new TaskCompletionSource