diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java
index 5aa15635e..551b0e584 100644
--- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java
+++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java
@@ -32,6 +32,7 @@ import com.fasterxml.jackson.databind.introspect.AnnotatedField;
 import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
 import lombok.Getter;
 import net.minecrell.terminalconsole.TerminalConsoleAppender;
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Logger;
@@ -167,11 +168,6 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
         this.onEnable();
     }
 
-    public void onEnable(boolean useGui) {
-        this.useGui = useGui;
-        this.onEnable();
-    }
-
     @Override
     public void onEnable() {
         Logger logger = (Logger) LogManager.getRootLogger();
@@ -213,6 +209,9 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
         }
         GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
 
+        // Allow libraries like Protocol to have their debug information passthrough
+        logger.get().setLevel(geyserConfig.isDebugMode() ? Level.DEBUG : Level.INFO);
+
         connector = GeyserConnector.start(PlatformType.STANDALONE, this);
         geyserCommandManager = new GeyserCommandManager(connector);
 
diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
index 4ec87d7b6..f86e0b1e6 100644
--- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
+++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
@@ -56,10 +56,7 @@ import org.geysermc.connector.network.translators.world.WorldManager;
 import org.geysermc.connector.network.translators.world.block.BlockTranslator;
 import org.geysermc.connector.network.translators.world.block.entity.BlockEntityTranslator;
 import org.geysermc.connector.network.translators.world.block.entity.SkullBlockEntityTranslator;
-import org.geysermc.connector.utils.DimensionUtils;
-import org.geysermc.connector.utils.LanguageUtils;
-import org.geysermc.connector.utils.LocaleUtils;
-import org.geysermc.connector.utils.ResourcePack;
+import org.geysermc.connector.utils.*;
 
 import javax.naming.directory.Attribute;
 import javax.naming.directory.InitialDirContext;
@@ -190,6 +187,7 @@ public class GeyserConnector {
         remoteServer = new RemoteServer(config.getRemote().getAddress(), remotePort);
         authType = AuthType.getByName(config.getRemote().getAuthType());
 
+        CooldownUtils.setShowCooldown(config.isShowCooldown());
         DimensionUtils.changeBedrockNetherId(config.isAboveBedrockNetherBuilding()); // Apply End dimension ID workaround to Nether
         SkullBlockEntityTranslator.ALLOW_CUSTOM_SKULLS = config.isAllowCustomSkulls();
 
diff --git a/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java
index e21aa6bb8..31bcbe995 100644
--- a/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java
+++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java
@@ -59,6 +59,8 @@ public interface GeyserConfiguration {
 
     int getPingPassthroughInterval();
 
+    boolean isForwardPlayerPing();
+
     int getMaxPlayers();
 
     boolean isDebugMode();
diff --git a/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java
index 7c9532ff8..4e03da52f 100644
--- a/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java
+++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java
@@ -74,6 +74,9 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration
     @JsonProperty("ping-passthrough-interval")
     private int pingPassthroughInterval = 3;
 
+    @JsonProperty("forward-player-ping")
+    private boolean forwardPlayerPing = false;
+
     @JsonProperty("max-players")
     private int maxPlayers = 100;
 
diff --git a/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java b/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java
index 1afcf08d3..ed5272b89 100644
--- a/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java
+++ b/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java
@@ -43,7 +43,7 @@ public class BoatEntity extends Entity {
      */
     private static final String BUOYANCY_DATA = "{\"apply_gravity\":true,\"base_buoyancy\":1.0,\"big_wave_probability\":0.02999999932944775," +
             "\"big_wave_speed\":10.0,\"drag_down_on_buoyancy_removed\":0.0,\"liquid_blocks\":[\"minecraft:water\"," +
-            "\"minecraft:flowing_water\"],\"simulate_waves\":false}}";
+            "\"minecraft:flowing_water\"],\"simulate_waves\":false}";
 
     private boolean isPaddlingLeft;
     private float paddleTimeLeft;
diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
index 17c6bd66c..15357ada3 100644
--- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
+++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
@@ -203,6 +203,9 @@ public class GeyserSession implements CommandSender {
     @Setter
     private boolean sprinting;
 
+    /**
+     * Not updated if cache chunks is enabled.
+     */
     @Setter
     private boolean jumping;
 
@@ -611,8 +614,10 @@ public class GeyserSession implements CommandSender {
             downstream.getSession().setFlag(BuiltinFlags.ENABLE_CLIENT_PROXY_PROTOCOL, true);
             downstream.getSession().setFlag(BuiltinFlags.CLIENT_PROXIED_ADDRESS, upstream.getAddress());
         }
-        // Let Geyser handle sending the keep alive
-        downstream.getSession().setFlag(MinecraftConstants.AUTOMATIC_KEEP_ALIVE_MANAGEMENT, false);
+        if (connector.getConfig().isForwardPlayerPing()) {
+            // Let Geyser handle sending the keep alive
+            downstream.getSession().setFlag(MinecraftConstants.AUTOMATIC_KEEP_ALIVE_MANAGEMENT, false);
+        }
         downstream.getSession().addListener(new SessionAdapter() {
             @Override
             public void packetSending(PacketSendingEvent event) {
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java
index b841a79b2..eb26dbff9 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java
@@ -30,6 +30,7 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdate
 import com.github.steveice10.packetlib.packet.Packet;
 import com.nukkitx.protocol.bedrock.BedrockPacket;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import org.geysermc.common.PlatformType;
 import org.geysermc.connector.GeyserConnector;
 import org.geysermc.connector.network.session.GeyserSession;
 import org.geysermc.connector.utils.FileUtils;
@@ -89,12 +90,15 @@ public class PacketTranslatorRegistry<T> {
     public <P extends T> boolean translate(Class<? extends P> clazz, P packet, GeyserSession session) {
         if (!session.getUpstream().isClosed() && !session.isClosed()) {
             try {
-                if (translators.containsKey(clazz)) {
-                    ((PacketTranslator<P>) translators.get(clazz)).translate(packet, session);
+                PacketTranslator<P> translator = (PacketTranslator<P>) translators.get(clazz);
+                if (translator != null) {
+                    translator.translate(packet, session);
                     return true;
                 } else {
-                    if (!IGNORED_PACKETS.contains(clazz))
+                    if ((GeyserConnector.getInstance().getPlatformType() != PlatformType.STANDALONE || !(packet instanceof BedrockPacket)) && !IGNORED_PACKETS.contains(clazz)) {
+                        // Other debug logs already take care of Bedrock packets for us if on standalone
                         GeyserConnector.getInstance().getLogger().debug("Could not find packet for " + (packet.toString().length() > 25 ? packet.getClass().getSimpleName() : packet));
+                    }
                 }
             } catch (Throwable ex) {
                 GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.network.translator.packet.failed", packet.getClass().getSimpleName()), ex);
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java
index 38e5981e6..56387fd58 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java
@@ -33,23 +33,25 @@ import org.geysermc.connector.network.translators.Translator;
 import org.geysermc.floodgate.util.DeviceOS;
 
 /**
- * Used to send the keep alive packet back to the server
+ * Used to send the forwarded keep alive packet back to the server
  */
 @Translator(packet = NetworkStackLatencyPacket.class)
 public class BedrockNetworkStackLatencyTranslator extends PacketTranslator<NetworkStackLatencyPacket> {
 
     @Override
     public void translate(NetworkStackLatencyPacket packet, GeyserSession session) {
-        long pingId;
-        // so apparently, as of 1.16.200
-        // PS4 divides the network stack latency timestamp FOR US!!!
-        // WTF
-        if (session.getClientData().getDeviceOS().equals(DeviceOS.NX)) {
-            // Ignore the weird DeviceOS, our order is wrong and will be fixed in Floodgate 2.0
-            pingId = packet.getTimestamp();
-        } else {
-            pingId = packet.getTimestamp() / 1000;
+        if (session.getConnector().getConfig().isForwardPlayerPing()) {
+            long pingId;
+            // so apparently, as of 1.16.200
+            // PS4 divides the network stack latency timestamp FOR US!!!
+            // WTF
+            if (session.getClientData().getDeviceOS().equals(DeviceOS.NX)) {
+                // Ignore the weird DeviceOS, our order is wrong and will be fixed in Floodgate 2.0
+                pingId = packet.getTimestamp();
+            } else {
+                pingId = packet.getTimestamp() / 1000;
+            }
+            session.sendDownstreamPacket(new ClientKeepAlivePacket(pingId));
         }
-        session.sendDownstreamPacket(new ClientKeepAlivePacket(pingId));
     }
 }
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockActionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockActionTranslator.java
index d0184c4d8..a60f46ac6 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockActionTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockActionTranslator.java
@@ -204,10 +204,11 @@ public class BedrockActionTranslator extends PacketTranslator<PlayerActionPacket
                 session.getEntityCache().updateBossBars();
                 break;
             case JUMP:
-                session.setJumping(true);
-                session.getConnector().getGeneralThreadPool().schedule(() -> {
-                    session.setJumping(false);
-                }, 1, TimeUnit.SECONDS);
+                if (!session.getConnector().getConfig().isCacheChunks()) {
+                    // Save the jumping status for determining teleport status
+                    session.setJumping(true);
+                    session.getConnector().getGeneralThreadPool().schedule(() -> session.setJumping(false), 1, TimeUnit.SECONDS);
+                }
                 break;
         }
     }
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaKeepAliveTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaKeepAliveTranslator.java
index 76e9b0958..8506389f3 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaKeepAliveTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaKeepAliveTranslator.java
@@ -39,6 +39,9 @@ public class JavaKeepAliveTranslator extends PacketTranslator<ServerKeepAlivePac
 
     @Override
     public void translate(ServerKeepAlivePacket packet, GeyserSession session) {
+        if (!session.getConnector().getConfig().isForwardPlayerPing()) {
+            return;
+        }
         NetworkStackLatencyPacket latencyPacket = new NetworkStackLatencyPacket();
         latencyPacket.setFromServer(true);
         latencyPacket.setTimestamp(packet.getPingId() * 1000);
diff --git a/connector/src/main/java/org/geysermc/connector/utils/CooldownUtils.java b/connector/src/main/java/org/geysermc/connector/utils/CooldownUtils.java
index 5a49fd9be..816b718aa 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/CooldownUtils.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/CooldownUtils.java
@@ -26,7 +26,6 @@
 package org.geysermc.connector.utils;
 
 import com.nukkitx.protocol.bedrock.packet.SetTitlePacket;
-import org.geysermc.connector.GeyserConnector;
 import org.geysermc.connector.network.session.GeyserSession;
 
 import java.util.concurrent.TimeUnit;
@@ -36,11 +35,10 @@ import java.util.concurrent.TimeUnit;
  * Much of the work here is from the wonderful folks from ViaRewind: https://github.com/ViaVersion/ViaRewind
  */
 public class CooldownUtils {
+    private static boolean SHOW_COOLDOWN;
 
-    private final static boolean SHOW_COOLDOWN;
-
-    static {
-        SHOW_COOLDOWN = GeyserConnector.getInstance().getConfig().isShowCooldown();
+    public static void setShowCooldown(boolean showCooldown) {
+        SHOW_COOLDOWN = showCooldown;
     }
 
     /**
@@ -116,5 +114,4 @@ public class CooldownUtils {
         }
         return builder.toString();
     }
-
 }
diff --git a/connector/src/main/java/org/geysermc/connector/utils/LocaleUtils.java b/connector/src/main/java/org/geysermc/connector/utils/LocaleUtils.java
index f2ec43bf6..15a52cf7f 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/LocaleUtils.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/LocaleUtils.java
@@ -101,7 +101,7 @@ public class LocaleUtils {
                 ASSET_MAP.put(entry.getKey(), asset);
             }
         } catch (Exception e) {
-            GeyserConnector.getInstance().getLogger().info(LanguageUtils.getLocaleStringLog("geyser.locale.fail.asset_cache", (!e.getMessage().isEmpty() ? e.getMessage() : e.getStackTrace())));
+            GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.locale.fail.asset_cache", (!e.getMessage().isEmpty() ? e.getMessage() : e.getStackTrace())));
         }
     }
 
@@ -260,7 +260,7 @@ public class LocaleUtils {
             // Delete the nolonger needed client/server jar
             Files.delete(tmpFilePath);
         } catch (Exception e) {
-            throw new AssertionError(LanguageUtils.getLocaleStringLog("geyser.locale.fail.en_us"), e);
+            GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.locale.fail.en_us"), e);
         }
     }
 
diff --git a/connector/src/main/resources/config.yml b/connector/src/main/resources/config.yml
index 07b73173e..cdb2cb362 100644
--- a/connector/src/main/resources/config.yml
+++ b/connector/src/main/resources/config.yml
@@ -81,7 +81,11 @@ legacy-ping-passthrough: false
 # Increase if you are getting BrokenPipe errors.
 ping-passthrough-interval: 3
 
-# Maximum amount of players that can connect
+# Whether to forward player ping to the server. While enabling this will allow Bedrock players to have more accurate
+# ping, it may also cause players to time out more easily.
+forward-player-ping: false
+
+# Maximum amount of players that can connect. This is only visual at this time and does not actually limit player count.
 max-players: 100
 
 # If debug messages should be sent through console