diff --git a/src/Octobot.cs b/src/Octobot.cs
index 5cffd70..2648338 100644
--- a/src/Octobot.cs
+++ b/src/Octobot.cs
@@ -24,12 +24,12 @@ namespace Octobot;
 
 public sealed class Octobot
 {
-    public static readonly AllowedMentions NoMentions = new(
-        Array.Empty<MentionType>(), Array.Empty<Snowflake>(), Array.Empty<Snowflake>());
-
     public const string RepositoryUrl = "https://github.com/LabsDevelopment/Octobot";
     public const string IssuesUrl = $"{RepositoryUrl}/issues";
 
+    public static readonly AllowedMentions NoMentions = new(
+        Array.Empty<MentionType>(), Array.Empty<Snowflake>(), Array.Empty<Snowflake>());
+
     public static async Task Main(string[] args)
     {
         var host = CreateHostBuilder(args).UseConsoleLifetime().Build();
@@ -86,12 +86,12 @@ public sealed class Octobot
                         .AddPreparationErrorEvent<LoggingPreparationErrorEvent>()
                         .AddPostExecutionEvent<ErrorLoggingPostExecutionEvent>()
                         // Services
-                        .AddSingleton<GuildDataService>()
                         .AddSingleton<Utility>()
+                        .AddSingleton<GuildDataService>()
+                        .AddHostedService<GuildDataService>(provider => provider.GetRequiredService<GuildDataService>())
                         .AddHostedService<MemberUpdateService>()
                         .AddHostedService<ScheduledEventUpdateService>()
                         .AddHostedService<SongUpdateService>()
-                        .AddHostedService<BackgroundGuildDataSaverService>()
                         // Slash commands
                         .AddCommandTree()
                         .WithCommandGroup<AboutCommandGroup>()
diff --git a/src/Services/BackgroundGuildDataSaverService.cs b/src/Services/BackgroundGuildDataSaverService.cs
deleted file mode 100644
index 766ffe0..0000000
--- a/src/Services/BackgroundGuildDataSaverService.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Microsoft.Extensions.Hosting;
-
-namespace Octobot.Services;
-
-public sealed class BackgroundGuildDataSaverService : BackgroundService
-{
-    private readonly GuildDataService _guildData;
-
-    public BackgroundGuildDataSaverService(GuildDataService guildData)
-    {
-        _guildData = guildData;
-    }
-
-    protected override async Task ExecuteAsync(CancellationToken ct)
-    {
-        using var timer = new PeriodicTimer(TimeSpan.FromMinutes(5));
-
-        while (await timer.WaitForNextTickAsync(ct))
-        {
-            await _guildData.SaveAsync(ct);
-        }
-    }
-}
diff --git a/src/Services/GuildDataService.cs b/src/Services/GuildDataService.cs
index 961c8f9..c9458a0 100644
--- a/src/Services/GuildDataService.cs
+++ b/src/Services/GuildDataService.cs
@@ -11,25 +11,23 @@ namespace Octobot.Services;
 /// <summary>
 ///     Handles saving, loading, initializing and providing <see cref="GuildData" />.
 /// </summary>
-public sealed class GuildDataService
+public sealed class GuildDataService : BackgroundService
 {
     private readonly ConcurrentDictionary<Snowflake, GuildData> _datas = new();
     private readonly ILogger<GuildDataService> _logger;
 
-    // https://github.com/dotnet/aspnetcore/issues/39139
-    public GuildDataService(
-        IHostApplicationLifetime lifetime, ILogger<GuildDataService> logger)
+    public GuildDataService(ILogger<GuildDataService> logger)
     {
         _logger = logger;
-        lifetime.ApplicationStopping.Register(ApplicationStopping);
     }
 
-    private void ApplicationStopping()
+    public override Task StopAsync(CancellationToken ct)
     {
-        SaveAsync(CancellationToken.None).GetAwaiter().GetResult();
+        base.StopAsync(ct);
+        return SaveAsync(ct);
     }
 
-    public Task SaveAsync(CancellationToken ct)
+    private Task SaveAsync(CancellationToken ct)
     {
         var tasks = new List<Task>();
         var datas = _datas.Values.ToArray();
@@ -58,6 +56,16 @@ public sealed class GuildDataService
         File.Delete(tempFilePath);
     }
 
+    protected override async Task ExecuteAsync(CancellationToken ct)
+    {
+        using var timer = new PeriodicTimer(TimeSpan.FromMinutes(5));
+
+        while (await timer.WaitForNextTickAsync(ct))
+        {
+            await SaveAsync(ct);
+        }
+    }
+
     public async Task<GuildData> GetData(Snowflake guildId, CancellationToken ct = default)
     {
         return _datas.TryGetValue(guildId, out var data) ? data : await InitializeData(guildId, ct);