diff --git a/mitmproxy/tools/console/keymap.py b/mitmproxy/tools/console/keymap.py
index d22420bfd..01ec9a0ac 100644
--- a/mitmproxy/tools/console/keymap.py
+++ b/mitmproxy/tools/console/keymap.py
@@ -199,11 +199,14 @@ class KeymapConfig:
                     "Error reading %s: %s" % (p, e)
                 ) from e
             for v in vals:
+                user_ctxs = v.get("ctx", ["global"])
                 try:
+                    km._check_contexts(user_ctxs)
+                    km.remove(v["key"], Contexts)
                     km.add(
                         key = v["key"],
                         command = v["cmd"],
-                        contexts = v.get("ctx", ["global"]),
+                        contexts = user_ctxs,
                         help = v.get("help", None),
                     )
                 except ValueError as e:
diff --git a/test/mitmproxy/tools/console/test_keymap.py b/test/mitmproxy/tools/console/test_keymap.py
index 3e6f7c2ee..0d6f9e888 100644
--- a/test/mitmproxy/tools/console/test_keymap.py
+++ b/test/mitmproxy/tools/console/test_keymap.py
@@ -117,6 +117,21 @@ def test_load_path(tmpdir):
         kmc.load_path(km, dst)
         assert(km.get("chooser", "key1"))
 
+        km.add("key123", "str", ["flowlist", "flowview"])
+        with open(dst, 'w') as f:
+            f.write(
+                """
+                    -   key: key123
+                        ctx: [options]
+                        cmd: foo
+                """
+            )
+        kmc.load_path(km, dst)
+        for b in km.bindings:
+            if b.key == "key123":
+                assert b.contexts == ["options"]
+                break
+
 
 def test_parse():
     kmc = keymap.KeymapConfig()