diff --git a/src/d_main.c b/src/d_main.c
index dd2cfe0e520308efc722ae06315cf60ba6676154..1782e94f579db209a267e50e2554a254f8f0eb9c 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -1130,6 +1130,10 @@ void D_SRB2Main(void)
 	// Setup default unlockable conditions
 	M_SetupDefaultConditionSets();
 
+	// Setup character tables
+	// Have to be done here before files are loaded
+	M_InitCharacterTables();
+
 	// load wad, including the main wad file
 	CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
 	if (!W_InitMultipleFiles(startupwadfiles))
diff --git a/src/m_menu.c b/src/m_menu.c
index c27689506050f878d36d4c73449e3bbd0115c995..333cdaa70d655765c537dab6fb91ef5e6e9fe806 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -2742,8 +2742,6 @@ void M_Ticker(void)
 //
 void M_Init(void)
 {
-	UINT8 i;
-
 	CV_RegisterVar(&cv_nextmap);
 	CV_RegisterVar(&cv_newgametype);
 	CV_RegisterVar(&cv_chooseskin);
@@ -2785,6 +2783,24 @@ void M_Init(void)
 	quitmsg[QUIT3MSG5] = M_GetText("You'll be back to play soon, though...\n......right?\n\n(Press 'Y' to quit)");
 	quitmsg[QUIT3MSG6] = M_GetText("Aww, is Egg Rock Zone too\ndifficult for you?\n\n(Press 'Y' to quit)");
 
+#ifdef HWRENDER
+	// Permanently hide some options based on render mode
+	if (rendermode == render_soft)
+		OP_VideoOptionsMenu[1].status = IT_DISABLED;
+#endif
+
+#ifndef NONET
+	CV_RegisterVar(&cv_serversort);
+#endif
+
+	//todo put this somewhere better...
+	CV_RegisterVar(&cv_allcaps);
+}
+
+void M_InitCharacterTables(void)
+{
+	UINT8 i;
+
 	// Setup PlayerMenu table
 	for (i = 0; i < MAXSKINS; i++)
 	{
@@ -2828,19 +2844,6 @@ void M_Init(void)
 			strcpy(description[i].skinname, "");
 		}
 	}
-
-#ifdef HWRENDER
-	// Permanently hide some options based on render mode
-	if (rendermode == render_soft)
-		OP_VideoOptionsMenu[1].status = IT_DISABLED;
-#endif
-
-#ifndef NONET
-	CV_RegisterVar(&cv_serversort);
-#endif
-
-	//todo put this somewhere better...
-	CV_RegisterVar(&cv_allcaps);
 }
 
 // ==========================================================================
diff --git a/src/m_menu.h b/src/m_menu.h
index 7e2cce20d77794dbb9ef6aea3c9ee838b5f90656..fcde5b7dbb9204ec60fa591f2c0a49f23f6f2bd6 100644
--- a/src/m_menu.h
+++ b/src/m_menu.h
@@ -38,6 +38,9 @@ void M_Drawer(void);
 // Called by D_SRB2Main, loads the config file.
 void M_Init(void);
 
+// Called by D_SRB2Main also, sets up the playermenu and description tables.
+void M_InitCharacterTables(void);
+
 // Called by intro code to force menu up upon a keypress,
 // does nothing if menu is already up.
 void M_StartControlPanel(void);