diff --git a/src/controls/include/controls/control.hpp b/src/controls/include/controls/control.hpp
index d5ddda2b566ac835c57b1dedeb66baf121ea644e..b299522a32653628b6c9a1728f40c20f9d2da1fb 100644
--- a/src/controls/include/controls/control.hpp
+++ b/src/controls/include/controls/control.hpp
@@ -21,6 +21,7 @@ protected:
 public:
     Controller() = default;
 
+    frame_ptr getFrame() { return bound_frame; }
     void setFrame(frame_ptr frame) { bound_frame = frame; }
     void setup(float dt, frame_ptr frame);
 
@@ -40,7 +41,9 @@ public:
     void setPos(float x, float y, float z) { bound_frame->setPosVec(glm::vec3(x, y, z)); }
     void setPosX(float coord) { bound_frame->setPosVec(glm::vec3(coord, bound_frame->getPosition().y, bound_frame->getPosition().z)); }
     void setPosY(float coord) { bound_frame->setPosVec(glm::vec3(bound_frame->getPosition().x, coord, bound_frame->getPosition().z)); }
-    void setPosZ(float coord) { bound_frame->setPosVec(glm::vec3(bound_frame->getPosition().x, bound_frame->getPosition().y, coord)); }    
+    void setPosZ(float coord) { bound_frame->setPosVec(glm::vec3(bound_frame->getPosition().x, bound_frame->getPosition().y, coord)); }
+
+    void translate(glm::vec3 direction) { bound_frame->translatePosVec(direction); }
 
     void keyboardMove(const std::unordered_set<std::string> &held_keys, 
                       const std::unordered_set<std::string> &pressed_keys);
diff --git a/src/controls/src/control_hub.cpp b/src/controls/src/control_hub.cpp
index 9c4d86ee66a322e873f1414113eafa802aa8cfee..761146c2a50facacae859370eb49df2a1edead05 100644
--- a/src/controls/src/control_hub.cpp
+++ b/src/controls/src/control_hub.cpp
@@ -31,7 +31,7 @@ void ControlHub::processInput(const scene_ptr &scene, const osi::Keyboard &keybo
     if (!window.has_keyboard_focus())
         return;
 
-    if (keyboard.down().contains("O") && scene->getSelection())
+    if (keyboard.down().contains("T") && scene->getSelection())
     {
         for (auto &controller : obj_controls)
         {
diff --git a/src/edit/include/edit/editor.hpp b/src/edit/include/edit/editor.hpp
index 4b7ce927a481b5a9b225cc980f479b3fbbb09fa0..0d82a41d21c5f485a9365820c65d54434c5482c3 100644
--- a/src/edit/include/edit/editor.hpp
+++ b/src/edit/include/edit/editor.hpp
@@ -22,17 +22,19 @@ namespace edit
 
 class Level
 {
-    std::array<float, 3> axes = {0.0f, 0.0f, 0.0f};
+    glm::vec3 axes = {0.0f, 0.0f, 0.0f};
 
     std::uint8_t active = 2;
 
 public:
+    Level() = default;
+    Level(glm::vec3 _axes, std::uint8_t _active) : axes{_axes}, active{_active} {}
     std::uint8_t getActiveIndex() const { return active; }
     float getActive() const { return axes[active]; }
     float getX() { return axes[0]; }
     float getY() { return axes[1]; }
     float getZ() { return axes[2]; }
-    std::array<float, 3> getAll() const { return axes; }
+    glm::vec3 getAll() const { return axes; }
 
     void setActiveIndex(std::uint8_t index) { active = index; }
     void setActiveX() { active = 0; }
@@ -41,6 +43,7 @@ public:
 
     Level& operator++() { ++axes[active]; return *this; }
     Level& operator--() { --axes[active]; return *this; }
+    glm::vec3 operator-(const Level &other) { return axes - other.axes; }
 };
 
 
@@ -78,9 +81,12 @@ public:
     void setPrevPlaneIntersect(glm::vec3 _prev_plane_intersect) { prev_plane_intersect = _prev_plane_intersect; }
 
     void doObjectAction(scene_ptr scene, ctrlhub_ptr controls);
-    void updateCamera(scene_ptr scene, ctrlhub_ptr controls);
+    void updateAxesCamera(scene_ptr scene, ctrlhub_ptr controls);
     void changeLevel(scene_ptr scene, ctrlhub_ptr controls);
 
+    void adjustGridPosition(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 position);
+    void adjustGridRotation(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 rotation);
+
     void selectObject(scene_ptr scene, ctrlhub_ptr controls);
     void rotateObject(scene_ptr scene, ctrlhub_ptr controls);
     void moveObject(scene_ptr scene, ctrlhub_ptr controls);
diff --git a/src/edit/include/edit/scene.hpp b/src/edit/include/edit/scene.hpp
index 59695d428b920ab6e124b3b5208c605c807efde8..c3033841268ac35f51380d10ec7c62214bcbc54b 100644
--- a/src/edit/include/edit/scene.hpp
+++ b/src/edit/include/edit/scene.hpp
@@ -25,6 +25,8 @@ private:
     node_ptr selection_AABB;
     node_ptr pre_add_AABB;
 
+    node_ptr grid;
+
     std::vector<light_ptr> lights;
 
     std::vector<camera_ptr> cameras;
@@ -40,6 +42,8 @@ public:
     node_ptr getSelectionAABB() const { return selection_AABB; }
     node_ptr getPreAddAABB() const { return pre_add_AABB; }
 
+    node_ptr getGrid() const { return grid; }
+
     std::vector<light_ptr>& getLights() { return lights; }
     std::vector<camera_ptr>& getCameras() { return cameras; }
     std::vector<camera_weak_ptr>& getActiveCameras() { return active_cameras; }
diff --git a/src/edit/src/editor.cpp b/src/edit/src/editor.cpp
index b79d270bb5384555a23ab18faac2a2d2092e2ef5..60cb236c6b62780c6af06190d835215fb9c6d665 100644
--- a/src/edit/src/editor.cpp
+++ b/src/edit/src/editor.cpp
@@ -24,17 +24,21 @@ void Editor::doObjectAction(scene_ptr scene, ctrlhub_ptr controls)
     }
 }
 
-void Editor::updateCamera(scene_ptr scene, ctrlhub_ptr controls)
+void Editor::updateAxesCamera(scene_ptr scene, ctrlhub_ptr controls)
 {
     if (!keyboard.just_pressed().contains("I") 
         && !keyboard.just_pressed().contains("K") 
         && !keyboard.just_pressed().contains("L") )
         return;
 
-    std::array<float, 3> cam_levels = build_level.getAll();
+    glm::vec3 cam_levels = build_level.getAll();
     std::array<glm::vec3, 3> rotations = { glm::vec3(0.0f, -90.0f, 0.0f), // L(x-depth)
-                                           glm::vec3(-90.0f, 0.0f, 0.0f), // I (y-depth) // FIX - should be -90.0f
+                                           glm::vec3(-90.0f, 0.0f, 0.0f), // I (y-depth) // FIX - breaks things
                                            glm::vec3(0.0f, 180.0f, 0.0f)  }; // K (z-depth)
+
+    std::array<glm::vec3, 3> grid_rotations = { glm::vec3(-90.0f, -90.0f, 0.0f), // L(x-depth)
+                                                glm::vec3(0.0f, 0.0f, 0.0f), // I (y-depth)
+                                                glm::vec3(-90.0f, 0.0f, 0.0f)  }; // K (z-depth)
     std::uint8_t new_active = 0;
 
     if (keyboard.just_pressed().contains("I"))
@@ -50,15 +54,41 @@ void Editor::updateCamera(scene_ptr scene, ctrlhub_ptr controls)
     build_level.setActiveIndex(new_active);
     controls->getActiveCamCtrl()->setRotation(rotations[new_active]);
     controls->getActiveCamCtrl()->setPos(cam_levels[0], cam_levels[1], cam_levels[2]);
+
+    // NOTE: grid could have its own controller ?
+    // scene->getGrid()->getFrame()->setRotationQuat(grid_rotations[new_active]);
+    adjustGridRotation(scene, controls, grid_rotations[new_active]);
+
 }
 void Editor::changeLevel(scene_ptr scene, ctrlhub_ptr controls)
 {
+    auto prev_build_level = build_level;
     if (keyboard.just_pressed().contains("P"))
         ++build_level;
         
     if (keyboard.just_pressed().contains("O"))
         --build_level;
+
+    adjustGridPosition(scene, controls, build_level - prev_build_level);
+}
+
+void Editor::adjustGridPosition(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 position)
+{
+    auto prev_active_object = controls->getActiveObjCtrl()->getFrame();
+    controls->bindObject(scene->getGrid()->getFrame());
+    controls->getActiveObjCtrl()->translate(position);
+    controls->bindObject(prev_active_object);
+}
+
+void Editor::adjustGridRotation(scene_ptr scene, ctrlhub_ptr controls, glm::vec3 rotation)
+{
+    auto prev_active_object = controls->getActiveObjCtrl()->getFrame();
+    controls->bindObject(scene->getGrid()->getFrame());
+    controls->getActiveObjCtrl()->setRotation(rotation);
+    controls->bindObject(prev_active_object);
+
 }
+
 void Editor::selectObject(scene_ptr scene, ctrlhub_ptr controls)
 {
     if (!mouse.just_released().contains("MouseLeft"))
diff --git a/src/edit/src/scene.cpp b/src/edit/src/scene.cpp
index be535437fa1ab8ed2a07807289fd4ec8e7984f59..08da752354dc043df990d1c23b5fbb26a1198fd0 100644
--- a/src/edit/src/scene.cpp
+++ b/src/edit/src/scene.cpp
@@ -25,6 +25,13 @@ void Scene::createScene()
     addNode(glm::vec3(5, 1, -4));
     addMesh(scene.back(), cube);
 
+    addNode(glm::vec3(2, 0, 1));
+    addMesh(scene.back(), cube);
+    addNode(glm::vec3(2, 2, 1));
+    addMesh(scene.back(), cube);
+    addNode(glm::vec3(2, 2, 2));
+    addMesh(scene.back(), cube);
+
     /* ADD AXIS OBJECT */
     // Mesh axis(axis_obj_vertices, axis_obj_indices, axis_obj_normals);
     // axis.setShaderType("basic");
@@ -32,11 +39,10 @@ void Scene::createScene()
     // addMesh(scene.back(), axis);
 
     /* ADD TRIANGLE */
-    Mesh triangle(triangle_vertices, triangle_indices);
-    triangle.setShaderType("basic");
-
-    addNode(glm::vec3(0, -0.5f, 0));
-    addMesh(scene.back(), triangle);
+    // Mesh triangle(triangle_vertices, triangle_indices);
+    // triangle.setShaderType("basic");
+    // addNode(glm::vec3(0, -0.5f, 0));
+    // addMesh(scene.back(), triangle);
 
     /* ADD LIGHT CUBE AND ITS LIGHT */
     Mesh light_cube(lit_cube_vertices, 
@@ -44,32 +50,33 @@ void Scene::createScene()
                     std::vector<float>{},
                     glm::vec3(1.0f, 1.0f, 1.0f), 
                     "basic");
-    addNode(glm::vec3(1.2f, 2.0f, 2.0f));
+    addNode(glm::vec3(1.2f, 5.0f, 2.0f));
     scene.back()->getFrame()->setScale(glm::vec3(0.1f, 0.1f, 0.1f));
     addMesh(scene.back(), light_cube);
     addLight(scene.back(), glm::vec3(1.0f, 1.0f, 1.0f));
 
     /* ADD GRID */
-    mesh_ptr grid = std::make_shared<Mesh>(generate_grid_vertices(100), 
+    mesh_ptr grid_mesh = std::make_shared<Mesh>(generate_grid_vertices(100), 
                                                generate_grid_indices(100), 
                                                std::vector<float>{},
                                                glm::vec3(0.5f, 0.5f, 0.5f), 
                                                "basic");
-    grid->setDrawMode(GL_LINES);     
-    grid->setSelectability(false);   
+    grid_mesh->setDrawMode(GL_LINES);     
+    grid_mesh->setSelectability(false);   
 
     addNode(Frame{});
-    addMesh(scene.back(), std::move(grid));
+    addMesh(scene.back(), std::move(grid_mesh));
+    grid = scene.back();
 
     /* ADD DEER */
-    addMeshNode("./data/models/deer.obj", glm::vec3(0, 2, 0));
-    scene.back()->getFrame()->setScale(glm::vec3(0.01f, 0.01f, 0.01f));
+    // addMeshNode("./data/models/deer.obj", glm::vec3(0, 2, 0));
+    // scene.back()->getFrame()->setScale(glm::vec3(0.01f, 0.01f, 0.01f));
 
-    /* ADD .OBJ CUBE */
-    addMeshNode("./data/models/cube.obj", glm::vec3(-3, 2, 0));
+    // /* ADD .OBJ CUBE */
+    // addMeshNode("./data/models/cube.obj", glm::vec3(-3, 2, 0));
 
-    /* ADD .OBJ VASE */
-    addMeshNode("./data/models/smooth_vase.obj", glm::vec3(2, 1, -1));
+    // /* ADD .OBJ VASE */
+    // addMeshNode("./data/models/smooth_vase.obj", glm::vec3(2, 1, -1));
 
     // /* ADD .OBJ GIRAFFE */
     // addMeshNode("./data/models/final_giraffe.obj", glm::vec3(-5, 1, 3));
diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp
index 2825e3955c4d62bba122aa08d9297b0ab62301bf..1d5936b0d45193a64ebc15c61515f4abd0b31ad6 100644
--- a/src/gfx/src/render.cpp
+++ b/src/gfx/src/render.cpp
@@ -19,17 +19,18 @@ std::vector<float> generate_grid_vertices(int span)
     {
         for(int j = 1; j >= -1; j -= 2)
         {
-            vertices.emplace_back((float)i);
+            vertices.emplace_back((float)i + 0.5f);
             vertices.emplace_back(0.0f);
-            vertices.emplace_back((float)(span * j));
+            vertices.emplace_back((float)(span * j) + 0.5f);
         }
         for(int j = 1; j >= -1; j -= 2)
         {
-            vertices.emplace_back((float)(span * j));
+            vertices.emplace_back((float)(span * j) + 0.5f);
             vertices.emplace_back(0.0f);
-            vertices.emplace_back((float)i);
+            vertices.emplace_back((float)i + 0.5f);
         }
     }
+
     return vertices;
 }
 
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index 49a338c17447331a49c52d3f3b8f84c637cb6496..32f19896c104f05981f7b1b21ef10c183d4c08c2 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -15,9 +15,9 @@ Simulator::Simulator()
                                                    "./data/shaders/basicshader.frag")}}
 {
     /* ROTATE FIRST OBJECT */
-    controls->bindObject(scene->getScene()[0]->getFrame());
-    controls->rotate_obj(glm::vec3(0.0f, 50.0f, 0.0f));
-    controls->rotate_obj(glm::vec3(45.0f, 0.0f, 0.0f));
+    // controls->bindObject(scene->getScene()[0]->getFrame());
+    // controls->rotate_obj(glm::vec3(0.0f, 50.0f, 0.0f));
+    // controls->rotate_obj(glm::vec3(45.0f, 0.0f, 0.0f));
 
     /* SET ACTIVE CAMERA AND CONTROLLER TYPE 
      * ADD ACTIVE CAMERAS HERE. */
@@ -37,7 +37,7 @@ void Simulator::update()
     controls->processInput(scene, keyboard(), timer(), window());
     controls->processMouse(mouse(), window(), editor->getEditorRunning()); 
 
-    editor->updateCamera(scene, controls);
+    editor->updateAxesCamera(scene, controls);
     editor->doObjectAction(scene, controls);
     editor->changeLevel(scene, controls);