diff --git a/src/main/java/net/minecraft/client/gui/hud/component/SubtitleComponent.java b/src/main/java/net/minecraft/client/gui/hud/component/SubtitleComponent.java
index aa427a9c0..c85a939f9 100644
--- a/src/main/java/net/minecraft/client/gui/hud/component/SubtitleComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/component/SubtitleComponent.java
@@ -23,7 +23,7 @@ public class SubtitleComponent extends MovableHudComponent{
 
     @Override
     public boolean isVisible(Minecraft mc) {
-        return mc.gameSettings.subtitles.value;
+        return mc.gameSettings.immersiveMode.drawOverlays() && mc.gameSettings.subtitles.value;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BasketBlock.java b/src/main/java/net/minecraft/core/block/BasketBlock.java
index 9c8e6c2da..c3ab79445 100644
--- a/src/main/java/net/minecraft/core/block/BasketBlock.java
+++ b/src/main/java/net/minecraft/core/block/BasketBlock.java
@@ -1,4 +1,5 @@
 package net.minecraft.core.block;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.entity.BasketBlockEntity;
 import net.minecraft.core.block.material.Material;
@@ -6,6 +7,7 @@ import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
@@ -32,6 +34,16 @@ public class BasketBlock extends EntityBlock
         return false;
     }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        final BasketBlockEntity te = (BasketBlockEntity) world.getBlockEntity(x, y, z);
+
+        if (te.getNumUnitsInside() > 0)
+        {
+            te.dropContents(world, x, y, z);
+        }
+    }
+
     @Override
     public boolean isCubeShaped() {
         return false;
diff --git a/src/main/java/net/minecraft/core/block/FullRotatableBlock.java b/src/main/java/net/minecraft/core/block/FullRotatableBlock.java
index 26a9682a5..c4cb103b9 100644
--- a/src/main/java/net/minecraft/core/block/FullRotatableBlock.java
+++ b/src/main/java/net/minecraft/core/block/FullRotatableBlock.java
@@ -8,6 +8,7 @@ import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
 
 public abstract class FullRotatableBlock extends Block {
+    public static final int MASK_DIRECTION = 0b0000_0111;
     public FullRotatableBlock(String translationKey, String namespaceId, int id, Material material) {
         super(translationKey, namespaceId, id, material);
     }
@@ -20,10 +21,10 @@ public abstract class FullRotatableBlock extends Block {
     }
 
     public static int directionToMeta(Direction direction) {
-        return direction.getId() & 7;
+        return direction.getId() & MASK_DIRECTION;
     }
 
     public static Direction metaToDirection(int meta) {
-        return Direction.getDirectionById(meta & 7);
+        return Direction.getDirectionById(meta & MASK_DIRECTION);
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/FallingBlockEntity.java b/src/main/java/net/minecraft/core/entity/FallingBlockEntity.java
index e1912e1c6..e8e02854f 100644
--- a/src/main/java/net/minecraft/core/entity/FallingBlockEntity.java
+++ b/src/main/java/net/minecraft/core/entity/FallingBlockEntity.java
@@ -78,6 +78,7 @@ public class FallingBlockEntity extends Entity
             remove();
             return;
         }
+        pushesThisTick = 0;
         pushTime *= 0.98f;
         if (pushTime < 0.05f || (pushTime < 0.25 && onGround)){
             pushTime = 0;
diff --git a/src/main/java/net/minecraft/core/item/BucketItem.java b/src/main/java/net/minecraft/core/item/BucketItem.java
index 2dfb760fc..5f9259cba 100644
--- a/src/main/java/net/minecraft/core/item/BucketItem.java
+++ b/src/main/java/net/minecraft/core/item/BucketItem.java
@@ -5,6 +5,8 @@ package net.minecraft.core.item;
 //            World, MovingObjectPosition, EnumMovingObjectType, Material, 
 //            ItemStack, WorldProvider, Block, CowMob
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
@@ -19,9 +21,11 @@ import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.player.ServerPlayer;
 
+import java.util.Random;
+
 public class BucketItem extends Item
 {
-
+	private final int idToPlace;
     public BucketItem(String name, String namespaceId, int id, Block blockToPlace)
     {
         super(name, namespaceId, id);
@@ -95,5 +99,19 @@ public class BucketItem extends Item
 		return stack;
 	}
 
-    private int idToPlace;
+	@Override
+	public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+		if (idToPlace < 0) {
+			itemStack.itemID = Items.BUCKET.id;
+			return;
+		}
+		int x = blockX + direction.getOffsetX();
+		int y = blockY + direction.getOffsetY();
+		int z = blockZ + direction.getOffsetZ();
+		Block b = world.getBlock(x, y, z);
+		if (b == null || BlockTags.PLACE_OVERWRITES.appliesTo(b) || BlockTags.BROKEN_BY_FLUIDS.appliesTo(b)) {
+			world.setBlockWithNotify(x, y, z, idToPlace);
+			itemStack.itemID = Items.BUCKET.id;
+		}
+	}
 }
diff --git a/src/main/java/net/minecraft/core/item/EmptyBucketItem.java b/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
index c587fdef8..9c089e522 100644
--- a/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
+++ b/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
@@ -5,13 +5,20 @@ package net.minecraft.core.item;
 //            World, MovingObjectPosition, EnumMovingObjectType, Material,
 //            ItemStack, WorldProvider, Block, CowMob
 
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.animal.CowMob;
+import net.minecraft.core.entity.animal.SheepMob;
 import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.HitResult;
-import net.minecraft.core.util.phys.Vec3;
-import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.server.entity.player.ServerPlayer;
+
+import java.util.List;
+import java.util.Random;
 
 public class EmptyBucketItem extends Item
 {
@@ -60,6 +67,35 @@ public class EmptyBucketItem extends Item
         return itemstack;
     }
 
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        if (itemStack.stackSize > 1) { // TODO figure out wtf to do for stacked buckets for this
+            return;
+        }
+        int x = blockX + direction.getOffsetX();
+        int y = blockY + direction.getOffsetY();
+        int z = blockZ + direction.getOffsetZ();
+        if(world.getBlockMaterial(x, y, z) == Material.water && world.getBlockMetadata(x, y, z) == 0)
+        {
+            world.setBlockWithNotify(x, y, z, 0);
+            itemStack.itemID = Items.BUCKET_WATER.id;
+            return;
+        }
+        else if(world.getBlockMaterial(x, y, z) == Material.lava && world.getBlockMetadata(x, y, z) == 0)
+        {
+            world.setBlockWithNotify(x, y, z, 0);
+            itemStack.itemID = Items.BUCKET_LAVA.id;
+            return;
+        }
+
+        AABB box = AABB.getTemporaryBB(x, y, z, x + 1, y + 1, z + 1);
+        List<Entity> entities = world.getEntitiesWithinAABB(CowMob.class, box);
+        if (!entities.isEmpty()) {
+            itemStack.itemID = Items.BUCKET_MILK.id;
+            return;
+        }
+    }
+
     public static boolean useBucket(Player player, ItemStack itemToGive) {
         if(player.inventory.getCurrentItem().stackSize <= 1) {
             player.inventory.setItem(player.inventory.getCurrentItemIndex(), itemToGive);
