diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/BlockEntityTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/BlockEntityTranslator.java
index 4913a300d..61d3fd08d 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/BlockEntityTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/BlockEntityTranslator.java
@@ -42,8 +42,7 @@ public abstract class BlockEntityTranslator {
 
     public abstract com.nukkitx.nbt.tag.CompoundTag getDefaultBedrockTag(int x, int y, int z);
 
-    public com.nukkitx.nbt.tag.CompoundTag getBlockEntityTag(CompoundTag tag) {
-        String id = BlockEntityUtils.getBedrockBlockEntityId((String) tag.get("id").getValue());
+    public com.nukkitx.nbt.tag.CompoundTag getBlockEntityTag(CompoundTag tag, String id) {
         int x = Integer.parseInt(String.valueOf(tag.getValue().get("x").getValue()));
         int y = Integer.parseInt(String.valueOf(tag.getValue().get("y").getValue()));
         int z = Integer.parseInt(String.valueOf(tag.getValue().get("z").getValue()));
@@ -70,4 +69,9 @@ public abstract class BlockEntityTranslator {
                 .stringTag("id", id);
         return tagBuilder.buildRootTag();
     }
+
+    @SuppressWarnings("unchecked")
+    protected <T> T getOrDefault(com.github.steveice10.opennbt.tag.builtin.Tag tag, T defaultValue) {
+        return (tag != null && tag.getValue() != null) ? (T) tag.getValue() : defaultValue;
+    }
 }
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/SignBlockEntityTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/SignBlockEntityTranslator.java
index 414455c77..182eedd99 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/SignBlockEntityTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/block/entity/SignBlockEntityTranslator.java
@@ -42,10 +42,10 @@ public class SignBlockEntityTranslator extends BlockEntityTranslator {
     public List<Tag<?>> translateTag(CompoundTag tag) {
         List<Tag<?>> tags = new ArrayList<>();
 
-        String line1 = (String) tag.getValue().get("Text1").getValue();
-        String line2 = (String) tag.getValue().get("Text2").getValue();
-        String line3 = (String) tag.getValue().get("Text3").getValue();
-        String line4 = (String) tag.getValue().get("Text4").getValue();
+        String line1 = getOrDefault(tag.getValue().get("Text1"), "");
+        String line2 = getOrDefault(tag.getValue().get("Text2"), "");
+        String line3 = getOrDefault(tag.getValue().get("Text3"), "");
+        String line4 = getOrDefault(tag.getValue().get("Text4"), "");
 
         tags.add(new StringTag("Text", MessageUtils.getBedrockMessage(Message.fromString(line1))
                 + "\n" + MessageUtils.getBedrockMessage(Message.fromString(line2))
@@ -60,10 +60,10 @@ public class SignBlockEntityTranslator extends BlockEntityTranslator {
     @Override
     public CompoundTag getDefaultJavaTag(int x, int y, int z) {
         CompoundTag tag = getConstantJavaTag("minecraft:sign", x, y, z);
-        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text1", "\"text\":\"\""));
-        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text2", "\"text\":\"\""));
-        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text3", "\"text\":\"\""));
-        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text4", "\"text\":\"\""));
+        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text1", "{\"text\":\"\"}"));
+        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text2", "{\"text\":\"\"}"));
+        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text3", "{\"text\":\"\"}"));
+        tag.put(new com.github.steveice10.opennbt.tag.builtin.StringTag("Text4", "{\"text\":\"\"}"));
         return tag;
     }
 
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUpdateTileEntityTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUpdateTileEntityTranslator.java
index ca9d63f4f..2b55e27e0 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUpdateTileEntityTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaUpdateTileEntityTranslator.java
@@ -45,7 +45,7 @@ public class JavaUpdateTileEntityTranslator extends PacketTranslator<ServerUpdat
 
         String id = BlockEntityUtils.getBedrockBlockEntityId(packet.getType().name());
         BlockEntityTranslator translator = BlockEntityUtils.getBlockEntityTranslator(id);
-        blockEntityPacket.setData(translator.getBlockEntityTag(packet.getNbt()));
+        blockEntityPacket.setData(translator.getBlockEntityTag(packet.getNbt(), id));
         session.getUpstream().sendPacket(blockEntityPacket);
     }
 }
diff --git a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java
index 59a5fe848..8275c3c8a 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java
@@ -41,6 +41,16 @@ public class ChunkUtils {
                         BlockState blockState = chunk.get(x, y, z);
                         BlockEntry block = TranslatorsInit.getBlockTranslator().getBedrockBlock(blockState);
 
+                        // Block entity data for signs is not sent in this packet, which is needed
+                        // for bedrock, so we need to check the block itself
+//                        if (block.getJavaIdentifier().contains("sign")) {
+////                            SignBlockEntityTranslator sign = (SignBlockEntityTranslator) BlockEntityUtils.getBlockEntityTranslator("Sign");
+////                            blockEntities.add(sign.getDefaultJavaTag(x, y, z));
+//                            section.getBlockStorageArray()[0].setFullBlock(ChunkSection.blockPosition(x, y, z), 0);
+////                            System.out.println("Found sign at " + x + " " + y + " " + z);
+//                            continue;
+//                        }
+
                         section.getBlockStorageArray()[0].setFullBlock(ChunkSection.blockPosition(x, y, z),
                                 block.getBedrockId() << 4 | block.getBedrockData());
 
@@ -48,13 +58,6 @@ public class ChunkUtils {
                             section.getBlockStorageArray()[1].setFullBlock(ChunkSection.blockPosition(x, y, z),
                                     9 << 4); // water id
                         }
-
-                        // Block entity data for signs is not sent in this packet, which is needed
-                        // for bedrock, so we need to check the block itself
-                        if (block.getJavaIdentifier().contains("sign")) {
-                            SignBlockEntityTranslator sign = (SignBlockEntityTranslator) BlockEntityUtils.getBlockEntityTranslator("Sign");
-                            blockEntities.add(sign.getDefaultJavaTag(x, y, z));
-                        }
                     }
                 }
             }
@@ -63,14 +66,14 @@ public class ChunkUtils {
         List<com.nukkitx.nbt.tag.CompoundTag> bedrockBlockEntities = new ArrayList<>();
         for (CompoundTag tag : blockEntities) {
             Tag idTag = tag.get("id");
-            if (idTag == null) {
+            if (idTag == null && !tag.contains("Sign")) {
                 GeyserLogger.DEFAULT.debug("Got tag with no id: " + tag.getValue());
                 continue;
             }
 
-            String id = BlockEntityUtils.getBedrockBlockEntityId((String) tag.get("id").getValue());
+            String id = idTag == null ? "Sign" : BlockEntityUtils.getBedrockBlockEntityId((String) idTag.getValue());
             BlockEntityTranslator blockEntityTranslator = BlockEntityUtils.getBlockEntityTranslator(id);
-            bedrockBlockEntities.add(blockEntityTranslator.getBlockEntityTag(tag));
+            bedrockBlockEntities.add(blockEntityTranslator.getBlockEntityTag(tag, id));
         }
 
         chunkData.blockEntities = bedrockBlockEntities;
diff --git a/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java b/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java
index af499ff7e..ed5ff1928 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java
@@ -132,7 +132,7 @@ public class MessageUtils {
                 base += "r";
                 break;
             default:
-                break;
+                return "";
         }
 
         return base;