diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/ClientGroup.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/ClientGroup.java
new file mode 100644
index 0000000..be396b0
--- /dev/null
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/ClientGroup.java
@@ -0,0 +1,26 @@
+package land.chipmunk.chayapak.chomens_bot.data.voiceChat;
+
+import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.UUID;
+
+@AllArgsConstructor
+public class ClientGroup {
+    @Getter private final UUID id;
+    @Getter private final String name;
+    @Getter private final boolean hasPassword;
+    @Getter private final boolean persistent;
+    @Getter private final GroupType type;
+
+    public static ClientGroup fromBytes(FriendlyByteBuf buf) {
+        return new ClientGroup(
+                buf.readUUID(),
+                buf.readUtf(512),
+                buf.readBoolean(),
+                buf.readBoolean(),
+                GroupType.values()[buf.readShort()]
+        );
+    }
+}
diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/GroupType.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/GroupType.java
new file mode 100644
index 0000000..6169f5e
--- /dev/null
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/GroupType.java
@@ -0,0 +1,7 @@
+package land.chipmunk.chayapak.chomens_bot.data.voiceChat;
+
+public enum GroupType {
+    NORMAL,
+    OPEN,
+    ISOLATED
+}
diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java
index 3babb4a..70f7151 100644
--- a/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java
@@ -8,16 +8,22 @@ import com.github.steveice10.packetlib.event.session.DisconnectedEvent;
 import com.github.steveice10.packetlib.packet.Packet;
 import io.netty.buffer.Unpooled;
 import land.chipmunk.chayapak.chomens_bot.Bot;
+import land.chipmunk.chayapak.chomens_bot.data.voiceChat.ClientGroup;
 import land.chipmunk.chayapak.chomens_bot.data.voiceChat.RawUdpPacket;
 import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf;
 import land.chipmunk.chayapak.chomens_bot.voiceChat.InitializationData;
 import land.chipmunk.chayapak.chomens_bot.voiceChat.NetworkMessage;
+import land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload.JoinGroupPacket;
+import land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload.SecretPacket;
 import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.*;
+import lombok.Getter;
 
 import java.net.*;
+import java.util.ArrayList;
+import java.util.List;
 
-// most of these codes are from the simple voice chat mod itself including the other voicechat classes
-// i didn't implement mic yet because my goal is to make `/voicechat test` work with the bot
+// ALMOST ALL of these codes are from the simple voice chat mod itself including the other voicechat classes
+// mic packet exists but is never sent because i am too lazy to implement the player + evilbot already has a voicechat music player
 public class VoiceChatPlugin extends Bot.Listener {
     private final Bot bot;
 
@@ -27,6 +33,8 @@ public class VoiceChatPlugin extends Bot.Listener {
 
     private boolean running = false;
 
+    @Getter private List<ClientGroup> groups = new ArrayList<>();
+
     public VoiceChatPlugin(Bot bot) {
         this.bot = bot;
 
@@ -100,9 +108,36 @@ public class VoiceChatPlugin extends Bot.Listener {
                     }
                 }
             }).start();
+        } else if (_packet.getChannel().equals("voicechat:add_group")) {
+            final byte[] bytes = _packet.getData();
+            final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes));
+
+            final ClientGroup group = ClientGroup.fromBytes(buf);
+
+            groups.add(group);
         }
     }
 
+    public void joinGroup (String group, String password) {
+        final ClientGroup[] clientGroups = groups
+                .stream()
+                .filter(eachGroup -> eachGroup.name().equals(group))
+                .toArray(ClientGroup[]::new);
+
+        if (clientGroups.length == 0) throw new RuntimeException("Group " + group + " doesn't exist");
+
+        final ClientGroup clientGroup = clientGroups[0];
+
+        final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer());
+
+        new JoinGroupPacket(clientGroup.id(), password).toBytes(buf);
+
+        bot.session().send(new ServerboundCustomPayloadPacket(
+                "voicechat:set_group",
+                buf.array()
+        ));
+    }
+
     public void sendToServer (NetworkMessage message) {
         try {
             socket.send(
@@ -144,6 +179,8 @@ public class VoiceChatPlugin extends Bot.Listener {
     public void disconnected(DisconnectedEvent event) {
         socket.close();
 
+        groups.clear();
+
         running = false;
     }
 
diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java
index 36c0aca..b3434e9 100644
--- a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java
@@ -1,7 +1,7 @@
 package land.chipmunk.chayapak.chomens_bot.voiceChat;
 
 import land.chipmunk.chayapak.chomens_bot.data.voiceChat.Codec;
-import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.SecretPacket;
+import land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload.SecretPacket;
 import lombok.Getter;
 
 import java.util.UUID;
diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java
index 3fa0d6a..33d45c0 100644
--- a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java
@@ -39,7 +39,7 @@ public class NetworkMessage {
 
     static {
         packetRegistry = new HashMap<>();
-//        packetRegistry.put((byte) 0x1, MicPacket.class);
+        packetRegistry.put((byte) 0x1, MicPacket.class);
 //        packetRegistry.put((byte) 0x2, PlayerSoundPacket.class);
 //        packetRegistry.put((byte) 0x3, GroupSoundPacket.class);
 //        packetRegistry.put((byte) 0x4, LocationSoundPacket.class);
diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/JoinGroupPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/JoinGroupPacket.java
new file mode 100644
index 0000000..d4cbc6e
--- /dev/null
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/JoinGroupPacket.java
@@ -0,0 +1,34 @@
+package land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload;
+
+import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf;
+import land.chipmunk.chayapak.chomens_bot.voiceChat.Packet;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.UUID;
+
+@AllArgsConstructor
+public class JoinGroupPacket implements Packet<JoinGroupPacket> {
+    @Getter private UUID group;
+    @Getter private String password;
+
+    public JoinGroupPacket () {}
+
+    @Override
+    public JoinGroupPacket fromBytes(FriendlyByteBuf buf) {
+        group = buf.readUUID();
+        if (buf.readBoolean()) {
+            password = buf.readUtf(512);
+        }
+        return this;
+    }
+
+    @Override
+    public void toBytes(FriendlyByteBuf buf) {
+        buf.writeUUID(group);
+        buf.writeBoolean(password != null);
+        if (password != null) {
+            buf.writeUtf(password, 512);
+        }
+    }
+}
diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/SecretPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/SecretPacket.java
similarity index 95%
rename from src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/SecretPacket.java
rename to src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/SecretPacket.java
index 38e69f4..e1b8c09 100644
--- a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/SecretPacket.java
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/SecretPacket.java
@@ -1,4 +1,4 @@
-package land.chipmunk.chayapak.chomens_bot.voiceChat.packets;
+package land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload;
 
 import land.chipmunk.chayapak.chomens_bot.data.voiceChat.Codec;
 import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf;
diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/MicPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/MicPacket.java
new file mode 100644
index 0000000..753afe4
--- /dev/null
+++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/MicPacket.java
@@ -0,0 +1,31 @@
+package land.chipmunk.chayapak.chomens_bot.voiceChat.packets;
+
+import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf;
+import land.chipmunk.chayapak.chomens_bot.voiceChat.Packet;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+public class MicPacket implements Packet<MicPacket> {
+    @Getter private byte[] data;
+    @Getter private boolean whispering;
+    @Getter private long sequenceNumber;
+
+    public MicPacket() {}
+
+    @Override
+    public MicPacket fromBytes(FriendlyByteBuf buf) {
+        MicPacket soundPacket = new MicPacket();
+        soundPacket.data = buf.readByteArray();
+        soundPacket.sequenceNumber = buf.readLong();
+        soundPacket.whispering = buf.readBoolean();
+        return soundPacket;
+    }
+
+    @Override
+    public void toBytes(FriendlyByteBuf buf) {
+        buf.writeByteArray(data);
+        buf.writeLong(sequenceNumber);
+        buf.writeBoolean(whispering);
+    }
+}