diff --git a/src/presenter.cpp b/src/presenter.cpp
index 70c6686c342644b55454fa10d15edd8a8e0b07ba..f5e25cf8574717f0b90340c956b177d646edf102 100644
--- a/src/presenter.cpp
+++ b/src/presenter.cpp
@@ -12,6 +12,7 @@
 #include <iostream>
 #include <sstream>
 #include <fstream>
+#include <glm/gtx/string_cast.hpp>
 
 namespace mak {
 
@@ -73,15 +74,31 @@ void Presenter::initialize()
     auto shader = gfx::shader_system()->insert_shader<Graph>(
         { "text_shaders" },
         "consolas_shader",
-        Graph::UNLIT
+        Graph::UNLIT,
+        Graph::PHONG,
+        Graph::PARTIAL
         );
 
-    Graph::TextureNode* textureNode = shader->insert<Graph::TextureNode>(com::ContextPath{"age", "texture", "font", "Consolas_16.png"});
+    gfx::AtlasGlyphProps glyph_props;
+    gfx::load_true_type_font(osi::data()->dir() / "age" / "font" / "open_sans" / "OpenSans-Regular.ttf", 48U, glyph_props);
+    //Graph::TextureNode* textureNode = shader->insert<Graph::TextureNode>(com::ContextPath{"age", "texture", "font", "Consolas_16.png"}, ElementType::VEC4);
+    Graph::TextureNode* textureNode = shader->insert<Graph::TextureNode>(com::ContextPath{"age", "texture", "font", "Open Sans_Regular_48_font_atlas.png"}, ElementType::VEC4);
     Graph::NodeVaryingTexcoord* uvCoordNode = shader->insert<Graph::NodeVaryingTexcoord>();
 
+    Graph::NodeDecomposeVector* decomposeNode = shader->insert<Graph::NodeDecomposeVector>(ElementType::VEC4);
+    Graph::NodeComposeVector* composeNode = shader->insert<Graph::NodeComposeVector>(ElementType::VEC3);
+    shader->connect(composeNode, 0, decomposeNode, 0);
+    shader->connect(composeNode, 1, decomposeNode, 1);
+    shader->connect(composeNode, 2, decomposeNode, 2);
+    shader->connect(decomposeNode, 0, textureNode, 0);
+
     shader->connect(textureNode, Graph::TextureNode::inputs::tex_coord, uvCoordNode, 0);
 
-    shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::color, textureNode, 0);
+    shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::color, composeNode, 0);
+    shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::alpha, decomposeNode, 3);
+
+    auto emission = shader->insert<Graph::NodeConstant>(vec3{0.});
+    shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::emission, emission, 0);
 
     gfx::Material* tex_material = gfx::material_system()->insert_material("box_material", text_shader, {"materials"});
     gfx::Material* consolas_material = gfx::material_system()->insert_material("consolas_material", shader, {"materials"});
@@ -99,65 +116,88 @@ void Presenter::initialize()
         );
 
     // --- BEGIN test_box ---
-    com::Folder* const test_box = gfx::object_system()->insert_object(
-            { "maker", "test_box" },
-            tex_material,
-            gfx::buffer_generators()->insert_procedural_box_solid({ 0.5f, 0.5f, 0.5f } , "test_box", { "maker" })
-            );
-    gfx::object_system()->push_frame_back(
-        test_box ,
-        root()->push_back<com::Folder>("test_box")->push_back<com::Frame>()
-        );
-    gfx::object_system()->get_uniforms(test_box)->push_back<com::FileVec3>("material_ambient_color", vec3{ 0.75f, 0.75f, 0 });
-
-    // The second instance
-    com::Frame* const frame2 = root()->push_back<com::Folder>("test_box_2")->push_back<com::Frame>();
-    frame2->move_origin({ 0.5f, 0, 1.5f });
-    gfx::object_system()->push_frame_back(test_box, frame2);
+    //com::Folder* const test_box = gfx::object_system()->insert_object(
+            //{ "maker", "test_box" },
+            //tex_material,
+            //gfx::buffer_generators()->insert_procedural_box_solid({ 0.5f, 0.5f, 0.5f } , "test_box", { "maker" })
+            //);
+    //gfx::object_system()->push_frame_back(
+        //test_box ,
+        //root()->push_back<com::Folder>("test_box")->push_back<com::Frame>()
+        //);
+    //gfx::object_system()->get_uniforms(test_box)->push_back<com::FileVec3>("material_ambient_color", vec3{ 0.75f, 0.75f, 0 });
+
+    //// The second instance
+    //com::Frame* const frame2 = root()->push_back<com::Folder>("test_box_2")->push_back<com::Frame>();
+    //frame2->move_origin({ 0.5f, 0, 1.5f });
+    //gfx::object_system()->push_frame_back(test_box, frame2);
 
     // --- END test_box ---
 
     // UI
     
     // Create gfx/ui/ and maker/ui/ folders
-    gfx::Button* ui_elem1 = gfx::ui_generators()->create_ui_button("ui_elem1", {});
-    gfx::Button* ui_elem2 = gfx::ui_generators()->create_ui_button("ui_elem2", {});
-    com::Folder* ui_elem_folder1 = root()->push_back<com::Folder>(ui_elem1->name());
-    com::Folder* ui_elem_folder2 = root()->push_back<com::Folder>(ui_elem2->name());
+    gfx::Button* ui_elem1 = gfx::ui_generators()->create_ui_button("ui_elem1", {"buttons"}, "text");
+    gfx::Button* ui_elem2 = gfx::ui_generators()->create_ui_button("ui_elem2", {"buttons"}, "text1234");
+    gfx::TextBox* ui_elem_text_box1 = dynamic_cast<gfx::TextBox*>(ui_elem1->get_child(gfx::Button::text_box_folder_name()));
+    gfx::TextBox* ui_elem_text_box2 = dynamic_cast<gfx::TextBox*>(ui_elem2->get_child(gfx::Button::text_box_folder_name()));
+    com::Frame* ui_elem_frame1 = root()->push_back<com::Folder>(ui_elem1->name())->push_back<com::Frame>();
+    com::Frame* ui_elem_frame2 = root()->push_back<com::Folder>(ui_elem2->name())->push_back<com::Frame>();
+    com::Frame* ui_elem_text_box_frame1 = root()->push_back<com::Folder>(root()->generate_unique_name(gfx::Button::text_box_folder_name()))->push_back<com::Frame>();
+    com::Frame* ui_elem_text_box_frame2 = root()->push_back<com::Folder>(root()->generate_unique_name(gfx::Button::text_box_folder_name()))->push_back<com::Frame>();
+
     gfx::ui_system()->set_parent(ui_elem1, camera_frame());
     gfx::ui_system()->set_parent(ui_elem2, camera_frame());
+    gfx::ui_system()->set_parent(ui_elem_text_box1, ui_elem_frame1);
+    gfx::ui_system()->set_parent(ui_elem_text_box2, ui_elem_frame2);
 
     // Set variables
-    gfx::ui_system()->get_transform(ui_elem1)->set_position(vec2{ 0.5f, 0.5f });
-    gfx::ui_system()->get_transform(ui_elem1)->set_scale(vec2{ 0.01f, 0.005f});
+    gfx::ui_system()->get_transform(ui_elem1)->set_position(vec2{ 0.7f, 0.7f });
+    gfx::ui_system()->get_transform(ui_elem1)->set_scale(vec2{ 0.01f, 0.01f });
 
-    gfx::ui_system()->get_transform(ui_elem2)->set_position(vec2{ -0.03f, 0.04f});
-    gfx::ui_system()->get_transform(ui_elem2)->set_scale(vec2{ 0.01f, 0.05f});
+    gfx::ui_system()->get_transform(ui_elem2)->set_position(vec2{ -0.7f, -0.7f});
+    gfx::ui_system()->get_transform(ui_elem2)->set_scale(vec2{ 0.01f, 0.01f });
+
+    gfx::ui_system()->get_transform(ui_elem_text_box1)->set_position(vec2{ 0.00f, 0.00f });
+    gfx::ui_system()->get_transform(ui_elem_text_box1)->set_scale(vec2{ 3.0f, 3.0f });
+    gfx::ui_system()->get_transform(ui_elem_text_box2)->set_position(vec2{ 0.00f, 0.00f });
+    gfx::ui_system()->get_transform(ui_elem_text_box2)->set_scale(vec2{ 0.5f, 0.5f });
 
     // Create buffer
     gfx::Buffer* ui_buffer = gfx::buffer_generators()->insert_procedural_rectangle({ 1.0f, 1.0f }, "ui_buffer", { "ui" });
     gfx::Buffer* ui_text_buffer1 = gfx::buffer_generators()->insert_procedural_text_rectangle(
-        "01234",
+        ui_elem_text_box1->get_text() + "12123123",
         font_props,
-        gfx::ui_system()->get_transform(ui_elem1)->get_aabb().hi.x - gfx::ui_system()->get_transform(ui_elem1)->get_aabb().lo.x,
+        // would like to set it up based on button aabb
+        1.0f,
         255U,
         true,
         true,
         "button_1_text"
     );
     gfx::Buffer* ui_text_buffer2 = gfx::buffer_generators()->insert_procedural_text_rectangle(
-        "01234",
+        ui_elem_text_box2->get_text(),
         font_props,
-        gfx::ui_system()->get_transform(ui_elem2)->get_aabb().hi.x - gfx::ui_system()->get_transform(ui_elem2)->get_aabb().lo.x,
+        10.0f,
         255U,
         true,
         true,
         "button_2_text"
     );
 
+    gfx::Buffer* ttf_buffer = gfx::buffer_generators()->create_text_buffer(
+        "text",
+        glyph_props,
+        "id"
+    );
+
+    //ui_elem1->get_theme()->set_material(gfx::ENABLED, consolas_material);
+
     // Insert UI elements into object system
-    auto ui_elem_object1 = gfx::ui_system()->insert_object(ui_elem1, ui_elem_folder1, consolas_material, ui_text_buffer1);
-    auto ui_elem_object2 = gfx::ui_system()->insert_object(ui_elem2, ui_elem_folder2, consolas_material, ui_text_buffer2);
+    auto ui_elem_object1 = gfx::ui_system()->insert_object(ui_elem1, ui_elem_frame1, tex_material, ui_buffer);
+    auto ui_elem_object2 = gfx::ui_system()->insert_object(ui_elem2, ui_elem_frame2, tex_material, ui_buffer);
+    gfx::ui_system()->insert_object(ui_elem_text_box1, ui_elem_text_box_frame1, consolas_material, ttf_buffer);
+    gfx::ui_system()->insert_object(ui_elem_text_box2, ui_elem_text_box_frame2, consolas_material, ui_text_buffer2);
 
     // --- BEGIN directional light ---
 
@@ -175,19 +215,13 @@ void Presenter::initialize()
 
     // --- END directional light ---
 
-    // BEGIN Handlers
-    ButtonHandler* button_handler = root()->find<ButtonHandler>(ButtonHandler::self_name());
-    gfx::ui_system()->add_handler(ui_elem1, button_handler);
-    gfx::ui_system()->add_handler(ui_elem2, button_handler);
-
-    // END handlers
-
-    gfx::object_system()->insert_light(test_box, dir_light);
-    gfx::object_system()->insert_light(test_box, ambient_light);
-    gfx::light_system()->insert_shadow_caster(dir_light, test_box);
+    //gfx::object_system()->insert_light(test_box, dir_light);
+    //gfx::object_system()->insert_light(test_box, ambient_light);
+    //gfx::light_system()->insert_shadow_caster(dir_light, test_box);
     print_tree(*gfx::root(), std::cout);
     print_tree(*mak::root(), std::cout);
-
+    std::cout << glm::to_string(gfx::camera_system()->active_camera()->bottom_left_absolute()) << std::endl;
+    std::cout << glm::to_string(gfx::camera_system()->active_camera()->top_right_absolute()) << std::endl;
 }
 
 void Presenter::release()
@@ -203,7 +237,18 @@ void Presenter::release()
 void Presenter::next_round()
 {
     gfx::renderer()->clear_render_buffers();
-    gfx::renderer()->present_collection(gfx::object_system()->objects(), gfx::Renderer::pipeline::FORWARD);
+    //gfx::renderer()->present_collection(gfx::object_system()->objects(), gfx::Renderer::pipeline::FORWARD);
+    gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("grid"), gfx::Renderer::pipeline::FORWARD);
+    //gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("maker"), gfx::Renderer::pipeline::FORWARD);
+
+    // if I change to ortho, the intersection with mouse stops working
+    gfx::camera_system()->active_camera()->set_perspective(false);
+
+    gfx::renderer()->configure_depth_writing(false);
+    gfx::renderer()->configure_blending(true, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+    gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("ui"), gfx::Renderer::pipeline::FORWARD);
+    gfx::camera_system()->active_camera()->set_perspective(true);
+    gfx::renderer()->configure_depth_writing(true);
 }
 
 }