diff --git a/src/example/scigl_depth_viewer.cpp b/src/example/scigl_depth_viewer.cpp
index 1114f92191374e9820ac3e39cf14bb7b864ab2c0..13b6af7c36f56b70a6c15536bda6dd5e8f707301 100644
--- a/src/example/scigl_depth_viewer.cpp
+++ b/src/example/scigl_depth_viewer.cpp
@@ -90,7 +90,7 @@ void process_input(GLFWwindow *window,
     glfwSetWindowShouldClose(window, true);
   }
   // movement
-  float cameraSpeed = 0.001;
+  float cameraSpeed = 0.005;
   if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
   {
     camera_pose.position.y += cameraSpeed;
diff --git a/src/render/depth_simulator.cpp b/src/render/depth_simulator.cpp
index ab81b41b62850edccbbb4b6da556d8ad11af5f34..9e38a4b9582ead339b16a18d56aec314f2f1cc72 100644
--- a/src/render/depth_simulator.cpp
+++ b/src/render/depth_simulator.cpp
@@ -46,6 +46,7 @@ void DepthSimulator::render_pose(const QuaternionPose &object_pose,
   camera.pose = camera_pose;
   camera.set_in_shader(depth_shader);
   model.pose = object_pose;
+  depth_shader.activate();
   model.draw(depth_shader);
 }
 } // namespace scigl_render
\ No newline at end of file
diff --git a/src/render/onscreen_render.cpp b/src/render/onscreen_render.cpp
index 20ed7a05388e57cbe24c02d55ce21387fdf15c3f..84ae814d102195f5c5b66c7ec32ca41d9202b8d7 100644
--- a/src/render/onscreen_render.cpp
+++ b/src/render/onscreen_render.cpp
@@ -16,15 +16,15 @@ void OnscreenRender::next_frame(
     GLContext &gl_context, const CvCamera &camera,
     const Model &model, const DiffuseLight &light)
 {
-  shader.activate();
   glClearColor(0, 0, 0, 0);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glEnable(GL_DEPTH_TEST);
   camera.set_in_shader(shader);
   light.set_in_shader(shader);
+  shader.activate();
   model.draw(shader);
-
+  shader.deactivate();
   glfwSwapBuffers(gl_context.get_window());
   check_gl_error("rendered next frame");
 }
diff --git a/src/scene/cv_camera.cpp b/src/scene/cv_camera.cpp
index b223bf548f1794127ba653eaf1b9fdd735fc3cee..afebe2aecf8687a0749173496b8b81d5eafbfc53 100644
--- a/src/scene/cv_camera.cpp
+++ b/src/scene/cv_camera.cpp
@@ -77,7 +77,6 @@ void CvCamera::resize_intrinsics(int width, int height)
 
 void CvCamera::set_in_shader(const Shader &shader) const
 {
-  shader.activate();
   shader.setVec3("camera_position", this->pose.position);
   shader.setFloatArray("dist_coeffs", this->intrinsics.dist_coeffs,
                   sizeof(this->intrinsics.dist_coeffs));
diff --git a/src/scene/diffuse_light.cpp b/src/scene/diffuse_light.cpp
index 1e4fecaa35af224db4493daeb3a6a22836f9468b..0a1b7c85b2fdef4e172ff6bade648065cd0434c8 100644
--- a/src/scene/diffuse_light.cpp
+++ b/src/scene/diffuse_light.cpp
@@ -2,7 +2,6 @@
 
 void scigl_render::DiffuseLight::set_in_shader(const Shader &shader) const
 {
-  shader.activate();
   shader.setVec3("light_position", position);
   shader.setVec3("light_color", color);
 }
\ No newline at end of file
diff --git a/src/scene/mesh.cpp b/src/scene/mesh.cpp
index 8275996364f2c9b00d521460da691b595e0cc784..af112e15684ac462988a6d292ba9209fbeb9c627 100644
--- a/src/scene/mesh.cpp
+++ b/src/scene/mesh.cpp
@@ -131,7 +131,6 @@ void Mesh::init()
 
 void Mesh::draw(const Shader &shader) const
 {
-  shader.activate();
   shader.setVec3("material.ambient", material.ambient);
   shader.setVec3("material.diffuse", material.diffuse);
   shader.setVec3("material.specular", material.specular);
@@ -139,6 +138,7 @@ void Mesh::draw(const Shader &shader) const
   // Shader shall sample form texture0
   shader.setInt("texture0", 0);
   shader.setFloat("diffuse_texture_strength", texture.strength);
+  shader.activate();
   glActiveTexture(GL_TEXTURE0);
   glBindTexture(GL_TEXTURE_2D, texture.id);
   // draw the vertex array
diff --git a/src/shader/shader.cpp b/src/shader/shader.cpp
index 53f8e1d3ba4bf28f8cecd58adb130a187e831412..b6ecc7d5b986a52809ecb39e4aedec619fad285a 100644
--- a/src/shader/shader.cpp
+++ b/src/shader/shader.cpp
@@ -30,148 +30,139 @@ void Shader::set_program_id(GLuint id)
 
 void Shader::setBool(const std::string &name, bool value) const
 {
-  activate();
-  glUniform1i(glGetUniformLocation(program_id, name.c_str()), (int)value);
-  deactivate();
+  glProgramUniform1i(program_id,
+                     glGetUniformLocation(program_id, name.c_str()),
+                     (int)value);
 }
 
 void Shader::setInt(const std::string &name, int value) const
 {
-  activate();
-  glUniform1i(glGetUniformLocation(program_id, name.c_str()), value);
-  deactivate();
+  glProgramUniform1i(program_id,
+                     glGetUniformLocation(program_id, name.c_str()),
+                     value);
 }
 
 void Shader::setUInt(const std::string &name, uint32_t value) const
 {
-  activate();
-  glUniform1ui(glGetUniformLocation(program_id, name.c_str()), value);
-  deactivate();
+  glProgramUniform1ui(program_id,
+                      glGetUniformLocation(program_id, name.c_str()), value);
 }
 
 void Shader::setFloat(const std::string &name, float value) const
 {
-  activate();
-  glUniform1f(glGetUniformLocation(program_id, name.c_str()), value);
-  deactivate();
+  glProgramUniform1f(program_id,
+                     glGetUniformLocation(program_id, name.c_str()), value);
 }
 
 void Shader::setVec2(const std::string &name, const glm::vec2 &value) const
 {
-  activate();
-  glUniform2fv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
-  deactivate();
+  glProgramUniform2fv(program_id,
+                      glGetUniformLocation(program_id, name.c_str()),
+                      1, &value[0]);
 }
 
 void Shader::setVec2(const std::string &name, float x, float y) const
 {
-  activate();
-  glUniform2f(glGetUniformLocation(program_id, name.c_str()), x, y);
-  deactivate();
+  glProgramUniform2f(program_id,
+                     glGetUniformLocation(program_id, name.c_str()), x, y);
 }
 
 void Shader::setVec3(const std::string &name, const glm::vec3 &value) const
 {
-  activate();
-  glUniform3fv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
-  deactivate();
+  glProgramUniform3fv(program_id,
+                      glGetUniformLocation(program_id, name.c_str()),
+                      1, &value[0]);
 }
 
 void Shader::setVec3(const std::string &name, float x, float y, float z) const
 {
-  activate();
-  glUniform3f(glGetUniformLocation(program_id, name.c_str()), x, y, z);
-  deactivate();
+  glProgramUniform3f(program_id,
+                     glGetUniformLocation(program_id, name.c_str()), x, y, z);
 }
 
 void Shader::setVec4(const std::string &name, const glm::vec4 &value) const
 {
-  activate();
-  glUniform4fv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
-  deactivate();
+  glProgramUniform4fv(program_id,
+                      glGetUniformLocation(program_id, name.c_str()),
+                      1, &value[0]);
 }
 
 void Shader::setVec4(const std::string &name, float x, float y, float z,
                      float w) const
 {
-  activate();
-  glUniform4f(glGetUniformLocation(program_id, name.c_str()), x, y, z, w);
-  deactivate();
+  glProgramUniform4f(program_id,
+                     glGetUniformLocation(program_id, name.c_str()),
+                     x, y, z, w);
 }
 
 void Shader::setMat2(const std::string &name, const glm::mat2 &mat) const
 {
-  activate();
-  glUniformMatrix2fv(glGetUniformLocation(program_id, name.c_str()), 1,
-                     GL_FALSE, &mat[0][0]);
-  deactivate();
+  glProgramUniformMatrix2fv(program_id,
+                            glGetUniformLocation(program_id, name.c_str()), 1,
+                            GL_FALSE, &mat[0][0]);
 }
 
 void Shader::setMat3(const std::string &name, const glm::mat3 &mat) const
 {
-  activate();
-  glUniformMatrix3fv(glGetUniformLocation(program_id, name.c_str()), 1,
-                     GL_FALSE, &mat[0][0]);
-  deactivate();
+  glProgramUniformMatrix3fv(program_id,
+                            glGetUniformLocation(program_id, name.c_str()), 1,
+                            GL_FALSE, &mat[0][0]);
 }
 
 void Shader::setMat4(const std::string &name, const glm::mat4 &mat) const
 {
-  activate();
-  glUniformMatrix4fv(glGetUniformLocation(program_id, name.c_str()), 1,
-                     GL_FALSE, &mat[0][0]);
-  deactivate();
+  glProgramUniformMatrix4fv(program_id,
+                            glGetUniformLocation(program_id, name.c_str()), 1,
+                            GL_FALSE, &mat[0][0]);
 }
 
 void Shader::setUVec2(const std::string &name, const glm::uvec2 &value) const
 {
-  activate();
-  glUniform2uiv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
-  deactivate();
+  glProgramUniform2uiv(program_id,
+                       glGetUniformLocation(program_id, name.c_str()),
+                       1, &value[0]);
 }
 
 void Shader::setUVec3(const std::string &name, const glm::uvec3 &value) const
 {
-  activate();
-  glUniform3uiv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
-  deactivate();
+  glProgramUniform3uiv(program_id,
+                       glGetUniformLocation(program_id, name.c_str()),
+                       1, &value[0]);
 }
 
 void Shader::setUVec4(const std::string &name, const glm::uvec4 &value) const
 {
-  activate();
-  glUniform4uiv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
-  deactivate();
+  glProgramUniform4uiv(program_id,
+                       glGetUniformLocation(program_id, name.c_str()),
+                       1, &value[0]);
 }
 
 void Shader::setUVec2(const std::string &name, uint32_t x, uint32_t y) const
 {
-  activate();
-  glUniform2ui(glGetUniformLocation(program_id, name.c_str()), x, y);
-  deactivate();
+  glProgramUniform2ui(program_id,
+                      glGetUniformLocation(program_id, name.c_str()), x, y);
 }
 
 void Shader::setUVec3(const std::string &name,
                       uint32_t x, uint32_t y, uint32_t z) const
 {
-  activate();
-  glUniform3ui(glGetUniformLocation(program_id, name.c_str()), x, y, z);
-  deactivate();
+  glProgramUniform3ui(program_id,
+                      glGetUniformLocation(program_id, name.c_str()), x, y, z);
 }
 
 void Shader::setUVec4(const std::string &name,
                       uint32_t x, uint32_t y, uint32_t z, uint32_t w) const
 {
-  activate();
-  glUniform4ui(glGetUniformLocation(program_id, name.c_str()), x, y, z, w);
-  deactivate();
+  glProgramUniform4ui(program_id,
+                      glGetUniformLocation(program_id, name.c_str()),
+                      x, y, z, w);
 }
 
 void Shader::setFloatArray(
     const std::string &name, const float array[], int count) const
 {
-  activate();
-  glUniform1fv(glGetUniformLocation(program_id, name.c_str()), count, array);
-  deactivate();
+  glProgramUniform1fv(program_id,
+                      glGetUniformLocation(program_id, name.c_str()),
+                      count, array);
 }
 } // namespace scigl_render