diff --git a/src/gfx/CMakeLists.txt b/src/gfx/CMakeLists.txt
index 2d32b01d31a2e647fbac7354b336a614a8271250..e686a9e90e5abca6bccd422dbd8dcb1e17ac338e 100644
--- a/src/gfx/CMakeLists.txt
+++ b/src/gfx/CMakeLists.txt
@@ -1,7 +1,6 @@
 set(THIS_TARGET_NAME gfx)
 
 add_library(${THIS_TARGET_NAME}
-    #./include/gfx/file.hpp
     ./include/gfx/shader.hpp
     ./src/shader.cpp
 
@@ -23,6 +22,18 @@ add_library(${THIS_TARGET_NAME}
     ./include/gfx/object.hpp
     ./src/object.cpp
 
+    ./include/gfx/frame.hpp
+    ./src/frame.cpp
+
+    ./include/gfx/control.hpp
+    ./src/control.cpp
+
+    ./include/gfx/cam_control.hpp
+    ./src/cam_control.cpp
+
+    ./include/gfx/obj_control.hpp
+    ./src/obj_control.cpp
+
     # ./include/osi/opengl.hpp
     # ./include/osi/gui.hpp
     )
diff --git a/src/gfx/include/gfx/cam_control.hpp b/src/gfx/include/gfx/cam_control.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..d9bb69ccbee5a54b715d46e25bc46f843374e80a
--- /dev/null
+++ b/src/gfx/include/gfx/cam_control.hpp
@@ -0,0 +1,37 @@
+#ifndef CAM_CONTROL_INCLUDED
+#define CAM_CONTROL_INCLUDED
+
+#include <glad/glad.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+
+#include <gfx/control.hpp>
+
+class CameraController : public Controller
+{
+    float pitch = 0.0f;
+    float yaw = -90.0f;
+
+    glm::vec2 sens;
+    float sens_multiplier = 400.0f;
+
+public:
+    using Controller::Controller;
+
+    float getPitch() { return pitch; }
+    float getYaw() { return yaw; }
+    void setPitch(float yoffset);
+    void setYaw(float xoffset);
+
+    void setFrontVec() override;
+
+    void turn(float xoffset, float yoffset);
+
+    glm::vec2 getSens() { return sens; }
+    void setSens(float x_size, float y_size);
+    void setSensMultiplier(float multiplier) { sens_multiplier = multiplier; }
+    
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gfx/include/gfx/camera.hpp b/src/gfx/include/gfx/camera.hpp
index a5db7fc8f26555d5dc0728a005b18f5041c7ad87..27e1213a7ec0473d94e960153517bdbfb5100f77 100644
--- a/src/gfx/include/gfx/camera.hpp
+++ b/src/gfx/include/gfx/camera.hpp
@@ -8,57 +8,16 @@
 
 class Camera
 {
-    glm::vec3 posVec = glm::vec3(0.0f, 0.0f, 3.0f);
-    glm::vec3 frontVec = glm::vec3(0.0f, 0.0f, -1.0f);
-    glm::vec3 upVec = glm::vec3(0.0f, 1.0f, 0.0f);
-
     float FOV = 45.0f;
 
-    float speed = 2.5f;
-    float step = 0;
-
-    glm::vec2 sens;
-    float sens_multiplier = 400.0f;
-
-    float pitch = 0.0f;
-    float yaw = -90.0f;
-
     glm::u32vec2 window_size = glm::u32vec2{0, 0};
 
     public:
-    Camera(glm::vec3 const &pos, glm::vec3 const &direction, float fov);
-
-    void forward();
-    void backward();
-    void left();
-    void right();
-    void up();
-    void down();
+    Camera(float fov);
 
     float getFOV();
     void setFOV(float fov);
 
-    float getPitch();
-    float getYaw();
-    void setPitch(float yoffset);
-    void setYaw(float xoffset);
-
-    glm::vec3 getFrontVec();
-    glm::vec3 getPosVec();
-    glm::vec3 getUpVec();
-    void setFrontVec();
-    //void setPosVec(); TO DO
-    //void setUpVec(); TO DO
-
-    void turn(float xoffset, float yoffset);
-
-    void setStep(float dt);
-    void setSpeed(float multiplier);
-
-    glm::vec2 getSens();
-    void setSens(float x_size, float y_size);
-    void setSensMultiplier(float multiplier);
-
     glm::vec2 getWindowSize();
     void setWindowSize(glm::u32vec2 size);
 };
diff --git a/src/gfx/include/gfx/control.hpp b/src/gfx/include/gfx/control.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..1dee7d07b3efe35acdc72ea7e98f903dffe0f48a
--- /dev/null
+++ b/src/gfx/include/gfx/control.hpp
@@ -0,0 +1,46 @@
+#ifndef CONTROL_INCLUDED
+#define CONTROL_INCLUDED
+
+#include <glad/glad.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+
+#include <gfx/frame.hpp>
+#include <unordered_set>
+#include <string>
+
+class Controller
+{
+protected:
+    glm::vec3 frontVec = glm::vec3(0.0f, 0.0f, -1.0f); 
+    glm::vec3 upVec = glm::vec3(0.0f, 1.0f, 0.0f);
+
+    float speed = 2.5f;
+    float step = 0;
+
+    Frame &bound_frame;
+
+public:
+    Controller(Frame &frame) : bound_frame{frame} {}
+
+    glm::vec3 getFrontVec() { return frontVec; }
+    glm::vec3 getUpVec() { return upVec; }
+    virtual void setFrontVec() = 0;
+    //void setUpVec(); TO DO
+
+    void setStep(float dt);
+    void setSpeed(float new_speed);
+
+    void teleport(glm::vec3 new_position) { bound_frame.setPositionVec(new_position); }
+
+    void move(const std::unordered_set<std::string> &pressed_keys);
+    void forward();
+    void backward();
+    void left();
+    void right();
+    void up();
+    void down();
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gfx/include/gfx/frame.hpp b/src/gfx/include/gfx/frame.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..5d8dffb6fb07ba89ce4ef1f771db8c4c4dc4d2af
--- /dev/null
+++ b/src/gfx/include/gfx/frame.hpp
@@ -0,0 +1,28 @@
+#ifndef FRAME_INCLUDED
+#define FRAME_INCLUDED
+
+#include <glad/glad.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+#include <glm/gtc/quaternion.hpp>
+#include <glm/gtx/quaternion.hpp>
+
+class Frame
+{
+    glm::vec3 positionVec = glm::vec3(0.0f, 0.0f, 0.0f);
+    glm::quat rotationQuat;
+
+public:
+    Frame(glm::vec3 position, glm::vec3 rotation)
+     : positionVec{position}, rotationQuat{glm::quat(rotation)} {}
+    
+    glm::vec3 getPosition() { return positionVec; }
+    glm::quat getRotation() { return rotationQuat; }
+    glm::mat4 getRotationMat() { return glm::toMat4(rotationQuat); }
+
+    void setPositionVec(glm::vec3 new_position) { positionVec = new_position; }
+    void setrotationQuat(glm::vec3 new_rotation) { rotationQuat = glm::quat(new_rotation); }
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gfx/include/gfx/obj_control.hpp b/src/gfx/include/gfx/obj_control.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..3f6ad4a418e58b09cfba7800703f55d2c95625f4
--- /dev/null
+++ b/src/gfx/include/gfx/obj_control.hpp
@@ -0,0 +1,29 @@
+#ifndef OBJ_CONTROL_INCLUDED
+#define OBJ_CONTROL_INCLUDED
+
+#include <glad/glad.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+
+#include <gfx/control.hpp>
+#include <gfx/frame.hpp>
+#include <unordered_set>
+#include <string>
+
+class ObjectController : public Controller
+{
+    // QUESTION: set automatically relative to camera or axis movement?
+    // Currently: axis
+    // glm::vec3 frontVec = glm::vec3(0.0f, 0.0f, -1.0f); 
+    // glm::vec3 upVec = glm::vec3(0.0f, 1.0f, 0.0f);
+
+public:
+    using Controller::Controller;
+    void setFrontVec() override;
+
+    //void rotate() TO DO
+};
+
+
+#endif
\ No newline at end of file
diff --git a/src/gfx/include/gfx/object.hpp b/src/gfx/include/gfx/object.hpp
index 72f4ab0ab107fd3b2ce020d3862908ec513badc7..e0070ba816cb5558ca5f41b31f327ff7fa545a2e 100644
--- a/src/gfx/include/gfx/object.hpp
+++ b/src/gfx/include/gfx/object.hpp
@@ -11,7 +11,6 @@
 
 class Object
 {
-    glm::vec3 positionVec = { 0.0f, 0.0f, 0.0f };
     std::vector<float> vertices;
     std::vector<unsigned int> indices;
 
@@ -22,13 +21,9 @@ class Object
     bool buffer_object();
 
 public:
-    Object(glm::vec3 const &position, 
-           std::vector<float> const &_vertices, 
+    Object(std::vector<float> const &_vertices, 
            std::vector<unsigned int> const &_indices);
 
-    glm::vec3 const &getPosition() const { return positionVec; }
-    void setPosition(glm::vec3 const &new_pos) { positionVec = new_pos; }
-
     std::vector<float> const &getVertices() const { return vertices; }
     void setVertices(std::vector<float> const &new_vertices) { vertices = new_vertices; }
 
diff --git a/src/gfx/include/gfx/render.hpp b/src/gfx/include/gfx/render.hpp
index 1887a2315e0f53e4e4b7fc8a1af6edebaa16192d..184b37503d246dbb91d63abb140414fec58adf8e 100644
--- a/src/gfx/include/gfx/render.hpp
+++ b/src/gfx/include/gfx/render.hpp
@@ -12,6 +12,9 @@
 #include <vector>
 
 void send_matrices_to_shader(Shader &myShader, glm::mat4 &model, glm::mat4 &view, glm::mat4 &projection);
-void gfx_draw(Shader &myShader, Camera &camera, Object &object);
+void gfx_draw(Shader &myShader, 
+              Camera &camera, Object &object, 
+              Frame &cam_frame, Frame &obj_frame, 
+              CameraController &cam_control, ObjectController &obj_control);
 
 #endif
\ No newline at end of file
diff --git a/src/gfx/src/cam_control.cpp b/src/gfx/src/cam_control.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..17bdbf06703af606d851548244482cbb5b3539af
--- /dev/null
+++ b/src/gfx/src/cam_control.cpp
@@ -0,0 +1,39 @@
+#include <gfx/cam_control.hpp>
+
+void CameraController::setPitch(float yoffset)
+{
+    pitch += yoffset;
+
+    if(pitch > 89.0f)
+    {
+        pitch = 89.0f;
+    }
+    if(pitch < -89.0f)
+    {
+        pitch = -89.0f;
+    }
+}
+
+void CameraController::setYaw(float xoffset) { yaw += xoffset; }
+
+void CameraController::setFrontVec()
+{
+    glm::vec3 front;
+    front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
+    front.y = sin(glm::radians(pitch));
+    front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
+    frontVec = glm::normalize(front);
+}
+
+void CameraController::turn(float xoffset, float yoffset)
+{
+    setYaw(xoffset);
+    setPitch(yoffset);
+    setFrontVec();
+}
+
+void CameraController::setSens(float x_size, float y_size)
+{
+    sens.x = sens_multiplier * x_size;
+    sens.y = sens_multiplier * y_size;
+}
diff --git a/src/gfx/src/camera.cpp b/src/gfx/src/camera.cpp
index 7a86fe37b85a9836f941241032bd200df6fab16d..7976218d2539b375f41475c9250ee7dd77fe27a6 100644
--- a/src/gfx/src/camera.cpp
+++ b/src/gfx/src/camera.cpp
@@ -1,102 +1,11 @@
 #include <gfx/camera.hpp>
 
-Camera::Camera(glm::vec3 const &pos, glm::vec3 const &direction, float fov) : 
-posVec{pos}, frontVec{direction}, FOV{fov} {}
+Camera::Camera(float fov) : FOV{fov} {}
 
-void Camera::forward()
-{
-    posVec += step * frontVec;
-}
-void Camera::backward()
-{
-    posVec -= step * frontVec;
-}
-void Camera::left()
-{
-    posVec -= glm::normalize(glm::cross(frontVec, upVec)) * step;
-}
-void Camera::right()
-{
-    posVec += glm::normalize(glm::cross(frontVec, upVec)) * step;
-}
-void Camera::up()
-{
-    posVec += step * upVec;
-}
-void Camera::down()
-{
-    posVec -= step * upVec;
-}
 
 float Camera::getFOV() { return FOV; }
 void Camera::setFOV(float fov) { FOV = fov <= 120 ? fov : 120; }
 
-float Camera::getPitch() { return pitch; }
-float Camera::getYaw() { return yaw; }
-void Camera::setPitch(float yoffset)
-{
-    pitch += yoffset;
-
-    if(pitch > 89.0f)
-    {
-        pitch = 89.0f;
-    }
-    if(pitch < -89.0f)
-    {
-        pitch = -89.0f;
-    }
-}
-
-void Camera::setYaw(float xoffset) { yaw += xoffset; }
-
-glm::vec3 Camera::getFrontVec() { return frontVec; }
-glm::vec3 Camera::getPosVec() { return posVec; }
-glm::vec3 Camera::getUpVec() { return upVec; }
-
-void Camera::setFrontVec()
-{
-    glm::vec3 front;
-    front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
-    front.y = sin(glm::radians(pitch));
-    front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
-    frontVec = glm::normalize(front);
-}
-
-// void Camera::setPosVec()
-// void Camera::setUpVec()
-
-void Camera::turn(float xoffset, float yoffset)
-{
-    setYaw(xoffset);
-    setPitch(yoffset);
-    setFrontVec();
-}
-
-void Camera::setStep(float dt)
-{
-    step = speed * dt;
-}
-void Camera::setSpeed(float multiplier)
-{
-    speed = multiplier;
-}
-
-glm::vec2 Camera::getSens()
-{
-    return sens;
-}
-
-void Camera::setSens(float x_size, float y_size)
-{
-    sens.x = sens_multiplier * x_size;
-    sens.y = sens_multiplier * y_size;
-}
-
-void Camera::setSensMultiplier(float multiplier)
-{
-    sens_multiplier = multiplier;
-}
-
 glm::vec2 Camera::getWindowSize()
 {
     return window_size;
diff --git a/src/gfx/src/control.cpp b/src/gfx/src/control.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2b1227329cff48cdf21d725fed204fb79d7dc868
--- /dev/null
+++ b/src/gfx/src/control.cpp
@@ -0,0 +1,51 @@
+#include <gfx/control.hpp>
+
+void Controller::setStep(float dt)
+{
+    step = speed * dt;
+}
+void Controller::setSpeed(float new_speed)
+{
+    speed = new_speed;
+}
+
+void Controller::move(const std::unordered_set<std::string> &pressed_keys)
+{
+    if (pressed_keys.contains("W"))
+        forward();
+    if (pressed_keys.contains("S"))
+        backward();
+    if (pressed_keys.contains("A"))
+        left();
+    if (pressed_keys.contains("D"))
+        right();
+    if (pressed_keys.contains("R"))
+        up();
+    if (pressed_keys.contains("F"))
+        down();
+}
+
+void Controller::forward()
+{
+    bound_frame.setPositionVec(bound_frame.getPosition() + step * frontVec);
+}
+void Controller::backward()
+{
+    bound_frame.setPositionVec(bound_frame.getPosition() - step * frontVec);
+}
+void Controller::left()
+{
+    bound_frame.setPositionVec(bound_frame.getPosition() - step * glm::normalize(glm::cross(frontVec, upVec)));
+}
+void Controller::right()
+{
+    bound_frame.setPositionVec(bound_frame.getPosition() + step * glm::normalize(glm::cross(frontVec, upVec)));
+}
+void Controller::up()
+{
+    bound_frame.setPositionVec(bound_frame.getPosition() + step * upVec);
+}
+void Controller::down()
+{
+    bound_frame.setPositionVec(bound_frame.getPosition() - step * upVec);
+}
\ No newline at end of file
diff --git a/src/gfx/src/frame.cpp b/src/gfx/src/frame.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a73e8b32897cbab04e207fcc61cde8dc32d8d83a
--- /dev/null
+++ b/src/gfx/src/frame.cpp
@@ -0,0 +1 @@
+#include <gfx/frame.hpp>
diff --git a/src/gfx/src/obj_control.cpp b/src/gfx/src/obj_control.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d167cea5fa320cf0ffafa60c5ab6ce3062fb946f
--- /dev/null
+++ b/src/gfx/src/obj_control.cpp
@@ -0,0 +1,6 @@
+#include <gfx/obj_control.hpp>
+
+void ObjectController::setFrontVec() // temporary implementation
+{
+    frontVec = glm::vec3(0.0f, 0.0f, -1.0f);
+}
\ No newline at end of file
diff --git a/src/gfx/src/object.cpp b/src/gfx/src/object.cpp
index 087f168d2924c4e9babc49756c45441fe5629cda..5ec31359b567dc90599f37e58bb5871cf8ab16a3 100644
--- a/src/gfx/src/object.cpp
+++ b/src/gfx/src/object.cpp
@@ -1,8 +1,9 @@
 #include <gfx/object.hpp>
 #include <vector>
 
-Object::Object(glm::vec3 const &position, std::vector<float> const &_vertices, std::vector<unsigned int> const &_indices) :
-    positionVec{position}, vertices{_vertices}, indices{_indices} 
+Object::Object(std::vector<float> const &_vertices, 
+               std::vector<unsigned int> const &_indices)
+ : vertices{_vertices}, indices{_indices} 
 {
     buffer_object();
 }
diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp
index f5b5d1428e9951d4b4e72c52e99e4414b2163ac0..6ca2a53fe39f1862dba0599ad821aff8760b9a6f 100644
--- a/src/gfx/src/render.cpp
+++ b/src/gfx/src/render.cpp
@@ -8,6 +8,7 @@
 #include <gfx/ebo.hpp>
 #include <gfx/camera.hpp>
 #include <gfx/object.hpp>
+#include <gfx/frame.hpp>
 #include <gfx/render.hpp> // Order important for compile
 #include <gfx/shader.hpp>
 #include <iostream>
@@ -37,7 +38,10 @@ void send_matrices_to_shader(Shader &myShader, glm::mat4 &model, glm::mat4 &view
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 }
 
-void gfx_draw(Shader &myShader, Camera &camera, Object &object)
+void gfx_draw(Shader &myShader, 
+              Camera &camera, Object &object, 
+              Frame &cam_frame, Frame &obj_frame, 
+              CameraController &cam_control, ObjectController &obj_control)
 {
     glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
@@ -53,7 +57,8 @@ void gfx_draw(Shader &myShader, Camera &camera, Object &object)
 
     glm::mat4 model = glm::mat4(1.0f);
     //model = glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
-    model = glm::translate(model, object.getPosition());
+    model *= obj_frame.getRotationMat();
+    model = glm::translate(model, obj_frame.getPosition());
     //model = glm::rotate(model, ((float)SDL_GetTicks() / 1000) * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));
 
     // //     glm::mat4 view = glm::mat4(1.0f);
@@ -65,7 +70,7 @@ void gfx_draw(Shader &myShader, Camera &camera, Object &object)
     //                    glm::vec3(0.0f, 0.0f, 0.0f),
     //                    glm::vec3(0.0f, 1.0f, 0.0f));
 
-    view = glm::lookAt(camera.getPosVec(), camera.getPosVec() + camera.getFrontVec(), camera.getUpVec());
+    view = glm::lookAt(cam_frame.getPosition(), cam_frame.getPosition() + cam_control.getFrontVec(), cam_control.getUpVec());
 
     glm::mat4 projection;
     //projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f);
@@ -89,5 +94,5 @@ void gfx_draw(Shader &myShader, Camera &camera, Object &object)
                    GL_UNSIGNED_INT, 
                    0);
     ASSUMPTION(glGetError() == GL_NO_ERROR);
-    //glBindVertexArray(0);
+    //object.getVAO().Unbind();
 }
diff --git a/src/studio/include/studio/simulator.hpp b/src/studio/include/studio/simulator.hpp
index 9fdb6d3ab78f84e2f9fe4b84009318f88327bf2a..2ce0e9425c3d947c1239327f1f71c4dcfbadce37 100644
--- a/src/studio/include/studio/simulator.hpp
+++ b/src/studio/include/studio/simulator.hpp
@@ -14,6 +14,9 @@
 #include <gfx/ebo.hpp>
 #include <gfx/camera.hpp>
 #include <gfx/object.hpp>
+#include <gfx/frame.hpp>
+#include <gfx/cam_control.hpp>
+#include <gfx/obj_control.hpp>
 #include <gfx/shader.hpp>
 #include <gfx/render.hpp>
 #include <iostream>
@@ -31,12 +34,15 @@ struct Simulator : public osi::Simulator
     void process_mouse();
 
     private:    
-    VAO myVAO;
-    VBO myVBO;
-    EBO myEBO;
-
     Camera camera;
     Object object; // TO DO: vector of objects
+
+    Frame cam_frame;
+    Frame obj_frame;
+
+    CameraController cam_control;
+    ObjectController obj_control;
+
     Shader myShader;
 };
 
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index f946afaacc5d8c3253908bbd19d698139a8437f6..5f0e42d72523035b18312ccd84d2fc40d20b042e 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -12,8 +12,8 @@
 namespace studio {
 
 // OBJECT
-glm::vec3 obj_position = { 1.0f, -1.0f, 0.0f };
-// rotation ? TO DO
+glm::vec3 obj_position = { 1.0f, -1.0f, 0.0f }; // frame
+// rotation ? TO DO // frame
 std::vector<float> obj_vertices =
     {
         // positions
@@ -57,9 +57,8 @@ Simulator::Simulator()
     // camera frame, object frame, camera, object
     , myShader{"./data/shaders/basicshader.vert",
                "./data/shaders/basicshader.frag"}
-    , camera{{0.0f, 0.0f, 3.0f}, {0.0f, 1.0f, 0.0f}, 60.0f}
-    , object{{ 0.0f, 0.0f, 0.0f }, 
-             {
+    , camera{60.0f}
+    , object{{
               0, 0, 0,       1, -0.2f, 0,       1, 0.2f, 0,
               0, 0, 0,   -0.2f,     2, 0,    0.2f,    2, 0,
               0, 0, 0,   -0.2f,     0, 3,    0.2f,    0, 3,
@@ -69,6 +68,12 @@ Simulator::Simulator()
               3, 4, 5,
               6, 7, 8
              }
+            }
+    , cam_frame{{0.0f, 0.0f, 3.0f}, {0.0f, 90.0f, 0.0f}}
+    , obj_frame{{ 0.0f, 0.0f, 0.0f }, { -50.0f, 0.0f, 0.0f }}
+    //, cam_control{cam_frame}
+    , obj_control{obj_frame}
+    , cam_control{cam_frame}
     // , object{{ 1.0f, -1.0f, 0.0f }, 
     //          {
     //             // positions
@@ -96,8 +101,7 @@ Simulator::Simulator()
     //             0, 3, 4, 3, 4, 7,
     //             // bottom
     //             1, 2, 5, 2, 5, 6
-    //         }
-            }
+    //         }}
 {
     camera.setWindowSize(window().size()); 
 }
@@ -126,7 +130,7 @@ void Simulator::present()
         camera.setWindowSize(window().size());
     }
     
-    gfx_draw(myShader, camera, object);
+    gfx_draw(myShader, camera, object, cam_frame, obj_frame, cam_control, obj_control);
 }
 
 void Simulator::process_input()
@@ -134,21 +138,16 @@ void Simulator::process_input()
     if (!window().has_keyboard_focus())
         return;
 
-    camera.setStep(timer().dt());
-
-    // Issues not occuring anymore
-    if (keyboard().down().contains("W"))
-        camera.forward();
-    if (keyboard().down().contains("S"))
-        camera.backward();
-    if (keyboard().down().contains("A"))
-        camera.left();
-    if (keyboard().down().contains("D"))
-        camera.right();
-    if (keyboard().down().contains("R"))
-        camera.up();
-    if (keyboard().down().contains("F"))
-        camera.down();
+    if (keyboard().down().contains("O"))
+    {
+        obj_control.setStep(timer().dt());
+        obj_control.move(keyboard().down());
+    }
+    else
+    {
+        cam_control.setStep(timer().dt());
+        cam_control.move(keyboard().down());
+    }
 
     int fill_mode = keyboard().down().contains("X") ? GL_FILL : GL_LINE; // TO DO: change
     glPolygonMode(GL_FRONT_AND_BACK, fill_mode);
@@ -170,13 +169,13 @@ void Simulator::process_mouse()
         xoffset = static_cast<float>(offset.x);
         yoffset = static_cast<float>(-offset.y);
 
-        camera.setSens(window().pixel_size_in_meters().x,  // TO DO: if window.is_resized()?
+        cam_control.setSens(window().pixel_size_in_meters().x,  // TO DO: if window.is_resized()?
                        window().pixel_size_in_meters().y);
-        xoffset *= camera.getSens().x;
-        yoffset *= camera.getSens().y;
+        xoffset *= cam_control.getSens().x;
+        yoffset *= cam_control.getSens().y;
     }
 
-    camera.turn(xoffset, yoffset);
+    cam_control.turn(xoffset, yoffset);
 }
 
 }