diff --git a/demos/optical_bench/src/controller_overlay.cpp b/demos/optical_bench/src/controller_overlay.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..df45dfe4bad080e6a097993346a359fe4436a094
--- /dev/null
+++ b/demos/optical_bench/src/controller_overlay.cpp
@@ -0,0 +1,166 @@
+//------------------------------------------------------------------------------
+// Project Phoenix
+//
+// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
+// Virtual Reality & Immersive Visualization Group.
+//------------------------------------------------------------------------------
+//                                 License
+//
+// Licensed under the 3-Clause BSD License (the "License");
+// you may not use this file except in compliance with the License.
+// See the file LICENSE for the full text.
+// You may obtain a copy of the License at
+//
+//     https://opensource.org/licenses/BSD-3-Clause
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//------------------------------------------------------------------------------
+
+#include <string>
+
+#include "controller_overlay.hpp"
+#include "phx/rendering/components/material_handle.hpp"
+#include "phx/rendering/components/transform.hpp"
+#include "phx/resources/loaders/scene_loader.hpp"
+#include "phx/resources/resource_utils.hpp"
+#include "phx/resources/types/image.hpp"
+#include "phx/suppress_warnings.hpp"
+
+SUPPRESS_WARNINGS_BEGIN
+#include "glm/gtc/matrix_transform.hpp"
+SUPPRESS_WARNINGS_END
+
+namespace phx {
+ControllerOverlay::ControllerOverlay(phx::Entity* controller,
+                                     phx::Scene* scene) {
+  auto controller_overlay = phx::SceneLoader::InsertModelIntoScene(
+      "models/opticalBench/controller_overlay/Controller_Buttons.obj", scene);
+
+  controller_overlay->GetFirstComponent<phx::Transform>()->SetParent(
+      controller->GetFirstComponent<phx::Transform>());
+
+  // select entitys
+  auto transform = controller_overlay->GetFirstComponent<phx::Transform>();
+  for (auto i = 0u; i < transform->GetChildCount(); i++) {
+    auto entity = transform->GetChild(i)->GetEntity();
+    auto handle = entity->GetFirstComponent<phx::MaterialHandle>();
+
+    if (handle->GetMaterial()->GetName().compare("Grip_Left") == 0)
+      grip_left_ = entity;
+    else if (handle->GetMaterial()->GetName().compare("Grip_Right") == 0)
+      grip_right_ = entity;
+    else if (handle->GetMaterial()->GetName().compare("Trigger") == 0)
+      grip_trigger_ = entity;
+    else if (handle->GetMaterial()->GetName().compare("Trackpad") == 0)
+      grip_trackpad_ = entity;
+  }
+
+  // store/load images
+  grip_images_.push_back(grip_left_->GetFirstComponent<phx::MaterialHandle>()
+                             ->GetMaterial()
+                             ->GetAmbientImage());
+  grip_images_.push_back(phx::ResourceUtils::LoadResourceFromFile<phx::Image>(
+      "models/opticalBench/controller_overlay/menu_images/Grip_Select.png"));
+  grip_images_.push_back(phx::ResourceUtils::LoadResourceFromFile<phx::Image>(
+      "models/opticalBench/controller_overlay/menu_images/Grip1.png"));
+  grip_images_.push_back(phx::ResourceUtils::LoadResourceFromFile<phx::Image>(
+      "models/opticalBench/controller_overlay/menu_images/Grip2.png"));
+  grip_images_.push_back(phx::ResourceUtils::LoadResourceFromFile<phx::Image>(
+      "models/opticalBench/controller_overlay/menu_images/Grip3.png"));
+
+  trigger_images_.push_back(
+      grip_trigger_->GetFirstComponent<phx::MaterialHandle>()
+          ->GetMaterial()
+          ->GetAmbientImage());
+  trigger_images_.push_back(phx::ResourceUtils::LoadResourceFromFile<
+                            phx::Image>(
+      "models/opticalBench/controller_overlay/menu_images/Trigger_Grab.png"));
+  trigger_images_.push_back(
+      phx::ResourceUtils::LoadResourceFromFile<phx::Image>(
+          "models/opticalBench/controller_overlay/menu_images/"
+          "Trigger_Grabbed.png"));
+
+  trackpad_images_.push_back(
+      grip_trackpad_->GetFirstComponent<phx::MaterialHandle>()
+          ->GetMaterial()
+          ->GetAmbientImage());
+  trackpad_images_.push_back(
+      phx::ResourceUtils::LoadResourceFromFile<phx::Image>(
+          "models/opticalBench/controller_overlay/menu_images/"
+          "Trackpad_Rotate.png"));
+}
+
+std::string ControllerOverlay::ToString() const { return "Controller Overlay"; }
+
+void ControllerOverlay::SetGripMode(GripMode m) {
+  if (m == current_grip_mode_) return;
+  switch (m) {
+    case EMPTY:
+      setEntityImage(grip_left_, grip_images_[3]);
+      setEntityImage(grip_right_, grip_images_[3]);
+      break;
+    case ROTATION:
+      setEntityImage(grip_left_, grip_images_[4]);
+      setEntityImage(grip_right_, grip_images_[4]);
+      break;
+    case TRANSLATION:
+      setEntityImage(grip_left_, grip_images_[2]);
+      setEntityImage(grip_right_, grip_images_[2]);
+      break;
+    case RESET:
+      setEntityImage(grip_left_, grip_images_[0]);
+      setEntityImage(grip_right_, grip_images_[0]);
+      break;
+    case SELECT:
+      setEntityImage(grip_left_, grip_images_[1]);
+      setEntityImage(grip_right_, grip_images_[1]);
+      break;
+  };
+  current_grip_mode_ = m;
+}
+
+void ControllerOverlay::SetTrackpadRotate(bool activate) {
+  if (activate == current_trackpad_rotate_) return;
+  if (activate) {
+    setEntityImage(grip_trackpad_, trackpad_images_[1]);
+  } else {
+    setEntityImage(grip_trackpad_, trackpad_images_[0]);
+  }
+  current_trackpad_rotate_ = activate;
+}
+
+void ControllerOverlay::SetTrackpadAngle(float angle) {
+  if (current_angle_ == angle) return;
+  grip_trackpad_->GetFirstComponent<phx::Transform>()->SetLocalMatrix(
+      glm::translate(glm::mat4(), glm::vec3(0, -0.00509f, 0.04835f)) *
+      glm::rotate(glm::mat4(), angle, glm::vec3(0, 0.9935f, 0.1138f)) *
+      glm::translate(glm::mat4(), glm::vec3(0, 0.00509f, -0.04835f)));
+  current_angle_ = angle;
+}
+
+void ControllerOverlay::SetTriggerMode(TriggerMode m) {
+  if (m == current_trigger_mode_) return;
+  switch (m) {
+    case NORMAL:
+      setEntityImage(grip_trigger_, trigger_images_[0]);
+      break;
+    case GRAB:
+      setEntityImage(grip_trigger_, trigger_images_[1]);
+      break;
+    case GRABBED:
+      setEntityImage(grip_trigger_, trigger_images_[2]);
+      break;
+  };
+  current_trigger_mode_ = m;
+}
+
+void phx::ControllerOverlay::setEntityImage(
+    phx::Entity* e, phx::ResourcePointer<phx::Image> i) {
+  e->GetFirstComponent<phx::MaterialHandle>()->GetMaterial()->SetAmbientImage(
+      i);
+}
+}  // namespace phx
diff --git a/demos/optical_bench/src/controller_overlay.hpp b/demos/optical_bench/src/controller_overlay.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..98dfc26b6d3f69788ff557263fc518cb12e20723
--- /dev/null
+++ b/demos/optical_bench/src/controller_overlay.hpp
@@ -0,0 +1,78 @@
+//------------------------------------------------------------------------------
+// Project Phoenix
+//
+// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
+// Virtual Reality & Immersive Visualization Group.
+//------------------------------------------------------------------------------
+//                                 License
+//
+// Licensed under the 3-Clause BSD License (the "License");
+// you may not use this file except in compliance with the License.
+// See the file LICENSE for the full text.
+// You may obtain a copy of the License at
+//
+//     https://opensource.org/licenses/BSD-3-Clause
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//------------------------------------------------------------------------------
+
+#ifndef OPTICAL_BENCH_CONTROLLER_OVERLAY_HPP_
+#define OPTICAL_BENCH_CONTROLLER_OVERLAY_HPP_
+
+#include <functional>
+#include <string>
+#include <vector>
+#include "phx/core/component.hpp"
+#include "phx/core/entity.hpp"
+#include "phx/core/scene.hpp"
+#include "phx/resources/resource_pointer.hpp"
+#include "phx/resources/types/image.hpp"
+#include "phx/suppress_warnings.hpp"
+
+namespace phx {
+class ControllerOverlay : public Component {
+ public:
+  enum GripMode {
+    EMPTY = 0,
+    ROTATION = 1,
+    TRANSLATION = 2,
+    RESET = 3,
+    SELECT = 4
+  };
+  enum TriggerMode { NORMAL = 0, GRAB = 1, GRABBED = 2 };
+  explicit ControllerOverlay(phx::Entity* entity, phx::Scene* scene);
+  virtual ~ControllerOverlay() = default;
+
+  std::string ToString() const override;
+
+  void SetGripMode(GripMode m);
+  void SetTrackpadRotate(bool activate);
+  void SetTrackpadAngle(float angle);
+  void SetTriggerMode(TriggerMode m);
+
+ private:
+  phx::Entity* grip_left_;
+  phx::Entity* grip_right_;
+  phx::Entity* grip_trigger_;
+  phx::Entity* grip_trackpad_;
+
+  GripMode current_grip_mode_ = GripMode::RESET;
+  TriggerMode current_trigger_mode_ = TriggerMode::NORMAL;
+  bool current_grip_select_ = false;
+  bool current_trackpad_rotate_ = false;
+  float current_angle_ = 0.0f;
+
+  std::vector<phx::ResourcePointer<phx::Image>> grip_images_;
+  std::vector<phx::ResourcePointer<phx::Image>> trigger_images_;
+  std::vector<phx::ResourcePointer<phx::Image>> trackpad_images_;
+
+  void setEntityImage(phx::Entity* e, phx::ResourcePointer<phx::Image> i);
+};
+
+}  // namespace phx
+
+#endif  // OPTICAL_BENCH_CONTROLLER_OVERLAY_HPP_
diff --git a/demos/optical_bench/src/hmd_navigation_behavior.cpp b/demos/optical_bench/src/hmd_navigation_behavior.cpp
index e8ac0a7e353504b298cc3137495162d8362939a5..7f685a8d4522fdb9e3cbb8b0b0c90e60bb257372 100644
--- a/demos/optical_bench/src/hmd_navigation_behavior.cpp
+++ b/demos/optical_bench/src/hmd_navigation_behavior.cpp
@@ -21,6 +21,7 @@
 //------------------------------------------------------------------------------
 
 #include "hmd_navigation_behavior.hpp"
+#include "controller_overlay.hpp"
 #include "ray_pass.hpp"
 #include "selection_mark_handler.hpp"
 #include "selector.hpp"
@@ -101,6 +102,11 @@ HMDNavigationBehavior::HMDNavigationBehavior(
               phx::RuntimeComponent<phx::RIGHT_CONTROLLER>>()[0]
           ->GetFirstComponent<phx::Transform>();
 
+  auto controller_entity = scene_->GetEntitiesWithComponents<
+      phx::RuntimeComponent<phx::RIGHT_CONTROLLER>>()[0];
+  controller_overlay_ = controller_entity->AddComponent<phx::ControllerOverlay>(
+      controller_entity, scene);
+
   // Prepare helpers
   pointer_rod_ = phx::SceneLoader::InsertModelIntoScene(
       "models/opticalBench/rod/pointerRod.obj", scene);
@@ -135,7 +141,7 @@ void HMDNavigationBehavior::OnUpdate() {
 
   static bool trigger_pressed = false;
 
-  // Change selected or grabbed entities
+  // Change selected or hovered entities
   if (right_controller_->GetAxesValue(phx::VRController::AXES_TRIGGER).x ==
       1.0f) {
     if (!trigger_pressed) {  // Trigger pressed
@@ -153,20 +159,54 @@ void HMDNavigationBehavior::OnUpdate() {
   }
 
   // update rotator
+  static float angle = 0;
   if (last_selected_ != nullptr &&
       last_selected_->GetFirstComponent<phx::TurnHandler>() != nullptr) {
-    last_selected_->GetFirstComponent<phx::TurnHandler>()->Turn(
-        getTouchpadRotationDelta());
+    controller_overlay_->SetTrackpadRotate(true);
+    float delta = getTouchpadRotationDelta();
+    last_selected_->GetFirstComponent<phx::TurnHandler>()->Turn(delta);
+    angle += delta;
+  } else {
+    controller_overlay_->SetTrackpadRotate(false);
+    angle = 0;
   }
+  controller_overlay_->SetTrackpadAngle(-angle);
 
   if (select_->GetIntersectionDistance() < INFINITY &&
-      select_->GetIntersectionDistance() > 0.05f) {
+      select_->GetIntersectionDistance() >= 0.0f) {
     pointer_rod_->GetFirstComponent<phx::Transform>()->SetLocalScale(
-        glm::vec3(1, 1, select_->GetIntersectionDistance()));
+        glm::vec3(1, 1, select_->GetIntersectionDistance() + 0.015f));  //+15mm
   } else {
     pointer_rod_->GetFirstComponent<phx::Transform>()->SetLocalScale(
         glm::vec3(1, 1, 0.05f));
   }
+
+  // Change Grip Images
+  if (!trigger_pressed) {
+    if (manipulationHelperAttachable(select_->GetHovered())) {
+      controller_overlay_->SetGripMode(phx::ControllerOverlay::SELECT);
+    } else if (last_selected_ == nullptr) {
+      controller_overlay_->SetGripMode(phx::ControllerOverlay::RESET);
+    } else if (last_selected_ != nullptr &&
+               manipulationHelperAttachable(last_selected_)) {
+      controller_overlay_->SetGripMode(
+          static_cast<phx::ControllerOverlay::GripMode>(grip_mode % 3));
+    }
+  } else {
+    controller_overlay_->SetGripMode(phx::ControllerOverlay::RESET);
+  }
+
+  // Change Trigger Images
+  if (trigger_pressed && select_->GetGrabbed() != nullptr &&
+      select_->GetGrabbed()->GetFirstComponent<phx::Selector>() != nullptr) {
+    controller_overlay_->SetTriggerMode(phx::ControllerOverlay::GRABBED);
+  } else if (!trigger_pressed && select_->GetHovered() != nullptr &&
+             select_->GetHovered()->GetFirstComponent<phx::Selector>() !=
+                 nullptr) {
+    controller_overlay_->SetTriggerMode(phx::ControllerOverlay::GRAB);
+  } else {
+    controller_overlay_->SetTriggerMode(phx::ControllerOverlay::NORMAL);
+  }
 }
 
 void HMDNavigationBehavior::update_helpers() {
@@ -262,15 +302,22 @@ void HMDNavigationBehavior::updateInsersectionData() {
 void HMDNavigationBehavior::buttonChange(
     phx::VRController::ButtonId& id, phx::VRController::ButtonEvent& event) {
   if (id == phx::VRController::ButtonId::k_EButton_Grip &&
-      event == phx::VRController::ButtonEvent::BUTTON_PRESSED &&
-      select_->GetGrabbed() == nullptr) {
-    if (select_->GetHovered() == nullptr) {
+      event == phx::VRController::ButtonEvent::BUTTON_PRESSED) {
+    if (select_->GetHovered() == nullptr &&
+        manipulationHelperAttachable(last_selected_)) {
       grip_mode = grip_mode + 1 % 3;
+
       update_helpers();
     } else {
       setLastSelected(select_->GetHovered());
-      update_helpers();
+
       if (grip_mode == 0) grip_mode = 1;  // Hover without feedback sucks
+      update_helpers();
     }
   }
 }
+
+bool HMDNavigationBehavior::manipulationHelperAttachable(phx::Entity* e) {
+  return e != nullptr && e->GetFirstComponent<phx::Selector>() != nullptr &&
+         e->GetFirstComponent<phx::Selector>()->manipulation_helper_attachable_;
+}
diff --git a/demos/optical_bench/src/hmd_navigation_behavior.hpp b/demos/optical_bench/src/hmd_navigation_behavior.hpp
index f825ec7b7914c46f2dd27cc11b2c00f5384acc2b..ba6bdb099fb8a83ec2fb32a72bf10deaf400b9db 100644
--- a/demos/optical_bench/src/hmd_navigation_behavior.hpp
+++ b/demos/optical_bench/src/hmd_navigation_behavior.hpp
@@ -23,6 +23,7 @@
 #ifndef OPTICAL_BENCH_HMD_NAVIGATION_BEHAVIOR_HPP_
 #define OPTICAL_BENCH_HMD_NAVIGATION_BEHAVIOR_HPP_
 
+#include "controller_overlay.hpp"
 #include "phx/core/engine.hpp"
 #include "phx/core/entity.hpp"
 #include "phx/core/scene.hpp"
@@ -65,6 +66,7 @@ class HMDNavigationBehavior : public phx::Behavior {
 
   phx::VRController* right_controller_;
   phx::Transform* right_controller_transform_;
+  phx::ControllerOverlay* controller_overlay_;
 
   unsigned int grip_mode = 0;
   void update_helpers();
@@ -78,6 +80,7 @@ class HMDNavigationBehavior : public phx::Behavior {
   void updateInsersectionData();
   void buttonChange(phx::VRController::ButtonId& id,
                     phx::VRController::ButtonEvent& event);
+  bool manipulationHelperAttachable(phx::Entity* e);
 };
 
 #endif  // OPTICAL_BENCH_HMD_NAVIGATION_BEHAVIOR_HPP_
diff --git a/resources/models/opticalBench/controller_overlay/Button_Menu.png b/resources/models/opticalBench/controller_overlay/Button_Menu.png
new file mode 100644
index 0000000000000000000000000000000000000000..291752bd52497c88c747b014ca0b9b712299fa6b
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/Button_Menu.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96871ce30dcaaa426510bf306f374f227f77f61eb291fb420a7924bdf2cb0914
+size 2235
diff --git a/resources/models/opticalBench/controller_overlay/Button_Power.png b/resources/models/opticalBench/controller_overlay/Button_Power.png
new file mode 100644
index 0000000000000000000000000000000000000000..97209a1692e29c20ad7d9dc4ae5563385b369391
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/Button_Power.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b54f6bab64b4cb3cc7f5f112ea4e2eb897aa55615ad8a5b18060407bca82c24
+size 2326
diff --git a/resources/models/opticalBench/controller_overlay/Controller_Buttons.mtl b/resources/models/opticalBench/controller_overlay/Controller_Buttons.mtl
new file mode 100644
index 0000000000000000000000000000000000000000..8d8051376a6822a62e84651551a5ecfa3fe44572
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/Controller_Buttons.mtl
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c00107d0edbf4a1a27ac930c3bc3eea7619380592778dc5e1c2121803cb93452
+size 854
diff --git a/resources/models/opticalBench/controller_overlay/Controller_Buttons.obj b/resources/models/opticalBench/controller_overlay/Controller_Buttons.obj
new file mode 100644
index 0000000000000000000000000000000000000000..423dc4a2b49c1ae22c2ecdc6e292df938669fb89
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/Controller_Buttons.obj
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:59090fb8e67446b6f68bd1de0e7b21a6639f2a6a035117ca27f82552b5bb80e5
+size 71915
diff --git a/resources/models/opticalBench/controller_overlay/Grip.png b/resources/models/opticalBench/controller_overlay/Grip.png
new file mode 100644
index 0000000000000000000000000000000000000000..3178c129b5ce98a7da8c01b1b26c43cc3b7a691e
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/Grip.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:76aa8aebe6b6d096b0c4996d8090f9cc65bae64f93cc263d1b0572336a6c0a02
+size 2283
diff --git a/resources/models/opticalBench/controller_overlay/Trackpad.png b/resources/models/opticalBench/controller_overlay/Trackpad.png
new file mode 100644
index 0000000000000000000000000000000000000000..48c9f65ad6ace5c3bbfd4ca1b54c258c439eff0f
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/Trackpad.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:988abf00cc3a3a2a18776b75b6931b3986214cce28e03f7f1cb37bb10857c58a
+size 4547
diff --git a/resources/models/opticalBench/controller_overlay/Trigger.png b/resources/models/opticalBench/controller_overlay/Trigger.png
new file mode 100644
index 0000000000000000000000000000000000000000..509c1683ce7645992bf0c33acf30eb995d5a1432
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/Trigger.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ec8f758984ba58427ef40c18422207242352ad34915d4df91fd3cc2b86ffa44
+size 2398
diff --git a/resources/models/opticalBench/controller_overlay/menu_images/Grip1.png b/resources/models/opticalBench/controller_overlay/menu_images/Grip1.png
new file mode 100644
index 0000000000000000000000000000000000000000..10b92aaa6a8fff098825e580f992ee2bb4ebecd7
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/menu_images/Grip1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c7e92357d408ec48fe26d3197fe918fec6b73688e878378193c93cbe51cce30
+size 2554
diff --git a/resources/models/opticalBench/controller_overlay/menu_images/Grip2.png b/resources/models/opticalBench/controller_overlay/menu_images/Grip2.png
new file mode 100644
index 0000000000000000000000000000000000000000..db58e5bdb6997faeb67a72ed26f998e41da514dd
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/menu_images/Grip2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:82ccfb0231d5fc4d2e3d0c7d8d2c6665c16c8a09fdaf508438e917079c5ff016
+size 2642
diff --git a/resources/models/opticalBench/controller_overlay/menu_images/Grip3.png b/resources/models/opticalBench/controller_overlay/menu_images/Grip3.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6620e671cc14f3a70a9520414450c551512c6fb
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/menu_images/Grip3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:64f0adf5e543db0e1b7bd54a006da59b7465e15cbc9028974f70b73bdec134eb
+size 2291
diff --git a/resources/models/opticalBench/controller_overlay/menu_images/Grip_Select.png b/resources/models/opticalBench/controller_overlay/menu_images/Grip_Select.png
new file mode 100644
index 0000000000000000000000000000000000000000..c24a637ab9c56a4d92c477a39cebdc4304614a46
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/menu_images/Grip_Select.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90e1a0be70598d991b383a8399cf419d4ef1f6c140d454063084c7587b306166
+size 2430
diff --git a/resources/models/opticalBench/controller_overlay/menu_images/Trackpad_Rotate.png b/resources/models/opticalBench/controller_overlay/menu_images/Trackpad_Rotate.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a933c9def0a8efae7078766e3e2b534ae04745d
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/menu_images/Trackpad_Rotate.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:55227d1718bfa8b363443edeec576ff6540c9d552b985cec76e62e33b6ca6427
+size 38447
diff --git a/resources/models/opticalBench/controller_overlay/menu_images/Trigger_Grab.png b/resources/models/opticalBench/controller_overlay/menu_images/Trigger_Grab.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7395bc7f559265d0c72e6906bdbf47a7e84f936
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/menu_images/Trigger_Grab.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:78b46ec7b6619b78af851376473b86fe0bef869a27c2741f22a66a2659c2bd0d
+size 3585
diff --git a/resources/models/opticalBench/controller_overlay/menu_images/Trigger_Grabbed.png b/resources/models/opticalBench/controller_overlay/menu_images/Trigger_Grabbed.png
new file mode 100644
index 0000000000000000000000000000000000000000..f470b3ef054b1e4b28e2a7ebe1dda9dd89fcb076
--- /dev/null
+++ b/resources/models/opticalBench/controller_overlay/menu_images/Trigger_Grabbed.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd613282eb6d96e017ecf61115e5a074e71020c42ec80891917b96a1261d24be
+size 3649
diff --git a/resources/models/opticalBench/controller_overlay/untitled.blend b/resources/models/opticalBench/controller_overlay/untitled.blend
new file mode 100644
index 0000000000000000000000000000000000000000..84bc3918ff9f0f97fac915b65cbc23b4cf35d1b4
Binary files /dev/null and b/resources/models/opticalBench/controller_overlay/untitled.blend differ
diff --git a/resources/models/opticalBench/controller_overlay/untitled.blend1 b/resources/models/opticalBench/controller_overlay/untitled.blend1
new file mode 100644
index 0000000000000000000000000000000000000000..246bf64ec65e0e9368c27bb50f65e1f96e3b7ba4
Binary files /dev/null and b/resources/models/opticalBench/controller_overlay/untitled.blend1 differ
diff --git a/resources/shader/phong.frag b/resources/shader/phong.frag
index 58f0eab21f73db2f8f2b5f2e9065b5ce9eb47c44..966591796dd634621d0f55a281709f5c987ad2d8 100644
--- a/resources/shader/phong.frag
+++ b/resources/shader/phong.frag
@@ -53,6 +53,7 @@ layout(std140, binding = 0) uniform Lights {
 out vec4 frag_color;
 
 void main() {
+	if(material.texture_toggle.x != 0 && texture(material.ambient_tex , in_tex_coord).a == 0) discard;
 
 	vec4 color_out = vec4(0.0, 0.0, 0.0, 1.0);