diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
index 5c8f1290f..60b10cab3 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
@@ -715,26 +715,26 @@ public final class BlockModelDispatcher
             .setTex(BLOCK_TEXTURES, "minecraft:block/jukebox/bottom", Side.BOTTOM)
             .setTex(BLOCK_TEXTURES, "minecraft:block/jukebox/side", S_SIDES));
 
-        addDispatch(new BlockModelHorizontalRotation<>(Blocks.PUMPKIN)
+        addDispatch(new BlockModelStandard<>(Blocks.PUMPKIN)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin/top", Side.TOP)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin/bottom", Side.BOTTOM)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin/side", S_SIDES));
-        addDispatch(new BlockModelHorizontalRotation<>(Blocks.PUMPKIN_CARVED_IDLE)
+        addDispatch(new BlockModelVeryRotatable<>(Blocks.PUMPKIN_CARVED_IDLE)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved/top", Side.TOP)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved/bottom", Side.BOTTOM)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved/front", Side.NORTH)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved/side", Side.WEST, Side.EAST, Side.SOUTH));
-        addDispatch(new BlockModelHorizontalRotation<>(Blocks.PUMPKIN_CARVED_ACTIVE)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved/front", Side.SOUTH)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved/side", Side.WEST, Side.EAST, Side.NORTH));
+        addDispatch(new BlockModelVeryRotatable<>(Blocks.PUMPKIN_CARVED_ACTIVE)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved_lit/top", Side.TOP)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved_lit/bottom", Side.BOTTOM)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved_lit/front", Side.NORTH)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved_lit/side", Side.WEST, Side.EAST, Side.SOUTH));
-        addDispatch(new BlockModelHorizontalRotation<>(Blocks.PUMPKIN_REDSTONE)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved_lit/front", Side.SOUTH)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_carved_lit/side", Side.WEST, Side.EAST, Side.NORTH));
+        addDispatch(new BlockModelVeryRotatable<>(Blocks.PUMPKIN_REDSTONE)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_redstone/top", Side.TOP)
             .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_redstone/bottom", Side.BOTTOM)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_redstone/front", Side.NORTH)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_redstone/side", Side.WEST, Side.EAST, Side.SOUTH)
-            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/pumpkin_redstone/front_overlay", Side.NORTH));
+            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_redstone/front", Side.SOUTH)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/pumpkin_redstone/side", Side.WEST, Side.EAST, Side.NORTH)
+            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/pumpkin_redstone/front_overlay", Side.SOUTH));
 
 
         addDispatch(new BlockModelStandard<>(Blocks.COBBLE_NETHERRACK).setAllTextures(BLOCK_TEXTURES, "minecraft:block/cobbled_netherrack/normal"));
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicDeadBush.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicDeadBush.java
index 885ac09e7..891252d06 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicDeadBush.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicDeadBush.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
@@ -19,7 +20,7 @@ public class BlockLogicDeadBush extends BlockLogicFlower
     @Override
 	public boolean mayPlaceOn(int blockId)
     {
-        return blockId == Blocks.SAND.id() || blockId == Blocks.DIRT_SCORCHED.id();
+        return blockId == Blocks.SAND.id() || blockId == Blocks.DIRT_SCORCHED.id() || BlockTags.GROWS_FLOWERS.appliesTo(Blocks.getBlock(blockId));
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkin.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkin.java
index 2a79c1605..b8cac2ada 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkin.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkin.java
@@ -9,7 +9,7 @@ import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class BlockLogicPumpkin extends BlockLogicRotatable
+public class BlockLogicPumpkin extends BlockLogicVeryRotatable
 {
     private final boolean isCarvable;
 
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkinRedstone.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkinRedstone.java
index ccc9ebe0c..edc34ec3b 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkinRedstone.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicPumpkinRedstone.java
@@ -5,7 +5,7 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockLogicPumpkinRedstone extends BlockLogicRotatable {
+public class BlockLogicPumpkinRedstone extends BlockLogicVeryRotatable {
 
     public BlockLogicPumpkinRedstone(Block<?> block) {
         super(block, Material.vegetable);
@@ -34,9 +34,6 @@ public class BlockLogicPumpkinRedstone extends BlockLogicRotatable {
 
     @Override
     public boolean getSignal(WorldSource worldSource, int x, int y, int z, Side side) {
-        if (!side.isHorizontal()) {
-            return false;
-        }
         Side mySide = Side.getSideById(worldSource.getBlockMetadata(x, y, z));
         return mySide == side.getOpposite();
     }
diff --git a/game/core/src/main/java/net/minecraft/core/block/Blocks.java b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
index 244fc868f..326bf32cc 100644
--- a/game/core/src/main/java/net/minecraft/core/block/Blocks.java
+++ b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
@@ -75,7 +75,7 @@ public final class Blocks {
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block<?> COBBLE_STONE_MOSSY = register("cobble.stone.mossy", "minecraft:block/cobble_stone_mossy", 11, (b) -> new BlockLogicCobble(b, Material.stone, () -> Blocks.GRAVEL))
         .withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS);
     public static final Block<?> COBBLE_BASALT = register("cobble.basalt", "minecraft:block/cobble_basalt", 12, (b) -> new BlockLogicCobble(b, Material.basalt, () -> Blocks.GRAVEL))
         .withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
@@ -195,7 +195,7 @@ public final class Blocks {
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block<?> BRICK_STONE_POLISHED_MOSSY = register("brick.stone.polished.mossy", "minecraft:block/brick_stone_polished_mossy", 122, (b) -> new BlockLogic(b, Material.stone))
         .withSound(BlockSounds.STONE).withHardness(2F).withBlastResistance(10F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS);
     public static final Block<?> BRICK_SANDSTONE = register("brick.sandstone", "minecraft:block/brick_sandstone", 123, (b) -> new BlockLogic(b, Material.stone))
         .withSound(BlockSounds.STONE).withHardness(0.8F).withBlastResistance(10F).withOverrideColor(MaterialColor.sand)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
@@ -469,7 +469,7 @@ public final class Blocks {
         .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
     public static final Block<?> LOG_OAK_MOSSY = register("log.oak.mossy", "minecraft:block/log_oak_mossy", 285, BlockLogicLog::new)
         .withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-        .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE, BlockTags.GROWS_FLOWERS);
     public static final Block<?> LOG_THORN = register("log.thorn", "minecraft:block/log_thorn", 286, BlockLogicLog::new)
         .withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
         .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
@@ -1083,7 +1083,7 @@ public final class Blocks {
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block<?> COBBLE_NETHERRACK_MOSSY = register("cobble.netherrack.mossy", "minecraft:block/cobble_netherrack_mossy", 802, (b) -> new BlockLogicCobble(b, Material.netherrack, null))
         .withSound(BlockSounds.STONE).withHardness(0.4F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.INFINITE_BURN);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.INFINITE_BURN);
     public static final Block<?> NETHERRACK = register("netherrack", "minecraft:block/netherrack", 803, (b) -> new BlockLogicStone(b, Blocks.COBBLE_NETHERRACK, Material.netherrack))
         .withSound(BlockSounds.STONE).withHardness(0.32F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.INFINITE_BURN, BlockTags.CAVES_CUT_THROUGH, BlockTags.NETHER_MOBS_SPAWN);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java
index c8245c23d..20bfd5712 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java
@@ -8,6 +8,7 @@ import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.CommandManager;
+import net.minecraft.core.net.command.arguments.ArgumentTypeDimension;
 import net.minecraft.core.net.command.util.CommandHelper;
 import net.minecraft.core.net.command.CommandSource;
 import net.minecraft.core.net.command.arguments.ArgumentTypeEntity;
@@ -15,6 +16,8 @@ import net.minecraft.core.net.command.arguments.ArgumentTypeVec3;
 import net.minecraft.core.net.command.exceptions.CommandExceptions;
 import net.minecraft.core.net.command.helpers.DoubleCoordinates;
 import net.minecraft.core.net.command.helpers.EntitySelector;
+import net.minecraft.core.world.Dimension;
+import net.minecraft.core.world.PortalHandler;
 
 import java.util.List;
 
@@ -22,6 +25,37 @@ public class CommandTeleport implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("teleport")
                 .requires(CommandSource::hasAdmin)
+                .then(ArgumentBuilderRequired.<CommandSource, Dimension>argument("dimension", ArgumentTypeDimension.dimension())
+                    .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
+                        .executes(c -> {
+                            CommandSource source = c.getSource();
+                            DoubleCoordinates targetCoordinates = c.getArgument("position", DoubleCoordinates.class);
+                            Dimension dimension = c.getArgument("dimension", Dimension.class);
+
+                            if (source.getSender() != null) {
+                                source.movePlayerToDimension(source.getSender(), dimension.id);
+                                source.teleportPlayerToPos(source.getSender(), targetCoordinates.getX(source), targetCoordinates.getY(source, true), targetCoordinates.getZ(source));
+                                source.sendTranslatableMessage("command.commands.teleport.dimension_location.success_single_entity", source.getSender().getDisplayName(), dimension.languageKey, targetCoordinates.getX(source), targetCoordinates.getY(source, true), targetCoordinates.getZ(source));
+                            } else {
+                                throw CommandExceptions.notInWorld().create();
+                            }
+
+                            return Command.SINGLE_SUCCESS;
+                        }))
+                    .executes(c -> {
+                        CommandSource source = c.getSource();
+                        Dimension dimension = c.getArgument("dimension", Dimension.class);
+
+                        if (source.getSender() != null) {
+                            source.movePlayerToDimension(source.getSender(), dimension.id);
+                            source.sendTranslatableMessage("command.commands.teleport.dimension.success_single_entity", source.getSender().getDisplayName(), dimension.languageKey);
+                        } else {
+                            throw CommandExceptions.notInWorld().create();
+                        }
+
+                        return Command.SINGLE_SUCCESS;
+                    })
+                )
                 .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
                         .executes(c -> {
                             CommandSource source = c.getSource();
diff --git a/game/core/src/main/resources/lang/en_US/command.lang b/game/core/src/main/resources/lang/en_US/command.lang
index e0db41bea..9c29fc03c 100644
--- a/game/core/src/main/resources/lang/en_US/command.lang
+++ b/game/core/src/main/resources/lang/en_US/command.lang
@@ -83,6 +83,8 @@ command.commands.teleport.entity.success_single_entity=Teleported %s to %s
 command.commands.teleport.entity.success_multiple_entities=Teleported %s entities to %s
 command.commands.teleport.location.success_single_entity=Teleported %s to %s, %s, %s
 command.commands.teleport.location.success_multiple_entities=Teleported %s entities to %s, %s, %s
+command.commands.teleport.dimension.success_single_entity=Teleported %s to dimension %s
+command.commands.teleport.dimension_location.success_single_entity=Teleported %s to dimension %s at %s, %s, %s
 command.commands.setblock.exception_failure=Could not set the block
 command.commands.setblock.success=Changed the block at %s, %s, %s
 command.commands.message.incoming=%s whispers to you: %s
