diff --git a/game/client/src/main/java/net/minecraft/client/render/LightmapHelper.java b/game/client/src/main/java/net/minecraft/client/render/LightmapHelper.java
index 26f24c9fd..7c0bc0952 100644
--- a/game/client/src/main/java/net/minecraft/client/render/LightmapHelper.java
+++ b/game/client/src/main/java/net/minecraft/client/render/LightmapHelper.java
@@ -20,6 +20,10 @@ import org.slf4j.Logger;
 public class LightmapHelper {
 	private static final Logger LOGGER = LogUtils.getLogger();
 	private static LightmapHelper instance = null;
+	private static int currentSkyCoord = 0;
+	private static int currentBlockCoord = 0;
+	private static int lastSkyCoord = 0;
+	private static int lastBlockCoord = 0;
 
 	public static boolean isLightmapEnabled() {
 		return instance != null && instance.isEnabled();
@@ -386,6 +390,11 @@ public class LightmapHelper {
 	
 	public static void setLightmapCoord(int skylight, int blocklight) {
 		glMultiTexCoord2f(GL_TEXTURE1, blocklight * 16.0f, skylight * 16.0f);
+
+		lastBlockCoord = currentBlockCoord;
+		lastSkyCoord = currentSkyCoord;
+		currentBlockCoord = blocklight * 16;
+		currentSkyCoord = skylight * 16;
 	}
 	
 	public static void setLightmapCoord(int lightmapCoord) {
@@ -393,6 +402,23 @@ public class LightmapHelper {
 		int block = lightmapCoord & 0xFFFF;
 		
 		glMultiTexCoord2f(GL_TEXTURE1, block, sky);
+
+		lastBlockCoord = currentBlockCoord;
+		lastSkyCoord = currentSkyCoord;
+		currentBlockCoord = block;
+		currentSkyCoord = sky;
+	}
+
+	public static void setLastLightmapCoord() {
+		int sky = lastSkyCoord;
+		int block = lastBlockCoord;
+
+		glMultiTexCoord2f(GL_TEXTURE1, block, sky);
+
+		lastBlockCoord = currentBlockCoord;
+		lastSkyCoord = currentSkyCoord;
+		currentBlockCoord = block;
+		currentSkyCoord = sky;
 	}
 	
 	public static int setBlocklightValue(int lightmapCoord, int blocklight) {
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelAxisAligned.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelAxisAligned.java
index a4133ec8c..a4fb3b83f 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelAxisAligned.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelAxisAligned.java
@@ -52,8 +52,21 @@ public class BlockModelAxisAligned<T extends BlockLogic> extends BlockModelStand
     @Override
     public @Nullable IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
     {
-        if ((6 * (data & 3) + side.getId()) >= Sides.orientationLookUpXYZAligned.length) return TextureRegistry.getTexture("minecraft:block/grass_top");
-        return super.getBlockTextureFromSideAndMetadata(Side.getSideById(Sides.orientationLookUpXYZAligned[6 * (data & 3) + side.getId()]), data);
+        Side rotated = getRotatedSide(side, data);
+        if (rotated == Side.NONE) return TextureRegistry.getTexture("minecraft:block/grass_top");
+        return super.getBlockTextureFromSideAndMetadata(rotated, data);
+    }
+
+    @Override
+    public @Nullable IconCoordinate getBlockOverbrightTextureFromSideAndMeta(Side side, int data) {
+        Side rotated = getRotatedSide(side, data);
+        if (rotated == Side.NONE) return null;
+        return super.getBlockOverbrightTextureFromSideAndMeta(rotated, data);
+    }
+
+    public Side getRotatedSide(Side side, int data) {
+        int d = (6 * (data & 3) + side.getId());
+        return d < Sides.orientationLookUpXYZAligned.length ? Side.getSideById(Sides.orientationLookUpXYZAligned[d]) : Side.NONE;
     }
 
 }
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 875d1a7c9..b3ac76ce1 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
@@ -811,16 +811,16 @@ public final class BlockModelDispatcher
         addDispatch(new BlockModelEmpty<>(Blocks.STATUE_PIGMAN_LOWER).setAllTextures(BLOCK_TEXTURES, "minecraft:block/marble"));
         addDispatch(new BlockModelEmpty<>(Blocks.STATUE_PIGMAN_UPPER).setAllTextures(BLOCK_TEXTURES, "minecraft:block/marble"));
 
-        addDispatch(new BlockModelComparer<>(Blocks.COMPARER, false)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/comparer/side", Side.TOP, Side.BOTTOM, Side.EAST, Side.WEST)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/comparer/front0", Side.NORTH, Side.SOUTH)
-            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/comparer/front_overlay0", Side.NORTH, Side.SOUTH));
-
-        addDispatch(new BlockModelComparer<>(Blocks.COMPARER_ACTIVE, true)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/comparer/side_active", Side.TOP, Side.BOTTOM, Side.EAST, Side.WEST)
-            .setTex(BLOCK_TEXTURES, "minecraft:block/comparer/front0", Side.NORTH, Side.SOUTH)
-            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/comparer/front_active_overlay0", Side.NORTH, Side.SOUTH)
-            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/comparer/side_active_overlay", Side.WEST, Side.EAST, Side.BOTTOM, Side.TOP));
+        addDispatch(new BlockModelMatcher<>(Blocks.MATCHER, false)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/matcher/side", S_SIDES)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/matcher/front0", S_TB)
+            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/matcher/front_overlay0", S_TB));
+
+        addDispatch(new BlockModelMatcher<>(Blocks.MATCHER_ACTIVE, true)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/matcher/side_active", S_SIDES)
+            .setTex(BLOCK_TEXTURES, "minecraft:block/matcher/front0", S_TB)
+            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/matcher/front_active_overlay0", S_TB)
+            .setTex(OVERBRIGHT_TEXTURES, "minecraft:block/matcher/side_active_overlay", S_SIDES));
     }
 }
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelComparer.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelMatcher.java
similarity index 60%
rename from game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelComparer.java
rename to game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelMatcher.java
index 03b192444..f5da93dcc 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelComparer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelMatcher.java
@@ -4,37 +4,42 @@ 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.block.BlockLogicActivator;
-import net.minecraft.core.block.BlockLogicVeryRotatable;
-import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.useless.dragonfly.DisplayPos;
 
+import java.util.Map;
 import java.util.Random;
 
-public class BlockModelComparer<T extends BlockLogic> extends BlockModelVeryRotatable<T> {
+public class BlockModelMatcher<T extends BlockLogic> extends BlockModelAxisAligned<T> {
     public IconCoordinate[] frontVariants;
     public IconCoordinate[] frontOverlayVariants;
     public final Random random = new Random();
 
-    public BlockModelComparer(Block<T> block, boolean isPowered) {
+    public BlockModelMatcher(Block<T> block, boolean isPowered) {
         super(block);
         frontVariants = new IconCoordinate[4];
         frontOverlayVariants = new IconCoordinate[frontVariants.length];
         for (int i = 0; i < frontVariants.length; i++) {
-            frontVariants[i] = TextureRegistry.getTexture("minecraft:block/comparer/front" + (isPowered ? "_active" : "") + i);
-            frontOverlayVariants[i] = TextureRegistry.getTexture("minecraft:block/comparer/front" + (isPowered ? "_active" : "") + "_overlay" + i);
+            frontVariants[i] = TextureRegistry.getTexture("minecraft:block/matcher/front" + (isPowered ? "_active" : "") + i);
+            frontOverlayVariants[i] = TextureRegistry.getTexture("minecraft:block/matcher/front" + (isPowered ? "_active" : "") + "_overlay" + i);
+        }
+
+        for (Map.Entry<String, DisplayPos> e : displayPosMap.entrySet()) {
+            DisplayPos p = displayPosMap.get(e.getKey());
+            boolean flip = e.getKey().equals(DisplayPos.FIRST_PERSON_RIGHT_HAND) || e.getKey().equals(DisplayPos.THIRD_PERSON_RIGHT_HAND) || e.getKey().equals(DisplayPos.THIRD_PERSON_LEFT_HAND);
+            displayPosMap.put(e.getKey(), new DisplayPos(p.tx, p.ty, p.tz, p.rx, p.ry + (flip ? -90 : 90), p.rz, p.sx, p.sy, p.sz));
         }
     }
 
     @Override
     public @Nullable IconCoordinate getBlockTexture(WorldSource blockAccess, int x, int y, int z, Side side) {
         Side rotated = getRotatedSide(side, blockAccess.getBlockMetadata(x, y, z));
-        if (rotated.getAxis() == Axis.Z) {
-            random.setSeed(x * 374761393 + y * 668265263 + z * 968290493);
+        if (rotated.getAxis() == Axis.Y) {
+            random.setSeed(getPositionalSeed(x, y, z));
             return frontVariants[random.nextInt(frontVariants.length)];
         }
         return super.getBlockTexture(blockAccess, x, y, z, side);
@@ -43,10 +48,14 @@ public class BlockModelComparer<T extends BlockLogic> extends BlockModelVeryRota
     @Override
     public @Nullable IconCoordinate getBlockOverbrightTexture(WorldSource blockAccess, int x, int y, int z, @NotNull Side side) {
         Side rotated = getRotatedSide(side, blockAccess.getBlockMetadata(x, y, z));
-        if (rotated.getAxis() == Axis.Z) {
-            random.setSeed(x * 374761393 + y * 668265263 + z * 968290493);
+        if (rotated.getAxis() == Axis.Y) {
+            random.setSeed(getPositionalSeed(x, y, z));
             return frontOverlayVariants[random.nextInt(frontVariants.length)];
         }
         return super.getBlockOverbrightTexture(blockAccess, x, y, z, side);
     }
+
+    public long getPositionalSeed(int x, int y, int z) {
+        return x * 374761393 + y * 668265263 + z * 968290493;
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
index 093e119a8..c2c685dda 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
@@ -134,18 +134,22 @@ public class BlockModelStandard<T extends BlockLogic> extends BlockModel<T>{
 
         tessellator.draw();
 
+        if(LightmapHelper.isLightmapEnabled() && lightmapCoordinate != null) {
+            LightmapHelper.setLastLightmapCoord();
+        }
+
         if(hasOverbright()) {
 //			GL11.glDisable(GL11.GL_LIGHTING);
 
-            brightness = 1.0f;
+            float brightnessOver = 1.0f;
             if(renderBlocks.useInventoryTint) {
                 int color = BlockColorDispatcher.getInstance().getDispatch(block).getFallbackColor(metadata, 0);
                 float r = (float) (color >> 16 & 0xff) / 255F;
                 float g = (float) (color >> 8 & 0xff) / 255F;
                 float b = (float) (color & 0xff) / 255F;
-                GL11.glColor4f(r * brightness, g * brightness, b * brightness, alpha);
+                GL11.glColor4f(r * brightnessOver, g * brightnessOver, b * brightnessOver, alpha);
             }else {
-                GL11.glColor4f(brightness, brightness, brightness, alpha);
+                GL11.glColor4f(brightnessOver, brightnessOver, brightnessOver, alpha);
             }
 
             if(LightmapHelper.isLightmapEnabled()) {
@@ -174,6 +178,10 @@ public class BlockModelStandard<T extends BlockLogic> extends BlockModel<T>{
 
             tessellator.draw();
 
+            if(LightmapHelper.isLightmapEnabled()) {
+                LightmapHelper.setLastLightmapCoord();
+            }
+
 //			GL11.glEnable(GL11.GL_LIGHTING);
         }
     }
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side.png b/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side.png
deleted file mode 100644
index b730e6606..000000000
Binary files a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side.png and /dev/null differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side_active.png b/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side_active.png
deleted file mode 100644
index 3f609bc16..000000000
Binary files a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side_active.png and /dev/null differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side_active_overlay.png b/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side_active_overlay.png
deleted file mode 100644
index e2741db32..000000000
Binary files a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/side_active_overlay.png and /dev/null differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front0.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front0.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front0.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front0.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front0.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front0.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front0.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front0.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front1.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front1.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front1.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front1.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front1.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front1.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front1.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front1.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front2.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front2.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front2.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front2.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front2.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front2.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front2.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front2.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front3.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front3.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front3.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front3.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front3.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front3.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front3.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front3.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active0.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active0.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active0.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active0.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active0.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active0.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active0.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active0.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active1.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active1.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active1.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active1.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active1.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active1.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active1.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active1.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active2.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active2.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active2.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active2.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active2.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active2.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active2.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active2.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active3.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active3.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active3.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active3.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active3.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active3.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active3.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active3.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay0.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay0.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay0.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay0.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay0.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay0.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay0.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay0.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay1.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay1.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay1.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay1.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay1.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay1.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay1.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay1.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay2.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay2.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay2.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay2.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay2.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay2.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay2.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay2.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay3.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay3.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay3.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay3.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay3.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay3.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_active_overlay3.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_active_overlay3.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay0.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay0.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay0.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay0.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay0.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay0.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay0.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay0.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay1.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay1.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay1.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay1.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay1.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay1.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay1.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay1.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay2.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay2.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay2.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay2.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay2.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay2.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay2.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay2.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay3.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay3.png
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay3.png
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay3.png
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay3.png.mcmeta b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay3.png.mcmeta
similarity index 100%
rename from game/client/src/main/resources/assets/minecraft/textures/block/comparer/front_overlay3.png.mcmeta
rename to game/client/src/main/resources/assets/minecraft/textures/block/matcher/front_overlay3.png.mcmeta
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side.png
new file mode 100644
index 000000000..2b1005590
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side_active.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side_active.png
new file mode 100644
index 000000000..01f66e83a
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side_active.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side_active_overlay.png b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side_active_overlay.png
new file mode 100644
index 000000000..7e18345b9
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/block/matcher/side_active_overlay.png differ
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicAxisAligned.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicAxisAligned.java
index 34fd38e5b..5d6817552 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicAxisAligned.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicAxisAligned.java
@@ -10,6 +10,9 @@ import org.jetbrains.annotations.NotNull;
 
 public class BlockLogicAxisAligned extends BlockLogic {
 
+	public static final int MASK_DIRECTION = 0b0000_0011;
+
+
 	public BlockLogicAxisAligned(Block<?> block, Material material) {
 		super(block, material);
 	}
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicComparer.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicMatcher.java
similarity index 76%
rename from game/core/src/main/java/net/minecraft/core/block/BlockLogicComparer.java
rename to game/core/src/main/java/net/minecraft/core/block/BlockLogicMatcher.java
index 6c7ae8aab..3554328b0 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicComparer.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicMatcher.java
@@ -4,7 +4,9 @@ import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.enums.PlacementMode;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
@@ -13,9 +15,9 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.Random;
 
-public class BlockLogicComparer extends BlockLogicVeryRotatable {
+public class BlockLogicMatcher extends BlockLogicAxisAligned {
     public final boolean isActive;
-    public BlockLogicComparer(Block<?> block, boolean isActive) {
+    public BlockLogicMatcher(Block<?> block, boolean isActive) {
         super(block, Material.stone);
         this.isActive = isActive;
     }
@@ -32,7 +34,9 @@ public class BlockLogicComparer extends BlockLogicVeryRotatable {
 
     @Override
     public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double xPlaced, double yPlaced) {
-        super.onBlockPlacedByMob(world, x, y, z, side, mob, xPlaced, yPlaced);
+        Axis axis = mob.getPlacementDirection(side, PlacementMode.FACING).getAxis();
+
+        world.setBlockMetadataWithNotify(x, y, z, axisToMeta(axis));
         world.scheduleBlockUpdate(x, y, z, id(), tickDelay());
     }
 
@@ -54,15 +58,32 @@ public class BlockLogicComparer extends BlockLogicVeryRotatable {
     }
 
     public void updateState(World world, int x, int y, int z) {
-        Direction dir = BlockLogicVeryRotatable.metaToDirection(world.getBlockMetadata(x, y, z) & BlockLogicVeryRotatable.MASK_DIRECTION);
+        Axis a = BlockLogicAxisAligned.metaToAxis(world.getBlockMetadata(x, y, z) & BlockLogicAxisAligned.MASK_DIRECTION);
+
+        int fx = x;
+        int fy = y;
+        int fz = z;
+
+        int bx = x;
+        int by = y;
+        int bz = z;
+        switch (a) {
+            case X:
+                fx += 1;
+                bx -= 1;
+                break;
+            case Y:
+                fy += 1;
+                by -= 1;
+                break;
+            case Z:
+            default:
+                fz += 1;
+                bz -= 1;
+                break;
+        }
 
-        int fx = x + dir.getOffsetX();
-        int fy = y + dir.getOffsetY();
-        int fz = z + dir.getOffsetZ();
 
-        int bx = x + dir.getOpposite().getOffsetX();
-        int by = y + dir.getOpposite().getOffsetY();
-        int bz = z + dir.getOpposite().getOffsetZ();
 
         Block<?> fBlock = world.getBlock(fx, fy, fz);
         Block<?> bBlock = world.getBlock(bx, by, bz);
@@ -73,9 +94,9 @@ public class BlockLogicComparer extends BlockLogicVeryRotatable {
         boolean backMatchesFront = fBlock == bBlock && fMeta == bMeta;
 
         if (!isActive && backMatchesFront) {
-            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.COMPARER_ACTIVE.id(), world.getBlockMetadata(x, y, z));
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.MATCHER_ACTIVE.id(), world.getBlockMetadata(x, y, z));
         } else if (isActive && !backMatchesFront) {
-            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.COMPARER.id(), world.getBlockMetadata(x, y, z));
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.MATCHER.id(), world.getBlockMetadata(x, y, z));
         }
     }
 
@@ -121,7 +142,7 @@ public class BlockLogicComparer extends BlockLogicVeryRotatable {
     @Override
     public boolean getSignal(WorldSource worldSource, int x, int y, int z, Side side)
     {
-        return isActive && (BlockLogicVeryRotatable.metaToDirection(worldSource.getBlockMetadata(x, y, z)).getAxis() != side.getAxis());
+        return isActive && (BlockLogicAxisAligned.metaToAxis(worldSource.getBlockMetadata(x, y, z)) != side.getAxis());
     }
 
     @Override
@@ -129,7 +150,7 @@ public class BlockLogicComparer extends BlockLogicVeryRotatable {
         if (dropCause == EnumDropCause.IMPROPER_TOOL) {
             return null;
         }
-        return new ItemStack[]{new ItemStack(Blocks.COMPARER)};
+        return new ItemStack[]{new ItemStack(Blocks.MATCHER)};
     }
 
 }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicWireRedstone.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicWireRedstone.java
index 643c5094e..38f26ebaa 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicWireRedstone.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicWireRedstone.java
@@ -381,8 +381,8 @@ public class BlockLogicWireRedstone extends BlockLogic {
             if (side == Side.NONE || side.isVertical()) return false;
             return Side.getSideById(worldSource.getBlockMetadata(x, y, z)).getOpposite() == side;
         }
-        if (block == Blocks.COMPARER || block == Blocks.COMPARER_ACTIVE) {
-            return BlockLogicVeryRotatable.metaToDirection(worldSource.getBlockMetadata(x, y, z)).getAxis() != side.getAxis();
+        if (block == Blocks.MATCHER || block == Blocks.MATCHER_ACTIVE) {
+            return BlockLogicAxisAligned.metaToAxis(worldSource.getBlockMetadata(x, y, z)) != side.getAxis();
         }
         if (block == Blocks.REPEATER_IDLE || block == Blocks.REPEATER_ACTIVE) {
             final Side direction = BlockLogicRepeater.getSideFromMeta(worldSource.getBlockMetadata(x, y, z));
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 d63ef9602..3da68ee16 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
@@ -1287,11 +1287,11 @@ public final class Blocks {
         .withSound(BlockSounds.STONE).withHardness(1.5F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
 
-    public static final Block<BlockLogic> COMPARER = register("comparer", "minecraft:block/comparer", 1040, (b) -> new BlockLogicComparer(b, false))
+    public static final Block<BlockLogic> MATCHER = register("matcher", "minecraft:block/matcher", 1040, (b) -> new BlockLogicMatcher(b, false))
         .withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange()
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
 
-    public static final Block<BlockLogic> COMPARER_ACTIVE = register("comparer.active", "minecraft:block/comparer_active", 1041, (b) -> new BlockLogicComparer(b, true))
+    public static final Block<BlockLogic> MATCHER_ACTIVE = register("matcher.active", "minecraft:block/matcher_active", 1041, (b) -> new BlockLogicMatcher(b, true))
         .withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange()
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
 
diff --git a/game/core/src/main/java/net/minecraft/core/world/World.java b/game/core/src/main/java/net/minecraft/core/world/World.java
index 9b719eaf8..583ddf01e 100644
--- a/game/core/src/main/java/net/minecraft/core/world/World.java
+++ b/game/core/src/main/java/net/minecraft/core/world/World.java
@@ -2691,7 +2691,7 @@ public class World implements WorldSource {
 
     public boolean getSignal(int x, int y, int z, Side side) {
         Block<?> block = getBlock(x, y, z);
-        if(isBlockNormalCube(x, y, z) && block != Blocks.BLOCK_REDSTONE  && block != Blocks.PUMPKIN_REDSTONE && block != Blocks.COMPARER_ACTIVE) {
+        if(isBlockNormalCube(x, y, z) && block != Blocks.BLOCK_REDSTONE  && block != Blocks.PUMPKIN_REDSTONE && block != Blocks.MATCHER_ACTIVE) {
             return hasDirectSignal(x, y, z);
         }
         if(block == null) {
diff --git a/game/core/src/main/resources/lang/en_US/tile.lang b/game/core/src/main/resources/lang/en_US/tile.lang
index 05fcf0d53..0ae07fd2a 100644
--- a/game/core/src/main/resources/lang/en_US/tile.lang
+++ b/game/core/src/main/resources/lang/en_US/tile.lang
@@ -1417,7 +1417,7 @@ tile.statue.pigman.lower.desc=
 tile.statue.pigman.upper.name=Pigman Statue (Upper)
 tile.statue.pigman.upper.desc=
 
-tile.comparer.name=Comparer
-tile.comparer.desc=Compares the block infront to the block behind.
-tile.comparer.active.name=Comparer
-tile.comparer.desc=Compares the block infront to the block behind.
+tile.matcher.name=Matcher
+tile.matcher.desc=Matches the block in front to the block behind.
+tile.matcher.active.name=Matcher
+tile.matcher.desc=Matches the block in front to the block behind.
diff --git a/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java b/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
index c284e03aa..a069def6b 100644
--- a/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
+++ b/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
@@ -1290,14 +1290,15 @@ class WorkbenchGenerator {
 
         RecipeBuilder.Shaped(CORE_NAMESPACE)
             .setShape(
-                "###",
-                "QRQ",
-                "###"
+                "#Q#",
+                "#S#",
+                "#R#"
             )
-            .addInput('#', "minecraft:cobblestones")
+            .addInput('#', Blocks.COBBLE_NETHERRACK)
             .addInput('Q', Items.QUARTZ)
             .addInput('R', Items.DUST_REDSTONE)
-            .create("comparer", new ItemStack(Blocks.COMPARER, 1));
+            .addInput('S', Blocks.SOULSAND)
+            .create("matcher", new ItemStack(Blocks.MATCHER, 1));
     }
 
     private static void generateScrapRecipes() {
