diff --git a/data/shaders/lightshader.frag b/data/shaders/lightshader.frag
new file mode 100644
index 0000000000000000000000000000000000000000..9ae137b45a37cf5bd5ae6419b7d59920b5c728a5
--- /dev/null
+++ b/data/shaders/lightshader.frag
@@ -0,0 +1,23 @@
+#version 330 core
+out vec4 FragColor; // layout(location = 0) out vec4 FragColor;
+
+in vec3 FragPos;
+in vec3 Normal;
+
+uniform vec3 objectColor;
+uniform vec3 lightColor;
+uniform vec3 lightPos;
+
+void main()
+{
+    float ambientStrength = 0.1;
+    vec3 ambient = ambientStrength * lightColor;
+
+    vec3 norm = normalize(Normal);
+    vec3 lightDir = normalize(lightPos - FragPos);
+
+    float diff = max(dot(norm, lightDir), 0.0);
+    vec3 diffuse = diff * lightColor;
+
+    FragColor = vec4((ambient + diffuse) * objectColor, 1.0f);
+}
diff --git a/data/shaders/lightshader.vert b/data/shaders/lightshader.vert
new file mode 100644
index 0000000000000000000000000000000000000000..322faf6171ee950a069277141b9a699d0fe526d9
--- /dev/null
+++ b/data/shaders/lightshader.vert
@@ -0,0 +1,18 @@
+#version 330 core
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec3 aNormal;
+
+out FragPos;
+out Normal;
+
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
+
+void main()
+{
+    gl_Position = projection * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);
+
+    FragPos = vec3(model * vec4(aPos, 1.0));
+    Normal = aNormal;
+}
diff --git a/src/gfx/include/gfx/frame.hpp b/src/gfx/include/gfx/frame.hpp
index fc45884ef85baac08b4c82e19ddc71b6adb1f8e8..b967dfa574442ed3b4e57a3bf02d074a1a3b839d 100644
--- a/src/gfx/include/gfx/frame.hpp
+++ b/src/gfx/include/gfx/frame.hpp
@@ -23,10 +23,13 @@ public:
     
     glm::vec3 getPosition() { return positionVec; }
     glm::quat getRotation() { return rotationQuat; }
+    //get modelMatrix()
+    //get inverse ( view) matice
     glm::mat4 getRotationMat() { return glm::toMat4(rotationQuat); }
 
     void setPositionVec(glm::vec3 new_position) { positionVec = new_position; }
     void setrotationQuat(glm::vec3 new_rotation) { rotationQuat *= glm::tquat(glm::radians(new_rotation)); }
+    // rozdělit na set a rotate + translate
 };
 
 #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
index a16edc21e2d15b16237f4d6384a5364cf52e99af..730ed2e9a0658a741d0bf9b5268e2e515a371055 100644
--- a/src/gfx/include/gfx/obj_control.hpp
+++ b/src/gfx/include/gfx/obj_control.hpp
@@ -14,7 +14,7 @@
 class ObjectController : public Controller
 {
     // QUESTION: set automatically relative to camera or axis movement?
-    // Currently: axis
+    // Currently: object axis
     // glm::vec3 frontVec = glm::vec3(0.0f, 0.0f, -1.0f); 
     // glm::vec3 upVec = glm::vec3(0.0f, 1.0f, 0.0f);
 
diff --git a/src/gfx/include/gfx/object.hpp b/src/gfx/include/gfx/object.hpp
index e0070ba816cb5558ca5f41b31f327ff7fa545a2e..fe7c027ac919400cd1aca7ad70f2772d864538c0 100644
--- a/src/gfx/include/gfx/object.hpp
+++ b/src/gfx/include/gfx/object.hpp
@@ -13,16 +13,19 @@ class Object
 {
     std::vector<float> vertices;
     std::vector<unsigned int> indices;
+    std::vector<float> normals;
 
     VAO _VAO;
-    VBO _VBO;
+    VBO _VBO_vertex;
+    VBO _VBO_normal;
     EBO _EBO;
 
     bool buffer_object();
 
 public:
     Object(std::vector<float> const &_vertices, 
-           std::vector<unsigned int> const &_indices);
+           std::vector<unsigned int> const &_indices,
+           std::vector<float> const &_normals);
 
     std::vector<float> const &getVertices() const { return vertices; }
     void setVertices(std::vector<float> const &new_vertices) { vertices = new_vertices; }
@@ -30,6 +33,9 @@ public:
     std::vector<unsigned int> const &getIndices() const { return indices; }
     void setIndices(std::vector<unsigned int> const &new_indices) { indices = new_indices; }
 
+    std::vector<float> const &getNormals() const { return normals; }
+    void setNormals(std::vector<float> const &new_normals) { normals = new_normals; }
+
     VAO &getVAO() { return _VAO; }
 };
 
diff --git a/src/gfx/include/gfx/shader.hpp b/src/gfx/include/gfx/shader.hpp
index 2255d8f5534b3f1bbcfe9297740759f28d895b2c..028b4d6c95627cdb7779e6b72c2472eb53f262b2 100644
--- a/src/gfx/include/gfx/shader.hpp
+++ b/src/gfx/include/gfx/shader.hpp
@@ -2,6 +2,7 @@
 #define SHADER_INCLUDED
 
 #include <glad/glad.h>
+#include <glm/glm.hpp>
 #include <string>
 #include <iostream>
 #include <filesystem>
@@ -25,6 +26,7 @@ public:
     void setBool(const std::string &name, bool value) const;
     void setInt(const std::string &name, int value) const;
     void setFloat(const std::string &name, float value) const;
+    void setVec3(const std::string &name, glm::vec3 value) const;
 
     unsigned int getID() {return ID;} // Why do we need to expose ID???
 
diff --git a/src/gfx/include/gfx/vao.hpp b/src/gfx/include/gfx/vao.hpp
index 78f21ffae14c24c39aadfd6de86418a9c3e01e91..e10f63c951ec2d0520dded1096e4ff256ad9e86c 100644
--- a/src/gfx/include/gfx/vao.hpp
+++ b/src/gfx/include/gfx/vao.hpp
@@ -16,7 +16,7 @@ public:
     void Unbind();
     void Delete();
 
-    void LinkVBO(); // , unsigned int layout
+    void LinkVBO(unsigned int layout_loc); // , unsigned int layout
 };
 
 #endif
\ No newline at end of file
diff --git a/src/gfx/src/object.cpp b/src/gfx/src/object.cpp
index 5ec31359b567dc90599f37e58bb5871cf8ab16a3..24b66c3b7d840a10baad1777bead9784616f9c49 100644
--- a/src/gfx/src/object.cpp
+++ b/src/gfx/src/object.cpp
@@ -2,8 +2,9 @@
 #include <vector>
 
 Object::Object(std::vector<float> const &_vertices, 
-               std::vector<unsigned int> const &_indices)
- : vertices{_vertices}, indices{_indices} 
+               std::vector<unsigned int> const &_indices, 
+               std::vector<float> const &_normals)
+ : vertices{_vertices}, indices{_indices}, normals{_normals}
 {
     buffer_object();
 }
@@ -11,11 +12,19 @@ Object::Object(std::vector<float> const &_vertices,
 bool Object::buffer_object()
 {
     _VAO.Bind();
-    _VBO.Bind();
+    // Vertices
+    _VBO_vertex.Bind();
+    _VBO_vertex.SendData(getVertices());
+    _VAO.LinkVBO(0);
+    _VBO_vertex.Unbind();
+    // Normals
+    _VBO_normal.Bind();
+    _VBO_normal.SendData(getNormals());
+    _VAO.LinkVBO(1);
+    // Indices
     _EBO.Bind();
-    _VBO.SendData(getVertices());
     _EBO.SendData(getIndices());
-    _VAO.LinkVBO();
+    
     // Either unbind all three or none, otherwise no cube
     // _VAO.Unbind();
     // _VBO.Unbind();
diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp
index 9d7305bef41470e412613ae9fb4237c4f9260809..62fcbec90bc001e5b205450ba11003ccc4dc321c 100644
--- a/src/gfx/src/render.cpp
+++ b/src/gfx/src/render.cpp
@@ -46,7 +46,13 @@ void gfx_draw(Shader &myShader,
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 
+    Frame lightPos(glm::vec3(1.2f, 1.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f));
+
     myShader.use();
+    myShader.setVec3("objectColor", glm::vec3(1.0f, 0.5f, 0.31f));
+    myShader.setVec3("lightColor", glm::vec3(1.0f, 1.0f, 1.0f));
+    myShader.setVec3("lightPos", lightPos.getPosition());
+
 
     /* -------------------- Transformation examples --------------------*/
     // glm::mat4 transform = glm::mat4(1.0f);
diff --git a/src/gfx/src/shader.cpp b/src/gfx/src/shader.cpp
index a19654ecb1bc4732851790b8d6ad31bce73fdb2f..7a7dfb2c68b5351e50501060babc068d4a5892c0 100644
--- a/src/gfx/src/shader.cpp
+++ b/src/gfx/src/shader.cpp
@@ -116,6 +116,12 @@ void Shader::setFloat(const std::string &name, float value) const
     glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 }
+void Shader::setVec3(const std::string &name, glm::vec3 value) const
+{
+    ASSUMPTION(ID != 0);
+    glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
+    ASSUMPTION(glGetError() == GL_NO_ERROR);
+}
 
 Shader::~Shader()
 {
diff --git a/src/gfx/src/vao.cpp b/src/gfx/src/vao.cpp
index ad0cc451c2266f6f22f1104192e115d72d711742..edea44ab3a0196eec0027fe0d8086fa5c277c028 100644
--- a/src/gfx/src/vao.cpp
+++ b/src/gfx/src/vao.cpp
@@ -12,12 +12,12 @@ VAO::~VAO()
     Delete();
 }
 
-void VAO::LinkVBO() // , unsigned int layout
+void VAO::LinkVBO(unsigned int layout_loc)
 {
     ASSUMPTION(ID != 0);
-    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
+    glVertexAttribPointer(layout_loc, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
     ASSUMPTION(glGetError() == GL_NO_ERROR);
-    glEnableVertexAttribArray(0); // layout instead of 0s at the start
+    glEnableVertexAttribArray(layout_loc); 
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 }
 
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index ccd573ec8fc6d577c505c2beb7a10b368d0b2ff9..13bf558f137ebe63c2d9504c322c43c5f2b06209 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -45,7 +45,7 @@ Simulator::Simulator()
     : osi::Simulator()
     // camera frame, object frame, camera, object
     , myShader{"./data/shaders/basicshader.vert",
-               "./data/shaders/basicshader.frag"}
+               "./data/shaders/lightshader.frag"}
     , camera{60.0f}
     , object{{
               0, 0, 0,       1, -0.2f, 0,       1, 0.2f, 0,
@@ -56,10 +56,15 @@ Simulator::Simulator()
               0, 1, 2,
               3, 4, 5,
               6, 7, 8
+             },
+             {
+                0, 1, 1,   0, 0, -1,     0, 0, -1,
+                0, 1, 1,   0, 0, -1,     0, 0, -1,
+                0, 1, 1,   1, 0,  0,     1, 0,  0
              }
             }
     , cam_frame{{0.0f, 0.0f, 3.0f}, {0.0f, -90.0f, 0.0f}} // Setting camera rotation currently does nothing
-    , obj_frame{{ 0.0f, 0.0f, 0.0f }, { 90.0f, 0.0f, 0.0f }}
+    , obj_frame{{ 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }}
     , cam_control{cam_frame}
     , obj_control{obj_frame}
     // , object{{ 1.0f, -1.0f, 0.0f }, 
@@ -92,6 +97,7 @@ Simulator::Simulator()
     //         }}
 {
     camera.setWindowSize(window().size()); 
+    //obj_control.rotate(glm::vec3(0.0f, 50.0f, 0.0f));
 }
 
 Simulator::~Simulator() {}