diff --git a/src/gfx/include/gfx/control.hpp b/src/gfx/include/gfx/control.hpp
index 515f0b4e56b2af573ce17ce81071c70c4209ab56..409d78cb339fe6820a9840cc657572a20dd3ae82 100644
--- a/src/gfx/include/gfx/control.hpp
+++ b/src/gfx/include/gfx/control.hpp
@@ -29,6 +29,7 @@ public:
     // virtual void setUpVec();
 
     void setStep(float dt);
+    float getSpeed() const { return speed; }
     void setSpeed(float new_speed);
 
     void teleport(glm::vec3 new_position) { bound_frame->setPosVec(new_position); }
diff --git a/src/gfx/include/gfx/obj_control.hpp b/src/gfx/include/gfx/obj_control.hpp
index 7b16596bc8c47ac3be29df342ee5bb0a253eedc7..126008b5fb20cdc246438606980b4a817bd60ec8 100644
--- a/src/gfx/include/gfx/obj_control.hpp
+++ b/src/gfx/include/gfx/obj_control.hpp
@@ -11,10 +11,13 @@
 #include <unordered_set>
 #include <string>
 
+#include <osi/mouse.hpp>
+
 class ObjectController : public Controller
 {
 public:
     using Controller::Controller;
+    void mouse_rotate(const osi::Mouse &mouse);
 };
 
 
diff --git a/src/gfx/src/obj_control.cpp b/src/gfx/src/obj_control.cpp
index 6a4504dac036a61ca0cd334c18d9d33331d7bf53..f6621e0afcd9b7261b960adde8af8dd639159d06 100644
--- a/src/gfx/src/obj_control.cpp
+++ b/src/gfx/src/obj_control.cpp
@@ -1 +1,15 @@
 #include <gfx/obj_control.hpp>
+
+void ObjectController::mouse_rotate(const osi::Mouse &mouse)
+{
+    // check for start at object
+    if (!mouse.down().contains("MouseLeft"))
+        return;
+
+    glm::i32vec2 offset = mouse.pos_delta();
+    float xoffset = static_cast<float>(offset.x);
+
+    auto inv_rotation = glm::inverse(bound_frame->getRotationMat());
+    glm::vec3 inv_rot_y = glm::column(inv_rotation, 1);
+    bound_frame->rotateRotationQuat(glm::angleAxis(xoffset * step, inv_rot_y));
+}
\ No newline at end of file
diff --git a/src/studio/include/studio/simulator.hpp b/src/studio/include/studio/simulator.hpp
index 278875ac25a758a39f7135696de27ad7deae9454..c0e0d34aaf0869cc39ddeeabb28d8e2dccc0d50b 100644
--- a/src/studio/include/studio/simulator.hpp
+++ b/src/studio/include/studio/simulator.hpp
@@ -63,6 +63,7 @@ struct Simulator : public osi::Simulator
     void manage_selection(node_ptr nearest_node); // Not node tree compatible
 
     void select_object();
+    void rotate_object();
     void process_mouse();
 
 private:    
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index c353219382e2bbb933d5ef9f7c82361c69338b25..081d9f60596a1201460348427e11e5fe7622de8f 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -134,7 +134,8 @@ Simulator::Simulator()
 
     /* ROTATE FIRST OBJECT */
     obj_controls[object_ctrl_type]->setFrame(scene[0]->getFrame());
-    obj_controls[object_ctrl_type]->rotate(glm::vec3(0.0f, 50.0f, 0.0f));  
+    obj_controls[object_ctrl_type]->rotate(glm::vec3(0.0f, 50.0f, 0.0f));
+    obj_controls[object_ctrl_type]->rotate(glm::vec3(45.0f, 0.0f, 0.0f));  
 
     /* SET ACTIVE CAMERA AND CONTROLLER TYPE 
      * ADD ACTIVE CAMERAS HERE. */
@@ -476,6 +477,16 @@ void Simulator::select_object()
     manage_selection(nearest_node);
 }
 
+void Simulator::rotate_object()
+{
+    if (!selection)
+        return;
+    auto controller = obj_controls[object_ctrl_type];
+    controller->setFrame(selection->getFrame());
+    controller->setStep(timer().dt());
+    controller->mouse_rotate(mouse());
+}
+
 void Simulator::process_mouse()
 {
     cam_controls[active_camera_type]->process_mouse(mouse(), window(), editor_running);
@@ -488,7 +499,7 @@ void Simulator::process_mouse()
             // happens in obj controller
             break;
         case state::rotate:
-            // happens in obj controller
+            rotate_object();
             break;
         default:
             break;