diff --git a/src/common/resources/lang/en_US/options.lang b/src/common/resources/lang/en_US/options.lang
index 951f1dd42..98d7fd10d 100644
--- a/src/common/resources/lang/en_US/options.lang
+++ b/src/common/resources/lang/en_US/options.lang
@@ -146,9 +146,10 @@ options.customAnimations=Custom Animations
 options.turnWithVehicle=Turn with Vehicle
 options.playServerSounds=Play Server Sounds
 options.lightmapStyle=Lightmap Style
-options.lightmapStyle.default=Default
+options.lightmapStyle.gray=Grayscale
 options.lightmapStyle.cosy=Cosy
 options.lightmapStyle.disabled=Disabled
+options.customLightmap=Custom Lightmap
 
 options.tooltipStyle.default=Default
 options.tooltipStyle.modern=Modern
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 0a9b3b1bb..91718ee61 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -1388,7 +1388,7 @@ public class Minecraft
                             else if (Keyboard.getEventKey() == Keyboard.KEY_L)
                             {
                             	if(gameSettings.lightmapStyle.value == LightmapStyle.DISABLED) {
-                            		gameSettings.lightmapStyle.value = LightmapStyle.DEFAULT;
+                            		gameSettings.lightmapStyle.value = LightmapStyle.GRAY;
                             		ingameGUI.guiHeldItemTooltip.setString("Lightmap: On");
                             		renderGlobal.loadRenderers();
                             	}else {
@@ -2050,6 +2050,7 @@ public class Minecraft
         if (world != null) {
             loadingScreen.progressStop();
         }
+        worldRenderer.lightmapHelper.setup();
     }
 
     private void convertSaveVersion(int fromVersion, String worldDirName, String worldName)
diff --git a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 78835f997..7580a97ab 100644
--- a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -196,6 +196,7 @@ public abstract class OptionsPages
             .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.animations))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.customAnimations))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.mobVariants))
+            .withComponent(new BooleanOptionComponent(mc.gameSettings.customLightmap))
         )
         .withComponent(new ShortcutComponent("gui.options.page.texture_packs.button.apply", () -> mc.texturePackList.refreshIfReady()))
         .withComponent(new OptionsCategory("gui.options.page.texture_packs.category.texture_packs.selected")
diff --git a/src/main/java/net/minecraft/client/option/GameSettings.java b/src/main/java/net/minecraft/client/option/GameSettings.java
index 01be9a240..7e1c92c5c 100644
--- a/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -151,7 +151,8 @@ public class GameSettings {
 	public BooleanOption borderlessFullscreen = new BooleanOption(this, "borderlessFullscreen", true);
 	public BooleanOption startInFullscreen = new BooleanOption(this, "startInFullscreen", true);
 	public EnumOption<TooltipStyle> tooltipStyle = new EnumOption<>(this, "tooltipStyle", TooltipStyle.class);
-	public EnumOption<LightmapStyle> lightmapStyle = new EnumOption<>(this, "lightmapStyle", LightmapStyle.class, LightmapStyle.DEFAULT);
+	public EnumOption<LightmapStyle> lightmapStyle = new EnumOption<>(this, "lightmapStyle", LightmapStyle.class, LightmapStyle.GRAY);
+	public BooleanOption customLightmap = new BooleanOption(this, "customLightmap", true);
 	public BooleanOption fog = new BooleanOption(this, "fog", true);
 	public BooleanOption hideUndiscoveredItems = new BooleanOption(this, "hideUndiscoveredItems", true);
 	public BooleanOption muteOnLostFocus = new BooleanOption(this, "muteOnLostFocus", false);
@@ -421,6 +422,9 @@ public class GameSettings {
 				mc.renderGlobal.loadRenderers();
 			}
 		}
+		if(option == customLightmap) {
+			mc.worldRenderer.lightmapHelper.setup();
+		}
 	}
 
 	public void loadOptions() {
diff --git a/src/main/java/net/minecraft/client/option/enums/LightmapStyle.java b/src/main/java/net/minecraft/client/option/enums/LightmapStyle.java
index 36450e11c..c9bf9f812 100644
--- a/src/main/java/net/minecraft/client/option/enums/LightmapStyle.java
+++ b/src/main/java/net/minecraft/client/option/enums/LightmapStyle.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.option.enums;
 
 public enum LightmapStyle {
-    DEFAULT("options.lightmapStyle.default"),
+    GRAY("options.lightmapStyle.gray"),
     COSY("options.lightmapStyle.cosy"),
     DISABLED("options.lightmapStyle.disabled");
 
diff --git a/src/main/java/net/minecraft/client/render/LightmapHelper.java b/src/main/java/net/minecraft/client/render/LightmapHelper.java
index eb29e66fb..faa679fff 100644
--- a/src/main/java/net/minecraft/client/render/LightmapHelper.java
+++ b/src/main/java/net/minecraft/client/render/LightmapHelper.java
@@ -3,11 +3,13 @@ package net.minecraft.client.render;
 import static org.lwjgl.opengl.GL11.*;
 import static org.lwjgl.opengl.GL13.*;
 
+import java.awt.image.BufferedImage;
 import java.nio.ByteBuffer;
 
 import net.minecraft.client.GLAllocation;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.option.enums.LightmapStyle;
+import net.minecraft.client.util.helper.Textures;
 import net.minecraft.core.util.helper.Buffer;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
@@ -24,12 +26,37 @@ public class LightmapHelper {
 
 	private int lightmapTexture = 0;
 	private int[] lightmapData = new int[256];
+	public BufferedImage customLightmap;
 
 	public LightmapHelper(Minecraft mc, WorldRenderer worldRenderer) {
 		this.mc = mc;
 		this.worldRenderer = worldRenderer;
 		instance = this;
 	}
+	
+	public void setup() {
+		World world = mc.theWorld;
+		if(mc.gameSettings.customLightmap.value && world != null) {
+			int dimension = world.dimension.id;
+			
+			String path = "/environment/lightmap" + dimension + ".png";
+			
+			System.out.println("Loading lightmap '" + path + "'");
+			customLightmap = mc.renderEngine.getImage(path);
+			
+			if(customLightmap == Textures.missingTexture) {
+				customLightmap = null;
+			}
+			
+			if(customLightmap != null) {
+				System.out.println("Loaded lightmap!");
+			}else {
+				System.out.println("No lightmap!");
+			}
+		}else {
+			customLightmap = null;
+		}
+	}
 
 	public boolean isEnabled() {
 		return mc.gameSettings.lightmapStyle.value != LightmapStyle.DISABLED;
@@ -47,13 +74,16 @@ public class LightmapHelper {
 				lightmapData[i] = 0xFFFFFFFF;
 			}
 		} else {
-			switch (mc.gameSettings.lightmapStyle.value) {
-				case DEFAULT:
+			if(mc.gameSettings.customLightmap.value && customLightmap != null) {
+				generateCustomLightmap(world);
+			}else {
+				LightmapStyle lightmapStyle = mc.gameSettings.lightmapStyle.value;
+				
+				if(lightmapStyle == LightmapStyle.COSY) {
+					generateCosyLightmap(world, partialTicks);
+				}else if(lightmapStyle == LightmapStyle.GRAY) {
 					generateGrayLightmap(world, partialTicks);
-					break;
-				case COSY:
-					generateVanillaLightmap(world, partialTicks);
-					break;
+				}
 			}
 		}
 
@@ -128,7 +158,7 @@ public class LightmapHelper {
 		}
 	}
 
-	public void generateVanillaLightmap(World world, float partialTicks) {
+	public void generateCosyLightmap(World world, float partialTicks) {
 		float ambientBrightness = world.getAmbientBrightness(partialTicks);
 		float brightness = mc.gameSettings.brightness.value - 0.5f;
 
@@ -171,6 +201,50 @@ public class LightmapHelper {
 			lightmapData[i] = toIntARGB(red, green, blue);
 		}
 	}
+	
+	public void generateCustomLightmap(World world) {
+		float ambientBrightness = (world.getAmbientBrightness(1.0f) - 0.2f) / 0.8f;
+		float brightness = mc.gameSettings.brightness.value;
+		
+		int skylightX = MathHelper.floor_float(ambientBrightness * (customLightmap.getWidth() - 2));
+		
+		for(int i=0; i < 256; i++) {
+			int blockLightIndex = i % 16;
+			int skyLightIndex = i / 16;
+			
+			int torchColor = customLightmap.getRGB(0, 16 + blockLightIndex);
+			int skyColor = customLightmap.getRGB(skylightX, skyLightIndex);
+			
+			float torchRed   = ((torchColor >> 16) & 0xFF) / 255.0f;
+			float torchGreen = ((torchColor >>  8) & 0xFF) / 255.0f;
+			float torchBlue  = ((torchColor >>  0) & 0xFF) / 255.0f;
+			
+			float skyRed   = ((skyColor >> 16) & 0xFF) / 255.0f;
+			float skyGreen = ((skyColor >>  8) & 0xFF) / 255.0f;
+			float skyBlue  = ((skyColor >>  0) & 0xFF) / 255.0f;
+			
+			float red = skyRed + torchRed;
+			float green = skyGreen + torchGreen;
+			float blue = skyBlue + torchBlue;
+
+			red = MathHelper.clamp(red, 0.0f, 1.0f);
+			green = MathHelper.clamp(green, 0.0f, 1.0f);
+			blue = MathHelper.clamp(blue, 0.0f, 1.0f);
+			
+			red = applyGamma(red, brightness);
+			green = applyGamma(green, brightness);
+			blue = applyGamma(blue, brightness);
+
+			red = MathHelper.clamp(red, 0.0f, 1.0f);
+			green = MathHelper.clamp(green, 0.0f, 1.0f);
+			blue = MathHelper.clamp(blue, 0.0f, 1.0f);
+			
+			lightmapData[i] = toIntARGB(red, green, blue);
+		}
+//		for(int i=0; i < 256; i++) {
+//			lightmapData[i] = 0xFFFF0000;
+//		}
+	}
 
 	public void setLightmapTextureData(int[] data) {
 		OpenGLHelper.checkError("pre set lightmap data");
diff --git a/src/main/java/net/minecraft/client/render/RenderEngine.java b/src/main/java/net/minecraft/client/render/RenderEngine.java
index a94431dea..9c469d4ad 100644
--- a/src/main/java/net/minecraft/client/render/RenderEngine.java
+++ b/src/main/java/net/minecraft/client/render/RenderEngine.java
@@ -752,6 +752,8 @@ public class RenderEngine {
         ColorizerWater.updateColorData(mc.renderEngine.getTextureImageData("/misc/watercolor.png"));
         ColorizerGrass.updateColorData(mc.renderEngine.getTextureImageData("/misc/grasscolor.png"));
         ColorizerFoliage.updateColorData(mc.renderEngine.getTextureImageData("/misc/foliagecolor.png"));
+        
+        mc.worldRenderer.lightmapHelper.setup();
 	}
 
 	public void bindTexture(int i) {
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
index 6d0c2f662..78b1418d1 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
@@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 public class ItemModelQuiver extends ItemModelStandard{
-    protected IconCoordinate quiverFull = TextureRegistry.getTexture("minecraft:item/armor_quiver_full");
+    protected IconCoordinate quiverFull = TextureRegistry.getTexture("minecraft:item/armor_quiver_empty");
     public ItemModelQuiver(Item item, String namespace) {
         super(item, namespace);
     }
diff --git a/src/main/resources/assets/minecraft/textures/item/armor_quiver_full.png b/src/main/resources/assets/minecraft/textures/item/armor_quiver_empty.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/item/armor_quiver_full.png
rename to src/main/resources/assets/minecraft/textures/item/armor_quiver_empty.png
