diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp
index c64b057117..b2ceffc7a3 100644
--- a/src/menu/menu.cpp
+++ b/src/menu/menu.cpp
@@ -469,10 +469,15 @@ void M_SetMenu(FName menu, int param)
 		const PClass *menuclass = PClass::FindClass(menu);
 		if (menuclass != nullptr)
 		{
-			if (menuclass->IsDescendantOf(RUNTIME_CLASS(DMenu)))
+			if (menuclass->IsDescendantOf("GenericMenu"))
 			{
 				DMenu *newmenu = (DMenu*)menuclass->CreateNew();
-				newmenu->mParentMenu = CurrentMenu;
+
+				IFVIRTUALPTRNAME(newmenu, "GenericMenu", Init)
+				{
+					VMValue params[3] = { newmenu, CurrentMenu };
+					GlobalVMStack.Call(func, params, 2, nullptr, 0);
+				}
 				M_ActivateMenu(newmenu);
 				return;
 			}
diff --git a/wadsrc/static/zscript/menu/menu.txt b/wadsrc/static/zscript/menu/menu.txt
index dda75a739f..84478ba818 100644
--- a/wadsrc/static/zscript/menu/menu.txt
+++ b/wadsrc/static/zscript/menu/menu.txt
@@ -296,3 +296,11 @@ class MenuDescriptor : Object native
 	native static MenuDescriptor GetDescriptor(Name n);
 }
 
+// This class is only needed to give it a virtual Init method that doesn't belong to Menu itself
+class GenericMenu : Menu
+{
+	virtual void Init(Menu parent)
+	{
+		Super.Init(parent);
+	}
+}
\ No newline at end of file
diff --git a/wadsrc/static/zscript/menu/readthis.txt b/wadsrc/static/zscript/menu/readthis.txt
index a3db8a8a7d..604fb489e0 100644
--- a/wadsrc/static/zscript/menu/readthis.txt
+++ b/wadsrc/static/zscript/menu/readthis.txt
@@ -33,7 +33,7 @@
 **
 */
 
-class ReadThisMenu : Menu
+class ReadThisMenu : GenericMenu
 {
 	int mScreen;
 	int mInfoTic;
@@ -43,18 +43,19 @@ class ReadThisMenu : Menu
 	//
 	//
 	//=============================================================================
+	
+	override void Init(Menu parent)
+	{
+		Super.Init(parent);
+		mScreen = 1;
+		mInfoTic = gametic;
+	}
 
 	override void Drawer()
 	{
 		double alpha;
 		TextureID tex, prevpic;
 		
-		if (mScreen == 0)
-		{
-			mScreen = 1;
-			mInfoTic = gametic;
-		}
-
 		// Did the mapper choose a custom help page via MAPINFO?
 		if (level.F1Pic.Length() != 0)
 		{