diff --git a/doc/Tutorial.md b/doc/Tutorial.md
index d81caa7e290a263762a3faa66b51aadfcde8139d..4c4442866017408ef2ab609a6d046a9349f476f2 100644
--- a/doc/Tutorial.md
+++ b/doc/Tutorial.md
@@ -57,7 +57,7 @@ lava::frame frame(argh);
 if (!frame.ready())
     return error::not_ready;
 
-auto count = 0;
+ui32 count = 0;
 
 frame.add_run([&]() {
     sleep(one_second);
@@ -138,19 +138,19 @@ input.key.listeners.add([&](key_event::ref event) {
     return input_ignore;
 });
 
-auto device = frame.create_device();
+lava::device_ptr device = frame.create_device();
 if (!device)
     return error::create_failed;
 
-auto render_target = create_target(&window, device);
+lava::render_target::ptr render_target = create_target(&window, device);
 if (!render_target)
     return error::create_failed;
 
-lava::renderer plotter;
-if (!plotter.create(render_target->get_swapchain()))
+lava::renderer renderer;
+if (!renderer.create(render_target->get_swapchain()))
     return error::create_failed;
 
-auto frame_count = render_target->get_frame_count();
+ui32 frame_count = render_target->get_frame_count();
 
 VkCommandPool cmd_pool;
 VkCommandBuffers cmd_bufs(frame_count);
@@ -176,8 +176,8 @@ auto build_cmd_bufs = [&]() {
     };
 
     for (auto i = 0u; i < frame_count; i++) {
-        auto cmd_buf = cmd_bufs[i];
-        auto frame_image = render_target->get_image(i);
+        VkCommandBuffer cmd_buf = cmd_bufs[i];
+        VkImage frame_image = render_target->get_image(i);
 
         if (failed(device->call().vkBeginCommandBuffer(cmd_buf, &begin_info)))
             return build_failed;
@@ -224,17 +224,17 @@ frame.add_run([&]() {
     if (window.resize_request())
         return window.handle_resize();
 
-    auto frame_index = plotter.begin_frame();
+    auto frame_index = renderer.begin_frame();
     if (!frame_index)
         return run_continue;
 
-    return plotter.end_frame({ cmd_bufs[*frame_index] });
+    return renderer.end_frame({ cmd_bufs[*frame_index] });
 });
 
 frame.add_run_end([&]() {
     clean_cmd_bufs();
 
-    plotter.destroy();
+    renderer.destroy();
     render_target->destroy();
 });
 
@@ -287,7 +287,7 @@ block.add_command([&](VkCommandBuffer cmd_buf) {
         .layerCount = 1,
     };
 
-    auto frame_image = render_target->get_image(block.get_current_frame());
+    VkImage frame_image = render_target->get_image(block.get_current_frame());
 
     insert_image_memory_barrier(device, cmd_buf, frame_image,
                                 VK_ACCESS_MEMORY_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
@@ -320,7 +320,7 @@ All we need to do now is to process the block in the run loop:
 if (!block.process(*frame_index))
     return run_abort;
 
-return plotter.end_frame(block.get_buffers());
+return renderer.end_frame(block.get_buffers());
 ```
 
 And call the renderer with our recorded command buffers
diff --git a/liblava-demo/lamp.cpp b/liblava-demo/lamp.cpp
index 41f90ffb06d4700de61478da2f0e3519fe1d7b88..5d77156c3acb535373732418acfd13425ab07b16 100644
--- a/liblava-demo/lamp.cpp
+++ b/liblava-demo/lamp.cpp
@@ -15,8 +15,8 @@ int main(int argc, char* argv[]) {
     if (!app.setup())
         return error::not_ready;
 
-    auto lamp_depth = .03f;
-    auto lamp_color = v4(.3f, .15f, .15f, 1.f);
+    r32 lamp_depth = .03f;
+    v4 lamp_color{ .3f, .15f, .15f, 1.f };
 
     graphics_pipeline::ptr pipeline;
     pipeline_layout::ptr layout;
@@ -44,7 +44,7 @@ int main(int argc, char* argv[]) {
         pipeline->set_auto_size(true);
 
         pipeline->on_process = [&](VkCommandBuffer cmd_buf) {
-            auto viewport = pipeline->get_viewport();
+            VkViewport viewport = pipeline->get_viewport();
 
             r32 pc_resolution[2];
             pc_resolution[0] = viewport.width - viewport.x;
@@ -52,7 +52,7 @@ int main(int argc, char* argv[]) {
             app.device->call().vkCmdPushConstants(cmd_buf, layout->get(), VK_SHADER_STAGE_FRAGMENT_BIT,
                                                   sizeof(r32) * 0, sizeof(r32) * 2, pc_resolution);
 
-            auto pc_time = to_r32(to_sec(app.run_time.current));
+            r32 pc_time = to_r32(to_sec(app.run_time.current));
             app.device->call().vkCmdPushConstants(cmd_buf, layout->get(), VK_SHADER_STAGE_FRAGMENT_BIT,
                                                   sizeof(r32) * 2, sizeof(r32), &pc_time);
 
@@ -65,7 +65,7 @@ int main(int argc, char* argv[]) {
             app.device->call().vkCmdDraw(cmd_buf, 3, 1, 0, 0);
         };
 
-        auto render_pass = app.shading.get_pass();
+        render_pass::ptr render_pass = app.shading.get_pass();
 
         if (!pipeline->create(render_pass->get()))
             return false;
@@ -80,7 +80,7 @@ int main(int argc, char* argv[]) {
         layout->destroy();
     };
 
-    auto auto_play = true;
+    bool auto_play = true;
 
     app.input.key.listeners.add([&](key_event::ref event) {
         if (app.imgui.capture_mouse())
@@ -108,7 +108,7 @@ int main(int argc, char* argv[]) {
 
         ImGui::SameLine(0.f, 10.f);
 
-        auto lamp_active = pipeline->activated();
+        bool lamp_active = pipeline->activated();
         if (ImGui::Checkbox("active", &lamp_active))
             pipeline->toggle();
 
@@ -126,7 +126,7 @@ int main(int argc, char* argv[]) {
         ImGui::DragFloat("depth", &lamp_depth, 0.0001f, 0.01f, 1.f, "%.4f");
         ImGui::ColorEdit4("color", (r32*) &lamp_color);
 
-        auto clear_color = app.shading.get_pass()->get_clear_color();
+        v3 clear_color = app.shading.get_pass()->get_clear_color();
         if (ImGui::ColorEdit3("ground", (r32*) &clear_color))
             app.shading.get_pass()->set_clear_color(clear_color);
 
@@ -146,7 +146,7 @@ int main(int argc, char* argv[]) {
         }
 
         r32 update(delta dt, r32 value) {
-            auto next = factor * dt;
+            r32 next = factor * dt;
 
             if (add)
                 value += next;
@@ -185,14 +185,14 @@ int main(int argc, char* argv[]) {
     color_dimmer.factor_max = 0.02f;
     color_dimmer.next_factor();
 
-    auto r_dimmer = color_dimmer;
+    dimmer r_dimmer = color_dimmer;
     r_dimmer.add = true;
 
-    auto g_dimmer = color_dimmer;
+    dimmer g_dimmer = color_dimmer;
     g_dimmer.add = true;
 
-    auto b_dimmer = color_dimmer;
-    auto a_dimmer = color_dimmer;
+    dimmer b_dimmer = color_dimmer;
+    dimmer a_dimmer = color_dimmer;
     a_dimmer.min = 0.2f;
 
     app.on_update = [&](delta dt) {
diff --git a/liblava-demo/spawn.cpp b/liblava-demo/spawn.cpp
index ea0f0f2eb3b294915d70498a678989ad1e87989d..30930bbe115ca7e1a15257cbf77ba85d5fc12c09 100644
--- a/liblava-demo/spawn.cpp
+++ b/liblava-demo/spawn.cpp
@@ -17,13 +17,13 @@ int main(int argc, char* argv[]) {
 
     timer load_timer;
 
-    auto spawn_mesh = load_mesh(app.device, "spawn/lava-spawn-game.obj");
+    mesh::ptr spawn_mesh = load_mesh(app.device, "spawn/lava-spawn-game.obj");
     if (!spawn_mesh)
         return error::create_failed;
 
-    auto mesh_load_time = load_timer.elapsed();
+    ms mesh_load_time = load_timer.elapsed();
 
-    auto default_texture = create_default_texture(app.device, { 4096, 4096 }, default_color);
+    texture::ptr default_texture = create_default_texture(app.device, { 4096, 4096 }, default_color);
     if (!default_texture)
         return error::create_failed;
 
@@ -32,7 +32,7 @@ int main(int argc, char* argv[]) {
     app.camera.position = v3(0.832f, 0.036f, 2.304f);
     app.camera.rotation = v3(8.42f, -29.73f, 0.f);
 
-    auto spawn_model = glm::identity<mat4>();
+    mat4 spawn_model = glm::identity<mat4>();
 
     buffer spawn_model_buffer;
     if (!spawn_model_buffer.create_mapped(app.device, &spawn_model, sizeof(mat4), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT))
@@ -125,7 +125,7 @@ int main(int argc, char* argv[]) {
             spawn_mesh->bind_draw(cmd_buf);
         };
 
-        auto render_pass = app.shading.get_pass();
+        render_pass::ptr render_pass = app.shading.get_pass();
 
         if (!pipeline->create(render_pass->get()))
             return false;
@@ -145,11 +145,11 @@ int main(int argc, char* argv[]) {
         layout->destroy();
     };
 
-    auto spawn_position = v3(0.f);
-    auto spawn_rotation = v3(0.f);
-    auto spawn_scale = v3(1.f);
+    v3 spawn_position{ 0.f };
+    v3 spawn_rotation{ 0.f };
+    v3 spawn_scale{ 1.f };
 
-    auto update_spawn_matrix = false;
+    bool update_spawn_matrix = false;
 
     app.imgui.on_draw = [&]() {
         ImGui::SetNextWindowPos(ImVec2(30, 30), ImGuiCond_FirstUseEver);
@@ -157,7 +157,7 @@ int main(int argc, char* argv[]) {
 
         ImGui::Begin(app.get_name());
 
-        auto camera_active = app.camera.activated();
+        bool camera_active = app.camera.activated();
         if (ImGui::Checkbox("active", &camera_active))
             app.camera.set_active(camera_active);
 
@@ -167,7 +167,7 @@ int main(int argc, char* argv[]) {
 
         ImGui::SameLine(0.f, 15.f);
 
-        auto first_person = app.camera.type == camera_type::first_person;
+        bool first_person = app.camera.type == camera_type::first_person;
         if (ImGui::Checkbox("first person##camera", &first_person))
             app.camera.type = first_person ? camera_type::first_person : camera_type::look_at;
 
@@ -197,7 +197,7 @@ int main(int argc, char* argv[]) {
         }
 
         if (ImGui::CollapsingHeader("projection")) {
-            auto update_projection = false;
+            bool update_projection = false;
 
             update_projection |= ImGui::DragFloat("fov", &app.camera.fov);
             update_projection |= ImGui::DragFloat("z near", &app.camera.z_near);
@@ -232,7 +232,7 @@ int main(int argc, char* argv[]) {
 
         ImGui::SameLine();
 
-        auto texture_size = default_texture->get_size();
+        uv2 texture_size = default_texture->get_size();
         ImGui::Text("texture: %d x %d", texture_size.x, texture_size.y);
 
         app.draw_about();
diff --git a/liblava-demo/triangle.cpp b/liblava-demo/triangle.cpp
index c0a604e77c58716317dae6e4c618320dc2a847f4..c0c16dbf271a9b7cef6a10014f78b8bb31aa7d01 100644
--- a/liblava-demo/triangle.cpp
+++ b/liblava-demo/triangle.cpp
@@ -15,11 +15,11 @@ int main(int argc, char* argv[]) {
     if (!app.setup())
         return error::not_ready;
 
-    auto triangle = create_mesh(app.device, mesh_type::triangle);
+    mesh::ptr triangle = create_mesh(app.device, mesh_type::triangle);
     if (!triangle)
         return error::create_failed;
 
-    auto& triangle_data = triangle->get_data();
+    mesh_data& triangle_data = triangle->get_data();
     triangle_data.vertices.at(0).color = v4(1.f, 0.f, 0.f, 1.f);
     triangle_data.vertices.at(1).color = v4(0.f, 1.f, 0.f, 1.f);
     triangle_data.vertices.at(2).color = v4(0.f, 0.f, 1.f, 1.f);
@@ -55,7 +55,7 @@ int main(int argc, char* argv[]) {
             { 1, 0, VK_FORMAT_R32G32B32A32_SFLOAT, to_ui32(offsetof(vertex, color)) },
         });
 
-        auto render_pass = app.shading.get_pass();
+        render_pass::ptr render_pass = app.shading.get_pass();
 
         pipeline->set_layout(layout);
 
diff --git a/liblava/app/app.cpp b/liblava/app/app.cpp
index 895215177b1f0069e59ea707702c3eb20582b3a3..7c4c73f103d4b79ed4ae6459e64c1c282592449c 100644
--- a/liblava/app/app.cpp
+++ b/liblava/app/app.cpp
@@ -199,7 +199,7 @@ namespace lava {
         if (!shading.create(target))
             return false;
 
-        if (!plotter.create(target->get_swapchain()))
+        if (!renderer.create(target->get_swapchain()))
             return false;
 
         window.assign(&input);
@@ -211,7 +211,7 @@ namespace lava {
         if (on_destroy)
             on_destroy();
 
-        plotter.destroy();
+        renderer.destroy();
 
         shading.destroy();
         target->destroy();
@@ -366,7 +366,7 @@ namespace lava {
                 return true;
             }
 
-            auto frame_index = plotter.begin_frame();
+            auto frame_index = renderer.begin_frame();
             if (!frame_index)
                 return true;
 
@@ -375,7 +375,7 @@ namespace lava {
             if (!block.process(*frame_index))
                 return false;
 
-            return plotter.end_frame(block.get_buffers());
+            return renderer.end_frame(block.get_buffers());
         });
     }
 
diff --git a/liblava/app/app.hpp b/liblava/app/app.hpp
index b4a0f66498a660c95da5a9b6ebd370fe349099fd..1b2935bad855b0d60e512b3f93f0e1240a81a69e 100644
--- a/liblava/app/app.hpp
+++ b/liblava/app/app.hpp
@@ -25,12 +25,14 @@ namespace lava {
         imgui::config imgui_config;
 
         device_ptr device = nullptr;
+
         lava::camera camera;
 
         lava::staging staging;
         lava::block block;
 
-        renderer plotter;
+        lava::renderer renderer;
+
         forward_shading shading;
         render_target::ptr target;
 
diff --git a/tests/tests.cpp b/tests/tests.cpp
index 6b08d0444b90a1e8c09b411ea245045c52b31479..919de0e1f56e2c078fc53f81076f0173f05d8247 100644
--- a/tests/tests.cpp
+++ b/tests/tests.cpp
@@ -17,7 +17,7 @@ LAVA_TEST(2, "run loop") {
     if (!frame.ready())
         return error::not_ready;
 
-    auto count = 0;
+    ui32 count = 0;
 
     frame.add_run([&]() {
         sleep(one_second);
@@ -84,19 +84,19 @@ LAVA_TEST(4, "clear color") {
         return input_ignore;
     });
 
-    auto device = frame.create_device();
+    device_ptr device = frame.create_device();
     if (!device)
         return error::create_failed;
 
-    auto render_target = create_target(&window, device);
+    render_target::ptr render_target = create_target(&window, device);
     if (!render_target)
         return error::create_failed;
 
-    renderer plotter;
-    if (!plotter.create(render_target->get_swapchain()))
+    renderer renderer;
+    if (!renderer.create(render_target->get_swapchain()))
         return error::create_failed;
 
-    auto frame_count = render_target->get_frame_count();
+    ui32 frame_count = render_target->get_frame_count();
 
     VkCommandPool cmd_pool;
     VkCommandBuffers cmd_bufs(frame_count);
@@ -122,8 +122,8 @@ LAVA_TEST(4, "clear color") {
         };
 
         for (auto i = 0u; i < frame_count; ++i) {
-            auto cmd_buf = cmd_bufs[i];
-            auto frame_image = render_target->get_image(i);
+            VkCommandBuffer cmd_buf = cmd_bufs[i];
+            VkImage frame_image = render_target->get_image(i);
 
             if (failed(device->call().vkBeginCommandBuffer(cmd_buf, &begin_info)))
                 return build_failed;
@@ -167,17 +167,17 @@ LAVA_TEST(4, "clear color") {
         if (window.resize_request())
             return window.handle_resize();
 
-        auto frame_index = plotter.begin_frame();
+        auto frame_index = renderer.begin_frame();
         if (!frame_index)
             return run_continue;
 
-        return plotter.end_frame({ cmd_bufs[*frame_index] });
+        return renderer.end_frame({ cmd_bufs[*frame_index] });
     });
 
     frame.add_run_end([&]() {
         clean_cmd_bufs();
 
-        plotter.destroy();
+        renderer.destroy();
         render_target->destroy();
     });
 
@@ -203,19 +203,19 @@ LAVA_TEST(5, "color block") {
         return input_ignore;
     });
 
-    auto device = frame.create_device();
+    device_ptr device = frame.create_device();
     if (!device)
         return error::create_failed;
 
-    auto render_target = create_target(&window, device);
+    render_target::ptr render_target = create_target(&window, device);
     if (!render_target)
         return error::create_failed;
 
-    renderer plotter;
-    if (!plotter.create(render_target->get_swapchain()))
+    renderer renderer;
+    if (!renderer.create(render_target->get_swapchain()))
         return error::create_failed;
 
-    auto frame_count = render_target->get_frame_count();
+    ui32 frame_count = render_target->get_frame_count();
 
     block block;
 
@@ -231,7 +231,7 @@ LAVA_TEST(5, "color block") {
             .layerCount = 1,
         };
 
-        auto frame_image = render_target->get_image(block.get_current_frame());
+        VkImage frame_image = render_target->get_image(block.get_current_frame());
 
         insert_image_memory_barrier(device, cmd_buf, frame_image,
                                     VK_ACCESS_MEMORY_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
@@ -255,20 +255,20 @@ LAVA_TEST(5, "color block") {
         if (window.resize_request())
             return window.handle_resize();
 
-        auto frame_index = plotter.begin_frame();
+        auto frame_index = renderer.begin_frame();
         if (!frame_index)
             return run_continue;
 
         if (!block.process(*frame_index))
             return run_abort;
 
-        return plotter.end_frame(block.get_buffers());
+        return renderer.end_frame(block.get_buffers());
     });
 
     frame.add_run_end([&]() {
         block.destroy();
 
-        plotter.destroy();
+        renderer.destroy();
         render_target->destroy();
     });
 
@@ -294,11 +294,11 @@ LAVA_TEST(6, "forward shading") {
         return input_ignore;
     });
 
-    auto device = frame.create_device();
+    device_ptr device = frame.create_device();
     if (!device)
         return error::create_failed;
 
-    auto render_target = create_target(&window, device);
+    render_target::ptr render_target = create_target(&window, device);
     if (!render_target)
         return error::create_failed;
 
@@ -306,7 +306,7 @@ LAVA_TEST(6, "forward shading") {
     if (!shading.create(render_target))
         return error::create_failed;
 
-    auto render_pass = shading.get_pass();
+    render_pass::ptr render_pass = shading.get_pass();
 
     block block;
     if (!block.create(device, render_target->get_frame_count(), device->graphics_queue().family))
@@ -317,8 +317,8 @@ LAVA_TEST(6, "forward shading") {
         render_pass->process(cmd_buf, block.get_current_frame());
     });
 
-    renderer plotter;
-    if (!plotter.create(render_target->get_swapchain()))
+    renderer renderer;
+    if (!renderer.create(render_target->get_swapchain()))
         return error::create_failed;
 
     frame.add_run([&]() {
@@ -338,21 +338,21 @@ LAVA_TEST(6, "forward shading") {
                 frame.set_wait_for_events(false);
         }
 
-        auto frame_index = plotter.begin_frame();
+        auto frame_index = renderer.begin_frame();
         if (!frame_index)
             return run_continue;
 
         if (!block.process(*frame_index))
             return run_abort;
 
-        return plotter.end_frame(block.get_buffers());
+        return renderer.end_frame(block.get_buffers());
     });
 
     frame.add_run_end([&]() {
         block.destroy();
         shading.destroy();
 
-        plotter.destroy();
+        renderer.destroy();
         render_target->destroy();
     });
 
@@ -365,7 +365,7 @@ LAVA_TEST(7, "gamepad") {
         return error::not_ready;
 
     gamepad_manager::add([&](gamepad pad, bool active) {
-        auto id = pad.get_id();
+        ui32 id = pad.get_id();
 
         if (active)
             log()->info("gamepad {} - active ({})", id, pad.get_name());
@@ -375,7 +375,7 @@ LAVA_TEST(7, "gamepad") {
         return input_ignore;
     });
 
-    for (auto& pad : gamepads())
+    for (gamepad& pad : gamepads())
         log()->info("gamepad {} - active ({})", pad.get_id(), pad.get_name());
 
     log()->info("Waiting some seconds for gamepads...");