diff --git a/SharpChat.Flashii/FlashiiAuthResult.cs b/SharpChat.Flashii/FlashiiAuthResult.cs
index c4a29ed..eac5c44 100644
--- a/SharpChat.Flashii/FlashiiAuthResult.cs
+++ b/SharpChat.Flashii/FlashiiAuthResult.cs
@@ -23,14 +23,17 @@ public class FlashiiAuthResult : AuthResult {
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_MESSAGE_EDIT_ANY))
                 perms |= UserPermissions.EditAnyMessage;
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_MESSAGE_BROADCAST))
-                perms |= UserPermissions.Broadcast;
+                perms |= UserPermissions.SendBroadcast;
 
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_USER_KICK))
                 perms |= UserPermissions.KickUser;
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_USER_BAN))
-                perms |= UserPermissions.BanUser;
+                perms |= UserPermissions.BanUser
+                    | UserPermissions.ViewBanList
+                    | UserPermissions.PardonUser
+                    | UserPermissions.PardonIPAddress;
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_USER_VIEW_ADDR))
-                perms |= UserPermissions.SeeIPAddress;
+                perms |= UserPermissions.ViewIPAddress;
 
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_CHANNEL_CREATE))
                 perms |= UserPermissions.CreateChannel;
@@ -39,7 +42,7 @@ public class FlashiiAuthResult : AuthResult {
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_CHANNEL_SET_PASSWORD))
                 perms |= UserPermissions.SetChannelPassword;
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_CHANNEL_SET_MIN_RANK))
-                perms |= UserPermissions.SetChannelHierarchy;
+                perms |= UserPermissions.SetChannelMinimumRank;
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_CHANNEL_DELETE))
                 perms |= UserPermissions.DeleteChannel;
             if(UserPermissionsRaw.HasFlag(FlashiiUserPermissions.C_CHANNEL_JOIN_ANY))
diff --git a/SharpChat/ClientCommands/BanListClientCommand.cs b/SharpChat/ClientCommands/BanListClientCommand.cs
index 7907ee3..be0a30b 100644
--- a/SharpChat/ClientCommands/BanListClientCommand.cs
+++ b/SharpChat/ClientCommands/BanListClientCommand.cs
@@ -12,7 +12,7 @@ public class BanListClientCommand(BansClient bansClient) : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.BanUser | UserPermissions.KickUser)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.ViewBanList)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/BroadcastClientCommand.cs b/SharpChat/ClientCommands/BroadcastClientCommand.cs
index 878e9b3..78796ab 100644
--- a/SharpChat/ClientCommands/BroadcastClientCommand.cs
+++ b/SharpChat/ClientCommands/BroadcastClientCommand.cs
@@ -12,7 +12,7 @@ public class BroadcastClientCommand : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.Broadcast)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.SendBroadcast)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/CreateChannelClientCommand.cs b/SharpChat/ClientCommands/CreateChannelClientCommand.cs
index 00cf727..03de911 100644
--- a/SharpChat/ClientCommands/CreateChannelClientCommand.cs
+++ b/SharpChat/ClientCommands/CreateChannelClientCommand.cs
@@ -10,7 +10,7 @@ public class CreateChannelClientCommand : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.CreateChannel)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.CreateChannel)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
@@ -47,7 +47,7 @@ public class CreateChannelClientCommand : ClientCommand {
 
         Channel createChan = new(
             createChanName,
-            isTemporary: !ctx.User.Can(UserPermissions.SetChannelPermanent),
+            isTemporary: !ctx.User.Permissions.HasFlag(UserPermissions.SetChannelPermanent),
             rank: createChanHierarchy,
             ownerId: ctx.User.UserId
         );
diff --git a/SharpChat/ClientCommands/DeleteChannelClientCommand.cs b/SharpChat/ClientCommands/DeleteChannelClientCommand.cs
index bd8cf08..ec0984c 100644
--- a/SharpChat/ClientCommands/DeleteChannelClientCommand.cs
+++ b/SharpChat/ClientCommands/DeleteChannelClientCommand.cs
@@ -26,7 +26,7 @@ public class DeleteChannelClientCommand : ClientCommand {
             return;
         }
 
-        if(!ctx.User.Can(UserPermissions.DeleteChannel) && delChan.IsOwner(ctx.User)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.DeleteChannel) && delChan.IsOwner(ctx.User)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_DELETE_FAILED, true, delChan.Name));
             return;
         }
diff --git a/SharpChat/ClientCommands/DeleteMessageClientCommand.cs b/SharpChat/ClientCommands/DeleteMessageClientCommand.cs
index ab14ac6..807fe3f 100644
--- a/SharpChat/ClientCommands/DeleteMessageClientCommand.cs
+++ b/SharpChat/ClientCommands/DeleteMessageClientCommand.cs
@@ -13,9 +13,9 @@ public class DeleteMessageClientCommand : ClientCommand {
 
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
-        bool deleteAnyMessage = ctx.User.Can(UserPermissions.DeleteAnyMessage);
+        bool deleteAnyMessage = ctx.User.Permissions.HasFlag(UserPermissions.DeleteAnyMessage);
 
-        if(!deleteAnyMessage && !ctx.User.Can(UserPermissions.DeleteOwnMessage)) {
+        if(!deleteAnyMessage && !ctx.User.Permissions.HasFlag(UserPermissions.DeleteOwnMessage)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/KickBanClientCommand.cs b/SharpChat/ClientCommands/KickBanClientCommand.cs
index 45e0257..88b72a9 100644
--- a/SharpChat/ClientCommands/KickBanClientCommand.cs
+++ b/SharpChat/ClientCommands/KickBanClientCommand.cs
@@ -14,7 +14,7 @@ public class KickBanClientCommand(BansClient bansClient) : ClientCommand {
         bool isBanning = ctx.NameEquals("ban");
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(isBanning ? UserPermissions.BanUser : UserPermissions.KickUser)) {
+        if(!ctx.User.Permissions.HasFlag(isBanning ? UserPermissions.BanUser : UserPermissions.KickUser)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/NickClientCommand.cs b/SharpChat/ClientCommands/NickClientCommand.cs
index 0d20d73..a1549ac 100644
--- a/SharpChat/ClientCommands/NickClientCommand.cs
+++ b/SharpChat/ClientCommands/NickClientCommand.cs
@@ -14,9 +14,9 @@ public class NickClientCommand : ClientCommand {
 
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
-        bool setOthersNick = ctx.User.Can(UserPermissions.SetOthersNickname);
+        bool setOthersNick = ctx.User.Permissions.HasFlag(UserPermissions.SetOthersNickname);
 
-        if(!setOthersNick && !ctx.User.Can(UserPermissions.SetOwnNickname)) {
+        if(!setOthersNick && !ctx.User.Permissions.HasFlag(UserPermissions.SetOwnNickname)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/PardonAddressClientCommand.cs b/SharpChat/ClientCommands/PardonAddressClientCommand.cs
index b410b21..69d033d 100644
--- a/SharpChat/ClientCommands/PardonAddressClientCommand.cs
+++ b/SharpChat/ClientCommands/PardonAddressClientCommand.cs
@@ -13,7 +13,7 @@ public class PardonAddressClientCommand(BansClient bansClient) : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.BanUser | UserPermissions.KickUser)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.PardonIPAddress)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/PardonUserClientCommand.cs b/SharpChat/ClientCommands/PardonUserClientCommand.cs
index d489f44..041d461 100644
--- a/SharpChat/ClientCommands/PardonUserClientCommand.cs
+++ b/SharpChat/ClientCommands/PardonUserClientCommand.cs
@@ -12,7 +12,7 @@ public class PardonUserClientCommand(BansClient bansClient) : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.BanUser | UserPermissions.KickUser)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.PardonUser)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/PasswordChannelClientCommand.cs b/SharpChat/ClientCommands/PasswordChannelClientCommand.cs
index 3fd48d3..c8cd882 100644
--- a/SharpChat/ClientCommands/PasswordChannelClientCommand.cs
+++ b/SharpChat/ClientCommands/PasswordChannelClientCommand.cs
@@ -11,7 +11,7 @@ public class PasswordChannelClientCommand : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.SetChannelPassword) || ctx.Channel.IsOwner(ctx.User)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.SetChannelPassword) || ctx.Channel.IsOwner(ctx.User)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/RankChannelClientCommand.cs b/SharpChat/ClientCommands/RankChannelClientCommand.cs
index 34f8683..0ff0fa6 100644
--- a/SharpChat/ClientCommands/RankChannelClientCommand.cs
+++ b/SharpChat/ClientCommands/RankChannelClientCommand.cs
@@ -12,7 +12,7 @@ public class RankChannelClientCommand : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.SetChannelHierarchy) || ctx.Channel.IsOwner(ctx.User)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.SetChannelMinimumRank) || ctx.Channel.IsOwner(ctx.User)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}"));
             return;
         }
diff --git a/SharpChat/ClientCommands/RemoteAddressClientCommand.cs b/SharpChat/ClientCommands/RemoteAddressClientCommand.cs
index adc7765..78efef6 100644
--- a/SharpChat/ClientCommands/RemoteAddressClientCommand.cs
+++ b/SharpChat/ClientCommands/RemoteAddressClientCommand.cs
@@ -12,7 +12,7 @@ public class RemoteAddressClientCommand : ClientCommand {
     public async Task Dispatch(ClientCommandContext ctx) {
         long msgId = ctx.Chat.RandomSnowflake.Next();
 
-        if(!ctx.User.Can(UserPermissions.SeeIPAddress)) {
+        if(!ctx.User.Permissions.HasFlag(UserPermissions.ViewIPAddress)) {
             await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.COMMAND_NOT_ALLOWED, true, "/ip"));
             return;
         }
diff --git a/SharpChat/ClientCommands/WhoClientCommand.cs b/SharpChat/ClientCommands/WhoClientCommand.cs
index 74b07b5..c60f6dd 100644
--- a/SharpChat/ClientCommands/WhoClientCommand.cs
+++ b/SharpChat/ClientCommands/WhoClientCommand.cs
@@ -37,7 +37,7 @@ public class WhoClientCommand : ClientCommand {
                 return;
             }
 
-            if(whoChan.Rank > ctx.User.Rank || (whoChan.HasPassword && !ctx.User.Can(UserPermissions.JoinAnyChannel))) {
+            if(whoChan.Rank > ctx.User.Rank || (whoChan.HasPassword && !ctx.User.Permissions.HasFlag(UserPermissions.JoinAnyChannel))) {
                 await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USERS_LISTING_ERROR, true, whoChanStr));
                 return;
             }
diff --git a/SharpChat/Context.cs b/SharpChat/Context.cs
index a095cf9..e9bfcf3 100644
--- a/SharpChat/Context.cs
+++ b/SharpChat/Context.cs
@@ -275,7 +275,7 @@ public class Context {
             return;
         }
 
-        if(!user.Can(UserPermissions.JoinAnyChannel) && chan.IsOwner(user)) {
+        if(!user.Permissions.HasFlag(UserPermissions.JoinAnyChannel) && chan.IsOwner(user)) {
             if(chan.Rank > user.Rank) {
                 await SendTo(user, new CommandResponseS2CPacket(RandomSnowflake.Next(), LCR.CHANNEL_INSUFFICIENT_HIERARCHY, true, chan.Name));
                 await ForceChannel(user);
diff --git a/SharpChat/EventStorage/MariaDBEventStorage_Permissions.cs b/SharpChat/EventStorage/MariaDBEventStorage_Permissions.cs
index ef239f3..cbbf1c0 100644
--- a/SharpChat/EventStorage/MariaDBEventStorage_Permissions.cs
+++ b/SharpChat/EventStorage/MariaDBEventStorage_Permissions.cs
@@ -8,7 +8,7 @@ public partial class MariaDBEventStorage {
         if(sup.HasFlag(StoredUserPermissions.BanUser))
             perms |= UserPermissions.BanUser;
         if(sup.HasFlag(StoredUserPermissions.Broadcast))
-            perms |= UserPermissions.Broadcast;
+            perms |= UserPermissions.SendBroadcast;
         if(sup.HasFlag(StoredUserPermissions.SetOwnNickname))
             perms |= UserPermissions.SetOwnNickname;
         if(sup.HasFlag(StoredUserPermissions.SetOthersNickname))
@@ -22,7 +22,7 @@ public partial class MariaDBEventStorage {
         if(sup.HasFlag(StoredUserPermissions.SetChannelPassword))
             perms |= UserPermissions.SetChannelPassword;
         if(sup.HasFlag(StoredUserPermissions.SetChannelHierarchy))
-            perms |= UserPermissions.SetChannelHierarchy;
+            perms |= UserPermissions.SetChannelMinimumRank;
         if(sup.HasFlag(StoredUserPermissions.JoinAnyChannel))
             perms |= UserPermissions.JoinAnyChannel;
         if(sup.HasFlag(StoredUserPermissions.SendMessage))
@@ -36,9 +36,15 @@ public partial class MariaDBEventStorage {
         if(sup.HasFlag(StoredUserPermissions.EditAnyMessage))
             perms |= UserPermissions.EditAnyMessage;
         if(sup.HasFlag(StoredUserPermissions.SeeIPAddress))
-            perms |= UserPermissions.SeeIPAddress;
+            perms |= UserPermissions.ViewIPAddress;
         if(sup.HasFlag(StoredUserPermissions.ViewLogs))
             perms |= UserPermissions.ViewLogs;
+        if(sup.HasFlag(StoredUserPermissions.ViewBanList))
+            perms |= UserPermissions.ViewBanList;
+        if(sup.HasFlag(StoredUserPermissions.PardonUser))
+            perms |= UserPermissions.PardonUser;
+        if(sup.HasFlag(StoredUserPermissions.PardonIPAddress))
+            perms |= UserPermissions.PardonIPAddress;
 
         return perms;
     }
@@ -50,7 +56,7 @@ public partial class MariaDBEventStorage {
             perms |= StoredUserPermissions.KickUser;
         if(up.HasFlag(UserPermissions.BanUser))
             perms |= StoredUserPermissions.BanUser;
-        if(up.HasFlag(UserPermissions.Broadcast))
+        if(up.HasFlag(UserPermissions.SendBroadcast))
             perms |= StoredUserPermissions.Broadcast;
         if(up.HasFlag(UserPermissions.SetOwnNickname))
             perms |= StoredUserPermissions.SetOwnNickname;
@@ -64,7 +70,7 @@ public partial class MariaDBEventStorage {
             perms |= StoredUserPermissions.SetChannelPermanent;
         if(up.HasFlag(UserPermissions.SetChannelPassword))
             perms |= StoredUserPermissions.SetChannelPassword;
-        if(up.HasFlag(UserPermissions.SetChannelHierarchy))
+        if(up.HasFlag(UserPermissions.SetChannelMinimumRank))
             perms |= StoredUserPermissions.SetChannelHierarchy;
         if(up.HasFlag(UserPermissions.JoinAnyChannel))
             perms |= StoredUserPermissions.JoinAnyChannel;
@@ -78,10 +84,16 @@ public partial class MariaDBEventStorage {
             perms |= StoredUserPermissions.EditOwnMessage;
         if(up.HasFlag(UserPermissions.EditAnyMessage))
             perms |= StoredUserPermissions.EditAnyMessage;
-        if(up.HasFlag(UserPermissions.SeeIPAddress))
+        if(up.HasFlag(UserPermissions.ViewIPAddress))
             perms |= StoredUserPermissions.SeeIPAddress;
         if(up.HasFlag(UserPermissions.ViewLogs))
             perms |= StoredUserPermissions.ViewLogs;
+        if(up.HasFlag(UserPermissions.ViewBanList))
+            perms |= StoredUserPermissions.ViewBanList;
+        if(up.HasFlag(UserPermissions.PardonUser))
+            perms |= StoredUserPermissions.PardonUser;
+        if(up.HasFlag(UserPermissions.PardonIPAddress))
+            perms |= StoredUserPermissions.PardonIPAddress;
 
         return perms;
     }
diff --git a/SharpChat/EventStorage/StoredUserPermissions.cs b/SharpChat/EventStorage/StoredUserPermissions.cs
index 4a25635..3e29d2d 100644
--- a/SharpChat/EventStorage/StoredUserPermissions.cs
+++ b/SharpChat/EventStorage/StoredUserPermissions.cs
@@ -2,23 +2,26 @@
 
 [Flags]
 public enum StoredUserPermissions : int {
-    KickUser = 0x00000001,
-    BanUser = 0x00000002,
-    //SilenceUser = 0x00000004,
-    Broadcast = 0x00000008,
-    SetOwnNickname = 0x00000010,
-    SetOthersNickname = 0x00000020,
-    CreateChannel = 0x00000040,
-    DeleteChannel = 0x00010000,
-    SetChannelPermanent = 0x00000080,
-    SetChannelPassword = 0x00000100,
-    SetChannelHierarchy = 0x00000200,
-    JoinAnyChannel = 0x00020000,
-    SendMessage = 0x00000400,
-    DeleteOwnMessage = 0x00000800,
-    DeleteAnyMessage = 0x00001000,
-    EditOwnMessage = 0x00002000,
-    EditAnyMessage = 0x00004000,
-    SeeIPAddress = 0x00008000,
-    ViewLogs = 0x00040000,
+    KickUser = 0x1,
+    BanUser = 0x2,
+    //SilenceUser = 0x4,
+    Broadcast = 0x8,
+    SetOwnNickname = 0x10,
+    SetOthersNickname = 0x20,
+    CreateChannel = 0x40,
+    SetChannelPermanent = 0x80,
+    SetChannelPassword = 0x100,
+    SetChannelHierarchy = 0x200,
+    SendMessage = 0x400,
+    DeleteOwnMessage = 0x800,
+    DeleteAnyMessage = 0x1000,
+    EditOwnMessage = 0x2000,
+    EditAnyMessage = 0x4000,
+    SeeIPAddress = 0x8000,
+    DeleteChannel = 0x10000,
+    JoinAnyChannel = 0x20000,
+    ViewLogs = 0x40000,
+    ViewBanList = 0x80000,
+    PardonUser = 0x100000,
+    PardonIPAddress = 0x200000,
 }
diff --git a/SharpChat/User.cs b/SharpChat/User.cs
index 7b0f874..47c39c5 100644
--- a/SharpChat/User.cs
+++ b/SharpChat/User.cs
@@ -49,11 +49,6 @@ public class User(
         }
     }
 
-    public bool Can(UserPermissions perm, bool strict = false) {
-        UserPermissions perms = Permissions & perm;
-        return strict ? perms == perm : perms > 0;
-    }
-
     public bool NameEquals(string name) {
         return string.Equals(name, UserName, StringComparison.InvariantCultureIgnoreCase)
             || string.Equals(name, NickName, StringComparison.InvariantCultureIgnoreCase)
diff --git a/SharpChatCommon/UserPermissions.cs b/SharpChatCommon/UserPermissions.cs
index a6e9bb6..5027151 100644
--- a/SharpChatCommon/UserPermissions.cs
+++ b/SharpChatCommon/UserPermissions.cs
@@ -12,17 +12,20 @@ public enum UserPermissions : ulong {
     DeleteAnyMessage = 1ul << 3,
     EditOwnMessage = 1ul << 4,
     EditAnyMessage = 1ul << 5,
-    Broadcast = 1ul << 6,
+    SendBroadcast = 1ul << 6,
     ViewLogs = 1ul << 7,
 
     KickUser = 1ul << 10,
     BanUser = 1ul << 11,
-    SeeIPAddress = 1ul << 12,
+    PardonUser = 1ul << 12,
+    PardonIPAddress = 1ul << 13,
+    ViewIPAddress = 1ul << 14,
+    ViewBanList = 1ul << 15,
 
     CreateChannel = 1ul << 20,
     SetChannelPermanent = 1ul << 21,
     SetChannelPassword = 1ul << 22,
-    SetChannelHierarchy = 1ul << 23,
+    SetChannelMinimumRank = 1ul << 23,
     DeleteChannel = 1ul << 24,
     JoinAnyChannel = 1ul << 25,