diff --git a/src/gfx/include/gfx/frame.hpp b/src/gfx/include/gfx/frame.hpp
index e83c36e2daebf56e3e962e6677291966c721fd0b..a094b69d3a73b892d2ba9944b87e3db4cc04744f 100644
--- a/src/gfx/include/gfx/frame.hpp
+++ b/src/gfx/include/gfx/frame.hpp
@@ -25,38 +25,6 @@ public:
         setRotationQuat(rotation);
     }
 
-    Frame(Frame &f)
-    {
-        positionVec = f.getPosition();
-        rotationQuat = f.getRotation();
-        scaleVec = f.getScale();
-    }
-
-    Frame(Frame &&f)
-    {
-        positionVec = f.getPosition();
-        rotationQuat = f.getRotation();
-        scaleVec = f.getScale();
-    }
-
-    Frame& operator=(Frame &f)
-    {
-        positionVec = f.getPosition();
-        rotationQuat = f.getRotation();
-        scaleVec = f.getScale();
-        return *this;
-    }
-
-    Frame& operator=(Frame &&f)
-    {
-        positionVec = f.getPosition();
-        rotationQuat = f.getRotation();
-        scaleVec = f.getScale();
-        return *this;
-    }
-
-    // ~Frame() = 0;
-
     glm::vec3 getPosition() { return positionVec; }
     glm::quat getRotation() { return rotationQuat; }
     glm::vec3 getScale() { return scaleVec; }
diff --git a/src/gfx/include/gfx/light.hpp b/src/gfx/include/gfx/light.hpp
index c284fb5e4a126b90b18af27947e827164acb6237..5923c3d24907eb0362181f3fc5f662e631e0a836 100644
--- a/src/gfx/include/gfx/light.hpp
+++ b/src/gfx/include/gfx/light.hpp
@@ -3,15 +3,43 @@
 
 #include <glad/glad.h>
 #include <glm/glm.hpp>
+#include <gfx/frame.hpp>
 
 class Light
 {
-    glm::vec3* position;
-    glm::vec3* color;
-    Light(glm::vec3* _position, glm::vec3* _color) : position{_position}, color{_color} {}
+protected:
+    glm::vec3 color;
+public:
+    Light(glm::vec3 _color) : color{_color} {}
+    glm::vec3 getColor() { return color; }
 
-    glm::vec3 getPosition() { return *position; }
-    glm::vec3 getColor() { return *color; }
+    // WTF, FIX!!!
+    virtual glm::vec3 getPosition() { return color; }
+    virtual ~Light() = default;
+};
+
+class DirLight : public Light
+{
+    glm::vec3 direction;
+public:
+    using Light::Light;
+    DirLight(glm::vec3 _color, glm::vec3 _direction) : Light{_color}, direction{_direction} {}
+    glm::vec3 getDirection() { return direction; }
+};
+
+class PointLight : public Light
+{
+    glm::vec3 position;
+    bool bound_to_frame = false;
+    std::shared_ptr<Frame> bound_frame;
+
+public:
+    using Light::Light;
+    PointLight(glm::vec3 _color, glm::vec3 _position) : Light{_color}, position{_position} {}
+    PointLight(glm::vec3 _color, std::shared_ptr<Frame> _bound_frame) 
+    : Light{_color}, bound_frame{_bound_frame} { bound_to_frame = true; }
+
+    glm::vec3 getPosition() override { return bound_to_frame ? bound_frame->getPosition() : position; }
 };
 
 #endif
\ No newline at end of file
diff --git a/src/gfx/include/gfx/render.hpp b/src/gfx/include/gfx/render.hpp
index 7596f1b7f26df78bd190d298b8022665011eb3aa..a18ca6f31c3c04289643deb8c2745cadc868abc4 100644
--- a/src/gfx/include/gfx/render.hpp
+++ b/src/gfx/include/gfx/render.hpp
@@ -20,7 +20,7 @@ using shader_ptr = std::shared_ptr<Shader>;
 std::vector<float> generate_grid_vertices(int span);
 std::vector<unsigned int> generate_grid_indices(int span);
 void send_matrices_to_shader(Shader &myShader, glm::mat4 &model, glm::mat4 &view, glm::mat4 &projection);
-void gfx_draw(std::map<std::string, shader_ptr> &myShaders, 
+void gfx_draw(std::map<std::string, shader_ptr> &myShaders, Light &light,
               std::vector<camera_ptr> &cameras, std::vector<frame_ptr> &cam_frames, int active_camera, 
               std::vector<object_ptr> &objects, std::vector<frame_ptr> &obj_frames, 
               Object &grid, Frame &grid_frame);
diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp
index b5a29c058998712a488262c1876f885ca2cf5192..6305d65f2fe29e1a034f2e1b4a624ab55573d742 100644
--- a/src/gfx/src/render.cpp
+++ b/src/gfx/src/render.cpp
@@ -69,7 +69,8 @@ void send_matrices_to_shader(Shader &myShader, glm::mat4 &model, glm::mat4 &view
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 }
 
-void draw_objects(std::map<std::string, shader_ptr> &myShaders, std::vector<frame_ptr> &cam_frames, int active_camera,
+void draw_objects(std::map<std::string, shader_ptr> &myShaders, Light &light,
+                  std::vector<frame_ptr> &cam_frames, int active_camera,
                   std::vector<object_ptr> &objects,std::vector<frame_ptr> &obj_frames,
                   glm::mat4 &view, glm::mat4 &projection)
 {
@@ -84,8 +85,8 @@ void draw_objects(std::map<std::string, shader_ptr> &myShaders, std::vector<fram
             // Hardcoded light index
             // TO DO: enum promennych z shaderu
             // TO DO: Light struct, kde bude info o pos, color
-            myShaders[shader_used]->setVec3("lightColor", objects[1]->getColor());
-            myShaders[shader_used]->setVec3("lightPos", obj_frames[1]->getPosition()); 
+            myShaders[shader_used]->setVec3("lightColor", light.getColor());
+            myShaders[shader_used]->setVec3("lightPos", light.getPosition()); 
             myShaders[shader_used]->setVec3("viewPos", cam_frames[active_camera]->getPosition()); 
         }
         
@@ -120,8 +121,7 @@ void draw_grid(std::map<std::string, shader_ptr> &myShaders, Object &grid, Frame
     ASSUMPTION(glGetError() == GL_NO_ERROR);   
 }
 
-// TO DO: only objs, shaders - no frames?
-void gfx_draw(std::map<std::string, shader_ptr> &myShaders, 
+void gfx_draw(std::map<std::string, shader_ptr> &myShaders, Light &light,
               std::vector<camera_ptr> &cameras, std::vector<frame_ptr> &cam_frames, int active_camera, 
               std::vector<object_ptr> &objects, std::vector<frame_ptr> &obj_frames, 
               Object &grid, Frame &grid_frame)
@@ -163,7 +163,7 @@ void gfx_draw(std::map<std::string, shader_ptr> &myShaders,
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 
     // DRAW OBJECTS
-    draw_objects(myShaders, cam_frames, active_camera, objects, obj_frames, view, projection);
+    draw_objects(myShaders, light, cam_frames, active_camera, objects, obj_frames, view, projection);
     
     // DRAW GRID
     draw_grid(myShaders, grid, grid_frame, view, projection);
diff --git a/src/studio/include/studio/simulator.hpp b/src/studio/include/studio/simulator.hpp
index ef6fc69ee3758d979f132abffe52e4481d612199..74b4a10ee8ff07e90645a08dff0d091c08e38f20 100644
--- a/src/studio/include/studio/simulator.hpp
+++ b/src/studio/include/studio/simulator.hpp
@@ -63,7 +63,7 @@ struct Simulator : public osi::Simulator
 
     Object grid = Object(generate_grid_vertices(100), generate_grid_indices(100), {0, -1, 0});
     Frame grid_frame = Frame({0, 0, 0});
-    // Light light;
+    PointLight light;
     std::map<std::string, shader_ptr> myShaders;
 };
 
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index de9380478df75593ad33de78544a62a71273a8b2..6ecce98c06378912fd77ef6483c9607a42fe9fd4 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -124,7 +124,7 @@ Simulator::Simulator()
     , obj_frames{std::make_shared<Frame>(),
                  std::make_shared<Frame>(glm::vec3(1.2f, 2.0f, 2.0f ))}
     , obj_controls{std::make_shared<ObjectController>()}
-    //, light{&obj_frames[1]->getPosition(), &objects[1]->getColor()}
+    , light{PointLight(glm::vec3(1.0f, 1.0f, 1.0f), obj_frames[1])}
 {
     // SET LIGHT CUBE SHADER AND SIZE
     objects[1]->setShaderType("basic");
@@ -166,7 +166,7 @@ void Simulator::present()
         cameras[active_camera]->setWindowSize(window().size());
     }
     
-    gfx_draw(myShaders, cameras, cam_frames, active_camera, objects, obj_frames, grid, grid_frame);
+    gfx_draw(myShaders, light, cameras, cam_frames, active_camera, objects, obj_frames, grid, grid_frame);
 }
 
 // Object movement now works only for one object