diff --git a/Serialization/Manager/vtkObjectManager.h b/Serialization/Manager/vtkObjectManager.h
index 75bd5c7990e24b692c8669dc0eeffaea1d5fe439..44ed8ba1f2ea7b0d6290fcec1c0d6758613efb87 100644
--- a/Serialization/Manager/vtkObjectManager.h
+++ b/Serialization/Manager/vtkObjectManager.h
@@ -42,7 +42,7 @@ public:
   /**
    * Loads the default (de)serialization handlers and constructors for VTK classes
    */
-  bool Initialize();
+  virtual bool Initialize();
   bool InitializeDefaultHandlers();
   ///@}
 
diff --git a/Web/WebAssembly/CMakeLists.txt b/Web/WebAssembly/CMakeLists.txt
index 8b13e97b4eaccc3956130e1f4c1de7210bb95c61..82f8fc9a0421891ff6f0ddb17e7a44ec26ab97af 100644
--- a/Web/WebAssembly/CMakeLists.txt
+++ b/Web/WebAssembly/CMakeLists.txt
@@ -11,6 +11,18 @@ vtk_module_add_module(VTK::WebAssembly
 
 vtk_add_test_mangling(VTK::WebAssembly)
 
+set(_vtk_wasm_scene_manager_autoinit_mods)
+get_property(_vtk_wasm_scene_manager_optional_deps GLOBAL
+  PROPERTY "_vtk_module_VTK::WebAssembly_optional_depends")
+foreach(_module IN LISTS _vtk_wasm_scene_manager_private_deps _vtk_wasm_scene_manager_optional_deps)
+  if (NOT TARGET "${_module}")
+    continue ()
+  endif ()
+  list(APPEND _vtk_wasm_scene_manager_autoinit_mods "${_module}")
+endforeach()
+vtk_module_autoinit(
+  TARGETS WebAssembly
+  MODULES ${_vtk_wasm_scene_manager_autoinit_mods})
 # -----------------------------------------------------------------------------
 # Emscripten compile+link options
 # -----------------------------------------------------------------------------
@@ -41,7 +53,7 @@ endif ()
 # -----------------------------------------------------------------------------
 set(emscripten_optimizations)
 set(emscripten_debug_options)
-set(vtk_scene_manager_wasm_optimize "BEST")
+set(vtk_scene_manager_wasm_optimize "NO_OPTIMIZATION")
 set(vtk_scene_manager_wasm_optimize_NO_OPTIMIZATION "-O0")
 set(vtk_scene_manager_wasm_optimize_LITTLE "-O1")
 set(vtk_scene_manager_wasm_optimize_MORE "-O2")
@@ -59,7 +71,7 @@ else ()
   message (FATAL_ERROR "Unrecognized value for vtk_scene_manager_wasm_optimize=${vtk_scene_manager_wasm_optimize}")
 endif ()
 
-set(vtk_scene_manager_wasm_debuginfo "NONE")
+set(vtk_scene_manager_wasm_debuginfo "PROFILE")
 set(vtk_scene_manager_wasm_debuginfo_NONE "-g0")
 set(vtk_scene_manager_wasm_debuginfo_READABLE_JS "-g1")
 set(vtk_scene_manager_wasm_debuginfo_PROFILE "-g2")
@@ -77,13 +89,11 @@ endif ()
 vtk_module_add_executable(WasmSceneManager
   BASENAME vtkWasmSceneManager
   vtkWasmSceneManagerEmBinding.cxx)
-target_link_libraries(WasmSceneManager
-  PRIVATE
-    VTK::WebAssembly
-    VTK::RenderingOpenGL2
-    VTK::RenderingUI)
 add_executable("VTK::WasmSceneManager" ALIAS
   WasmSceneManager)
+target_link_libraries(WasmSceneManager
+  PRIVATE
+    VTK::WebAssembly)
 target_compile_options(WasmSceneManager
   PRIVATE
     ${emscripten_compile_options}
diff --git a/Web/WebAssembly/vtk.module b/Web/WebAssembly/vtk.module
index ff7a6e6dfcf9700bba7f0b7e06f6586014c7b229..bf2a3ff7a12a3635ec1a635efe115c8e73d70cf1 100644
--- a/Web/WebAssembly/vtk.module
+++ b/Web/WebAssembly/vtk.module
@@ -10,3 +10,8 @@ DEPENDS
   VTK::SerializationManager
 PRIVATE_DEPENDS
   VTK::RenderingCore
+OPTIONAL_DEPENDS
+  VTK::RenderingContextOpenGL2
+  VTK::RenderingOpenGL2
+  VTK::RenderingUI
+  VTK::RenderingVolumeOpenGL2
diff --git a/Web/WebAssembly/vtkWasmSceneManager.cxx b/Web/WebAssembly/vtkWasmSceneManager.cxx
index 5dbd326586632860c9c5536e074cb263c4c9bd89..ecb70278c9e268f19eea97c306fbf2f84c3f4495 100644
--- a/Web/WebAssembly/vtkWasmSceneManager.cxx
+++ b/Web/WebAssembly/vtkWasmSceneManager.cxx
@@ -10,6 +10,20 @@
 #include "vtkRenderWindowInteractor.h"
 #include "vtkRenderer.h"
 
+// Init factories.
+#ifdef VTK_MODULE_ENABLE_VTK_RenderingContextOpenGL2
+#include "vtkRenderingContextOpenGL2Module.h"
+#endif
+#ifdef VTK_MODULE_ENABLE_VTK_RenderingOpenGL2
+#include "vtkOpenGLPolyDataMapper.h" // needed to remove unused mapper, also includes vtkRenderingOpenGL2Module.h
+#endif
+#ifdef VTK_MODULE_ENABLE_VTK_RenderingUI
+#include "vtkRenderingUIModule.h"
+#endif
+#ifdef VTK_MODULE_ENABLE_VTK_RenderingVolumeOpenGL2
+#include "vtkRenderingVolumeOpenGL2Module.h"
+#endif
+
 VTK_ABI_NAMESPACE_BEGIN
 //-------------------------------------------------------------------------------
 vtkStandardNewMacro(vtkWasmSceneManager);
@@ -20,6 +34,22 @@ vtkWasmSceneManager::vtkWasmSceneManager() = default;
 //-------------------------------------------------------------------------------
 vtkWasmSceneManager::~vtkWasmSceneManager() = default;
 
+//-------------------------------------------------------------------------------
+bool vtkWasmSceneManager::Initialize()
+{
+  bool result = this->Superclass::Initialize();
+#ifdef VTK_MODULE_ENABLE_VTK_RenderingOpenGL2
+  // Remove the default vtkOpenGLPolyDataMapper as it is not used with wasm build.
+  /// get rid of serialization handler
+  this->Serializer->UnRegisterHandler(typeid(vtkOpenGLPolyDataMapper));
+  /// get rid of de-serialization handler
+  this->Deserializer->UnRegisterHandler(typeid(vtkOpenGLPolyDataMapper));
+  /// get rid of constructor
+  this->Deserializer->UnRegisterConstructor("vtkOpenGLPolyDataMapper");
+#endif
+  return result;
+}
+
 //-------------------------------------------------------------------------------
 void vtkWasmSceneManager::PrintSelf(ostream& os, vtkIndent indent)
 {
diff --git a/Web/WebAssembly/vtkWasmSceneManager.h b/Web/WebAssembly/vtkWasmSceneManager.h
index d386a267f7f3dbbe430053a9b61b5da503fcab40..ef2361120f24c38feb80b075724f506060c83791 100644
--- a/Web/WebAssembly/vtkWasmSceneManager.h
+++ b/Web/WebAssembly/vtkWasmSceneManager.h
@@ -29,6 +29,8 @@ public:
   vtkTypeMacro(vtkWasmSceneManager, vtkObjectManager);
   void PrintSelf(ostream& os, vtkIndent indent) override;
 
+  bool Initialize() override;
+
   /**
    * Set the size of the `vtkRenderWindow` object at `identifier` to
    * the supplied dimesions.
diff --git a/Web/WebAssembly/vtkWasmSceneManagerEmBinding.cxx b/Web/WebAssembly/vtkWasmSceneManagerEmBinding.cxx
index 39be3f6788bee7dfb1bac1c55885d4d08348e454..e3f0dfa09f44beab978de90de1078c19523e418c 100644
--- a/Web/WebAssembly/vtkWasmSceneManagerEmBinding.cxx
+++ b/Web/WebAssembly/vtkWasmSceneManagerEmBinding.cxx
@@ -4,7 +4,6 @@
 #include <emscripten/bind.h>
 
 #include "vtkDataArrayRange.h"
-#include "vtkOpenGLPolyDataMapper.h"
 #include "vtkTypeUInt8Array.h"
 #include "vtkVersion.h"
 #include "vtkWasmSceneManager.h"
@@ -33,12 +32,7 @@ thread_local const val JSON = val::global("JSON");
 bool initialize()
 {
   Manager = vtkWasmSceneManager::New();
-  bool result = Manager->Initialize();
-  // Remove the default vtkOpenGLPolyDataMapper as it is not used with wasm build.
-  Manager->GetSerializer()->UnRegisterHandler(typeid(vtkOpenGLPolyDataMapper));
-  Manager->GetDeserializer()->UnRegisterHandler(typeid(vtkOpenGLPolyDataMapper));
-  Manager->GetDeserializer()->UnRegisterConstructor("vtkOpenGLPolyDataMapper");
-  return result;
+  return Manager->Initialize();
 }
 
 //-------------------------------------------------------------------------------