diff --git a/src/common/resources/recipes/workbench.json b/src/common/resources/recipes/workbench.json
index 5ebfc4997..50ed9f778 100644
--- a/src/common/resources/recipes/workbench.json
+++ b/src/common/resources/recipes/workbench.json
@@ -11647,19 +11647,10 @@
     "name": "minecraft:workbench/rope",
     "type": "minecraft:crafting/shaped",
     "pattern": [
-      "X#X",
-      "X#X",
-      "X#X"
+      "X",
+      "X"
     ],
     "symbols": [
-      {
-        "symbol": "#",
-        "stack": {
-          "id": 16469,
-          "amount": 1,
-          "meta": 0
-        }
-      },
       {
         "symbol": "X",
         "stack": {
@@ -11671,7 +11662,7 @@
     ],
     "result": {
       "id": 16534,
-      "amount": 16,
+      "amount": 2,
       "meta": 0
     },
     "consumeContainers": true
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 30270e34f..e28144cfb 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -1838,7 +1838,7 @@ public class Minecraft
 
         // Toggle fog
         if (gameSettings.keyToggleFog.isPressEvent(currentInputDevice)) {
-            gameSettings.renderDistance.toggle(shift ? -1 : 1);
+            gameSettings.renderDistance.toggle(shift ? -8 : 8);
             ingameGUI.guiHeldItemTooltip.setOptionNameAndValueString(gameSettings.renderDistance);
             return true;
         }
diff --git a/src/main/java/net/minecraft/client/option/GameSettings.java b/src/main/java/net/minecraft/client/option/GameSettings.java
index 2e8d9ee90..f1f8fafe9 100644
--- a/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -104,7 +104,7 @@ public class GameSettings {
 	public ColorOption guiBackgroundColor = new ColorOption(this, "guiBackgroundColor", new Color().setARGB(0xc0101010));
 	public EnumOption<Difficulty> difficulty = new EnumOption<>(this, "difficulty", Difficulty.class, Difficulty.NORMAL); // Stub for local difficulty setting
 	public IntegerOption thirdPersonView = new IntegerOption(this, "thirdPersonView", 0);
-	public EnumOption<RenderDistance> renderDistance = new EnumOption<>(this, "renderDistance", RenderDistance.class, RenderDistance.FAR);
+	public RangeOption renderDistance = new RangeOption(this, "renderDistance", 8, 2, 64);
 	public BooleanOption enableVsync = new BooleanOption(this, "enableVsync", false);
 	public RangeOption customFpsLimit = new RangeOption(this,"customFpsLimit",0,241);
 	public IntegerOption guiScale = new IntegerOption(this, "guiScale", 0);
diff --git a/src/main/java/net/minecraft/client/option/RangeOption.java b/src/main/java/net/minecraft/client/option/RangeOption.java
index 3828f24af..fca1fa9de 100644
--- a/src/main/java/net/minecraft/client/option/RangeOption.java
+++ b/src/main/java/net/minecraft/client/option/RangeOption.java
@@ -1,10 +1,18 @@
 package net.minecraft.client.option;
 
 public class RangeOption extends ToggleableOption<Integer>{
-	
+	public final int highest;
+	public final int lowest;
     public RangeOption(GameSettings gameSettings, String name, int defaultValue, int values) {
         super(gameSettings, name, defaultValue, getValueArray(values));
+		highest = this.values[this.values.length - 1];
+		lowest = this.values[0];
     }
+	public RangeOption(GameSettings gameSettings, String name, int defaultValue, int lowest, int highest) {
+		super(gameSettings, name, defaultValue, getValueArray(lowest, highest));
+		this.highest = this.values[this.values.length - 1];
+		this.lowest = this.values[0];
+	}
 
 	@Override
 	public void parse(String string) {
@@ -21,6 +29,16 @@ public class RangeOption extends ToggleableOption<Integer>{
     	return array;
     }
 
+	public static Integer[] getValueArray(int lowest, int highest) {
+		Integer[] array = new Integer[highest - lowest + 1];
+
+		for(int i=0; i < array.length; i++) {
+			array[i] = i + lowest;
+		}
+
+		return array;
+	}
+
 	@Override
 	public boolean isSlider() {
 		return true;
diff --git a/src/main/java/net/minecraft/client/render/FogManager.java b/src/main/java/net/minecraft/client/render/FogManager.java
index 1a0c9d8fe..13cfe5885 100644
--- a/src/main/java/net/minecraft/client/render/FogManager.java
+++ b/src/main/java/net/minecraft/client/render/FogManager.java
@@ -46,7 +46,8 @@ public class FogManager {
 
         float brightnessAtCamera = mc.theWorld.getLightBrightness(MathHelper.floor(mc.activeCamera.getX(1f)), MathHelper.floor(mc.activeCamera.getY(1f)), MathHelper.floor(mc.activeCamera.getZ(1f)));
         if (mc.fullbright) brightnessAtCamera = 1.0f;
-        float renderDistanceModifier = ((3 - mc.gameSettings.renderDistance.value.legacyValue) * fogModifier) / 3F;
+        float renderDistanceModifier = (((mc.gameSettings.renderDistance.highest - mc.gameSettings.renderDistance.value) * fogModifier) / (float) mc.gameSettings.renderDistance.highest);
+
         float newBrightness = brightnessAtCamera * (1.0F - renderDistanceModifier) + renderDistanceModifier;
 
         fogBrightness += (newBrightness - fogBrightness) * 0.1F;
@@ -108,7 +109,7 @@ public class FogManager {
     {
         World world = mc.theWorld;
 
-        float renderDistanceScale = 1.0F / (float)(4 - mc.gameSettings.renderDistance.value.legacyValue);
+        float renderDistanceScale = 1.0F / (float)((mc.gameSettings.renderDistance.highest + 1) - mc.gameSettings.renderDistance.value);
         renderDistanceScale = 1.0F - (float) Math.pow(renderDistanceScale, 0.25D);
 
         Vec3 skyColor = world.getSkyColor(mc.activeCamera, partialTick);
diff --git a/src/main/java/net/minecraft/client/render/RenderGlobal.java b/src/main/java/net/minecraft/client/render/RenderGlobal.java
index 474a729ce..b80b29f54 100644
--- a/src/main/java/net/minecraft/client/render/RenderGlobal.java
+++ b/src/main/java/net/minecraft/client/render/RenderGlobal.java
@@ -231,7 +231,7 @@ public class RenderGlobal
                 chunkRenderer.delete();
             }
         }
-        int renderDiameterBlocks = renderDistance.chunks * 16 * 2;
+        int renderDiameterBlocks = renderDistance * 16 * 2;
 		renderChunksWide = renderDiameterBlocks / RENDER_CHUNK_SIZE + 1;
         renderChunksTall = worldObj.getHeightBlocks() / RENDER_CHUNK_SIZE;
 		renderChunksDeep =  renderDiameterBlocks / RENDER_CHUNK_SIZE + 1;
@@ -1744,7 +1744,7 @@ public class RenderGlobal
     private int maxBlockX;
     private int maxBlockY;
     private int maxBlockZ;
-    private RenderDistance renderDistance = null;
+    private Integer renderDistance = null;
     private int renderEntitiesStartupCounter;
     private int countEntitiesTotal;
     private int countEntitiesRendered;
diff --git a/src/main/java/net/minecraft/client/render/WorldRenderer.java b/src/main/java/net/minecraft/client/render/WorldRenderer.java
index ca54ffae0..67d020b34 100644
--- a/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -313,7 +313,7 @@ public class WorldRenderer
 
     private void setupCameraTransform(float partialTick)
     {
-        farPlaneDistance = mc.gameSettings.renderDistance.value.chunks * 16;
+        farPlaneDistance = mc.gameSettings.renderDistance.value * 16;
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         float fov = getFOVModifier(partialTick, true);
@@ -624,7 +624,7 @@ public class WorldRenderer
         setupCameraTransform(partialTicks);
         Frustum.getFrustum();
         Debug.change("sky");
-        if(mc.gameSettings.renderDistance.value.renderSky && !(mc.currentScreen instanceof GuiModelViewer))
+        if((mc.gameSettings.renderDistance.value > 4) /* Used to use Renderdistance rendersky! */ && !(mc.currentScreen instanceof GuiModelViewer))
         {
             fogManager.setupFog(FogManager.FOG_MODE_SKY, farPlaneDistance, partialTicks);
             glDisable(GL_FOG);
diff --git a/src/main/java/net/minecraft/client/world/chunk/provider/ChunkProviderDynamic.java b/src/main/java/net/minecraft/client/world/chunk/provider/ChunkProviderDynamic.java
index 20c98a49d..4a72e5379 100644
--- a/src/main/java/net/minecraft/client/world/chunk/provider/ChunkProviderDynamic.java
+++ b/src/main/java/net/minecraft/client/world/chunk/provider/ChunkProviderDynamic.java
@@ -54,7 +54,7 @@ public class ChunkProviderDynamic implements IChunkProvider
     public boolean canChunkBeUnloaded(int chunkX, int chunkZ) {
         int id = ChunkCoordinate.toInt(chunkX, chunkZ);
         if(forceLoadedChunkMap.containsKey(id)) return false;
-        int renderDistance = Minecraft.getMinecraft(this).gameSettings.renderDistance.value.chunks;
+        int renderDistance = Minecraft.getMinecraft(this).gameSettings.renderDistance.value;
         return chunkX <= currentChunkX - renderDistance || chunkZ <= currentChunkZ - renderDistance || chunkX >= currentChunkX + renderDistance || chunkZ >= currentChunkZ + renderDistance;
     }
 
@@ -169,7 +169,7 @@ public class ChunkProviderDynamic implements IChunkProvider
     public boolean keepLoaded(int chunkX, int chunkZ) {
         int id = ChunkCoordinate.toInt(chunkX, chunkZ);
         Chunk chunk = chunkMap.get(id);
-        if(isChunkLoaded(chunkX, chunkZ) && !forceLoadedChunkMap.containsKey(id) && forceLoadedChunkList.size() < forceLoadedChunksLimit) {
+        if(!forceLoadedChunkMap.containsKey(id) && forceLoadedChunkList.size() < forceLoadedChunksLimit) {
             forceLoadedChunkMap.put(id, chunk);
             forceLoadedChunkList.add(chunk);
             return true;
@@ -283,6 +283,10 @@ public class ChunkProviderDynamic implements IChunkProvider
         return "Chunks: " + chunkMap.size() + ", " + "Dropped: " + droppedChunksSet.size()+", "+"Chunkloaded: "+forceLoadedChunkMap.size()+"/"+forceLoadedChunksLimit;
     }
 
+    public List<Chunk> getForceLoadedChunks() {
+        return Collections.unmodifiableList(forceLoadedChunkList);
+    }
+
     @Override
     public void unloadAllChunks() {
         for (Chunk chunk : chunkMap.values()) {
@@ -290,6 +294,8 @@ public class ChunkProviderDynamic implements IChunkProvider
         }
         chunkMap.clear();
         droppedChunksSet.clear();
+        forceLoadedChunkMap.clear();
+        forceLoadedChunkList.clear();
         chunkGenerator = null;
         System.gc();
     }
diff --git a/src/main/java/net/minecraft/core/item/Items.java b/src/main/java/net/minecraft/core/item/Items.java
index fecd54aac..dde9bcd62 100644
--- a/src/main/java/net/minecraft/core/item/Items.java
+++ b/src/main/java/net/minecraft/core/item/Items.java
@@ -370,7 +370,7 @@ public final class Items {
         QUARTZ = (new Item("quartz", "minecraft:item/quartz", 16512));
         OLIVINE = (new Item("olivine", "minecraft:item/olivine", 16513));
         AMMO_PEBBLE = (new PebbleItem("ammo.pebble", "minecraft:item/ammo_pebble", 16514));
-        FOOD_CHERRY = (new FoodItem("food.cherry", "minecraft:item/food_cherry", 16515, 2, 2, false, 8));
+        FOOD_CHERRY = (new FoodItem("food.cherry", "minecraft:item/food_cherry", 16515, 2, 2, false, 2));
         BUCKET_ICECREAM = (new IceCreamBucketItem("bucket.icecream", "minecraft:item/bucket_icecream", 16516, 10, 4)).setContainerItem(BUCKET);
         AMMO_ARROW_PURPLE = (new Item("ammo.arrow.purple", "minecraft:item/ammo_arrow_purple", 16517)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
         LABEL = (new LabelItem("label", "minecraft:item/label", 16518));
