diff --git a/CMakeLists.txt b/CMakeLists.txt
index aecfefa7cdcfe54d74c5087821c601391c8c3958..5a8aeffeee8148a1cb09969a1ce068ad7e3ab5fb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,11 +28,12 @@ endif ()
 
 add_subdirectory(vendor/imgui/)
 add_subdirectory(vendor/flecs/core)
+add_subdirectory(vendor/flecs/modules)
 
 # engine
 #set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=*")
 add_subdirectory(fggl)
 
 # extras
-add_subdirectory(tests)
+#add_subdirectory(tests)
 add_subdirectory(demo)
diff --git a/demo/main.cpp b/demo/main.cpp
index f68e2890cac0924d2b20a8857552291aca38ce5c..066522d4643459f27080db04d38906ad914b62d3 100644
--- a/demo/main.cpp
+++ b/demo/main.cpp
@@ -12,6 +12,7 @@
 #include <fggl/gfx/ecs-cam.hpp>
 
 #include <fggl/math/ecs.hpp>
+#include <fggl/debug/ecs.hpp>
 
 #include <fggl/data/procedural.hpp>
 #include <fggl/debug/debug.h>
@@ -217,15 +218,6 @@ int main(int argc, char* argv[]) {
 		camEnt.set<fggl::components::Camera>({});
 	}
 
-	auto floorEnt = world.create();
-	{
-		floorEnt.set<fggl::math::Transform>( {} );
-
-		fggl::data::Mesh mesh = fggl::data::make_quad_xz();
-		auto token = meshRenderer.upload( mesh );
-		floorEnt.set<fggl::components::GfxToken>( token );
-	}
-
 	// bunker prefab
 	constexpr float HALF_PI = M_PI / 2.0f;
 	constexpr int nSections = 2;
@@ -262,15 +254,35 @@ int main(int argc, char* argv[]) {
 	}
 
 	// create testing bunkers
-	int nCubes = 3;
+	int nCubes = 1;
 	for ( int i=0; i<nCubes; i++ ) {
 		auto bunker = world.create(bunkerPrototype);
-		//bunker.add<fggl::components::GfxMat>();
 
 		auto trans = bunker.get_mut<fggl::components::Transform>();
 		trans->origin( glm::vec3( i * 5.0f, 0.0f, 0.0f) ); 
 	}
 
+	auto floorEnt = world.create("floor");
+	{
+		floorEnt.set<fggl::math::Transform>( {} );
+		floorEnt.set<fggl::components::GfxMat>( {} );
+
+		auto trans = floorEnt.get_mut<fggl::components::Transform>();
+		trans->origin( glm::vec3( 10.0f, 0.0f, 0.0f) ); 
+
+		// create mesh
+		fggl::data::Mesh mesh;
+		fggl::data::make_cube( mesh, fggl::math::mat4(1.0f) );
+		for (int i=0; i<10; i++ ) {
+			fggl::data::make_cube( mesh, glm::translate( fggl::math::mat4( 1.0f ), fggl::math::vec3( 0.0f, i * 1.0f, 0.0f) ) );
+		}
+		mesh.removeDups();
+
+		auto token = meshRenderer.upload( mesh );
+		token.pipeline = cache.get("phong");
+
+		floorEnt.set<fggl::components::GfxToken>( token );
+	}
 
 	fggl::gfx::Input& input = fggl::gfx::Input::instance();
 
@@ -291,6 +303,7 @@ int main(int argc, char* argv[]) {
 		// imgui demos
 		debugJoystickWindow( &joystickWindow, input );
 		debugGamepadWindow( &gamepadWindow, input );
+		fggl::debug::showEntityList(world.ecs());
 
 		// render step
 		ogl.clear();
diff --git a/fggl/debug/CMakeLists.txt b/fggl/debug/CMakeLists.txt
index 50de25c3af8ca1322276f6b3191a98353fd50372..c4480861ca37798c8d51faf59648572cb831f91d 100644
--- a/fggl/debug/CMakeLists.txt
+++ b/fggl/debug/CMakeLists.txt
@@ -2,6 +2,7 @@
 target_sources(fggl
     PRIVATE
 	debug.cpp
+	ecs.cpp
 )
 
 target_link_libraries(fggl imgui)
diff --git a/fggl/debug/ecs.cpp b/fggl/debug/ecs.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..185af4d17cd6eade1d480d151c82961c8239f05e
--- /dev/null
+++ b/fggl/debug/ecs.cpp
@@ -0,0 +1,23 @@
+#include <fggl/debug/ecs.hpp>
+#include <fggl/math/ecs.hpp>
+
+#include <string>
+#include <imgui.h>
+
+namespace fggl::debug {
+
+	void showEntityList(flecs::world &world) {
+		auto query = world.query<const fggl::components::Transform>();
+		bool visible = true;
+
+		ImGui::Begin("Entity List", &visible);
+		query.iter([&visible](flecs::iter& it, const fggl::components::Transform* t) {
+			for ( auto i : it ) {
+				auto entity = it.entity(i);
+				ImGui::Text("%s (#%lu)", entity.name().c_str(), entity.id() );
+			}
+		});
+		ImGui::End();
+	}
+
+}
diff --git a/fggl/debug/ecs.hpp b/fggl/debug/ecs.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..9a599429c7d26865c0cc8e344fae020fc4948f00
--- /dev/null
+++ b/fggl/debug/ecs.hpp
@@ -0,0 +1,17 @@
+#include <flecs.h>
+#include <flecs_meta.h>
+
+namespace fggl::debug {
+	void showEntityList(flecs::world& world);
+}
+
+namespace fggl::systems {
+
+	class Editor {
+		inline Editor(flecs::world& world) {
+			world.system<Editor>();
+
+			flecs::import<flecs::components::meta>(world);
+		}
+	};
+}
diff --git a/fggl/ecs2/CMakeLists.txt b/fggl/ecs2/CMakeLists.txt
index 1b492b620e69c4e4b10cd5764cf6d8f8ee5f8ca3..1c2d48895a019cbbc3e2d70c41c98b66d869c373 100644
--- a/fggl/ecs2/CMakeLists.txt
+++ b/fggl/ecs2/CMakeLists.txt
@@ -3,4 +3,4 @@ target_sources(fggl
 	PRIVATE
 		ecs.cpp
 )
-target_link_libraries(fggl flecs)
+target_link_libraries(fggl flecs flecsmodules)
diff --git a/vendor/flecs/modules/CMakeLists.txt b/vendor/flecs/modules/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ec65c275816a05af548645be058454fb78848410
--- /dev/null
+++ b/vendor/flecs/modules/CMakeLists.txt
@@ -0,0 +1,5 @@
+project(flecsmodules LANGUAGES C)
+
+add_library(flecsmodules STATIC src/flecs_meta.c )
+target_include_directories(flecsmodules PUBLIC include/)
+target_link_libraries(flecsmodules flecs)