diff --git a/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java b/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java
index eb15fa477..3e0892be4 100644
--- a/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java
+++ b/core/src/main/java/org/geysermc/geyser/inventory/holder/BlockInventoryHolder.java
@@ -25,7 +25,6 @@
 
 package org.geysermc.geyser.inventory.holder;
 
-import com.google.common.collect.ImmutableSet;
 import com.nukkitx.math.vector.Vector3i;
 import com.nukkitx.nbt.NbtMap;
 import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
@@ -35,11 +34,11 @@ import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
 import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
 import org.geysermc.geyser.inventory.Container;
 import org.geysermc.geyser.inventory.Inventory;
-import org.geysermc.geyser.level.BedrockDimension;
 import org.geysermc.geyser.registry.BlockRegistries;
 import org.geysermc.geyser.session.GeyserSession;
 import org.geysermc.geyser.translator.inventory.InventoryTranslator;
 import org.geysermc.geyser.util.BlockUtils;
+import org.geysermc.geyser.util.InventoryUtils;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -50,8 +49,6 @@ import java.util.Set;
  * This class will attempt to use a real block first, if possible.
  */
 public class BlockInventoryHolder extends InventoryHolder {
-    private static final int FAKE_BLOCK_DISTANCE = 1;
-
     /**
      * The default Java block ID to translate as a fake block
      */
@@ -66,7 +63,7 @@ public class BlockInventoryHolder extends InventoryHolder {
             Set<String> validBlocksTemp = new HashSet<>(validBlocks.length + 1);
             Collections.addAll(validBlocksTemp, validBlocks);
             validBlocksTemp.add(BlockUtils.getCleanIdentifier(javaBlockIdentifier));
-            this.validBlocks = ImmutableSet.copyOf(validBlocksTemp);
+            this.validBlocks = Set.copyOf(validBlocksTemp);
         } else {
             this.validBlocks = Collections.singleton(BlockUtils.getCleanIdentifier(javaBlockIdentifier));
         }
@@ -91,20 +88,10 @@ public class BlockInventoryHolder extends InventoryHolder {
             }
         }
 
-        // Check if a fake block can be placed, either above the player or beneath.
-        BedrockDimension dimension = session.getChunkCache().getBedrockDimension();
-        int minY = dimension.minY(), maxY = minY + dimension.height();
-        Vector3i flatPlayerPosition = session.getPlayerEntity().getPosition().toInt();
-        Vector3i position = flatPlayerPosition.add(Vector3i.UP);
-        if (position.getY() < minY) {
+        Vector3i position = InventoryUtils.findAvailableWorldSpace(session);
+        if (position == null) {
             return false;
         }
-        if (position.getY() >= maxY) {
-            position = flatPlayerPosition.sub(0, 4, 0);
-            if (position.getY() >= maxY) {
-                return false;
-            }
-        }
 
         UpdateBlockPacket blockPacket = new UpdateBlockPacket();
         blockPacket.setDataLayer(0);
diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java
index 5bf96fd39..fa20e6dbb 100644
--- a/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java
+++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/chest/DoubleChestInventoryTranslator.java
@@ -35,12 +35,12 @@ import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
 import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
 import org.geysermc.geyser.inventory.Container;
 import org.geysermc.geyser.inventory.Inventory;
-import org.geysermc.geyser.level.BedrockDimension;
-import org.geysermc.geyser.session.GeyserSession;
 import org.geysermc.geyser.level.block.BlockStateValues;
 import org.geysermc.geyser.level.block.DoubleChestValue;
-import org.geysermc.geyser.translator.level.block.entity.DoubleChestBlockEntityTranslator;
 import org.geysermc.geyser.registry.BlockRegistries;
+import org.geysermc.geyser.session.GeyserSession;
+import org.geysermc.geyser.translator.level.block.entity.DoubleChestBlockEntityTranslator;
+import org.geysermc.geyser.util.InventoryUtils;
 
 public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
     private final int defaultJavaBlockState;
@@ -82,19 +82,10 @@ public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
             }
         }
 
-        // Check if a fake block can be placed, either above the player or beneath.
-        BedrockDimension dimension = session.getChunkCache().getBedrockDimension();
-        int minY = dimension.minY(), maxY = minY + dimension.height();
-        Vector3i position = session.getPlayerEntity().getPosition().toInt().add(0, 5, 0);
-        if (position.getY() < minY) {
+        Vector3i position = InventoryUtils.findAvailableWorldSpace(session);
+        if (position == null) {
             return false;
         }
-        if (position.getY() >= maxY) {
-            position = session.getPlayerEntity().getPosition().toInt().sub(0, 5, 0);
-            if (position.getY() >= maxY) {
-                return false;
-            }
-        }
 
         Vector3i pairPosition = position.add(Vector3i.UNIT_X);
         int bedrockBlockId = session.getBlockMappings().getBedrockBlockId(defaultJavaBlockState);
diff --git a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java
index ce88bc69c..cb426963c 100644
--- a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java
+++ b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java
@@ -31,6 +31,7 @@ import com.github.steveice10.mc.protocol.data.game.recipe.Ingredient;
 import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundPickItemPacket;
 import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket;
 import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
+import com.nukkitx.math.vector.Vector3i;
 import com.nukkitx.nbt.NbtMap;
 import com.nukkitx.nbt.NbtMapBuilder;
 import com.nukkitx.nbt.NbtType;
@@ -46,6 +47,7 @@ import org.geysermc.geyser.inventory.click.Click;
 import org.geysermc.geyser.inventory.recipe.GeyserRecipe;
 import org.geysermc.geyser.inventory.recipe.GeyserShapedRecipe;
 import org.geysermc.geyser.inventory.recipe.GeyserShapelessRecipe;
+import org.geysermc.geyser.level.BedrockDimension;
 import org.geysermc.geyser.registry.Registries;
 import org.geysermc.geyser.registry.type.ItemMapping;
 import org.geysermc.geyser.session.GeyserSession;
@@ -134,6 +136,28 @@ public class InventoryUtils {
         }
     }
 
+    /**
+     * Finds a usable block space in the world to place a fake inventory block, and returns the position.
+     */
+    @Nullable
+    public static Vector3i findAvailableWorldSpace(GeyserSession session) {
+        // Check if a fake block can be placed, either above the player or beneath.
+        BedrockDimension dimension = session.getChunkCache().getBedrockDimension();
+        int minY = dimension.minY(), maxY = minY + dimension.height();
+        Vector3i flatPlayerPosition = session.getPlayerEntity().getPosition().toInt();
+        Vector3i position = flatPlayerPosition.add(Vector3i.UP);
+        if (position.getY() < minY) {
+            return null;
+        }
+        if (position.getY() >= maxY) {
+            position = flatPlayerPosition.sub(0, 4, 0);
+            if (position.getY() >= maxY) {
+                return null;
+            }
+        }
+        return position;
+    }
+
     public static void updateCursor(GeyserSession session) {
         InventorySlotPacket cursorPacket = new InventorySlotPacket();
         cursorPacket.setContainerId(ContainerId.UI);
@@ -148,18 +172,6 @@ public class InventoryUtils {
         return item1.getJavaId() == item2.getJavaId() && Objects.equals(item1.getNbt(), item2.getNbt());
     }
 
-    public static boolean canStack(ItemStack item1, ItemStack item2) {
-        if (item1 == null || item2 == null)
-            return false;
-        return item1.getId() == item2.getId() && Objects.equals(item1.getNbt(), item2.getNbt());
-    }
-
-    public static boolean canStack(ItemData item1, ItemData item2) {
-        if (item1 == null || item2 == null)
-            return false;
-        return item1.equals(item2, false, true, true);
-    }
-
     /**
      * Checks to see if an item stack represents air or has no count.
      */