diff --git a/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs b/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs
index e9369ee..5312efd 100644
--- a/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs
+++ b/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs
@@ -2,6 +2,8 @@ using SharpChat.Auth;
 using SharpChat.Bans;
 using SharpChat.Channels;
 using SharpChat.Configuration;
+using SharpChat.Messages;
+using SharpChat.Snowflake;
 using SharpChat.SockChat.S2CPackets;
 
 namespace SharpChat.C2SPacketHandlers;
@@ -10,6 +12,7 @@ public class AuthC2SPacketHandler(
     AuthClient authClient,
     BansClient bansClient,
     ChannelsContext channelsCtx,
+    RandomSnowflake snowflake,
     CachedValue<int> maxMsgLength,
     CachedValue<int> maxConns
 ) : C2SPacketHandler {
@@ -90,7 +93,48 @@ public class AuthC2SPacketHandler(
                         await ctx.Connection.Send(new CommandResponseS2CPacket(0, LCR.WELCOME, false, line));
                 }
 
-                await ctx.Chat.HandleJoin(user, channelsCtx.DefaultChannel, ctx.Connection, maxMsgLength);
+                Channel channel = channelsCtx.DefaultChannel;
+
+                if(!ctx.Chat.IsInChannel(user, channel)) {
+                    long msgId = snowflake.Next();
+                    await ctx.Chat.SendTo(channel, new UserConnectS2CPacket(msgId, DateTimeOffset.Now, user.UserId, user.LegacyNameWithStatus, user.Colour, user.Rank, user.Permissions));
+                    await ctx.Chat.Messages.LogMessage(msgId, "user:connect", channel.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, null, MessageFlags.Log);
+                }
+
+                await ctx.Connection.Send(new AuthSuccessS2CPacket(
+                    user.UserId,
+                    user.LegacyNameWithStatus,
+                    user.Colour,
+                    user.Rank,
+                    user.Permissions,
+                    channel.Name,
+                    maxMsgLength
+                ));
+                await ctx.Connection.Send(new ContextUsersS2CPacket(
+                    ctx.Chat.GetChannelUsers(channel).Except([user]).OrderByDescending(u => u.Rank)
+                        .Select(u => new ContextUsersS2CPacket.Entry(
+                            u.UserId,
+                            u.LegacyNameWithStatus,
+                            u.Colour,
+                            u.Rank,
+                            u.Permissions,
+                            true
+                        ))
+                ));
+
+                IEnumerable<Message> msgs = await ctx.Chat.Messages.GetMessages(channel.Name);
+                foreach(Message msg in msgs)
+                    await ctx.Connection.Send(new ContextMessageS2CPacket(msg));
+
+                await ctx.Connection.Send(new ContextChannelsS2CPacket(
+                    ctx.Chat.Channels.GetChannels(user.Rank)
+                        .Select(c => new ContextChannelsS2CPacket.Entry(c.Name, c.HasPassword, c.IsTemporary))
+                ));
+
+                ctx.Chat.Users.Add(user);
+
+                ctx.Chat.ChannelUsers.Add(new Context.ChannelUserAssoc(user.UserId, channel.Name));
+                ctx.Chat.UserLastChannel[user.UserId] = channel;
             } finally {
                 ctx.Chat.ContextAccess.Release();
             }
diff --git a/SharpChat/Context.cs b/SharpChat/Context.cs
index 423a7f8..b1740dc 100644
--- a/SharpChat/Context.cs
+++ b/SharpChat/Context.cs
@@ -208,49 +208,6 @@ public class Context {
         await HandleDisconnect(user, reason);
     }
 
-    public async Task HandleJoin(User user, Channel chan, Connection conn, int maxMsgLength) {
-        if(!IsInChannel(user, chan)) {
-            long msgId = RandomSnowflake.Next();
-            await SendTo(chan, new UserConnectS2CPacket(msgId, DateTimeOffset.Now, user.UserId, user.LegacyNameWithStatus, user.Colour, user.Rank, user.Permissions));
-            await Messages.LogMessage(msgId, "user:connect", chan.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, null, MessageFlags.Log);
-        }
-
-        await conn.Send(new AuthSuccessS2CPacket(
-            user.UserId,
-            user.LegacyNameWithStatus,
-            user.Colour,
-            user.Rank,
-            user.Permissions,
-            chan.Name,
-            maxMsgLength
-        ));
-        await conn.Send(new ContextUsersS2CPacket(
-            GetChannelUsers(chan).Except([user]).OrderByDescending(u => u.Rank)
-                .Select(u => new ContextUsersS2CPacket.Entry(
-                    u.UserId,
-                    u.LegacyNameWithStatus,
-                    u.Colour,
-                    u.Rank,
-                    u.Permissions,
-                    true
-                ))
-        ));
-
-        IEnumerable<Message> msgs = await Messages.GetMessages(chan.Name);
-        foreach(Message msg in msgs)
-            await conn.Send(new ContextMessageS2CPacket(msg));
-
-        await conn.Send(new ContextChannelsS2CPacket(
-            Channels.GetChannels(user.Rank)
-                .Select(c => new ContextChannelsS2CPacket.Entry(c.Name, c.HasPassword, c.IsTemporary))
-        ));
-
-        Users.Add(user);
-
-        ChannelUsers.Add(new ChannelUserAssoc(user.UserId, chan.Name));
-        UserLastChannel[user.UserId] = chan;
-    }
-
     public async Task HandleDisconnect(User user, UserDisconnectS2CPacket.Reason reason = UserDisconnectS2CPacket.Reason.Leave) {
         await UpdateUser(user, status: UserStatus.Offline);
         Users.Remove(user);
@@ -290,10 +247,6 @@ public class Context {
             }
         }
 
-        await ForceChannelSwitch(user, chan);
-    }
-
-    public async Task ForceChannelSwitch(User user, Channel chan) {
         Channel oldChan = UserLastChannel[user.UserId];
 
         long leaveId = RandomSnowflake.Next();
diff --git a/SharpChat/SockChatServer.cs b/SharpChat/SockChatServer.cs
index 3e9b6de..9f7baaf 100644
--- a/SharpChat/SockChatServer.cs
+++ b/SharpChat/SockChatServer.cs
@@ -2,7 +2,6 @@ using Fleck;
 using SharpChat.Auth;
 using SharpChat.Bans;
 using SharpChat.C2SPacketHandlers;
-using SharpChat.Channels;
 using SharpChat.ClientCommands;
 using SharpChat.Configuration;
 using SharpChat.Messages;
@@ -69,7 +68,14 @@ public class SockChatServer : IDisposable {
                 );
             }
 
-        GuestHandlers.Add(new AuthC2SPacketHandler(authClient, bansClient, Context.Channels, MaxMessageLength, MaxConnections));
+        GuestHandlers.Add(new AuthC2SPacketHandler(
+            authClient,
+            bansClient,
+            Context.Channels,
+            Context.RandomSnowflake,
+            MaxMessageLength,
+            MaxConnections
+        ));
 
         AuthedHandlers.AddRange([
             new PingC2SPacketHandler(authClient),