diff --git a/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/DeadUserDataTask.cs b/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/DeadUserDataTask.cs
new file mode 100644
index 0000000..5399e83
--- /dev/null
+++ b/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/DeadUserDataTask.cs
@@ -0,0 +1,82 @@
+#pragma warning disable RS0030 // Do not use banned APIs
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Jellyfin.Database.Implementations;
+using MediaBrowser.Model.Globalization;
+using MediaBrowser.Model.Tasks;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Logging;
+
+namespace Jellyfin.Plugin.MediaCleaner.ScheduledTasks;
+
+///
+/// Task to clean up any detached userdata from the database.
+///
+public class CleanupUserDataTask : IScheduledTask
+{
+ private readonly ILocalizationManager _localization;
+ private readonly IDbContextFactory _dbProvider;
+ private readonly ILogger _logger;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The localisation Provider.
+ /// The DB context factory.
+ /// A logger.
+ public CleanupUserDataTask(ILocalizationManager localization, IDbContextFactory dbProvider, ILogger logger)
+ {
+ _localization = localization;
+ _dbProvider = dbProvider;
+ _logger = logger;
+ }
+
+ ///
+ public string Name => _localization.GetLocalizedString("CleanupUserDataTask");
+
+ public Guid PlaceholderId => new("00000000-0000-0000-0000-000000000001");
+
+ ///
+ public string Description => _localization.GetLocalizedString("CleanupUserDataTaskDescription");
+
+ ///
+ public string Category => _localization.GetLocalizedString("Media");
+
+ ///
+ public string Key => nameof(CleanupUserDataTask);
+
+ ///
+ public async Task ExecuteAsync(IProgress progress, CancellationToken cancellationToken)
+ {
+ var dbContext = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
+ await using (dbContext.ConfigureAwait(false))
+ {
+ var detachedUserData = dbContext.UserData.Where(e => e.ItemId == PlaceholderId).ToList();
+ _logger.LogInformation("There are {NoDetached} detached UserData entries.", detachedUserData.Count);
+ foreach(var userData in detachedUserData)
+ {
+ if (userData.Item != null)
+ {
+ _logger.LogInformation("Detached user data for: {UserDataName}", userData.Item.Name);
+ }
+ else
+ {
+ _logger.LogInformation("Detached user data for: {UserDataName}", userData);
+ }
+ }
+ _logger.LogInformation("Detached user data count: {Count}.", detachedUserData.Count);
+
+ // await detachedUserData.ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
+ }
+ }
+
+ ///
+ public IEnumerable GetDefaultTriggers()
+ {
+ yield break;
+ }
+}