diff --git a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
index 3dd60dd..b0efa1c 100644
--- a/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
+++ b/src/main/java/chylex/bettercontrols/config/BetterControlsConfig.java
@@ -1,4 +1,5 @@
 package chylex.bettercontrols.config;
+import chylex.bettercontrols.input.KeyBindingWithModifier;
 import net.minecraft.client.options.KeyBinding;
 import java.nio.file.Path;
 
@@ -20,6 +21,8 @@ public final class BetterControlsConfig{
 	public float flightSpeedMpSpectatorDefault = 1F;
 	public float flightSpeedMpSpectatorSprinting = 2F;
 	
+	public final KeyBindingWithModifier keyOpenMenu = new KeyBindingWithModifier("key.bettercontrols.open_menu");
+	
 	BetterControlsConfig(){}
 	
 	private BetterControlsConfig setPath(final Path path){
@@ -28,7 +31,9 @@ public final class BetterControlsConfig{
 	}
 	
 	public KeyBinding[] getAllKeyBindings(){
-		return new KeyBinding[0];
+		return new KeyBinding[]{
+			keyOpenMenu
+		};
 	}
 	
 	public void save(){
diff --git a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
index 38e97c0..08a7bfe 100644
--- a/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
+++ b/src/main/java/chylex/bettercontrols/config/ConfigSerializer.java
@@ -41,6 +41,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		Json.setFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
 		Json.setFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
 		
+		Json.writeKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
+		
 		return obj;
 	}
 	
@@ -60,6 +62,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
 		cfg.flightSpeedMpSpectatorDefault = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
 		cfg.flightSpeedMpSpectatorSprinting = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
 		
+		Json.readKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
+		
 		return cfg;
 	}
 	
diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
index 066a74c..88c3742 100644
--- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
+++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
@@ -2,10 +2,13 @@ package chylex.bettercontrols.gui;
 import chylex.bettercontrols.BetterControlsMod;
 import chylex.bettercontrols.config.BetterControlsConfig;
 import chylex.bettercontrols.gui.elements.BooleanValueWidget;
+import chylex.bettercontrols.gui.elements.CycleButtonWidget;
 import chylex.bettercontrols.gui.elements.DiscreteValueSliderWidget;
 import chylex.bettercontrols.gui.elements.KeyBindingWidget;
 import chylex.bettercontrols.gui.elements.Option;
 import chylex.bettercontrols.gui.elements.TextWidget;
+import chylex.bettercontrols.input.KeyBindingWithModifier;
+import chylex.bettercontrols.input.ModifierKey;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Element;
 import net.minecraft.client.gui.screen.Screen;
@@ -22,8 +25,10 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import static chylex.bettercontrols.gui.OptionListWidget.COL2_W;
+import static chylex.bettercontrols.gui.OptionListWidget.COL4_W;
 import static chylex.bettercontrols.gui.OptionListWidget.ROW_WIDTH;
 import static chylex.bettercontrols.gui.OptionListWidget.col2;
+import static chylex.bettercontrols.gui.OptionListWidget.col4;
 import static chylex.bettercontrols.gui.elements.TextWidget.CENTER;
 
 public class BetterControlsScreen extends GameOptionsScreen{
@@ -105,8 +110,35 @@ public class BetterControlsScreen extends GameOptionsScreen{
 		return y;
 	}
 	
+	private int generateMiscellaneousOptions(int y, final List<Element> elements){
+		final BetterControlsConfig cfg = BetterControlsMod.config;
+		
+		generateKeyBindingWithModifierOption(y, elements, Text.of("Open Better Controls Menu"), cfg.keyOpenMenu);
+		
+		y += ROW_HEIGHT;
+		return y;
+	}
+	
 	// Helpers
 	
+	private static final List<Option<ModifierKey>> MODIFIER_OPTIONS = Arrays.asList(
+		new Option<>(null, Text.of("(No Modifier)")),
+		new Option<>(ModifierKey.CONTROL, Text.of("Control")),
+		new Option<>(ModifierKey.SHIFT, Text.of("Shift")),
+		new Option<>(ModifierKey.ALT, Text.of("Alt"))
+	);
+	
+	private void generateKeyBindingWithModifierOption(final int y, final List<Element> elements, final Text text, final KeyBindingWithModifier binding){
+		final CycleButtonWidget<ModifierKey> modifierButton = new CycleButtonWidget<>(col4(2), y, COL4_W, MODIFIER_OPTIONS, binding.getModifier(), binding::setModifier);
+		final KeyBindingWidget bindingButton = new KeyBindingWidget(col4(3), y, COL4_W, binding, this::startEditingKeyBinding);
+		bindingButton.linkButtonToBoundState(modifierButton);
+		
+		generateLeftSideText(y, elements, text);
+		elements.add(modifierButton);
+		elements.add(bindingButton);
+		allKeyBindings.add(bindingButton);
+	}
+	
 	private static void generateLeftSideText(final int y, final List<Element> elements, final Text text){
 		elements.add(new TextWidget(col2(0), y, COL2_W - TEXT_PADDING_RIGHT, text));
 	}
@@ -137,6 +169,9 @@ public class BetterControlsScreen extends GameOptionsScreen{
 		elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Flying"), CENTER));
 		y = generateFlightOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
 		
+		elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Miscellaneous"), CENTER));
+		y = generateMiscellaneousOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
+		
 		addButton(new ButtonWidget(width / 2 - 99, height - 29, 200, 20, ScreenTexts.DONE, btn -> client.openScreen(parent)));
 		addChild(optionsWidget = new OptionListWidget(21, height - 32, width, height, elements, y - TITLE_MARGIN_TOP + BOTTOM_PADDING));
 	}
diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
index 9ce0cdb..cc8c7a1 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.gui.BetterControlsScreen;
 import chylex.bettercontrols.mixin.AccessCameraFields;
 import chylex.bettercontrols.mixin.AccessClientPlayerFields;
 import net.minecraft.client.MinecraftClient;
@@ -123,5 +124,9 @@ public final class PlayerTicker{
 				camera.setCameraY(player.getStandingEyeHeight());
 			}
 		}
+		
+		if (cfg().keyOpenMenu.isPressed()){
+			mc().openScreen(new BetterControlsScreen(null));
+		}
 	}
 }
diff --git a/src/main/resources/assets/bettercontrols/lang/en_us.json b/src/main/resources/assets/bettercontrols/lang/en_us.json
index f4fb070..b04b077 100644
--- a/src/main/resources/assets/bettercontrols/lang/en_us.json
+++ b/src/main/resources/assets/bettercontrols/lang/en_us.json
@@ -1,3 +1,4 @@
 {
-  "key.categories.bettercontrols": "Better Controls"
+  "key.categories.bettercontrols": "Better Controls",
+  "key.bettercontrols.open_menu": "Open Menu"
 }