diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
index 449753dac..dea91a594 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
@@ -25,6 +25,9 @@ import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.Buffer;
+import net.minecraft.core.world.chunk.DisplayChunk;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
@@ -67,6 +70,7 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
     private final ModelViewerCategory entityCategory = new ViewerCategoryEntity(this);
     private final ModelViewerCategory particleCategory = new ViewerCategoryParticle(this);
     private final ModelViewerCategory blockCategory = new ViewerCategoryBlock(this);
+    private final List<ViewerCategoryBlock.BlockRenderInfo> blockCategoryBulkRenders = new ArrayList<>();
     public final List<ModelViewerCategory> categories = new ArrayList<>();
     private ModelViewerCategory currentCategory;
     protected final int defaultRed = (int) (255 * 0.25f);
@@ -79,6 +83,8 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
     protected boolean tickProgress = true;
     protected boolean rotateToCamera = true;
     public ScreenModelViewer(){
+        DisplayChunk.displayBlockId = 0;
+        DisplayChunk.displayBlockMeta = 0;
         mc.currentWorld.loadedEntityList.clear();
         mc.currentWorld.loadedTileEntityList.clear();
         mc.thePlayer.absMoveTo(0.5, 64.5, 0.5, 180, 0);
@@ -128,6 +134,8 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
         buttonTakeScreenshot = new ListenerButtonElement(4, width / 2 - 49, height - 20, 98, 20, i18n.translateKey("gui.photo_mode.button.take_screenshot"));
         buttonTakeScreenshot.setActionListener(this::screenShot);
 
+        ButtonElement bulkRender = new ListenerButtonElement(4, width - 100, height - 20, 98, 20, i18n.translateKey("gui.model_viewer.button.bulk_render")).setActionListener(this::bulkRender);
+
         buttonPrevEntry = new ListenerButtonElement(10, width / 2 - 49 - 2 - 20, height - 40 - 2, 20, 20, "<");
         buttonPrevEntry.setActionListener(() -> currentCategory.cycleCategoryEntry(-1));
         buttonNextEntry = new ListenerButtonElement(11, width / 2 + 49 + 2, height - 40 - 2, 20, 20, ">");
@@ -289,6 +297,7 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
         buttons.add(buttonRotateLeft);
         buttons.add(buttonRotateRight);
         buttons.add(buttonTakeScreenshot);
+        buttons.add(bulkRender);
         buttons.add(buttonOpenScreenshotFolder);
         buttons.add(buttonPrevEntry);
         buttons.add(buttonNextEntry);
@@ -313,9 +322,24 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
         }
         return id;
     }
+    private @Nullable ModelViewerCategory.Info lastInfo = null;
     @Override
     public void render(int mx, int my, float partialTick)
     {
+        if (lastInfo != null) {
+            specificScreenshot(lastInfo.outputFile());
+        }
+        if (this.currentCategory == blockCategory && !blockCategoryBulkRenders.isEmpty()) {
+            lastInfo = blockCategoryBulkRenders.remove(0);
+            mc.currentWorld.loadedEntityList.clear();
+            mc.currentWorld.loadedTileEntityList.clear();
+            blockCategory.setupRender(lastInfo);
+            iRotation = iRotationGoal = lastInfo.renderRotation();
+            iZoom = iZoomGoal = lastInfo.renderZoom();
+        } else {
+            lastInfo = null;
+        }
+
         GL11.glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
@@ -486,4 +510,42 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
         }
     }
 
+    public void specificScreenshot(@NotNull File destination) {
+        try {
+            Texture texture = ((ShadersRenderer)mc.renderer).getWorldFramebufferTex();
+            texture.bind();
+
+            int w = glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH);
+            int h = glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT);
+
+            int size = w * h * 4;
+            Buffer.checkBufferSize(size);
+            ByteBuffer buffer = Buffer.buffer;
+
+            buffer.position(0).limit(size);
+            glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+            if(glGetError() == 0) {
+                buffer.position(0);
+                ImageUtils.saveExternalImage(Textures.getImage(buffer, w, h, true, true), destination);
+
+            }else {
+                LOGGER.warn("Cannot get pixel data for screenshot!");
+            }
+        } catch (Exception e){
+            LOGGER.error("Exception while trying to take Model Viewer ScreenShot", e);
+        }
+    }
+
+    public void bulkRender() {
+        iRotation = iRotationGoal = 0;
+        iPanX = iPanXGoal = lastIPanX = 0;
+        iPanY = iPanYGoal = lastIPanY = -0.4574755f;
+        iZoom = iZoomGoal = 8.5f;
+        mc.gameWindow.setWindowSize(1024, 1024);
+        File bulkOutputDir = new File(mc.getMinecraftDir(), "bulkRenders");
+        bulkOutputDir.mkdirs();
+
+        setCategory(blockCategory);
+        blockCategory.queueBulkRender(bulkOutputDir, blockCategoryBulkRenders);
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ModelViewerCategory.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ModelViewerCategory.java
index b49f0a081..f693904e1 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ModelViewerCategory.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ModelViewerCategory.java
@@ -4,10 +4,12 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ButtonElement;
 import net.minecraft.client.gui.modelviewer.ScreenModelViewer;
 import net.minecraft.core.lang.I18n;
+import org.jetbrains.annotations.NotNull;
 
+import java.io.File;
 import java.util.List;
 
-public abstract class ModelViewerCategory {
+public abstract class ModelViewerCategory<T extends ModelViewerCategory.Info> {
     protected final ScreenModelViewer modelViewer;
     protected final Minecraft mc;
     public ModelViewerCategory(ScreenModelViewer modelViewer){
@@ -21,4 +23,13 @@ public abstract class ModelViewerCategory {
     public abstract void onOpen();
     public abstract void onClose();
     public abstract void onTick();
+    public abstract void queueBulkRender(@NotNull File outputDir, List<T> renderInfos);
+    public abstract void setupRender(T info);
+
+    public static abstract class Info {
+        public abstract @NotNull File outputFile();
+
+        public abstract float renderRotation();
+        public abstract float renderZoom();
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java
index 279dafee4..ee3951f92 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.client.gui.modelviewer.categories;
 
+import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ButtonElement;
 import net.minecraft.client.gui.modelviewer.ScreenModelViewer;
 import net.minecraft.client.gui.modelviewer.categories.entries.block.BlockEntryBasic;
@@ -8,19 +9,41 @@ import net.minecraft.client.gui.modelviewer.categories.entries.block.BlockEntryJ
 import net.minecraft.client.gui.modelviewer.categories.entries.block.BlockEntryMobSpawner;
 import net.minecraft.client.gui.modelviewer.categories.entries.block.BlockEntrySign;
 import net.minecraft.client.gui.modelviewer.elements.TextCycleElement;
+import net.minecraft.client.render.block.model.BlockModel;
+import net.minecraft.client.render.block.model.BlockModelCrossedSquares;
+import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockLogicButton;
+import net.minecraft.core.block.BlockLogicChest;
+import net.minecraft.core.block.BlockLogicCropsPumpkin;
+import net.minecraft.core.block.BlockLogicCropsWheat;
+import net.minecraft.core.block.BlockLogicFlowerStackable;
+import net.minecraft.core.block.BlockLogicFullyRotatable;
+import net.minecraft.core.block.BlockLogicLadder;
+import net.minecraft.core.block.BlockLogicLever;
+import net.minecraft.core.block.BlockLogicPortal;
+import net.minecraft.core.block.BlockLogicRotatable;
+import net.minecraft.core.block.BlockLogicVeryRotatable;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.IPainted;
+import net.minecraft.core.block.piston.BlockLogicPistonBase;
+import net.minecraft.core.block.piston.BlockLogicPistonHead;
 import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.chunk.DisplayChunk;
+import org.jetbrains.annotations.NotNull;
 
+import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 
-public class ViewerCategoryBlock extends ModelViewerCategory {
+public class ViewerCategoryBlock extends ModelViewerCategory<ViewerCategoryBlock.BlockRenderInfo> {
     public HashMap<Block<?>, BlockEntry> entryHashMap = new HashMap<>();
     public TextCycleElement<Integer> blockIdTextField;
     public TextCycleElement<Integer> blockMetaTextField;
@@ -169,6 +192,86 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
         // Delete any items blocks create when added/removed
         mc.currentWorld.loadedEntityList.removeIf(entity -> entity instanceof EntityItem);
     }
+
+    @Override
+    public void queueBulkRender(@NotNull File outputDir, List<BlockRenderInfo> renderInfos) {
+        int startId = 1;
+        int id = startId;
+        do {
+            Block<?> block = Blocks.getBlock(id);
+            if (block != null) {
+                BlockModel<?> bModel = BlockModelDispatcher.getInstance().getDispatch(block);
+                int meta = 0;
+                if (Block.hasLogicClass(block, BlockLogicPortal.class)) {
+                    meta |= BlockLogicPortal.MASK_COLOR_SET;
+                }
+                if (Block.hasLogicClass(block, BlockLogicChest.class)) {
+                    meta = BlockLogicChest.getMetaWithDirection(meta, Direction.SOUTH);
+                }
+                if (Block.hasLogicClass(block, BlockLogicRotatable.class)) {
+                    meta = BlockLogicRotatable.setDirection(meta, Direction.SOUTH);
+                }
+                if (Block.hasLogicClass(block, BlockLogicVeryRotatable.class)) {
+                    meta = BlockLogicVeryRotatable.setDirection(meta, Direction.SOUTH);
+                }
+                if (Block.hasLogicClass(block, BlockLogicFullyRotatable.class)) {
+                    meta |= BlockLogicFullyRotatable.directionToMeta(Direction.SOUTH);
+                }
+                if (Block.hasLogicClass(block, BlockLogicPistonBase.class)) {
+                    meta |= Direction.SOUTH.getId();
+                }
+                if (Block.hasLogicClass(block, BlockLogicPistonHead.class)) {
+                    meta |= Direction.SOUTH.getId();
+                    if (block == Blocks.PISTON_HEAD_STEEL) {
+                        meta = BlockLogicPistonHead.setPistonType(BlockLogicPistonHead.TYPE_STEEL, meta);
+                    }
+                }
+                if (Block.hasLogicClass(block, BlockLogicLadder.class)) {
+                    meta |= ((BlockLogicLadder)block.getLogic()).getMetaForSide(Side.SOUTH);
+                }
+                if (Block.hasLogicClass(block, BlockLogicButton.class)) {
+                    meta |= BlockLogicButton.SIDE_NORTH;
+                }
+                if (Block.hasLogicClass(block, BlockLogicLever.class)) {
+                    meta |= BlockLogicLever.ROTATION_SOUTH;
+                }
+
+                float rot = 0;
+                if (bModel instanceof BlockModelCrossedSquares) {
+                    rot = -45;
+                }
+
+                float zoom = 9f;
+                if (Block.hasLogicClass(block, IPainted.class)) {
+                    for (DyeColor color : DyeColor.blockOrderedColors()) {
+                        int newMeta = meta | ((IPainted)block.getLogic()).toMetadata(color);
+                        renderInfos.add(new BlockRenderInfo(new File(outputDir, block.namespaceId().value + "_" + color.colorID + ".png"), id, newMeta, rot, zoom));
+                    }
+                } else if (Block.hasLogicClass(block, BlockLogicFlowerStackable.class)) {
+                    for (int i = 0; i <= BlockLogicFlowerStackable.MAX_STACK_COUNT; i++) {
+                        renderInfos.add(new BlockRenderInfo(new File(outputDir, block.namespaceId().value + "_" + i + ".png"), id, BlockLogicFlowerStackable.setStackCount(meta, i), rot, zoom));
+                    }
+                } else if (Block.hasLogicClass(block, BlockLogicCropsWheat.class)) {
+                    for (int i = 0; i <= BlockLogicCropsWheat.MAX_GROWTH_STATE; i++) {
+                        renderInfos.add(new BlockRenderInfo(new File(outputDir, block.namespaceId().value + "_" + i + ".png"), id, meta | i, rot, zoom));
+                    }
+                } else if (Block.hasLogicClass(block, BlockLogicCropsPumpkin.class)) {
+                    for (int i = 0; i < 5; i++) {
+                        renderInfos.add(new BlockRenderInfo(new File(outputDir, block.namespaceId().value + "_" + i + ".png"), id, meta | i, rot, zoom));
+                    }
+                } else {
+                    renderInfos.add(new BlockRenderInfo(new File(outputDir, block.namespaceId().value + ".png"), id, meta, rot, zoom));
+                }
+            }
+            id = ScreenModelViewer.cycleBlockId(id, 1);
+        } while (id != startId);
+    }
+
+    @Override
+    public void setupRender(BlockRenderInfo info) {
+        setDisplayBlock(info.blockId, info.blockMeta);
+    }
+
     public void setDisplayBlock(int id, int meta){
         Block<?> displayBlock = Blocks.blocksList[DisplayChunk.displayBlockId];
         BlockEntry entry = entryHashMap.get(Blocks.getBlock(DisplayChunk.displayBlockId));
@@ -176,20 +279,20 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
         int _meta = DisplayChunk.displayBlockMeta;
 
         if (displayBlock != null && _id != id){
-            displayBlock.onBlockRemoved(mc.currentWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z, _meta);
+            displayBlock.onBlockRemoved(mc.currentWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y + 1, (int) mc.thePlayer.z, _meta);
         }
         if (entry != null){
             entry.onClose(mc.currentWorld, DisplayChunk.displayBlockMeta);
         }
         DisplayChunk.displayBlockPosX = (int) mc.thePlayer.x;
-        DisplayChunk.displayBlockPosY = (int) mc.thePlayer.y;
+        DisplayChunk.displayBlockPosY = (int) mc.thePlayer.y + 1;
         DisplayChunk.displayBlockPosZ = (int) mc.thePlayer.z;
         DisplayChunk.displayBlockId = id;
         DisplayChunk.displayBlockMeta = meta;
         displayBlock = Blocks.blocksList[id];
         if (displayBlock != null && _id != id){
             entry = entryHashMap.get(Blocks.getBlock(DisplayChunk.displayBlockId));
-            displayBlock.onBlockPlacedByWorld(mc.currentWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z);
+            displayBlock.onBlockPlacedByWorld(mc.currentWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y + 1, (int) mc.thePlayer.z);
             if (entry != null) entry.onOpen(mc.currentWorld, DisplayChunk.displayBlockMeta);
         }
         if (_id != id){
@@ -198,4 +301,35 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
         mc.particleEngine.setWorld(mc.currentWorld);
         mc.currentWorld.markBlockDirty(DisplayChunk.displayBlockPosX, DisplayChunk.displayBlockPosY, DisplayChunk.displayBlockPosZ);
     }
+
+    public static class BlockRenderInfo extends Info {
+        final @NotNull File outputDir;
+        final int blockId;
+        final int blockMeta;
+        final float rot;
+        final float zoom;
+
+        public BlockRenderInfo(@NotNull File outputDir, int blockId, int blockMeta, float rot, float zoom) {
+            this.outputDir = outputDir;
+            this.blockId = blockId;
+            this.blockMeta = blockMeta;
+            this.rot = rot;
+            this.zoom = zoom;
+        }
+
+        @Override
+        public @NotNull File outputFile() {
+            return this.outputDir;
+        }
+
+        @Override
+        public float renderRotation() {
+            return this.rot;
+        }
+
+        @Override
+        public float renderZoom() {
+            return this.zoom;
+        }
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java
index a5240fb41..6054a0186 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java
@@ -26,12 +26,14 @@ import net.minecraft.core.entity.monster.MobZombie;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
-public class ViewerCategoryEntity extends ModelViewerCategory{
+public class ViewerCategoryEntity extends ModelViewerCategory<ModelViewerCategory.Info> {
     public HashMap<Class<? extends Entity>, EntityEntry<?>> entryMap = new HashMap<>();
     public List<EntityEntry<?>> entryList = new ArrayList<>();
     public ListenerTextFieldElement entityName;
@@ -178,13 +180,24 @@ public class ViewerCategoryEntity extends ModelViewerCategory{
             }
         }
     }
+
+    @Override
+    public void queueBulkRender(@NotNull File outputDir, List<Info> renderInfos) {
+
+    }
+
+    @Override
+    public void setupRender(Info info) {
+
+    }
+
     public void setDisplayEntity(Entity entity){
         removeDisplayEntity();
         displayEntity = entity;
         if (displayEntity != null){
             displayEntity.noPhysics = true;
 
-            displayEntity.absMoveTo(mc.thePlayer.x, mc.thePlayer.y - displayEntity.bbHeight/2, mc.thePlayer.z, displayEntity.yRot, displayEntity.xRot);
+            displayEntity.absMoveTo(mc.thePlayer.x, mc.thePlayer.y + mc.thePlayer.getHeadHeight() - displayEntity.bbHeight/2, mc.thePlayer.z, displayEntity.yRot, displayEntity.xRot);
             displayEntity.lerpMotion(0, 0, 0);
             mc.currentWorld.entityJoinedWorld(displayEntity);
             if (displayEntity instanceof Mob){
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java
index 5aa870746..5b81593ee 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java
@@ -13,14 +13,16 @@ import net.minecraft.client.gui.modelviewer.categories.entries.particle.Particle
 import net.minecraft.client.gui.modelviewer.categories.entries.particle.ParticleEntryRedstone;
 import net.minecraft.client.gui.modelviewer.elements.ListenerSliderElement;
 import net.minecraft.core.lang.I18n;
+import org.jetbrains.annotations.NotNull;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class ViewerCategoryParticle extends ModelViewerCategory{
+public class ViewerCategoryParticle extends ModelViewerCategory<ModelViewerCategory.Info>{
     public Map<String, ParticleEntry> entryMap = new HashMap<>();
     public List<ParticleEntry> entriesList;
     public double spawnRadius = 0;
@@ -118,6 +120,16 @@ public class ViewerCategoryParticle extends ModelViewerCategory{
         offX *= spawnRadius;
         offY *= spawnRadius;
         offZ *= spawnRadius;
-        currentEntry.spawnParticle(mc, mc.currentWorld, mc.thePlayer.x + offX, mc.thePlayer.y + offY, mc.thePlayer.z + offZ);
+        currentEntry.spawnParticle(mc, mc.currentWorld, mc.thePlayer.x + offX, mc.thePlayer.y + mc.thePlayer.getHeadHeight() + offY, mc.thePlayer.z + offZ);
+    }
+
+    @Override
+    public void queueBulkRender(@NotNull File outputDir, List<Info> renderInfos) {
+
+    }
+
+    @Override
+    public void setupRender(Info info) {
+
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 2cb9e6c18..f26273141 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -133,6 +133,7 @@ public abstract class OptionsPages
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.fancyGraphics))
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.renderDistance))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.ambientOcclusion))
+                .withComponent(new BooleanOptionComponent(mc.gameSettings.connectedGlass))
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.mipmapLevels))
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.mipmapType))
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.colorblindnessFix))
diff --git a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
index 1f406c12f..2ad33bf4f 100644
--- a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -72,6 +72,7 @@ public class GameSettings {
 	public OptionBoolean advancedOpenGL = new OptionBoolean(this, "advancedOpengl", false);
 	public OptionRange fancyGraphics = new OptionRange(this, "fancyGraphics", 1, 2);
 	public OptionBoolean treeShadows = new OptionBoolean(this, "treeShadows", true);
+	public OptionBoolean connectedGlass = new OptionBoolean(this, "connectedGlass", false);
 	public OptionBoolean ambientOcclusion = new OptionBoolean(this, "ambientOcclusion", true);
 	public OptionBoolean items3D = new OptionBoolean(this, "3Ditems", false);
 	public OptionBoolean smoothCamera = new OptionBoolean(this, "smoothCamera", false);
@@ -466,6 +467,7 @@ public class GameSettings {
 		if(option == enableVsync) mc.gameWindow.setVsync(enableVsync.value);
 		if(option == fancyGraphics) mc.renderGlobal.loadRenderers();
 		if(option == ambientOcclusion) mc.renderGlobal.loadRenderers();
+		if(option == connectedGlass) mc.renderGlobal.loadRenderers();
 		if(option == advancedOpenGL) mc.renderGlobal.loadRenderers();
 		if(option == biomeWater) {
 			mc.renderGlobal.loadRenderers();
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 91d58e95f..3c024de83 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
@@ -229,8 +229,8 @@ public final class BlockModelDispatcher
 
         addDispatch(new BlockModelStandard<>(Blocks.OBSIDIAN).setAllTextures(BLOCK_TEXTURES, "minecraft:block/obsidian"));
 
-        addDispatch(new BlockModelTransparent<>(Blocks.GLASS, false).setAllTextures(BLOCK_TEXTURES, "minecraft:block/glass"));
-        addDispatch(new BlockModelTransparent<>(Blocks.GLASS_TINTED, false).onRenderLayer(1).setAllTextures(BLOCK_TEXTURES, "minecraft:block/glass_tinted"));
+        addDispatch(new BlockModelGlass<>(Blocks.GLASS, "minecraft:block/glass/").setAllTextures(BLOCK_TEXTURES, "minecraft:block/glass"));
+        addDispatch(new BlockModelGlass<>(Blocks.GLASS_TINTED, "minecraft:block/glass_tinted/").onRenderLayer(1).setAllTextures(BLOCK_TEXTURES, "minecraft:block/glass_tinted"));
         addDispatch(new BlockModelTransparent<>(Blocks.GLASS_STEEL, false).setAllTextures(BLOCK_TEXTURES, "minecraft:block/glass_steel"));
 
         addDispatch(new BlockModelGrass<>(Blocks.GRASS)
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
index dd4bbef8f..ce4095881 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
@@ -3,6 +3,7 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.BlockLogic;
 import net.minecraft.core.block.BlockLogicFire;
@@ -41,7 +42,7 @@ public class BlockModelFire<T extends BlockLogic> extends BlockModelStandard<T>
         double vMin = tex.getIconVMin();
         double vMax = tex.getIconVMax();
         final float yOffset = 1.4F;
-        if(overrideRender || worldSource.isBlockNormalCube(x, y - 1, z) || BlockLogicFire.canBurn(worldSource, x, y - 1, z))
+        if(overrideRender || worldSource.isBlockNormalCube(x, y - 1, z) || BlockLogicFire.canBurn(worldSource, x, y - 1, z) || worldSource == WorldClient.EMPTY_WORLD)
         {
             double d8 = (double)x + 0.5D + 0.2D;
             double d9 = ((double)x + 0.5D) - 0.2D;
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelGlass.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelGlass.java
new file mode 100644
index 000000000..2a2d7230b
--- /dev/null
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelGlass.java
@@ -0,0 +1,94 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockLogic;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class BlockModelGlass<T extends BlockLogic> extends BlockModelTransparent<T>{
+    public static final int UP = 1 << 0;
+    public static final int DOWN = 1 << 1;
+    public static final int LEFT = 1 << 2;
+    public static final int RIGHT = 1 << 3;
+
+    protected final IconCoordinate[] coordinates = new IconCoordinate[16];
+
+    public BlockModelGlass(final Block<T> block, final @NotNull String rootKey) {
+        super(block, false);
+
+        this.coordinates[0] = TextureRegistry.getTexture(rootKey + "none");
+
+        this.coordinates[UP] = TextureRegistry.getTexture(rootKey + "up");
+        this.coordinates[DOWN] = TextureRegistry.getTexture(rootKey + "down");
+        this.coordinates[LEFT] = TextureRegistry.getTexture(rootKey + "left");
+        this.coordinates[RIGHT] = TextureRegistry.getTexture(rootKey + "right");
+
+        this.coordinates[UP | DOWN] = TextureRegistry.getTexture(rootKey + "up_down");
+        this.coordinates[UP | LEFT] = TextureRegistry.getTexture(rootKey + "up_left");
+        this.coordinates[UP | RIGHT] = TextureRegistry.getTexture(rootKey + "up_right");
+
+        this.coordinates[DOWN | LEFT] = TextureRegistry.getTexture(rootKey + "down_left");
+        this.coordinates[DOWN | RIGHT] = TextureRegistry.getTexture(rootKey + "down_right");
+
+        this.coordinates[LEFT | RIGHT] = TextureRegistry.getTexture(rootKey + "left_right");
+
+        this.coordinates[UP | DOWN | LEFT] = TextureRegistry.getTexture(rootKey + "up_down_left");
+        this.coordinates[UP | DOWN | RIGHT] = TextureRegistry.getTexture(rootKey + "up_down_right");
+        this.coordinates[UP | LEFT | RIGHT] = TextureRegistry.getTexture(rootKey + "up_left_right");
+        this.coordinates[DOWN | LEFT | RIGHT] = TextureRegistry.getTexture(rootKey + "down_left_right");
+
+        this.coordinates[UP | DOWN | LEFT | RIGHT] = TextureRegistry.getTexture(rootKey + "up_down_left_right");
+    }
+
+    @Override
+    public @Nullable IconCoordinate getBlockTexture(final WorldSource blockAccess, final int x, final int y, final int z, final Side side) {
+        if (Minecraft.getMinecraft().gameSettings.connectedGlass.value) {
+            final boolean u;
+            final boolean d;
+            final boolean l;
+            final boolean r;
+            switch (side) {
+                case SOUTH:
+                    u = blockAccess.getBlockId(x + Side.TOP.getOffsetX(), y + Side.TOP.getOffsetY(), z + Side.TOP.getOffsetZ()) == this.block.id();
+                    d = blockAccess.getBlockId(x + Side.BOTTOM.getOffsetX(), y + Side.BOTTOM.getOffsetY(), z + Side.BOTTOM.getOffsetZ()) == this.block.id();
+                    l = blockAccess.getBlockId(x + Side.WEST.getOffsetX(), y + Side.WEST.getOffsetY(), z + Side.WEST.getOffsetZ()) == this.block.id();
+                    r = blockAccess.getBlockId(x + Side.EAST.getOffsetX(), y + Side.EAST.getOffsetY(), z + Side.EAST.getOffsetZ()) == this.block.id();
+                    break;
+                case NORTH:
+                    u = blockAccess.getBlockId(x + Side.TOP.getOffsetX(), y + Side.TOP.getOffsetY(), z + Side.TOP.getOffsetZ()) == this.block.id();
+                    d = blockAccess.getBlockId(x + Side.BOTTOM.getOffsetX(), y + Side.BOTTOM.getOffsetY(), z + Side.BOTTOM.getOffsetZ()) == this.block.id();
+                    l = blockAccess.getBlockId(x + Side.EAST.getOffsetX(), y + Side.EAST.getOffsetY(), z + Side.EAST.getOffsetZ()) == this.block.id();
+                    r = blockAccess.getBlockId(x + Side.WEST.getOffsetX(), y + Side.WEST.getOffsetY(), z + Side.WEST.getOffsetZ()) == this.block.id();
+                    break;
+                case WEST:
+                    u = blockAccess.getBlockId(x + Side.TOP.getOffsetX(), y + Side.TOP.getOffsetY(), z + Side.TOP.getOffsetZ()) == this.block.id();
+                    d = blockAccess.getBlockId(x + Side.BOTTOM.getOffsetX(), y + Side.BOTTOM.getOffsetY(), z + Side.BOTTOM.getOffsetZ()) == this.block.id();
+                    l = blockAccess.getBlockId(x + Side.NORTH.getOffsetX(), y + Side.NORTH.getOffsetY(), z + Side.NORTH.getOffsetZ()) == this.block.id();
+                    r = blockAccess.getBlockId(x + Side.SOUTH.getOffsetX(), y + Side.SOUTH.getOffsetY(), z + Side.SOUTH.getOffsetZ()) == this.block.id();
+                    break;
+                case EAST:
+                    u = blockAccess.getBlockId(x + Side.TOP.getOffsetX(), y + Side.TOP.getOffsetY(), z + Side.TOP.getOffsetZ()) == this.block.id();
+                    d = blockAccess.getBlockId(x + Side.BOTTOM.getOffsetX(), y + Side.BOTTOM.getOffsetY(), z + Side.BOTTOM.getOffsetZ()) == this.block.id();
+                    l = blockAccess.getBlockId(x + Side.SOUTH.getOffsetX(), y + Side.SOUTH.getOffsetY(), z + Side.SOUTH.getOffsetZ()) == this.block.id();
+                    r = blockAccess.getBlockId(x + Side.NORTH.getOffsetX(), y + Side.NORTH.getOffsetY(), z + Side.NORTH.getOffsetZ()) == this.block.id();
+                    break;
+                case TOP:
+                case BOTTOM:
+                default:
+                    u = blockAccess.getBlockId(x + Side.NORTH.getOffsetX(), y + Side.NORTH.getOffsetY(), z + Side.NORTH.getOffsetZ()) == this.block.id();
+                    d = blockAccess.getBlockId(x + Side.SOUTH.getOffsetX(), y + Side.SOUTH.getOffsetY(), z + Side.SOUTH.getOffsetZ()) == this.block.id();
+                    l = blockAccess.getBlockId(x + Side.WEST.getOffsetX(), y + Side.WEST.getOffsetY(), z + Side.WEST.getOffsetZ()) == this.block.id();
+                    r = blockAccess.getBlockId(x + Side.EAST.getOffsetX(), y + Side.EAST.getOffsetY(), z + Side.EAST.getOffsetZ()) == this.block.id();
+                    break;
+            }
+            return this.coordinates[(u ? UP : 0) | (d ? DOWN : 0) | (l ? LEFT : 0) | (r ? RIGHT : 0)];
+        } else {
+            return super.getBlockTexture(blockAccess, x, y, z, side);
+        }
+    }
+}
diff --git a/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java b/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java
index a451d1688..7d2eb583c 100644
--- a/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java
+++ b/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java
@@ -35,6 +35,8 @@ public interface GameWindow {
 
 	void setCursorShape(CursorShape shape);
 
+	void setWindowSize(int width, int height);
+
 	CursorShape getCursorShape();
 
 	public long getHandle();
diff --git a/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java b/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
index 934ff1da9..f0c84768c 100644
--- a/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
+++ b/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
@@ -205,6 +205,11 @@ public class GameWindowGLFW implements GameWindow {
         this.currentCursor = shape;
     }
 
+    @Override
+    public void setWindowSize(int width, int height) {
+        glfwSetWindowSize(window, width, height);
+    }
+
     @Override
     public CursorShape getCursorShape() {
         return this.currentCursor;
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/down.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down.png
new file mode 100644
index 000000000..359fe8e19
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_left.png
new file mode 100644
index 000000000..b974c35c6
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_left_right.png
new file mode 100644
index 000000000..ad9df0a5e
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_right.png
new file mode 100644
index 000000000..af4687785
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/down_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/left.png
new file mode 100644
index 000000000..841473b5d
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/left_right.png
new file mode 100644
index 000000000..d538837c4
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/none.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/none.png
new file mode 100644
index 000000000..61853513d
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/none.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/right.png
new file mode 100644
index 000000000..9af1c6dda
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up.png
new file mode 100644
index 000000000..f419a0a80
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down.png
new file mode 100644
index 000000000..655290ed3
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_left.png
new file mode 100644
index 000000000..cff5aa787
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_left_right.png
new file mode 100644
index 000000000..ccbe815a5
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_right.png
new file mode 100644
index 000000000..12845c8ee
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_down_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_left.png
new file mode 100644
index 000000000..3416a2f42
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_left_right.png
new file mode 100644
index 000000000..52425d5db
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_right.png
new file mode 100644
index 000000000..1b9a308d2
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass/up_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down.png
new file mode 100644
index 000000000..a50a8044e
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_left.png
new file mode 100644
index 000000000..c3f56fa4a
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_left_right.png
new file mode 100644
index 000000000..26c9deb37
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_right.png
new file mode 100644
index 000000000..e7666dfb8
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/down_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/left.png
new file mode 100644
index 000000000..505852c3c
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/left_right.png
new file mode 100644
index 000000000..20d08008c
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/none.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/none.png
new file mode 100644
index 000000000..63c6d7652
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/none.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/right.png
new file mode 100644
index 000000000..87e5df3dc
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up.png
new file mode 100644
index 000000000..cdf38c4cd
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down.png
new file mode 100644
index 000000000..f69276423
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_left.png
new file mode 100644
index 000000000..f50e2e6be
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_left_right.png
new file mode 100644
index 000000000..4d26faf84
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_right.png
new file mode 100644
index 000000000..b4f5d1f3d
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_down_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_left.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_left.png
new file mode 100644
index 000000000..bdd80c6b6
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_left_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_left_right.png
new file mode 100644
index 000000000..08e7e180d
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_right.png b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_right.png
new file mode 100644
index 000000000..473c62cb7
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/glass_tinted/up_right.png differ
diff --git a/game/core/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java b/game/core/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
index 977789001..0edb4b840 100644
--- a/game/core/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
+++ b/game/core/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
@@ -72,4 +72,19 @@ public class DisplayChunk extends EmptyChunk{
             displayTileEntity.z = DisplayChunk.displayBlockPosZ;
         }
     }
+
+    @Override
+    public double getBlockHumidity(final int x, final int z) {
+        return 0.5;
+    }
+
+    @Override
+    public double getBlockTemperature(final int x, final int z) {
+        return 0.5;
+    }
+
+    @Override
+    public double getBlockVariety(final int x, final int z) {
+        return 0.5;
+    }
 }
diff --git a/game/core/src/main/resources/lang/en_US/gui.lang b/game/core/src/main/resources/lang/en_US/gui.lang
index 12b2b5b15..5a4ee7ac9 100644
--- a/game/core/src/main/resources/lang/en_US/gui.lang
+++ b/game/core/src/main/resources/lang/en_US/gui.lang
@@ -363,6 +363,7 @@ gui.pick_monster.label.title=Select mob to spawn
 gui.model_viewer.slider.variant=Variant: %d
 gui.model_viewer.slider.meta=Meta: %d
 gui.model_viewer.button.tickprogress=Run Tick: %s
+gui.model_viewer.button.bulk_render=Bulk Render
 gui.model_viewer.button.rotate=Rotate Labels: %s
 gui.model_viewer.button.reload_textures=Reload Textures
 gui.model_viewer.button.category=Category
diff --git a/game/core/src/main/resources/lang/en_US/options.lang b/game/core/src/main/resources/lang/en_US/options.lang
index 8ba3c223a..0ea6f1bf5 100644
--- a/game/core/src/main/resources/lang/en_US/options.lang
+++ b/game/core/src/main/resources/lang/en_US/options.lang
@@ -38,6 +38,7 @@ options.difficulty.easy=Easy
 options.difficulty.normal=Normal
 options.difficulty.hard=Hard
 options.fancyGraphics=Graphics
+options.connectedGlass=Connected Glass
 options.graphics.fancy=Fancy
 options.graphics.fast=Fast
 options.guiScale=GUI Scale
