diff --git a/demo/data/redbook/debug_frag.glsl b/demo/data/redbook/debug_frag.glsl
index 04ed2671bf53eabd838c15dcc40ec17cbe3017eb..aa8e88c17f1a73144a27cc57fb2bdaec3c956a0c 100644
--- a/demo/data/redbook/debug_frag.glsl
+++ b/demo/data/redbook/debug_frag.glsl
@@ -12,5 +12,5 @@ out vec4 FragColour;
 
 void main() {
     vec3 normalScale = 0.5 + (Normal / 2);
-    FragColour = vec4(normalScale, 1);
+    FragColour = Colour * vec4(normalScale, 1);
 }
\ No newline at end of file
diff --git a/demo/demo/models/viewer.cpp b/demo/demo/models/viewer.cpp
index 048b8e563d608e0820679304a846277545f38305..c1860d29abb326a26538452c4b71d84b1c5a369e 100644
--- a/demo/demo/models/viewer.cpp
+++ b/demo/demo/models/viewer.cpp
@@ -121,12 +121,16 @@ namespace demo {
 	void Viewer::update(float dt) {
 		Game::update(dt);
 		process_camera(world(), input());
+
+		if ( input().keyboard.pressed(glfwGetKeyScancode(GLFW_KEY_F2)) ) {
+			m_debug = !m_debug;
+		}
 	}
 
 	void Viewer::render(fggl::gfx::Graphics &gfx) {
 		Game::render(gfx);
 
-		gfx.drawScene(world());
+		gfx.drawScene(world(), m_debug);
 	}
 
 }
diff --git a/demo/include/models/viewer.hpp b/demo/include/models/viewer.hpp
index 7e29623eb02c4e523580495759ab7c0cb36876e0..242cd35499163e7a6d4e8e5eeb34a6f064cc0cf1 100644
--- a/demo/include/models/viewer.hpp
+++ b/demo/include/models/viewer.hpp
@@ -36,6 +36,7 @@ namespace demo {
 
 		private:
 			fggl::entity::EntityID m_model;
+			bool m_debug = false;
 
 	};
 }
diff --git a/fggl/gfx/ogl/renderer.cpp b/fggl/gfx/ogl/renderer.cpp
index d1d024c42021ff316a537fcae6fe05fe73569811..c13ef6c05f0c0ef1a4ef4a7c15fd6b8a0aa02679 100644
--- a/fggl/gfx/ogl/renderer.cpp
+++ b/fggl/gfx/ogl/renderer.cpp
@@ -204,9 +204,9 @@ namespace fggl::gfx {
 		m_canvasRenderer->render(*m_canvasPipeline, paint);
 	}
 
-	void OpenGL4Backend::drawScene(entity::EntityManager &world) {
+	void OpenGL4Backend::drawScene(entity::EntityManager &world, bool debugMode) {
 		if (m_modelRenderer) {
-			m_modelRenderer->render(world);
+			m_modelRenderer->render(world, debugMode);
 		}
 
 		if (m_debugRenderer) {
diff --git a/fggl/gfx/ogl4/models.cpp b/fggl/gfx/ogl4/models.cpp
index 99a2384c6e13bb9d144c6551df7231b98aa98659..cfe500de1398a2a899369369595149616e7f00be 100644
--- a/fggl/gfx/ogl4/models.cpp
+++ b/fggl/gfx/ogl4/models.cpp
@@ -410,7 +410,7 @@ namespace fggl::gfx::ogl4 {
 		}
 	}
 
-	void StaticModelRenderer::renderModelsForward(const entity::EntityManager &world) {
+	void StaticModelRenderer::renderModelsForward(const entity::EntityManager &world, bool debugMode) {
 
 		// fetch cameras we will need to render with
 		auto cameras = world.find<gfx::Camera>();
@@ -430,7 +430,7 @@ namespace fggl::gfx::ogl4 {
 			forward_pass<ogl4::StaticMultiMesh>(cameraEnt, world);
 
 			// enable rendering normals
-			if ( m_renderNormals ) {
+			if ( debugMode ) {
 				auto normalShader = m_shaders->get("normals");
 				forward_pass_normals<StaticMesh>(cameraEnt, world, normalShader);
 				forward_pass_normals<StaticMultiMesh>(cameraEnt, world, normalShader);
diff --git a/fggl/gfx/ogl4/module.cpp b/fggl/gfx/ogl4/module.cpp
index 5c5289dea52994bfd12b8545ecc9ebc63f782d31..e18cce7727de1e38f75b445afa1d703e518e399e 100644
--- a/fggl/gfx/ogl4/module.cpp
+++ b/fggl/gfx/ogl4/module.cpp
@@ -18,6 +18,7 @@
 
 #include "fggl/gfx/ogl4/module.hpp"
 #include "fggl/gfx/phong.hpp"
+#include "fggl/mesh/components.hpp"
 #include "fggl/data/procedural.hpp"
 
 #include "fggl/assets/loader.hpp"
@@ -154,6 +155,10 @@ namespace fggl::gfx {
 			// register as responsible for creating rendering components
 			auto *entityFactory = services.get<entity::EntityFactory>();
 			entityFactory->bind(data::StaticMesh::guid, attach_mesh);
+
+			entityFactory->bind(mesh::StaticMesh3D::guid, attach_mesh);
+			entityFactory->bind(mesh::StaticMultiMesh3D::guid, attach_mesh);
+
 			entityFactory->bind(gfx::PhongMaterial::guid, attach_material);
 			entityFactory->bind(gfx::Light::guid, attach_light);
 
diff --git a/include/fggl/data/model.hpp b/include/fggl/data/model.hpp
index b042590ef43be92c07c3a75198934735b872a94a..d11a03aa76145dc6153887ec9dad3edb935ea089 100644
--- a/include/fggl/data/model.hpp
+++ b/include/fggl/data/model.hpp
@@ -29,8 +29,8 @@ namespace fggl::data {
 
 	struct Vertex {
 		math::vec3 posititon;
-		math::vec3 normal;
-		math::vec3 colour;
+		math::vec3 normal = ILLEGAL_NORMAL;
+		math::vec3 colour = DEFAULT_COLOUR;
 		math::vec2 texPos;
 
 		inline static Vertex from_pos(math::vec3 pos) {
diff --git a/include/fggl/gfx/interfaces.hpp b/include/fggl/gfx/interfaces.hpp
index 52150c2bd771bc442e8cc989feacafaa161340b0..4e1953d7c051239d6a7b5090e2c7aebc6f7d6320 100644
--- a/include/fggl/gfx/interfaces.hpp
+++ b/include/fggl/gfx/interfaces.hpp
@@ -43,7 +43,7 @@ namespace fggl::gfx {
 			virtual Bounds canvasBounds() = 0;
 			virtual void draw2D(const Paint &paint) = 0;
 
-			virtual void drawScene(entity::EntityManager &) = 0;
+			virtual void drawScene(entity::EntityManager &, bool debugMode = false) = 0;
 	};
 
 } // namespace fggl::gfx
diff --git a/include/fggl/gfx/ogl/renderer.hpp b/include/fggl/gfx/ogl/renderer.hpp
index c0d8d06a1ed44c610adf64c32f5f431d9f824fd1..39cb5ba84e31d3ffcbf78ce05e7d7e4ce43e6c52 100644
--- a/include/fggl/gfx/ogl/renderer.hpp
+++ b/include/fggl/gfx/ogl/renderer.hpp
@@ -93,7 +93,7 @@ namespace fggl::gfx {
 			 *
 			 * @param world the world to render
 			 */
-			void drawScene(entity::EntityManager &world) override;
+			void drawScene(entity::EntityManager &world, bool debugMode=false) override;
 
 			/**
 			 * Get the 2D canvas bounds.
diff --git a/include/fggl/gfx/ogl4/models.hpp b/include/fggl/gfx/ogl4/models.hpp
index bf58fdd84ccdb662fb797d5218a1230347a2819c..66ffbe2c9cabe7cbe56ad2a27ea18a62022e4bad 100644
--- a/include/fggl/gfx/ogl4/models.hpp
+++ b/include/fggl/gfx/ogl4/models.hpp
@@ -85,15 +85,13 @@ namespace fggl::gfx::ogl4 {
 			StaticModel* uploadMesh(assets::AssetGUID guid, const data::Mesh& mesh, bool allowCache=true);
 			StaticModelGPU* uploadMesh2(const assets::AssetGUID& meshName, const data::Mesh& mesh);
 
-			void render(entity::EntityManager &world) {
+			void render(entity::EntityManager &world, bool debugMode = false) {
 				#ifdef FGGL_ALLOW_DEFERRED_UPLOAD
 					resolveModels(world);
 				#endif
-				renderModelsForward(world);
+				renderModelsForward(world, debugMode);
 			}
 
-			bool m_renderNormals = true;
-
 		private:
 
 			#ifdef FGGL_ALLOW_DEFERRED_UPLOAD
@@ -106,7 +104,7 @@ namespace fggl::gfx::ogl4 {
 			/**
 			 * Render all visible objects according to their render tokens.
 			 */
-			void renderModelsForward(const entity::EntityManager &world);
+			void renderModelsForward(const entity::EntityManager &world, bool debugMode);
 
 			assets::AssetManager *m_assets;
 			gfx::ShaderCache *m_shaders;