diff --git a/deprecated/fabric-networking-v0/src/client/java/net/fabricmc/fabric/impl/networking/ClientSidePacketRegistryImpl.java b/deprecated/fabric-networking-v0/src/client/java/net/fabricmc/fabric/impl/networking/ClientSidePacketRegistryImpl.java
index 5436b81d2..b3b8d3e78 100644
--- a/deprecated/fabric-networking-v0/src/client/java/net/fabricmc/fabric/impl/networking/ClientSidePacketRegistryImpl.java
+++ b/deprecated/fabric-networking-v0/src/client/java/net/fabricmc/fabric/impl/networking/ClientSidePacketRegistryImpl.java
@@ -44,7 +44,7 @@ public class ClientSidePacketRegistryImpl implements ClientSidePacketRegistry, P
 	@Override
 	public void sendToServer(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> completionListener) {
 		if (MinecraftClient.getInstance().getNetworkHandler() != null) {
-			MinecraftClient.getInstance().getNetworkHandler().getConnection().send(packet, completionListener);
+			MinecraftClient.getInstance().getNetworkHandler().getConnection().send(packet, GenericFutureListenerHolder.create(completionListener));
 			return;
 		}
 
diff --git a/deprecated/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/networking/ServerSidePacketRegistryImpl.java b/deprecated/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/networking/ServerSidePacketRegistryImpl.java
index 49c1122cf..287320459 100644
--- a/deprecated/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/networking/ServerSidePacketRegistryImpl.java
+++ b/deprecated/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/networking/ServerSidePacketRegistryImpl.java
@@ -49,7 +49,7 @@ public class ServerSidePacketRegistryImpl implements ServerSidePacketRegistry, P
 	@Override
 	public void sendToPlayer(PlayerEntity player, Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> completionListener) {
 		if (player instanceof ServerPlayerEntity) {
-			((ServerPlayerEntity) player).networkHandler.sendPacket(packet, completionListener);
+			((ServerPlayerEntity) player).networkHandler.sendPacket(packet, GenericFutureListenerHolder.create(completionListener));
 			return;
 		}
 
diff --git a/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/api/message/v1/ServerMessageEvents.java b/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/api/message/v1/ServerMessageEvents.java
index e944a818d..371ffff66 100644
--- a/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/api/message/v1/ServerMessageEvents.java
+++ b/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/api/message/v1/ServerMessageEvents.java
@@ -20,7 +20,6 @@ import net.minecraft.network.message.MessageType;
 import net.minecraft.network.message.SignedMessage;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.command.ServerCommandSource;
-import net.minecraft.server.filter.FilteredMessage;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.text.Text;
 
@@ -147,7 +146,7 @@ public final class ServerMessageEvents {
 		 * @param params the {@link MessageType.Parameters}
 		 * @return {@code true} if the message should be broadcast, otherwise {@code false}
 		 */
-		boolean allowChatMessage(FilteredMessage<SignedMessage> message, ServerPlayerEntity sender, MessageType.Parameters params);
+		boolean allowChatMessage(SignedMessage message, ServerPlayerEntity sender, MessageType.Parameters params);
 	}
 
 	@FunctionalInterface
@@ -183,7 +182,7 @@ public final class ServerMessageEvents {
 		 * @param params the {@link MessageType.Parameters}
 		 * @return {@code true} if the message should be broadcast, otherwise {@code false}
 		 */
-		boolean allowCommandMessage(FilteredMessage<SignedMessage> message, ServerCommandSource source, MessageType.Parameters params);
+		boolean allowCommandMessage(SignedMessage message, ServerCommandSource source, MessageType.Parameters params);
 	}
 
 	@FunctionalInterface
@@ -201,7 +200,7 @@ public final class ServerMessageEvents {
 		 * @param sender  the player that sent the message
 		 * @param params the {@link MessageType.Parameters}
 		 */
-		void onChatMessage(FilteredMessage<SignedMessage> message, ServerPlayerEntity sender, MessageType.Parameters params);
+		void onChatMessage(SignedMessage message, ServerPlayerEntity sender, MessageType.Parameters params);
 	}
 
 	@FunctionalInterface
@@ -232,6 +231,6 @@ public final class ServerMessageEvents {
 		 * @param source  the command source that sent the message
 		 * @param params the {@link MessageType.Parameters}
 		 */
-		void onCommandMessage(FilteredMessage<SignedMessage> message, ServerCommandSource source, MessageType.Parameters params);
+		void onCommandMessage(SignedMessage message, ServerCommandSource source, MessageType.Parameters params);
 	}
 }
diff --git a/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/mixin/message/PlayerManagerMixin.java b/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/mixin/message/PlayerManagerMixin.java
index e87b001ca..10959275f 100644
--- a/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/mixin/message/PlayerManagerMixin.java
+++ b/fabric-message-api-v1/src/main/java/net/fabricmc/fabric/mixin/message/PlayerManagerMixin.java
@@ -30,7 +30,6 @@ import net.minecraft.network.message.SignedMessage;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.PlayerManager;
 import net.minecraft.server.command.ServerCommandSource;
-import net.minecraft.server.filter.FilteredMessage;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.text.Text;
 
@@ -42,8 +41,8 @@ public class PlayerManagerMixin {
 	@Final
 	private MinecraftServer server;
 
-	@Inject(method = "broadcast(Lnet/minecraft/server/filter/FilteredMessage;Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/network/message/MessageType$Parameters;)V", at = @At("HEAD"), cancellable = true)
-	private void onSendChatMessage(FilteredMessage<SignedMessage> message, ServerPlayerEntity sender, MessageType.Parameters params, CallbackInfo ci) {
+	@Inject(method = "broadcast(Lnet/minecraft/network/message/SignedMessage;Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/network/message/MessageType$Parameters;)V", at = @At("HEAD"), cancellable = true)
+	private void onSendChatMessage(SignedMessage message, ServerPlayerEntity sender, MessageType.Parameters params, CallbackInfo ci) {
 		if (!ServerMessageEvents.ALLOW_CHAT_MESSAGE.invoker().allowChatMessage(message, sender, params)) {
 			ci.cancel();
 			return;
@@ -62,8 +61,8 @@ public class PlayerManagerMixin {
 		ServerMessageEvents.GAME_MESSAGE.invoker().onGameMessage(this.server, message, overlay);
 	}
 
-	@Inject(method = "broadcast(Lnet/minecraft/server/filter/FilteredMessage;Lnet/minecraft/server/command/ServerCommandSource;Lnet/minecraft/network/message/MessageType$Parameters;)V", at = @At("HEAD"), cancellable = true)
-	private void onSendCommandMessage(FilteredMessage<SignedMessage> message, ServerCommandSource source, MessageType.Parameters params, CallbackInfo ci) {
+	@Inject(method = "broadcast(Lnet/minecraft/network/message/SignedMessage;Lnet/minecraft/server/command/ServerCommandSource;Lnet/minecraft/network/message/MessageType$Parameters;)V", at = @At("HEAD"), cancellable = true)
+	private void onSendCommandMessage(SignedMessage message, ServerCommandSource source, MessageType.Parameters params, CallbackInfo ci) {
 		if (!ServerMessageEvents.ALLOW_COMMAND_MESSAGE.invoker().allowCommandMessage(message, source, params)) {
 			ci.cancel();
 			return;
diff --git a/fabric-message-api-v1/src/testmod/java/net/fabricmc/fabric/test/message/ChatTest.java b/fabric-message-api-v1/src/testmod/java/net/fabricmc/fabric/test/message/ChatTest.java
index 60213bd82..a782f4c79 100644
--- a/fabric-message-api-v1/src/testmod/java/net/fabricmc/fabric/test/message/ChatTest.java
+++ b/fabric-message-api-v1/src/testmod/java/net/fabricmc/fabric/test/message/ChatTest.java
@@ -95,7 +95,7 @@ public class ChatTest implements ModInitializer {
 
 		// ServerMessageEvents blocking
 		ServerMessageEvents.ALLOW_CHAT_MESSAGE.register(
-				(message, sender, params) -> !message.raw().getContent().getString().contains("sadtater")
+				(message, sender, params) -> !message.getContent().getString().contains("sadtater")
 		);
 		ServerMessageEvents.ALLOW_GAME_MESSAGE.register((server, message, overlay) -> {
 			if (message.getContent() instanceof TranslatableTextContent translatable) {
@@ -105,7 +105,7 @@ public class ChatTest implements ModInitializer {
 			return true;
 		});
 		ServerMessageEvents.ALLOW_COMMAND_MESSAGE.register(
-				(message, source, params) -> !message.raw().getContent().getString().contains("sadtater")
+				(message, source, params) -> !message.getContent().getString().contains("sadtater")
 		);
 	}
 }
diff --git a/fabric-networking-api-v1/src/client/java/net/fabricmc/fabric/impl/networking/client/ClientLoginNetworkAddon.java b/fabric-networking-api-v1/src/client/java/net/fabricmc/fabric/impl/networking/client/ClientLoginNetworkAddon.java
index e847c7602..d2e6c8983 100644
--- a/fabric-networking-api-v1/src/client/java/net/fabricmc/fabric/impl/networking/client/ClientLoginNetworkAddon.java
+++ b/fabric-networking-api-v1/src/client/java/net/fabricmc/fabric/impl/networking/client/ClientLoginNetworkAddon.java
@@ -39,6 +39,7 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientLoginNetworking;
 import net.fabricmc.fabric.api.networking.v1.FutureListeners;
 import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
 import net.fabricmc.fabric.impl.networking.AbstractNetworkAddon;
+import net.fabricmc.fabric.impl.networking.GenericFutureListenerHolder;
 
 @Environment(EnvType.CLIENT)
 public final class ClientLoginNetworkAddon extends AbstractNetworkAddon<ClientLoginNetworking.LoginQueryRequestHandler> {
@@ -91,7 +92,7 @@ public final class ClientLoginNetworkAddon extends AbstractNetworkAddon<ClientLo
 					listener = FutureListeners.union(listener, each);
 				}
 
-				this.handler.getConnection().send(packet, listener);
+				this.handler.getConnection().send(packet, GenericFutureListenerHolder.create(listener));
 			});
 		} catch (Throwable ex) {
 			this.logger.error("Encountered exception while handling in channel with name \"{}\"", channelName, ex);
diff --git a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/api/networking/v1/PacketSender.java b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/api/networking/v1/PacketSender.java
index 6b45f60b8..c33190f0b 100644
--- a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/api/networking/v1/PacketSender.java
+++ b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/api/networking/v1/PacketSender.java
@@ -23,6 +23,7 @@ import io.netty.util.concurrent.Future;
 import io.netty.util.concurrent.GenericFutureListener;
 import org.jetbrains.annotations.Nullable;
 
+import net.minecraft.class_7648;
 import net.minecraft.network.Packet;
 import net.minecraft.network.PacketByteBuf;
 import net.minecraft.util.Identifier;
@@ -55,6 +56,14 @@ public interface PacketSender {
 	 */
 	void sendPacket(Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> callback);
 
+	/**
+	 * Sends a packet.
+	 *
+	 * @param packet the packet
+	 * @param callback an optional callback to execute after the packet is sent, may be {@code null}. The callback may also accept a {@link ChannelFutureListener}.
+	 */
+	void sendPacket(Packet<?> packet, @Nullable class_7648 callback);
+
 	/**
 	 * Sends a packet to a channel.
 	 *
@@ -76,7 +85,7 @@ public interface PacketSender {
 	 * @param callback an optional callback to execute after the packet is sent, may be {@code null}
 	 */
 	// the generic future listener can accept ChannelFutureListener
-	default void sendPacket(Identifier channel, PacketByteBuf buf, @Nullable GenericFutureListener<? extends Future<? super Void>> callback) {
+	default void sendPacket(Identifier channel, PacketByteBuf buf, @Nullable class_7648 callback) {
 		Objects.requireNonNull(channel, "Channel cannot be null");
 		Objects.requireNonNull(buf, "Payload cannot be null");
 
diff --git a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/AbstractChanneledNetworkAddon.java b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/AbstractChanneledNetworkAddon.java
index 7f764836e..477b9f4fe 100644
--- a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/AbstractChanneledNetworkAddon.java
+++ b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/AbstractChanneledNetworkAddon.java
@@ -30,6 +30,7 @@ import io.netty.util.concurrent.Future;
 import io.netty.util.concurrent.GenericFutureListener;
 import org.jetbrains.annotations.Nullable;
 
+import net.minecraft.class_7648;
 import net.minecraft.network.ClientConnection;
 import net.minecraft.network.Packet;
 import net.minecraft.network.PacketByteBuf;
@@ -176,7 +177,12 @@ public abstract class AbstractChanneledNetworkAddon<H> extends AbstractNetworkAd
 	}
 
 	@Override
-	public void sendPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> callback) {
+	public void sendPacket(Packet<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> callback) {
+		sendPacket(packet, GenericFutureListenerHolder.create(callback));
+	}
+
+	@Override
+	public void sendPacket(Packet<?> packet, class_7648 callback) {
 		Objects.requireNonNull(packet, "Packet cannot be null");
 
 		this.connection.send(packet, callback);
diff --git a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/GenericFutureListenerHolder.java b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/GenericFutureListenerHolder.java
new file mode 100644
index 000000000..98b529ac0
--- /dev/null
+++ b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/GenericFutureListenerHolder.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2016, 2017, 2018, 2019 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.fabric.impl.networking;
+
+import java.util.Objects;
+
+import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.GenericFutureListener;
+import org.jetbrains.annotations.Nullable;
+
+import net.minecraft.class_7648;
+import net.minecraft.network.ClientConnection;
+import net.minecraft.network.Packet;
+
+/**
+ * We still need to support {@link GenericFutureListener} so we use this disguise impl {@link class_7648}
+ * to get our {@link GenericFutureListener} to into {@link ClientConnection}
+ */
+public final class GenericFutureListenerHolder implements class_7648 {
+	private final GenericFutureListener<? extends Future<? super Void>> delegate;
+
+	private GenericFutureListenerHolder(GenericFutureListener<? extends Future<? super Void>> delegate) {
+		this.delegate = Objects.requireNonNull(delegate);
+	}
+
+	@Nullable
+	public static GenericFutureListenerHolder create(@Nullable GenericFutureListener<? extends Future<? super Void>> delegate) {
+		if (delegate == null) {
+			return null;
+		}
+
+		return new GenericFutureListenerHolder(delegate);
+	}
+
+	public GenericFutureListener<? extends Future<? super Void>> getDelegate() {
+		return delegate;
+	}
+
+	@Override
+	public void method_45083() {
+		throw new AssertionError("Should not be called");
+	}
+
+	@Nullable
+	@Override
+	public Packet<?> method_45086() {
+		throw new AssertionError("Should not be called");
+	}
+}
diff --git a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/server/ServerLoginNetworkAddon.java b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/server/ServerLoginNetworkAddon.java
index c471b26ca..26be0becf 100644
--- a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/server/ServerLoginNetworkAddon.java
+++ b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/server/ServerLoginNetworkAddon.java
@@ -29,6 +29,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import io.netty.util.concurrent.GenericFutureListener;
 import org.jetbrains.annotations.Nullable;
 
+import net.minecraft.class_7648;
 import net.minecraft.network.ClientConnection;
 import net.minecraft.network.Packet;
 import net.minecraft.network.PacketByteBuf;
@@ -44,6 +45,7 @@ import net.fabricmc.fabric.api.networking.v1.PacketSender;
 import net.fabricmc.fabric.api.networking.v1.ServerLoginConnectionEvents;
 import net.fabricmc.fabric.api.networking.v1.ServerLoginNetworking;
 import net.fabricmc.fabric.impl.networking.AbstractNetworkAddon;
+import net.fabricmc.fabric.impl.networking.GenericFutureListenerHolder;
 import net.fabricmc.fabric.mixin.networking.accessor.LoginQueryResponseC2SPacketAccessor;
 import net.fabricmc.fabric.mixin.networking.accessor.ServerLoginNetworkHandlerAccessor;
 
@@ -113,8 +115,8 @@ public final class ServerLoginNetworkAddon extends AbstractNetworkAddon<ServerLo
 	private void sendCompressionPacket() {
 		// Compression is not needed for local transport
 		if (this.server.getNetworkCompressionThreshold() >= 0 && !this.connection.isLocal()) {
-			this.connection.send(new LoginCompressionS2CPacket(this.server.getNetworkCompressionThreshold()), (channelFuture) ->
-					this.connection.setCompressionThreshold(this.server.getNetworkCompressionThreshold(), true)
+			this.connection.send(new LoginCompressionS2CPacket(this.server.getNetworkCompressionThreshold()),
+					class_7648.method_45084(() -> connection.setCompressionThreshold(server.getNetworkCompressionThreshold(), true))
 			);
 		}
 	}
@@ -174,7 +176,12 @@ public final class ServerLoginNetworkAddon extends AbstractNetworkAddon<ServerLo
 	}
 
 	@Override
-	public void sendPacket(Packet<?> packet, GenericFutureListener<? extends io.netty.util.concurrent.Future<? super Void>> callback) {
+	public void sendPacket(Packet<?> packet, @Nullable GenericFutureListener<? extends io.netty.util.concurrent.Future<? super Void>> callback) {
+		sendPacket(packet, GenericFutureListenerHolder.create(callback));
+	}
+
+	@Override
+	public void sendPacket(Packet<?> packet, class_7648 callback) {
 		Objects.requireNonNull(packet, "Packet cannot be null");
 
 		this.connection.send(packet, callback);
diff --git a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/mixin/networking/ClientConnectionMixin.java b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/mixin/networking/ClientConnectionMixin.java
index c04686245..72b2cf97c 100644
--- a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/mixin/networking/ClientConnectionMixin.java
+++ b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/mixin/networking/ClientConnectionMixin.java
@@ -20,9 +20,10 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.concurrent.ConcurrentHashMap;
 
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelFutureListener;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.GenericFutureListener;
+import org.jetbrains.annotations.Nullable;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.Unique;
@@ -30,9 +31,12 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.Redirect;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
 
+import net.minecraft.class_7648;
 import net.minecraft.network.ClientConnection;
 import net.minecraft.network.NetworkSide;
+import net.minecraft.network.NetworkState;
 import net.minecraft.network.Packet;
 import net.minecraft.network.listener.PacketListener;
 import net.minecraft.text.Text;
@@ -40,6 +44,7 @@ import net.minecraft.util.Identifier;
 
 import net.fabricmc.fabric.impl.networking.ChannelInfoHolder;
 import net.fabricmc.fabric.impl.networking.DisconnectPacketSource;
+import net.fabricmc.fabric.impl.networking.GenericFutureListenerHolder;
 import net.fabricmc.fabric.impl.networking.NetworkHandlerExtensions;
 import net.fabricmc.fabric.impl.networking.PacketCallbackListener;
 
@@ -49,10 +54,10 @@ abstract class ClientConnectionMixin implements ChannelInfoHolder {
 	private PacketListener packetListener;
 
 	@Shadow
-	public abstract void send(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> callback);
+	public abstract void disconnect(Text disconnectReason);
 
 	@Shadow
-	public abstract void disconnect(Text disconnectReason);
+	public abstract void send(Packet<?> packet, @Nullable class_7648 arg);
 
 	@Unique
 	private Collection<Identifier> playChannels;
@@ -63,9 +68,8 @@ abstract class ClientConnectionMixin implements ChannelInfoHolder {
 	}
 
 	// Must be fully qualified due to mixin not working in production without it
-	@SuppressWarnings("UnnecessaryQualifiedMemberReference")
-	@Redirect(method = "Lnet/minecraft/network/ClientConnection;exceptionCaught(Lio/netty/channel/ChannelHandlerContext;Ljava/lang/Throwable;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ClientConnection;send(Lnet/minecraft/network/Packet;Lio/netty/util/concurrent/GenericFutureListener;)V"))
-	private void resendOnExceptionCaught(ClientConnection self, Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> listener, ChannelHandlerContext context, Throwable ex) {
+	@Redirect(method = "exceptionCaught", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ClientConnection;send(Lnet/minecraft/network/Packet;Lnet/minecraft/class_7648;)V"))
+	private void resendOnExceptionCaught(ClientConnection self, Packet<?> packet, class_7648 listener, ChannelHandlerContext context, Throwable ex) {
 		PacketListener handler = this.packetListener;
 		Text disconnectMessage = Text.translatable("disconnect.genericReason", "Internal Exception: " + ex);
 
@@ -77,7 +81,7 @@ abstract class ClientConnectionMixin implements ChannelInfoHolder {
 	}
 
 	@Inject(method = "sendImmediately", at = @At(value = "FIELD", target = "Lnet/minecraft/network/ClientConnection;packetsSentCounter:I"))
-	private void checkPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> callback, CallbackInfo ci) {
+	private void checkPacket(Packet<?> packet, class_7648 callback, CallbackInfo ci) {
 		if (this.packetListener instanceof PacketCallbackListener) {
 			((PacketCallbackListener) this.packetListener).sent(packet);
 		}
@@ -90,6 +94,15 @@ abstract class ClientConnectionMixin implements ChannelInfoHolder {
 		}
 	}
 
+	@Inject(method = "sendInternal", at = @At(value = "INVOKE_ASSIGN", target = "Lio/netty/channel/Channel;writeAndFlush(Ljava/lang/Object;)Lio/netty/channel/ChannelFuture;"), locals = LocalCapture.CAPTURE_FAILHARD)
+	private void sendInternal(Packet<?> packet, @Nullable class_7648 listener, NetworkState packetState, NetworkState currentState, CallbackInfo ci, ChannelFuture channelFuture) {
+		if (listener instanceof GenericFutureListenerHolder holder) {
+			channelFuture.addListener(holder.getDelegate());
+			channelFuture.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
+			ci.cancel();
+		}
+	}
+
 	@Override
 	public Collection<Identifier> getPendingChannelsNames() {
 		return this.playChannels;
diff --git a/gradle.properties b/gradle.properties
index 3464e4beb..922f2569b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,8 +1,8 @@
 org.gradle.jvmargs=-Xmx2560M
 org.gradle.parallel=true
 
-version=0.58.2
-minecraft_version=1.19.1-rc2
+version=0.58.3
+minecraft_version=1.19.1-rc3
 yarn_version=+build.1
 loader_version=0.14.8
 
@@ -16,10 +16,10 @@ fabric-blockrenderlayer-v1-version=1.1.18
 fabric-command-api-v1-version=1.2.9
 fabric-command-api-v2-version=2.1.5
 fabric-commands-v0-version=0.2.26
-fabric-containers-v0-version=0.1.29
+fabric-containers-v0-version=0.1.30
 fabric-content-registries-v0-version=3.2.1
 fabric-crash-report-info-v1-version=0.2.3
-fabric-data-generation-api-v1-version=5.1.3
+fabric-data-generation-api-v1-version=5.1.4
 fabric-dimensions-v1-version=2.1.28
 fabric-entity-events-v1-version=1.4.16
 fabric-events-interaction-v0-version=0.4.26
@@ -33,14 +33,14 @@ fabric-keybindings-v0-version=0.2.16
 fabric-lifecycle-events-v1-version=2.1.0
 fabric-loot-api-v2-version=1.1.1
 fabric-loot-tables-v1-version=1.1.4
-fabric-message-api-v1-version=4.0.0
+fabric-message-api-v1-version=5.0.0
 fabric-mining-level-api-v1-version=2.1.11
 fabric-models-v0-version=0.3.15
-fabric-networking-api-v1-version=1.1.0
-fabric-networking-v0-version=0.3.16
+fabric-networking-api-v1-version=1.2.0
+fabric-networking-v0-version=0.3.17
 fabric-object-builder-api-v1-version=4.0.8
 fabric-particles-v1-version=1.0.8
-fabric-registry-sync-v0-version=0.9.19
+fabric-registry-sync-v0-version=0.9.20
 fabric-renderer-api-v1-version=1.0.8
 fabric-renderer-indigo-version=0.6.10
 fabric-renderer-registries-v1-version=3.2.18
@@ -51,7 +51,7 @@ fabric-rendering-v1-version=1.10.14
 fabric-resource-conditions-api-v1-version=2.0.9
 fabric-resource-loader-v0-version=0.5.6
 fabric-screen-api-v1-version=1.0.24
-fabric-screen-handler-api-v1-version=1.2.8
+fabric-screen-handler-api-v1-version=1.2.9
 fabric-textures-v0-version=1.0.18
 fabric-transfer-api-v1-version=2.0.9
 fabric-transitive-access-wideners-v1-version=1.1.1