diff --git a/demo/data/rollball.yml b/demo/data/rollball.yml
index 61598f82092029fb69bb39073569635bf81d18f3..df682f1d361a6053a76f856363d77bffb25566a2 100644
--- a/demo/data/rollball.yml
+++ b/demo/data/rollball.yml
@@ -13,11 +13,11 @@ prefabs:
         diffuse: [1, 1, 1]
         specular: [0.0633, 0.727811, 0.633]
         shininess: 16
-#      phys::Body:
-#        type: static
-#        shape:
-#          type: box
-#          extents: [0.5, 2.5, 20.5]
+      phys::Body:
+        type: static
+        shape:
+          type: box
+          extents: [0.5, 2.5, 20.5]
   # Wall Z shorter to avoid z-fighting
   - name: "wallZ"
     components:
@@ -32,11 +32,11 @@ prefabs:
         diffuse: [1, 1, 1]
         specular: [0.0633, 0.727811, 0.633]
         shininess: 16
-#      phys::Body:
-#        type: static
-#        shape:
-#          type: box
-#          extents: [ 19.5, 2.5, 0.5 ]
+      phys::Body:
+        type: static
+        shape:
+          type: box
+          extents: [ 19.5, 2.5, 0.5 ]
   - name: "floor"
     components:
       Transform:
@@ -50,11 +50,11 @@ prefabs:
         diffuse: [1, 1, 1]
         specular: [0.0633, 0.727811, 0.633]
         shininess: 16
-#      phys::Body:
-#        type: static
-#        shape:
-#          type: box # we don't (currently) support planes...
-#          extents: [19.5, 0.25, 19.5]
+      phys::Body:
+        type: static
+        shape:
+          type: box # we don't (currently) support planes...
+          extents: [19.5, 0.25, 19.5]
   - name: player
     components:
       Transform:
@@ -67,10 +67,10 @@ prefabs:
         diffuse: [0.4, 0.4, 0.4]
         specular: [0.774597,0.774597,0.774597]
         shininess: 16
-#      phys::Body:
-#        shape:
-#          type: sphere
-#          radius: 1
+      phys::Body:
+        shape:
+          type: sphere
+          radius: 1
   - name: collectable
     components:
       Transform:
@@ -83,9 +83,9 @@ prefabs:
         diffuse: [1, 1, 1]
         specular: [0.0633, 0.727811, 0.633]
         shininess: 16
-#      phys::Body:
-#        type: kinematic
-#        shape:
-#          type: box
-#      phys::Callbacks:
-#      phys::Cache:
\ No newline at end of file
+      phys::Body:
+        type: kinematic
+        shape:
+          type: box
+      phys::Callbacks:
+      phys::Cache:
\ No newline at end of file
diff --git a/demo/demo/main.cpp b/demo/demo/main.cpp
index 24106bb9de13a7ff6055d965716fe0a5ab5452a5..6e20bfcbebe6043ee9b6cdccb2200df559164e5f 100644
--- a/demo/demo/main.cpp
+++ b/demo/demo/main.cpp
@@ -85,6 +85,7 @@ int main(int argc, const char* argv[]) {
 	moduleManager.use<fggl::display::GLFW>();
 	moduleManager.use<fggl::assets::AssetFolders>();
 	moduleManager.use<fggl::entity::ECS>();
+	moduleManager.use<fggl::phys::Bullet3>();
 	moduleManager.resolve();
 
 	// create the application
diff --git a/fggl/entity/module.cpp b/fggl/entity/module.cpp
index 4037902587a33107b8eb6bfea594aa2e671627da..ee6b1c00d7f5ba5b13fece3d2a0345567a58f5dc 100644
--- a/fggl/entity/module.cpp
+++ b/fggl/entity/module.cpp
@@ -32,7 +32,7 @@ namespace fggl::entity {
 		factory->bind(math::Transform::guid, make_transform);
 	}
 
-	bool entity_svc_factory(modules::ModuleService service, modules::Services& services) {
+	bool ECS::factory(modules::ModuleService service, modules::Services& services) {
 		if ( service == EntityFactory::service) {
 			auto* factory = services.create<EntityFactory>();
 			install_component_factories(factory);
@@ -46,5 +46,4 @@ namespace fggl::entity {
 		}
 		return false;
 	}
-	const modules::ServiceFactory ECS::factory = entity_svc_factory;
 }
\ No newline at end of file
diff --git a/fggl/gfx/ogl4/module.cpp b/fggl/gfx/ogl4/module.cpp
index d0c2b33212c23a6118a6ea2c873cef5b8d3236c5..9bfe38cc869beb8d26197edd1dc66d4b1a71f558 100644
--- a/fggl/gfx/ogl4/module.cpp
+++ b/fggl/gfx/ogl4/module.cpp
@@ -83,7 +83,7 @@ namespace fggl::gfx {
 		auto& light = manager.add<gfx::Light>(id);
 	}
 
-	bool ogl4_factory(modules::ModuleService service, modules::Services& services) {
+	bool OpenGL4::factory(modules::ModuleService service, modules::Services& services) {
 		if (service == WindowGraphics::service) {
 			// setup the thing responsible for graphics
 			auto* storage = services.get<data::Storage>();
@@ -100,6 +100,5 @@ namespace fggl::gfx {
 		}
 		return false;
 	}
-	const modules::ServiceFactory OpenGL4::factory = ogl4_factory;
 
 } // namespace fggl::gfX::ogl4
\ No newline at end of file
diff --git a/include/fggl/assets/module.hpp b/include/fggl/assets/module.hpp
index a925f64969182d7186e20d3a2e0e5a3fce9517be..e3942f3a88f6c8ad391ce35de612fc7369eb0504 100644
--- a/include/fggl/assets/module.hpp
+++ b/include/fggl/assets/module.hpp
@@ -35,10 +35,11 @@ namespace fggl::assets {
 		constexpr static const std::array<modules::ModuleService, 1> depends = {
 			data::Storage::service
 		};
-		static const modules::ServiceFactory factory;
+
+		static bool factory(modules::ModuleService name, modules::Services& serviceManager);
 	};
 
-	bool asset_factory(modules::ModuleService service, modules::Services& services) {
+	bool AssetFolders::factory(modules::ModuleService service, modules::Services& services) {
 		if ( service == Loader::service) {
 			auto storage = services.get<data::Storage>();
 			services.create<Loader>(storage);
@@ -50,7 +51,6 @@ namespace fggl::assets {
 		}
 		return false;
 	}
-	const modules::ServiceFactory AssetFolders::factory = asset_factory;
 
 } // namespace fggl::assets
 
diff --git a/include/fggl/audio/openal/module.hpp b/include/fggl/audio/openal/module.hpp
index dd37f67cc42421e7fe45b6776b1ed7b490a84240..0468fa64667a9ae8d09e9f2b1f23150265ae0aba 100644
--- a/include/fggl/audio/openal/module.hpp
+++ b/include/fggl/audio/openal/module.hpp
@@ -34,10 +34,10 @@ namespace fggl::audio {
 		constexpr static const std::array<modules::ModuleService, 1> depends = {
 			modules::make_service("fggl::data::Storage")
 		};
-		static const modules::ServiceFactory factory;
+		static bool factory(modules::ModuleService name, modules::Services& serviceManager);
 	};
 
-	bool openal_factory(modules::ModuleService service, modules::Services& services) {
+	bool OpenAL::factory(modules::ModuleService service, modules::Services& services) {
 		if (service == SERVICE_AUDIO_PLAYBACK) {
 			auto storage = services.get<data::Storage>();
 			services.bind<audio::AudioService, openal::AudioServiceOAL>(storage);
@@ -45,7 +45,6 @@ namespace fggl::audio {
 		}
 		return false;
 	}
-	const modules::ServiceFactory OpenAL::factory = openal_factory;
 
 } // namespace fggl::audio
 
diff --git a/include/fggl/data/module.hpp b/include/fggl/data/module.hpp
index 6628f7f9135e49ee472c1cf039c73c67dcdbabd3..97986b455b6c87278ef2bde96893d9862a2965b2 100644
--- a/include/fggl/data/module.hpp
+++ b/include/fggl/data/module.hpp
@@ -32,10 +32,11 @@ namespace fggl::data {
 			SERVICE_STORAGE
 		};
 		constexpr static const std::array<modules::ModuleService, 0> depends = {};
-		static const modules::ServiceFactory factory;
+
+		static bool factory(modules::ModuleService service, modules::Services& serviceManager);
 	};
 
-	bool storage_factory(modules::ModuleService service, modules::Services& data) {
+	bool LocalStorage::factory(modules::ModuleService service, modules::Services& data) {
 		if (service == SERVICE_STORAGE) {
 			// FIXME: no easy way to set the application name
 			auto pathConfig = fggl::platform::calc_engine_paths("fggl-demo");
@@ -44,7 +45,6 @@ namespace fggl::data {
 		}
 		return false;
 	}
-	const modules::ServiceFactory LocalStorage::factory = storage_factory;
 
 } // namespace fggl::data
 
diff --git a/include/fggl/display/glfw/module.hpp b/include/fggl/display/glfw/module.hpp
index e3df059e47537092737f7b4967f3406bbc7bd329..e4499dfc71d90685fdec72d6f85c570e21ed6b2e 100644
--- a/include/fggl/display/glfw/module.hpp
+++ b/include/fggl/display/glfw/module.hpp
@@ -36,10 +36,11 @@ namespace fggl::display {
 			fggl::input::Input::service,
 			fggl::gfx::WindowGraphics::service
 		};
-		static const modules::ServiceFactory factory;
+
+		static bool factory(modules::ModuleService name, modules::Services& serviceManager);
 	};
 
-	bool glfw_factory(modules::ModuleService service, modules::Services& services) {
+	bool GLFW::factory(modules::ModuleService service, modules::Services& services) {
 		if (service == WindowService::service) {
 			auto input = services.get<input::Input>();
 			auto graphics = services.get<gfx::WindowGraphics>();
@@ -50,7 +51,6 @@ namespace fggl::display {
 		}
 		return false;
 	}
-	const modules::ServiceFactory GLFW::factory = glfw_factory;
 
 } // namespace fggl::display
 
diff --git a/include/fggl/entity/module.hpp b/include/fggl/entity/module.hpp
index 0b70faaf3b59c3725f7136404f0604cb382891a0..b5d66d2b93e50c3efa62263fb0eb830f1cba4a4f 100644
--- a/include/fggl/entity/module.hpp
+++ b/include/fggl/entity/module.hpp
@@ -34,7 +34,7 @@ namespace fggl::entity {
 		constexpr static const std::array<modules::ModuleService, 1> depends = {
 			assets::Loader::service
 		};
-		static const modules::ServiceFactory factory;
+		static bool factory(modules::ModuleService name, modules::Services& serviceManager);
 	};
 
 	void install_component_factories(EntityFactory* factory);
diff --git a/include/fggl/gfx/ogl4/module.hpp b/include/fggl/gfx/ogl4/module.hpp
index c9501b5fc6f705924dedcde027733fb16bfa2631..7bd50ca18f3f9e58499a8b3a7b14fe3a44f34dc4 100644
--- a/include/fggl/gfx/ogl4/module.hpp
+++ b/include/fggl/gfx/ogl4/module.hpp
@@ -41,7 +41,8 @@ namespace fggl::gfx {
 			gui::FontLibrary::service,
 			entity::EntityFactory::service
 		};
-		static const modules::ServiceFactory factory;
+
+		static bool factory(modules::ModuleService name, modules::Services& serviceManager);
 	};
 
 } //namespace fggl::gfx
diff --git a/include/fggl/gui/module.hpp b/include/fggl/gui/module.hpp
index 6c926f20f1857221663ea843c1a5920fbc91ab75..4fb81270d46cb66816e0b16a9184fbd4c2e290b5 100644
--- a/include/fggl/gui/module.hpp
+++ b/include/fggl/gui/module.hpp
@@ -32,10 +32,10 @@ namespace fggl::gui {
 		constexpr static const std::array<modules::ModuleService, 1> depends = {
 			data::Storage::service
 		};
-		static const modules::ServiceFactory factory;
+		static bool factory(modules::ModuleService name, modules::Services& serviceManager);
 	};
 
-	bool freetype_factory(modules::ModuleService service, modules::Services& services) {
+	bool FreeType::factory(modules::ModuleService service, modules::Services& services) {
 		if ( service == FontLibrary::service ) {
 			auto storage = services.get<data::Storage>();
 			services.create< FontLibrary >(storage);
@@ -43,7 +43,6 @@ namespace fggl::gui {
 		}
 		return false;
 	}
-	const modules::ServiceFactory FreeType::factory = freetype_factory;
 }
 
 #endif //FGGL_GUI_MODULE_HPP
diff --git a/include/fggl/input/module.hpp b/include/fggl/input/module.hpp
index 125259fda0fc6e9a678f2f3ea1b0967cd0b7801b..a10b21650b1efddba266e7a6abc6e7155c7d902d 100644
--- a/include/fggl/input/module.hpp
+++ b/include/fggl/input/module.hpp
@@ -31,17 +31,16 @@ namespace fggl::input {
 			SERVICE_INPUT
 		};
 		constexpr static const std::array<modules::ModuleService, 0> depends = {};
-		static const modules::ServiceFactory factory;
+		static bool factory(modules::ModuleService service, modules::Services& serviceManager);
 	};
 
-	bool input_factory(modules::ModuleService service, modules::Services& services) {
+	bool Generic::factory(modules::ModuleService service, modules::Services& services) {
 		if (service == SERVICE_INPUT) {
 			services.create<input::Input>();
 			return true;
 		}
 		return false;
 	}
-	const modules::ServiceFactory Generic::factory = input_factory;
 }
 
 #endif //FGGL_INPUT_MODULE_HPP
diff --git a/integrations/bullet/include/fggl/phys/bullet/module.hpp b/integrations/bullet/include/fggl/phys/bullet/module.hpp
index 7ef91f68a215056e9ff6c55c664740d578f9bd15..695091900869ac2ba04d2227c59f116bc1928eeb 100644
--- a/integrations/bullet/include/fggl/phys/bullet/module.hpp
+++ b/integrations/bullet/include/fggl/phys/bullet/module.hpp
@@ -38,7 +38,8 @@ namespace fggl::phys::bullet {
 		constexpr static const std::array<modules::ModuleService, 1> depends = {
 			entity::EntityFactory::service
 		};
-		static const modules::ServiceFactory factory;
+
+		static bool factory(modules::ModuleService name, modules::Services& serviceManager);
 	};
 
 } // namespace fggl::phys::bullet
diff --git a/integrations/bullet/src/module.cpp b/integrations/bullet/src/module.cpp
index da7d6d4c6caa77adec8bb391818bb039173cd883..7703f1d131603fef6202ca5fd8eff6f4af738a8b 100644
--- a/integrations/bullet/src/module.cpp
+++ b/integrations/bullet/src/module.cpp
@@ -83,13 +83,12 @@ namespace fggl::phys::bullet {
 		// add the body to the simulation
 	}
 
-	bool bullet_factory(modules::ModuleService service, modules::Services& services) {
+	bool Bullet::factory(modules::ModuleService service, modules::Services& services) {
 		if ( service == BIND_BULLET ) {
 			auto* entityFactory = services.get<entity::EntityFactory>();
 			entityFactory->bind(CONFIG_PHYS_BODY, add_bt_body);
 		}
 		return false;
 	}
-	const modules::ServiceFactory Bullet::factory = bullet_factory;
 
 } // namespace fggl::phys::bullet
\ No newline at end of file