diff --git a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
index 05f0330..2389e83 100644
--- a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
+++ b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
@@ -11,6 +11,8 @@ public final class BetterControlsConfig{
 	
 	public boolean doubleTapForwardToSprint = true;
 	
+	public boolean sneakingMovesCameraSmoothly = true;
+	
 	public boolean flyOnGroundInCreative = false;
 	public float flightSpeedMpCreativeDefault = 1F;
 	public float flightSpeedMpCreativeSprinting = 2F;
diff --git a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
index 151c96b..740e98b 100644
--- a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
+++ b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
@@ -32,6 +32,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		
 		Json.setBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
 		
+		Json.setBool(obj, "Sneak.SmoothCamera", cfg.sneakingMovesCameraSmoothly);
+		
 		Json.setBool(obj, "Flight.FlyOnGround.Creative", cfg.flyOnGroundInCreative);
 		Json.setFloat(obj, "Flight.SpeedMp.Creative.Default", cfg.flightSpeedMpCreativeDefault);
 		Json.setFloat(obj, "Flight.SpeedMp.Creative.Sprinting", cfg.flightSpeedMpCreativeSprinting);
@@ -48,6 +50,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		
 		cfg.doubleTapForwardToSprint = Json.getBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
 		
+		cfg.sneakingMovesCameraSmoothly = Json.getBool(obj, "Sneak.SmoothCamera", cfg.sneakingMovesCameraSmoothly);
+		
 		cfg.flyOnGroundInCreative = Json.getBool(obj, "Flight.FlyOnGround.Creative", cfg.flyOnGroundInCreative);
 		cfg.flightSpeedMpCreativeDefault = Json.getFloat(obj, "Flight.SpeedMp.Creative.Default", cfg.flightSpeedMpCreativeDefault);
 		cfg.flightSpeedMpCreativeSprinting = Json.getFloat(obj, "Flight.SpeedMp.Creative.Sprinting", cfg.flightSpeedMpCreativeSprinting);
diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
index a337c23..26fd9e2 100644
--- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
+++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
@@ -46,6 +46,16 @@ public class BetterControlsScreen extends GameOptionsScreen{
 		return y;
 	}
 	
+	private int generateSneakingOptions(int y, final List<Element> elements){
+		final BetterControlsConfig cfg = BetterControlsMod.config;
+		
+		generateLeftSideText(y, elements, Text.of("Move Camera Smoothly"));
+		elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.sneakingMovesCameraSmoothly, value -> cfg.sneakingMovesCameraSmoothly = value));
+		
+		y += ROW_HEIGHT;
+		return y;
+	}
+	
 	@SuppressWarnings({ "AutoBoxing", "AutoUnboxing" })
 	private int generateFlightOptions(int y, final List<Element> elements){
 		final BetterControlsConfig cfg = BetterControlsMod.config;
@@ -116,6 +126,9 @@ public class BetterControlsScreen extends GameOptionsScreen{
 		elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Sprinting"), CENTER));
 		y = generateSprintingOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
 		
+		elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Sneaking"), CENTER));
+		y = generateSneakingOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
+		
 		elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Flying"), CENTER));
 		y = generateFlightOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
 		
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessCameraFields.java b/src/main/java/chylex/bettercontrols/mixin/AccessCameraFields.java
new file mode 100644
index 0000000..4d5b96a
--- /dev/null
+++ b/src/main/java/chylex/bettercontrols/mixin/AccessCameraFields.java
@@ -0,0 +1,14 @@
+package chylex.bettercontrols.mixin;
+import net.minecraft.client.render.Camera;
+import net.minecraft.entity.Entity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(Camera.class)
+public interface AccessCameraFields{
+	@Accessor
+	Entity getFocusedEntity();
+	
+	@Accessor
+	void setCameraY(float y);
+}
diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
index f17f024..e146a79 100644
--- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
+++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
@@ -1,6 +1,7 @@
 package chylex.bettercontrols.player;
 import chylex.bettercontrols.BetterControlsMod;
 import chylex.bettercontrols.config.BetterControlsConfig;
+import chylex.bettercontrols.mixin.AccessCameraFields;
 import chylex.bettercontrols.mixin.AccessClientPlayerFields;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.network.ClientPlayerEntity;
@@ -92,5 +93,13 @@ public final class PlayerTicker{
 			wasSneakingBeforeTouchingGround = false;
 			holdingSneakWhileTouchingGround = false;
 		}
+		
+		if (!cfg().sneakingMovesCameraSmoothly){
+			final AccessCameraFields camera = (AccessCameraFields)mc().gameRenderer.getCamera();
+			
+			if (camera.getFocusedEntity() == player){
+				camera.setCameraY(player.getStandingEyeHeight());
+			}
+		}
 	}
 }
diff --git a/src/main/resources/mixins.json b/src/main/resources/mixins.json
index d4b0038..e35b201 100644
--- a/src/main/resources/mixins.json
+++ b/src/main/resources/mixins.json
@@ -4,6 +4,7 @@
   "package": "chylex.bettercontrols.mixin",
   "compatibilityLevel": "JAVA_8",
   "mixins": [
+    "AccessCameraFields",
     "AccessClientPlayerFields",
     "AccessKeyBindingFields",
     "AccessScreenButtons",