diff --git a/include/maker/presenter.hpp b/include/maker/presenter.hpp
index a281896124ac46486921b95271538f2ccc1320e2..db2a6ed86340822aa18c940c750daced420ce8e5 100644
--- a/include/maker/presenter.hpp
+++ b/include/maker/presenter.hpp
@@ -4,6 +4,8 @@
 #   include <com/runner.hpp>
 #   include <math/math.hpp>
 
+#include "gfx/camera.hpp"
+
 namespace com { struct Frame; }
 
 namespace mak {
@@ -20,6 +22,10 @@ struct Presenter : public com::Runner
 protected:
 
     void initialize() override;
+    void init_scene1(gfx::Camera* camera);
+    void init_scene2(gfx::Camera* camera);
+    void init_scene3(gfx::Camera* camera);
+    void init_scene4(gfx::Camera* camera);
     void release() override;
 };
 
diff --git a/src/presenter.cpp b/src/presenter.cpp
index f5e25cf8574717f0b90340c956b177d646edf102..4036f0e0aff0a4602194d78a946c9abb62208a92 100644
--- a/src/presenter.cpp
+++ b/src/presenter.cpp
@@ -1,16 +1,11 @@
 #include <maker/presenter.hpp>
 #include <maker/index.hpp>
-#include <maker/handlers/button_handler.hpp>
 #include <gfx/index.hpp>
-#include <gfx/ui/transform.hpp>
+#include <lfs/index.hpp>
 #include <gfx/text_shader.hpp>
-#include <gfx/font.hpp>
 #include <gfx/buffer_generators.hpp>
 #include <osi/index.hpp>
-#include <com/math_files.hpp>
-#include <utils/context_utils.hpp>
 #include <iostream>
-#include <sstream>
 #include <fstream>
 #include <glm/gtx/string_cast.hpp>
 
@@ -20,6 +15,8 @@ typedef gfx::ShaderGraph::Node::DataType::ElementType ElementType;
 typedef gfx::ShaderGraph Graph;
 typedef gfx::ShaderGraph::Node::SlotDefinition Slot;
 
+using namespace gfx;
+
 Presenter::Presenter()
     : com::Runner{ self_name() }
 {}
@@ -36,75 +33,14 @@ com::Folder* ambient_light() {
     return ambient_light;
 }
 
-static const std::string default_vertex_shader = R"(
-#version 330 core
-
-layout(location = 0) in vec3 vertex_position;
-uniform mat4 model;
-uniform mat4 view;
-uniform mat4 projection;
-
-void main()
-{
-    gl_Position = projection * view * model * vec4(vertex_position, 1.);
-}
-)";
-
-static const std::string default_fragment_shader = R"(
-#version 330 core
-
-out vec4 fragColor;
-
-void main()
-{
-    fragColor = vec4(0.2, 0.8, 1., 1.);
-}
-)";
-
 void Presenter::initialize()
 {
     osi::presenters()->push_back<com::Folder>("maker")->push_back<com::Link>(self_name() + ".link", this);
 
-    gfx::Shader* text_shader =  gfx::shader_system()->insert_shader<gfx::TextShader>({ "shaders" } , "default_text_shader", gfx::Shader::UNLIT,
-                                                                                     default_vertex_shader, default_fragment_shader);
-
-    Graph* default_shader = dynamic_cast<Graph*>(gfx::shader_system()->default_shader());
+    auto* default_shader = dynamic_cast<Graph*>(shader_system()->default_shader());
 
-    // Create a new shader graph
-    auto shader = gfx::shader_system()->insert_shader<Graph>(
-        { "text_shaders" },
-        "consolas_shader",
-        Graph::UNLIT,
-        Graph::PHONG,
-        Graph::PARTIAL
-        );
-
-    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, 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"});
-
-    gfx::MonoFontProps font_props;
-    gfx::load_font_mono_props(std::filesystem::canonical(osi::data()->dir()) / "age"/ "font" / "Consolas_16.txt", font_props);
+    Material* tex_material = material_system()->insert_material("box_material", default_shader, {"materials"});
+    ui_system()->insert_default_materials();
 
     gfx::object_system()->push_frame_back(
         gfx::object_system()->insert_object(
@@ -113,7 +49,7 @@ void Presenter::initialize()
             gfx::buffer_generators()->insert_procedural_grid()
             ),
         grid_frame()
-        );
+    );
 
     // --- BEGIN test_box ---
     //com::Folder* const test_box = gfx::object_system()->insert_object(
@@ -133,75 +69,26 @@ void Presenter::initialize()
     //gfx::object_system()->push_frame_back(test_box, frame2);
 
     // --- END test_box ---
+    camera_system()->set_frame(camera_system()->default_camera_folder(), camera_frame());
 
     // UI
-    
-    // Create gfx/ui/ and maker/ui/ folders
-    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.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.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(
-        ui_elem_text_box1->get_text() + "12123123",
-        font_props,
-        // 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(
-        ui_elem_text_box2->get_text(),
-        font_props,
-        10.0f,
-        255U,
-        true,
-        true,
-        "button_2_text"
-    );
+    // Camera Setup
+    Camera* ui_camera = camera_system()->insert_camera({"ui", "camera"});
+    ui_camera->set_perspective(false);
+    camera_system()->set_frame(ui_camera->folder(), ui_system()->get_default_camera_frame());
 
-    gfx::Buffer* ttf_buffer = gfx::buffer_generators()->create_text_buffer(
-        "text",
-        glyph_props,
-        "id"
-    );
+    // Initialize scenes
+    init_scene1(ui_camera);
+    init_scene2(ui_camera);
+    init_scene3(ui_camera);
+    init_scene4(ui_camera);
 
-    //ui_elem1->get_theme()->set_material(gfx::ENABLED, consolas_material);
+    ui_system()->set_current_scene("scene1");
 
-    // Insert UI elements into object system
-    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 ---
 
-    com::Frame* const frame_light = root()->push_back<com::Folder>("directional_light")->push_back<com::Frame>();
+    auto* const frame_light = root()->push_back<com::Folder>("directional_light")->push_back<com::Frame>();
     com::Folder* const dir_light = gfx::light_system()->insert_light<gfx::DirectionalLight>(
             { "global", "directional" },
             frame_light,
@@ -224,31 +111,219 @@ void Presenter::initialize()
     std::cout << glm::to_string(gfx::camera_system()->active_camera()->top_right_absolute()) << std::endl;
 }
 
+void Presenter::init_scene1(Camera* camera) {
+    auto* scene1 = ui_system()->create_scene("scene1");
+    auto* scene1_layer1 = ui_system()->insert_scene_layer_top(scene1, "layer1");
+    auto* scene1_default_layer = ui_system()->get_default_scene_layer(scene1);
+    ui_system()->assign_camera_to_scene(scene1, camera);
+    auto* scene1_camera_bottom_left_frame = ui_system()->get_scene_frame(scene1);
+
+    auto* check_box = ui_system()->insert_element<CheckBox>("checkbox", scene1, scene1_default_layer,  vec2i{50.0f, 50.0f});
+    auto* slider = ui_system()->insert_element<Slider>("slider", scene1, scene1_default_layer,  vec2i{20.0f, 200.0f}, VERTICAL);
+    auto* h_slider = ui_system()->insert_element<Slider>("h_slider", scene1, scene1_default_layer,  vec2i{200.0f, 20.0f}, HORIZONTAL);
+    auto* progress_bar = ui_system()->insert_element<ProgressBar>("progress_bar", scene1, scene1_default_layer,  vec2i{200.0f, 20.0f}, 0.4f);
+    Button* button1 = ui_generators()->create_ui_button("ui_elem1", vec2i{100, 50}, scene1, scene1_layer1,  "button1");
+    // todo maybe move this function into ui generators
+    button1->request_fonts_to_load("OpenSans", 48U, false, false);
+    Button* button2 = ui_generators()->create_ui_button("ui_elem2", vec2i{100,100}, scene1, scene1_default_layer,  "button2");
+    button2->request_fonts_to_load("OpenSans", 48U, false, false);
+
+    auto* list_box = ui_system()->insert_element<ListBox>("list_box", scene1, scene1_default_layer, vec2i(100, 300), vec2i(100, 30));
+    auto* list_box_scroll_bar = ui_system()->insert_child_element<Slider>("list_box_slider", list_box, scene1, scene1_default_layer, vec2i(20, 300), 1.0f, VERTICAL);
+    list_box_scroll_bar->get_transform()->set_anchor(Anchor{0.f, 1.0f, 0.f, 0.f});
+    list_box->insert_item(scene1, scene1_default_layer,  "text1", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text2", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text3", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text4", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text5", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text6", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text7", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text8", 0.3f, "OpenSans", 12U);
+    list_box->insert_item(scene1, scene1_default_layer,  "text9", 0.3f, "OpenSans", 12U);
+
+    auto* edit_text_line = ui_system()->insert_element<LineTextEdit>("line_text_edit", scene1, scene1_default_layer, vec2i{100, 48}, "text_edit");
+    edit_text_line->request_fonts_to_load("OpenSans", 48U, false, false);
+
+    auto* handlers_folder = root()->push_back<com::Folder>("handlers");
+    auto* button_handler = handlers_folder->push_back<ButtonHandler>("button_handler");
+    auto* check_box_handler = handlers_folder->push_back<CheckBoxHandler>("check_box_handler");
+    auto* interval_handler = handlers_folder->push_back<IntervalHandler>("interval_handler");
+
+    //check_box->register_handler(check_box_handler);
+    slider->register_handler(interval_handler);
+
+    ui_system()->set_parent_frame(edit_text_line, scene1_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(list_box, scene1_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(button1, scene1_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(button2, scene1_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(check_box, scene1_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(slider, scene1_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(h_slider, scene1_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(progress_bar, scene1_camera_bottom_left_frame);
+
+    edit_text_line->get_frame()->set_origin(vec3{ui_system()->get_size_in_meters(nullptr, {100.0f, 100.0f}), 0.0f});
+    list_box->get_frame()->set_origin(vec3{ui_system()->get_size_in_meters(nullptr, {850.f, 250.f}), 0.0f});
+    button1->get_frame()->set_origin(vec3(ui_system()->get_size_in_meters(nullptr, vec2i(300, 200)), 0.0f));
+    button2->get_frame()->set_origin(vec3(ui_system()->get_size_in_meters(nullptr, vec2i(200, 300)), 0.0f));
+    check_box->get_frame()->set_origin(vec3(ui_system()->get_size_in_meters(nullptr, vec2i(500, 400)), 0.0f));
+    slider->get_frame()->set_origin(vec3(ui_system()->get_size_in_meters(nullptr, vec2i(100, 600)), 0.0f));
+    h_slider->get_frame()->set_origin(vec3(ui_system()->get_size_in_meters(nullptr, vec2i(400, 600)), 0.0f));
+    progress_bar->get_frame()->set_origin(vec3(ui_system()->get_size_in_meters(nullptr, vec2i(400, 500)), 0.0f));
+
+    // Insert UI elements into object system
+    ui_system()->insert_objects(edit_text_line, scene1);
+    ui_system()->insert_objects(list_box, scene1);
+    ui_system()->insert_objects(check_box, scene1);
+    ui_system()->insert_objects(slider, scene1);
+    ui_system()->insert_objects(h_slider, scene1);
+    ui_system()->insert_objects(progress_bar, scene1);
+    ui_system()->insert_objects(button1, scene1);
+    ui_system()->insert_objects(button2, scene1);
+}
+
+void Presenter::init_scene2(Camera* camera) {
+    auto* scene2 = ui_system()->create_scene("scene2");
+    auto* scene2_default_layer = ui_system()->get_default_scene_layer(scene2);
+    ui_system()->assign_camera_to_scene(scene2, camera);
+    auto* scene2_camera_bottom_left_frame = ui_system()->get_scene_frame(scene2);
+
+    auto* tab_bar = ui_system()->insert_element<TabBar>("tab_bar", scene2, scene2_default_layer, vec2i{600, 500}, vec2i{200, 50});
+    auto* tab_bar_static_text1 = ui_system()->insert_child_element<StaticText>("tab_bar_text1", tab_bar, scene2, scene2_default_layer, vec2i{500, 400}, "tab bar text1");
+    tab_bar_static_text1->request_fonts_to_load("OpenSans", 48U, true, true);
+    auto* tab_bar_static_text2 = ui_system()->insert_child_element<StaticText>("tab_bar_text2", tab_bar, scene2, scene2_default_layer, vec2i{500, 300}, "tab bar text2");
+    tab_bar_static_text2->request_fonts_to_load("OpenSans", 48U, true, true);
+    // Composite element
+    auto* tab_bar_elem1 = ui_system()->insert_child_element<UiElement>("tab_bar_elem1", tab_bar, scene2, scene2_default_layer, vec2i{600, 450});
+    std::string button_text = "sub_element_text";
+    auto* tab_bar_elem1_button = ui_system()->insert_child_element<Button>("tab_bar_elem1_button", tab_bar_elem1, scene2, scene2_default_layer, vec2i{100,50}, std::move(button_text));
+    tab_bar_elem1_button->request_fonts_to_load("OpenSans", 48U, false, false);
+    // List box
+    auto* tab_bar_elem1_list_box = ui_system()->insert_child_element<ListBox>("tab_bar_elem1_list_box", tab_bar_elem1, scene2, scene2_default_layer, vec2i{100,300}, vec2i{100, 30});
+    tab_bar_elem1_list_box->insert_item(scene2, scene2_default_layer,  "text", 0.3f, "OpenSans", 48);
+    // Tabs
+    auto* tab1 = tab_bar->add_tab(".", scene2, scene2_default_layer, "OpenSans", 48u);
+    auto* tab2 = tab_bar->add_tab("..", scene2, scene2_default_layer, "OpenSans", 48u);
+    auto* tab3 = tab_bar->add_tab("...", scene2, scene2_default_layer, "OpenSans", 48u);
+    tab_bar->assign_content_to_tab(tab_bar_static_text1, tab1);
+    tab_bar->assign_content_to_tab(tab_bar_static_text2, tab2);
+    tab_bar->assign_content_to_tab(tab_bar_elem1, tab3);
+
+    ui_system()->set_parent_frame(tab_bar, scene2_camera_bottom_left_frame);
+
+    tab_bar_elem1_list_box->get_frame()->set_origin(vec3{ui_system()->get_size_in_meters(nullptr, vec2i{-100, 50}), 0.f});
+    tab_bar_elem1_button->get_frame()->set_origin(vec3{ui_system()->get_size_in_meters(nullptr, vec2i{100, 50}), 0.f});
+    tab_bar->get_frame()->set_origin(vec3{ui_system()->get_size_in_meters(nullptr, vec2i(osi::window()->size()) / 2), 0.0f});
+
+    ui_system()->insert_objects(tab_bar, scene2);
+    tab_bar->set_active_tab(tab1);
+}
+
+void Presenter::init_scene3(Camera* camera) {
+    auto* scene3 = ui_system()->create_scene("scene3");
+     auto* scene3_default_layer = ui_system()->get_default_scene_layer(scene3);
+    ui_system()->assign_camera_to_scene(scene3, camera);
+    auto* scene3_camera_bottom_left_frame = ui_system()->get_scene_frame(scene3);
+
+    std::string text_static = "Test 123 \\c[128,0,0]i{Ja fajn} fiwasd \\c[0,128,0]b{dfsgndfugrefhewhfjkewjfdsjhjfhdsfjgkdffhjdsfjsdjfhdsjhfdsjhf} fawdsaf \\c[0,0,128]i{dwafsaf}dfwafsaffewfsdddddddddddddddddddddddddssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssassssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssassssssssssssssssssssssssssssss";
+    auto* static_text = ui_system()->insert_element<StaticText>("static_text", scene3, scene3_default_layer, vec2i{600, 600}, text_static, true);
+    auto* static_text_scroll_bar = ui_system()->insert_child_element<Slider>("static_text_slider", static_text, scene3, scene3_default_layer, vec2i(20, 300), 1.0f, VERTICAL);
+    static_text_scroll_bar->get_transform()->set_anchor(Anchor{0.f, 1.0f, 0.0f, 0.0f});
+    static_text->request_fonts_to_load("OpenSans", 48U, true, true);
+
+    ui_system()->set_parent_frame(static_text, scene3_camera_bottom_left_frame);
+
+    static_text_scroll_bar->get_frame()->set_origin(vec3{ui_system()->get_size_in_meters(nullptr, vec2i{200, 0}), 0.f});
+    static_text->get_frame()->set_origin(vec3{ui_system()->get_size_in_meters(nullptr, {500.0f,400.0f}), 0.0f});
+
+    ui_system()->insert_objects(static_text, scene3);
+}
+
+void Presenter::init_scene4(Camera* camera)
+{
+    auto* scene4 = ui_system()->create_scene("scene4");
+    auto* scene4_camera_bottom_left_frame = ui_system()->get_scene_frame(scene4);
+
+    ui_system()->assign_camera_to_scene(scene4, camera);
+    auto* scene4_default_layer = ui_system()->get_default_scene_layer(scene4);
+
+    Button* button3 = ui_generators()->create_ui_button("ui_elem3", vec2i{100, 50}, scene4, scene4_default_layer,  "button3");
+    Button* button4 = ui_generators()->create_ui_button("ui_elem4", vec2i{100, 50}, scene4, scene4_default_layer,  "button4");
+    Button* button5 = ui_generators()->create_ui_button("ui_elem5", vec2i{100, 50}, scene4, scene4_default_layer,  "button5");
+    Button* button6 = ui_generators()->create_ui_button("ui_elem6", vec2i{100, 50}, scene4, scene4_default_layer,  "button6");
+    Button* button7 = ui_generators()->create_ui_button("ui_elem7", vec2i{100, 50}, scene4, scene4_default_layer,  "button7");
+    button3->get_transform()->set_anchor(Anchor{0.001f, 0.001f, 1.f, .8f});
+    button4->get_transform()->set_anchor(Anchor{1.f, .8f, 0.001f, 0.001f});
+    button5->get_transform()->set_anchor(Anchor{0.001f, .8f, 1.f, 0.001f});
+    button6->get_transform()->set_anchor(Anchor{1.f, 0.001f, 0.001f, .8f});
+    button7->get_transform()->set_anchor(Anchor{0.5f, 0.5f, 0.5f, 0.5f});
+    button3->request_fonts_to_load("OpenSans", 48U, true, true);
+    button4->request_fonts_to_load("OpenSans", 48U, true, true);
+    button5->request_fonts_to_load("OpenSans", 48U, true, true);
+    button6->request_fonts_to_load("OpenSans", 48U, true, true);
+    button7->request_fonts_to_load("OpenSans", 48U, true, true);
+
+    ui_system()->set_parent_frame(button3, scene4_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(button4, scene4_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(button5, scene4_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(button6, scene4_camera_bottom_left_frame);
+    ui_system()->set_parent_frame(button7, scene4_camera_bottom_left_frame);
+
+
+    ui_system()->insert_objects(button3, scene4);
+    ui_system()->insert_objects(button4, scene4);
+    ui_system()->insert_objects(button5, scene4);
+    ui_system()->insert_objects(button6, scene4);
+    ui_system()->insert_objects(button7, scene4);
+
+    print_tree(*ui_system()->uis(), std::cout);
+    print_tree(*object_system()->objects(), std::cout);
+    print_tree(*material_system()->materials(), std::cout);
+
+    // const GLubyte* renderer = glGetString(GL_RENDERER); // Renderer string
+    // const GLubyte* vendor = glGetString(GL_VENDOR);     // Vendor name
+    // const GLubyte* version = glGetString(GL_VERSION);   // OpenGL version
+    //
+    // if (renderer && vendor && version) {
+    //     std::cout << "GPU Renderer: " << renderer << std::endl;
+    //     std::cout << "GPU Vendor: " << vendor << std::endl;
+    //     std::cout << "OpenGL Version: " << version << std::endl;
+    // } else {
+    //     std::cerr << "Unable to retrieve GPU information." << std::endl;
+    // }
+}
+
 void Presenter::release()
 {
     osi::presenters()->find<com::Folder>("maker")->erase(self_name() + ".link");
 
     root()->erase("test_box");
     root()->erase("test_box2");
+
+    // Erase element frames
+    root()->erase("container");
+    root()->erase("checkbox");
     root()->erase("ui_elem1");
     root()->erase("ui_elem2");
+    root()->erase("slider");
+    root()->erase("handlers");
+    root()->erase("directional_light");
 }
 
 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()->find<com::Folder>("grid"), gfx::Renderer::pipeline::FORWARD);
-    //gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("maker"), gfx::Renderer::pipeline::FORWARD);
+    // Clear buffers
+    renderer()->clear_render_buffers();
+
+    // Present grid with default camera
+    camera_system()->activate_default_camera();
+    camera_system()->set_frame(camera_system()->default_camera_folder(), camera_frame());
+    renderer()->present_collection(object_system()->objects()->find<com::Folder>("grid"), Renderer::pipeline::FORWARD);
 
-    // if I change to ortho, the intersection with mouse stops working
-    gfx::camera_system()->active_camera()->set_perspective(false);
+    // Present ui scene
+    ui_system()->present_current_scene();
 
-    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);
+    //gfx::renderer()->present_collection(gfx::object_system()->objects(), gfx::Renderer::pipeline::FORWARD);
+    //gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("maker"), gfx::Renderer::pipeline::FORWARD);
 }
 
 }