diff --git a/src/presenter.cpp b/src/presenter.cpp
index b782ebdc2bc6d16af840692526c341a967ca8b1c..2ddd34474c2917b7b68c84fca48169e5d9a7a8a7 100644
--- a/src/presenter.cpp
+++ b/src/presenter.cpp
@@ -17,7 +17,7 @@ static com::Folder *generate_grid() {
     auto material = gfx::material_system()->insert_default_material("grid_material", { "materials" }, vec3{ 0 });
 
     auto grid =
-        gfx::object_system()->insert_object({ "grid" }, material, gfx::buffer_generators()->insert_procedural_grid());
+        gfx::object_system()->insert_object({ "forward", "grid" }, material, gfx::buffer_generators()->insert_procedural_grid());
     gfx::object_system()->push_frame_back(grid, grid_frame());
 
     return grid;
@@ -51,18 +51,15 @@ void main()
 static com::Folder *default_text_material_box() {
     auto material = gfx::material_system()->insert_material(
         "default-text-material",
-        gfx::shader_system()->insert_shader<gfx::TextShader>(
-            { "shaders" }, "default-text-shader",
-            default_vertex_shader, default_fragment_shader
-        ),
-        {"materials"}
-    );
+        gfx::shader_system()->insert_shader<gfx::TextShader>({ "shaders" }, "default-text-shader", gfx::Shader::UNLIT,
+                                                             default_vertex_shader, default_fragment_shader),
+        { "materials" });
 
     auto box = gfx::object_system()->insert_object(
-        { "default-text-material-box" }, material,
-        gfx::buffer_generators()->insert_procedural_box_solid({1, 1, 1}, "default-text-material-box", { "maker" }));
+        { "forward", "default-text-material-box" }, material,
+        gfx::buffer_generators()->insert_procedural_box_solid({ 1, 1, 1 }, "default-text-material-box", { "maker" }));
     auto frame = root()->push_back<com::Folder>("default-text-material-box")->push_back<com::Frame>();
-    frame->set_origin({4, 4, 4});
+    frame->set_origin({ 4, 4, 4 });
     gfx::object_system()->push_frame_back(box, frame);
 
     return box;
@@ -97,44 +94,42 @@ void main()
 )";
 
 static com::Folder *generate_rectangle() {
-    auto shader = gfx::shader_system()->insert_shader<gfx::TextShader>(
-        {"test-rectangle"}, "test-rectangle-shader", gfx::Shader::UNLIT, rectangle_vertex_shader, rectangle_fragment_shader);
+    auto shader = gfx::shader_system()->insert_shader<gfx::TextShader>({ "test-rectangle" }, "test-rectangle-shader",
+                                                                       gfx::Shader::UNLIT, rectangle_vertex_shader,
+                                                                       rectangle_fragment_shader);
 
-    auto material = gfx::material_system()->insert_material("test-rectangle-material", shader, {"test-rectangle"});
+    auto material = gfx::material_system()->insert_material("test-rectangle-material", shader, { "test-rectangle" });
 
     auto rect = gfx::object_system()->insert_object(
-            { "test-rectangle" }, material,
-            gfx::buffer_generators()->insert_procedural_rectangle({ 1, 1 }, "test-rectangle", { "maker" }));
-    gfx::object_system()->push_frame_back(rect, root()->push_back<com::Folder>("test-rectangle")->push_back<com::Frame>());
+        { "forward", "test-rectangle" }, material,
+        gfx::buffer_generators()->insert_procedural_rectangle({ 1, 1 }, "test-rectangle", { "maker" }));
+    gfx::object_system()->push_frame_back(rect,
+                                          root()->push_back<com::Folder>("test-rectangle")->push_back<com::Frame>());
 
     return rect;
 }
 
 static com::Folder *generate_box(vec3 position, vec3 half_sizes_along_axes) {
-    auto shader = gfx::shader_system()->insert_shader("box_shader", gfx::Shader::Pipeline::FORWARD, gfx::Shader::LIT,
-                                                      { "shaders" });
-    auto texture =
-        shader->insert<gfx::Shader::TextureNode>("/home/pbabic/Repositories/age_app_template/data/age/texture/UV.jpeg");
-    auto container = shader->insert<gfx::Shader::TextureNode>(
-        "/home/pbabic/Repositories/age_app_template/data/age/texture/container.jpg");
+    auto shader =
+        gfx::shader_system()->insert_shader<gfx::ShaderGraph>({ "shaders" }, "box_shader", gfx::ShaderGraph::DEFERRED);
+    auto container =
+        shader->insert<gfx::ShaderGraph::TextureNode>(com::ContextPath{ "age", "texture", "container2.png" });
+    // auto specular = shader->insert<gfx::ShaderGraph::TextureNode>(
+    // "/home/pbabic/Repositories/age_app_template/data/age/texture/container2_specular.png");
 
-    auto tex_coords = shader->insert<gfx::Shader::NodeVaryingTexcoord>();
-    shader->connect(texture, gfx::Shader::TextureNode::inputs::tex_coord, tex_coords, 0);
-    shader->connect(container, gfx::Shader::TextureNode::inputs::tex_coord, tex_coords, 0);
+    auto tex_coords = shader->insert<gfx::ShaderGraph::NodeVaryingTexcoord>();
+    shader->connect(container, gfx::ShaderGraph::TextureNode::inputs::tex_coord, tex_coords, 0);
+    // shader->connect(container, gfx::ShaderGraph::TextureNode::inputs::tex_coord, tex_coords, 0);
 
-    auto add = shader->insert<gfx::Shader::NodeVectorAdd>(gfx::Shader::Node::DataType::ElementType::VEC3);
-    shader->connect(add, 0, texture, 0);
-    shader->connect(add, 1, container, 0);
-
-    shader->connect(shader->root(), gfx::Shader::MasterNodeLit::inputs::ambient, add, 0);
-    shader->connect(shader->root(), gfx::Shader::MasterNodeLit::inputs::diffuse, add, 0);
-    shader->connect(shader->root(), gfx::Shader::MasterNodeLit::inputs::specular, add, 0);
+    shader->connect(shader->root(), gfx::ShaderGraph::MasterNodeLit::inputs::ambient, container, 0);
+    shader->connect(shader->root(), gfx::ShaderGraph::MasterNodeLit::inputs::diffuse, container, 0);
+    shader->connect(shader->root(), gfx::ShaderGraph::MasterNodeLit::inputs::specular, container, 0);
 
     auto material = gfx::material_system()->insert_material("box_material", shader,
                                                             { gfx::material_system()->materials()->name() });
 
     auto box = gfx::object_system()->insert_object(
-        { "test_box" }, material,
+        { "deferred", "test_box" }, material,
         gfx::buffer_generators()->insert_procedural_box_solid(half_sizes_along_axes, "test_box", { "maker" }));
     auto frame = root()->push_back<com::Folder>("test_box")->push_back<com::Frame>();
     frame->set_origin(position);
@@ -143,19 +138,18 @@ static com::Folder *generate_box(vec3 position, vec3 half_sizes_along_axes) {
     return box;
 }
 
-static com::Folder *generate_point_light(vec3 position, vec3 color, float radius) {
-    auto point_light_frame = root()->push_back<com::Folder>("point_light")->push_back<com::Frame>();
+static com::Folder *generate_point_light(const std::string &name, vec3 position, vec3 color, float radius) {
+    auto point_light_frame = root()->push_back<com::Folder>(name)->push_back<com::Frame>();
     point_light_frame->move_origin(position);
-    auto point_light =
-        gfx::light_system()->insert_light<gfx::PointLight>({ "point_light" }, point_light_frame, color, radius);
+    auto point_light = gfx::light_system()->insert_light<gfx::PointLight>({ name }, point_light_frame, color, radius);
 
-    auto material = gfx::material_system()->insert_default_material("point_light_material", { "materials" }, color);
+    auto material = gfx::material_system()->insert_default_material(name + "_material", { "materials" }, color);
 
     // point light visualizer box
     gfx::object_system()->push_frame_back(
         gfx::object_system()->insert_object(
-            { "point_light_box" }, material,
-            gfx::buffer_generators()->insert_procedural_box_solid({ 0.1, 0.1, 0.1 }, "point_light_box", { "maker" })),
+            { "forward", name + "_box" }, material,
+            gfx::buffer_generators()->insert_procedural_box_solid({ 0.1, 0.1, 0.1 }, name + "_box", { "maker" })),
         point_light_frame);
 
     return point_light;
@@ -167,14 +161,19 @@ void Presenter::initialize() {
     auto grid = generate_grid();
     auto box = generate_box(vec3{ 0 }, vec3{ 0.5 });
 
-    auto point_light = generate_point_light({ 2, 1, 1 }, { 0, 1, 1 }, 20);
-    gfx::object_system()->insert_light(box, point_light);
+    std::vector point_lights{
+        generate_point_light("point_light_1", { 1, 1, 1 }, { 0, 1, 1 }, 5),
+        generate_point_light("point_light_2", { -1, -1.5, -1 }, { 1, 0, 1 }, 7),
+        generate_point_light("point_light_3", { 0.25, 1.25, -0.25 }, { 1, 1, 0 }, 3),
+    };
+    for (auto &pl : point_lights)
+        gfx::object_system()->insert_light(box, pl);
 
     // directional light
     auto light_frame = root()->push_back<com::Folder>("dir_light")->push_back<com::Frame>();
     light_frame->set_rotation(quat{ { 1.2, 0.8, 0.3 } });
-    auto light =
-        gfx::light_system()->insert_light<gfx::DirectionalLight>({ "dir_light" }, light_frame, vec3{ 0.75, 0.5, 0.5 });
+    auto light = gfx::light_system()->insert_light<gfx::DirectionalLight>({ "dir_light" }, light_frame,
+                                                                          vec3{ 0.75, 0.75, 0.75 });
     gfx::object_system()->insert_light(box, light);
 
     // ambient light
@@ -193,7 +192,10 @@ void Presenter::release() {
 
 void Presenter::next_round() {
     gfx::renderer()->clear_render_buffers();
-    gfx::renderer()->present_collection(gfx::object_system()->objects());
+    gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("deferred"), gfx::Renderer::DEFERRED);
+    gfx::renderer()->lighting_pass(*gfx::light_system()->lights());
+    gfx::renderer()->copy_depth_buffer();
+    gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("forward"), gfx::Renderer::FORWARD);
 }
 
 } // namespace mak