diff --git a/src/g_input.c b/src/g_input.c
index 44d9f2b28224c1c4c28ca79d83b95842af5df743..579a048e33db780cd2b2494942692fea0ae77b2b 100644
--- a/src/g_input.c
+++ b/src/g_input.c
@@ -1010,6 +1010,16 @@ void G_ClearControlKeys(INT32 (*setupcontrols)[2], INT32 control)
 	setupcontrols[control][1] = KEY_NULL;
 }
 
+void G_ClearAllControlKeys(void)
+{
+	INT32 i;
+	for (i = 0; i < num_gamecontrols; i++)
+	{
+		G_ClearControlKeys(gamecontrol, i);
+		G_ClearControlKeys(gamecontrolbis, i);
+	}
+}
+
 //
 // Returns the name of a key (or virtual key for mouse and joy)
 // the input value being an keynum
diff --git a/src/g_input.h b/src/g_input.h
index 557fb3bf38acf75c313d4c403c5418a5682472f0..102809f7ff0997c8d950ee315d5f37066064b939 100644
--- a/src/g_input.h
+++ b/src/g_input.h
@@ -160,6 +160,7 @@ INT32 G_KeyStringtoNum(const char *keystr);
 
 // detach any keys associated to the given game control
 void G_ClearControlKeys(INT32 (*setupcontrols)[2], INT32 control);
+void G_ClearAllControlKeys(void);
 void Command_Setcontrol_f(void);
 void Command_Setcontrol2_f(void);
 void G_Controldefault(void);
diff --git a/src/m_misc.c b/src/m_misc.c
index 80c58d644ab93a05c440a1a7eb74ff586e6a7027..79fb0c99b6a5a1f0d780a9b079d96aec847077b4 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -442,6 +442,10 @@ void Command_LoadConfig_f(void)
 	strcpy(configfile, COM_Argv(1));
 	FIL_ForceExtension(configfile, ".cfg");
 
+	// load default control
+	G_ClearAllControlKeys();
+	G_Controldefault();
+
 	// temporarily reset execversion to default
 	cv_execversion.flags &= ~CV_HIDEN;
 	COM_BufInsertText(va("%s \"%s\"\n", cv_execversion.name, cv_execversion.defaultvalue));