diff --git a/src/EllieBot/Modules/Xp/Xp.cs b/src/EllieBot/Modules/Xp/Xp.cs
index 78d10cd..2fd8d46 100644
--- a/src/EllieBot/Modules/Xp/Xp.cs
+++ b/src/EllieBot/Modules/Xp/Xp.cs
@@ -101,33 +101,33 @@ public partial class Xp : EllieModule<XpService>
         }
 
         await Response()
-              .Paginated()
-              .PageItems(GetPageItems)
-              .PageSize(10)
-              .CurrentPage(page)
-              .Page((users, curPage) =>
-              {
-                  var embed = CreateEmbed().WithTitle(GetText(strs.server_leaderboard)).WithOkColor();
+            .Paginated()
+            .PageItems(GetPageItems)
+            .PageSize(10)
+            .CurrentPage(page)
+            .Page((users, curPage) =>
+            {
+                var embed = CreateEmbed().WithTitle(GetText(strs.server_leaderboard)).WithOkColor();
 
-                  if (!users.Any())
-                      return embed.WithDescription("-");
+                if (!users.Any())
+                    return embed.WithDescription("-");
 
-                  for (var i = 0; i < users.Count; i++)
-                  {
-                      var levelStats = new LevelStats(users[i].Xp);
-                      var user = ((SocketGuild)ctx.Guild).GetUser(users[i].UserId);
+                for (var i = 0; i < users.Count; i++)
+                {
+                    var levelStats = new LevelStats(users[i].Xp);
+                    var user = ((SocketGuild)ctx.Guild).GetUser(users[i].UserId);
 
-                      var userXpData = users[i];
+                    var userXpData = users[i];
 
-                      var awardStr = string.Empty;
+                    var awardStr = string.Empty;
 
-                      embed.AddField($"#{i + 1 + (curPage * 10)} {user?.ToString() ?? users[i].UserId.ToString()}",
-                          $"{GetText(strs.level_x(levelStats.Level))} - {levelStats.TotalXp}xp {awardStr}");
-                  }
+                    embed.AddField($"#{i + 1 + (curPage * 10)} {user?.ToString() ?? users[i].UserId.ToString()}",
+                        $"{GetText(strs.level_x(levelStats.Level))} - {levelStats.TotalXp}xp {awardStr}");
+                }
 
-                  return embed;
-              })
-              .SendAsync();
+                return embed;
+            })
+            .SendAsync();
     }
 
     [Cmd]
@@ -148,8 +148,8 @@ public partial class Xp : EllieModule<XpService>
 
         await _service.SetLevelAsync(ctx.Guild.Id, userId, level);
         await Response()
-              .Confirm(strs.level_set($"<@{userId}>", Format.Bold(level.ToString())))
-              .SendAsync();
+            .Confirm(strs.level_set($"<@{userId}>", Format.Bold(level.ToString())))
+            .SendAsync();
     }
 
     [Cmd]
@@ -164,36 +164,28 @@ public partial class Xp : EllieModule<XpService>
         if (role.IsManaged)
             return;
 
-        var count = await _service.AddXpToUsersAsync(ctx.Guild.Id,
+        await _service.AddXpAsync(ctx.Channel.Id,
             amount,
-            role.Members.Select(x => x.Id).ToArray());
+            role.Members.Cast<IGuildUser>().ToArray());
+        
         await Response()
-              .Confirm(
-                  strs.xpadd_users(Format.Bold(amount.ToString()), Format.Bold(count.ToString())))
-              .SendAsync();
+            .Confirm(strs.xpadd_users(Format.Bold(amount.ToString()), Format.Bold(role.Name)))
+            .SendAsync();
     }
 
     [Cmd]
     [RequireContext(ContextType.Guild)]
     [UserPerm(GuildPerm.Administrator)]
     [Priority(3)]
-    public async Task XpAdd(int amount, ulong userId)
+    public async Task XpAdd(int amount, [Leftover] IGuildUser user)
     {
         if (amount == 0)
             return;
 
-        await _service.AddXpAsync(userId, ctx.Guild.Id, amount);
-        var usr = ((SocketGuild)ctx.Guild).GetUser(userId)?.ToString() ?? userId.ToString();
-        await Response().Confirm(strs.modified(Format.Bold(usr), Format.Bold(amount.ToString()))).SendAsync();
+        await _service.AddXpAsync(ctx.Channel.Id, amount, user);
+        await Response().Confirm(strs.modified(Format.Bold(user.ToString()), Format.Bold(amount.ToString()))).SendAsync();
     }
 
-    [Cmd]
-    [RequireContext(ContextType.Guild)]
-    [UserPerm(GuildPerm.Administrator)]
-    [Priority(4)]
-    public Task XpAdd(int amount, [Leftover] IGuildUser user)
-        => XpAdd(amount, user.Id);
-
     [Cmd]
     [RequireContext(ContextType.Guild)]
     [OwnerOnly]
@@ -216,8 +208,8 @@ public partial class Xp : EllieModule<XpService>
     public async Task XpReset(ulong userId)
     {
         var embed = CreateEmbed()
-                    .WithTitle(GetText(strs.reset))
-                    .WithDescription(GetText(strs.reset_user_confirm));
+            .WithTitle(GetText(strs.reset))
+            .WithDescription(GetText(strs.reset_user_confirm));
 
         if (!await PromptUserConfirmAsync(embed))
             return;
@@ -233,8 +225,8 @@ public partial class Xp : EllieModule<XpService>
     public async Task XpReset()
     {
         var embed = CreateEmbed()
-                    .WithTitle(GetText(strs.reset))
-                    .WithDescription(GetText(strs.reset_server_confirm));
+            .WithTitle(GetText(strs.reset))
+            .WithDescription(GetText(strs.reset_server_confirm));
 
         if (!await PromptUserConfirmAsync(embed))
             return;
@@ -267,12 +259,12 @@ public partial class Xp : EllieModule<XpService>
         }
 
         await Response()
-              .Confirm(GetText(strs.available_commands),
-                  $"""
-                   `{prefix}xpshop bgs`
-                   `{prefix}xpshop frames`
-                   """)
-              .SendAsync();
+            .Confirm(GetText(strs.available_commands),
+                $"""
+                 `{prefix}xpshop bgs`
+                 `{prefix}xpshop frames`
+                 """)
+            .SendAsync();
     }
 
     [Cmd]
@@ -300,80 +292,80 @@ public partial class Xp : EllieModule<XpService>
         }
 
         await Response()
-              .Paginated()
-              .Items(allItems)
-              .PageSize(1)
-              .CurrentPage(page)
-              .AddFooter(false)
-              .Page((items, _) =>
-              {
-                  if (!items.Any())
-                      return CreateEmbed()
-                             .WithDescription(GetText(strs.not_found))
-                             .WithErrorColor();
+            .Paginated()
+            .Items(allItems)
+            .PageSize(1)
+            .CurrentPage(page)
+            .AddFooter(false)
+            .Page((items, _) =>
+            {
+                if (!items.Any())
+                    return CreateEmbed()
+                        .WithDescription(GetText(strs.not_found))
+                        .WithErrorColor();
 
-                  var (key, item) = items.FirstOrDefault();
+                var (_, item) = items.FirstOrDefault();
 
-                  var eb = CreateEmbed()
-                           .WithOkColor()
-                           .WithTitle(item.Name)
-                           .AddField(GetText(strs.price),
-                               CurrencyHelper.N(item.Price, Culture, _gss.GetCurrencySign()),
-                               true)
-                           .WithImageUrl(string.IsNullOrWhiteSpace(item.Preview)
-                               ? item.Url
-                               : item.Preview);
+                var eb = CreateEmbed()
+                    .WithOkColor()
+                    .WithTitle(item.Name)
+                    .AddField(GetText(strs.price),
+                        CurrencyHelper.N(item.Price, Culture, _gss.GetCurrencySign()),
+                        true)
+                    .WithImageUrl(string.IsNullOrWhiteSpace(item.Preview)
+                        ? item.Url
+                        : item.Preview);
 
-                  if (!string.IsNullOrWhiteSpace(item.Desc))
-                      eb.AddField(GetText(strs.desc), item.Desc);
+                if (!string.IsNullOrWhiteSpace(item.Desc))
+                    eb.AddField(GetText(strs.desc), item.Desc);
 
-                  return eb;
-              })
-              .Interaction(async current =>
-              {
-                  var (key, _) = allItems.Skip(current).First();
+                return eb;
+            })
+            .Interaction(async current =>
+            {
+                var (key, _) = allItems.Skip(current).First();
 
-                  var itemType = type == XpShopInputType.Backgrounds
-                      ? XpShopItemType.Background
-                      : XpShopItemType.Frame;
+                var itemType = type == XpShopInputType.Backgrounds
+                    ? XpShopItemType.Background
+                    : XpShopItemType.Frame;
 
-                  var ownedItem = await _service.GetUserItemAsync(ctx.User.Id, itemType, key);
-                  if (ownedItem is not null)
-                  {
-                      var button = new ButtonBuilder(ownedItem.IsUsing
-                              ? GetText(strs.in_use)
-                              : GetText(strs.use),
-                          "xpshop:use",
-                          emote: Emoji.Parse("👐"),
-                          isDisabled: ownedItem.IsUsing);
+                var ownedItem = await _service.GetUserItemAsync(ctx.User.Id, itemType, key);
+                if (ownedItem is not null)
+                {
+                    var button = new ButtonBuilder(ownedItem.IsUsing
+                            ? GetText(strs.in_use)
+                            : GetText(strs.use),
+                        "xpshop:use",
+                        emote: Emoji.Parse("👐"),
+                        isDisabled: ownedItem.IsUsing);
 
-                      var inter = _inter.Create(
-                          ctx.User.Id,
-                          button,
-                          OnShopUse,
-                          (key, itemType),
-                          clearAfter: false);
+                    var inter = _inter.Create(
+                        ctx.User.Id,
+                        button,
+                        OnShopUse,
+                        (key, itemType),
+                        clearAfter: false);
 
-                      return inter;
-                  }
-                  else
-                  {
-                      var button = new ButtonBuilder(GetText(strs.buy),
-                          "xpshop:buy",
-                          emote: Emoji.Parse("💰"));
+                    return inter;
+                }
+                else
+                {
+                    var button = new ButtonBuilder(GetText(strs.buy),
+                        "xpshop:buy",
+                        emote: Emoji.Parse("💰"));
 
-                      var inter = _inter.Create(
-                          ctx.User.Id,
-                          button,
-                          OnShopBuy,
-                          (key, itemType),
-                          singleUse: true,
-                          clearAfter: false);
+                    var inter = _inter.Create(
+                        ctx.User.Id,
+                        button,
+                        OnShopBuy,
+                        (key, itemType),
+                        singleUse: true,
+                        clearAfter: false);
 
-                      return inter;
-                  }
-              })
-              .SendAsync();
+                    return inter;
+                }
+            })
+            .SendAsync();
     }
 
     [Cmd]
@@ -396,8 +388,8 @@ public partial class Xp : EllieModule<XpService>
             {
                 BuyResult.XpShopDisabled => await Response().Error(strs.xp_shop_disabled).SendAsync(),
                 BuyResult.InsufficientFunds => await Response()
-                                                     .Error(strs.not_enough(_gss.GetCurrencySign()))
-                                                     .SendAsync(),
+                    .Error(strs.not_enough(_gss.GetCurrencySign()))
+                    .SendAsync(),
                 BuyResult.AlreadyOwned =>
                     await Response().Error(strs.xpshop_already_owned).Interaction(GetUseInteraction()).SendAsync(),
                 BuyResult.UnknownItem => await Response().Error(strs.xpshop_item_not_found).SendAsync(),
@@ -407,10 +399,10 @@ public partial class Xp : EllieModule<XpService>
         }
 
         await Response()
-              .Confirm(strs.xpshop_buy_success(type.ToString().ToLowerInvariant(),
-                  key.ToLowerInvariant()))
-              .Interaction(GetUseInteraction())
-              .SendAsync();
+            .Confirm(strs.xpshop_buy_success(type.ToString().ToLowerInvariant(),
+                key.ToLowerInvariant()))
+            .Interaction(GetUseInteraction())
+            .SendAsync();
     }
 
     [Cmd]
diff --git a/src/EllieBot/Modules/Xp/XpService.cs b/src/EllieBot/Modules/Xp/XpService.cs
index 58def50..6cae523 100644
--- a/src/EllieBot/Modules/Xp/XpService.cs
+++ b/src/EllieBot/Modules/Xp/XpService.cs
@@ -551,25 +551,12 @@ public class XpService : IEService, IReadyExecutor, IExecNoCommand
         return false;
     }
 
-    public async Task<int> AddXpToUsersAsync(ulong guildId, long amount, params ulong[] userIds)
+    public Task AddXpAsync(ulong channelId, long amount, params IGuildUser[] users)
     {
-        await using var ctx = _db.GetDbContext();
-        return await ctx.GetTable<UserXpStats>()
-            .Where(x => x.GuildId == guildId && userIds.Contains(x.UserId))
-            .UpdateAsync(old => new()
-            {
-                Xp = old.Xp + amount
-            });
-    }
-
-    public async Task AddXpAsync(ulong userId, ulong guildId, int amount)
-    {
-        await using var uow = _db.GetDbContext();
-        var usr = uow.GetOrCreateUserXpStats(guildId, userId);
-
-        usr.Xp += amount;
-
-        await uow.SaveChangesAsync();
+        foreach (var user in users)
+            _usersBatch.Add(new(user, amount, channelId));
+        
+        return Task.CompletedTask;
     }
 
     private Task<bool> TryAddUserGainedXpAsync(ulong userId, float cdInMinutes)