diff --git a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
index 4426b69..186c750 100644
--- a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
+++ b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
@@ -12,6 +12,7 @@ public final class BetterControlsConfig{
 	
 	public final KeyBindingWithModifier keyToggleSprint = new KeyBindingWithModifier("key.bettercontrols.toggle_sprint");
 	public boolean doubleTapForwardToSprint = true;
+	public boolean tapSprintKeyAgainToStopSprinting = false;
 	public boolean resumeSprintingAfterHittingObstacle = false;
 	
 	public final KeyBindingWithModifier keyToggleSneak = new KeyBindingWithModifier("key.bettercontrols.toggle_sneak");
diff --git a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
index d3fddd8..b7e3e73 100644
--- a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
+++ b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
@@ -32,6 +32,7 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		
 		Json.writeKeyBinding(obj, "Sprint.KeyToggle", cfg.keyToggleSprint);
 		Json.setBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
+		Json.setBool(obj, "Sprint.TapToStop", cfg.tapSprintKeyAgainToStopSprinting);
 		Json.setBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle);
 		
 		Json.writeKeyBinding(obj, "Sneak.KeyToggle", cfg.keyToggleSneak);
@@ -58,6 +59,7 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		
 		Json.readKeyBinding(obj, "Sprint.KeyToggle", cfg.keyToggleSprint);
 		cfg.doubleTapForwardToSprint = Json.getBool(obj, "Sprint.DoubleTapForward", cfg.doubleTapForwardToSprint);
+		cfg.tapSprintKeyAgainToStopSprinting = Json.getBool(obj, "Sprint.TapToStop", cfg.tapSprintKeyAgainToStopSprinting);
 		cfg.resumeSprintingAfterHittingObstacle = Json.getBool(obj, "Sprint.ResumeAfterHittingObstacle", cfg.resumeSprintingAfterHittingObstacle);
 		
 		Json.readKeyBinding(obj, "Sneak.KeyToggle", cfg.keyToggleSneak);
diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
index 6e989a8..c418ea4 100644
--- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
+++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
@@ -53,6 +53,11 @@ public class BetterControlsScreen extends GameOptionsScreen{
 		
 		y += ROW_HEIGHT;
 		
+		generateLeftSideText(y, elements, Text.of("Tap 'Sprint' While Sprinting To Stop"));
+		elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.tapSprintKeyAgainToStopSprinting, value -> cfg.tapSprintKeyAgainToStopSprinting = value));
+		
+		y += ROW_HEIGHT;
+		
 		generateLeftSideText(y, elements, Text.of("Resume Sprinting After Hitting Obstacle"));
 		elements.add(new BooleanValueWidget(col2(1), y, COL2_W, cfg.resumeSprintingAfterHittingObstacle, value -> cfg.resumeSprintingAfterHittingObstacle = value));
 		
diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
index 8b29478..16330d7 100644
--- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
+++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
@@ -44,6 +44,7 @@ public final class PlayerTicker{
 	private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, mc().options.keyForward);
 	private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, mc().options.keyJump);
 	
+	private boolean waitingForSprintKeyRelease = false;
 	private boolean stopSprintingAfterReleasingSprintKey = false;
 	private boolean wasHittingObstacle = false;
 	private boolean wasSprintingBeforeHittingObstacle = false;
@@ -67,9 +68,26 @@ public final class PlayerTicker{
 		
 		if (isSprintToggled){
 			stopSprintingAfterReleasingSprintKey = false;
+			waitingForSprintKeyRelease = false;
 		}
 		else if (wasSprintToggled){
 			stopSprintingAfterReleasingSprintKey = true;
+			waitingForSprintKeyRelease = false;
+		}
+		else if (cfg().tapSprintKeyAgainToStopSprinting){
+			if (opts.keySprint.isPressed()){
+				if (!waitingForSprintKeyRelease){
+					waitingForSprintKeyRelease = true;
+					stopSprintingAfterReleasingSprintKey = player.isSprinting();
+				}
+			}
+			else{
+				if (player.isSprinting() && !waitingForSprintKeyRelease){
+					stopSprintingAfterReleasingSprintKey = false;
+				}
+				
+				waitingForSprintKeyRelease = false;
+			}
 		}
 		
 		if (stopSprintingAfterReleasingSprintKey && !opts.keySprint.isPressed()){