diff --git a/demos/optical_bench/src/lens.cpp b/demos/optical_bench/src/lens.cpp
index 589485e7d69e12fdd052d6aa77c2720796c721ee..c2a909078cdd72844369eefed95eb643279e5101 100644
--- a/demos/optical_bench/src/lens.cpp
+++ b/demos/optical_bench/src/lens.cpp
@@ -48,12 +48,11 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager,
 
   geometry_group_ = manager->getContext()->createGeometryGroup();
   geometry_group_->addChild(geometry);
-  acceleration_structure_ = manager->getContext()->createAcceleration("Trbvh");
+  acceleration_structure_ = manager->GetLensAcceleration();
   geometry_group_->setAcceleration(acceleration_structure_);
 
   transform->setChild<optix::GeometryGroup>(geometry_group_);
   manager->getTopObject()->addChild(transform);
-  manager->getTopObject()->getAcceleration()->markDirty();
 
   // Attach handles
   entity_ = scene->CreateEntity();
@@ -84,6 +83,7 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager,
     transform->setMatrix(true, &(trans[0][0]), &(inverse(trans)[0][0]));
 
     support_rod_->Moved();
+    manager_->ChangedLens();
   });
   selector_->SetExternalUpdate([this]() {
     glm::mat4 trans =
@@ -91,6 +91,7 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager,
     transform->setMatrix(true, &(trans[0][0]), &(inverse(trans)[0][0]));
 
     support_rod_->Moved();
+    manager_->ChangedLens();
   });
 
   // Store if grabbed
@@ -98,13 +99,13 @@ Lens::Lens(phx::Engine* engine, phx::Scene* scene, OptixContextManager* manager,
   selector_->SetRelease([this]() { grabbed_ = false; });
 
   recalcBB();
+  manager_->ChangedLens();
 }
 
 Lens::~Lens() {
   manager_->getTopObject()->removeChild(transform);
   glass_material->destroy();
   geometry->destroy();
-  acceleration_structure_->destroy();
   geometry_group_->destroy();
   transform->destroy();
   delete support_rod_;
@@ -322,11 +323,6 @@ void Lens::recalcBB() {
   selector_->ExternalUpdate();
 }
 
-void Lens::markDirty() {
-  acceleration_structure_->markDirty();
-  manager_->getTopObject()->getAcceleration()->markDirty();
-}
-
 std::string Lens::getTypeString(LensSideType t) {
   switch (t) {
     case CONCAVE:
@@ -340,16 +336,10 @@ std::string Lens::getTypeString(LensSideType t) {
 }
 
 void Lens::CreateGlassMaterialInstance() {
-  optix::Program closeHitP = manager_->getContext()->createProgramFromPTXString(
-      OptixContextManager::getPtxString("glass_perspective_camera.cu"),
-      "closest_hit_radiance");
-  optix::Program closeHitI = manager_->getContext()->createProgramFromPTXString(
-      OptixContextManager::getPtxString("glass_iterative_camera.cu"),
-      "closest_hit_radiance");
-
   glass_material = manager_->getContext()->createMaterial();
-  glass_material->setClosestHitProgram(0, closeHitP);
-  glass_material->setClosestHitProgram(1, closeHitI);
+  glass_material->setClosestHitProgram(0,
+                                       manager_->GetGlassProgramPerspective());
+  glass_material->setClosestHitProgram(1, manager_->GetGlassProgramIterative());
 
   glass_material["importance_cutoff"]->setFloat(1e-2f);
   glass_material["cutoff_color"]->setFloat(0.034f, 0.055f, 0.085f);
diff --git a/demos/optical_bench/src/lens.hpp b/demos/optical_bench/src/lens.hpp
index 46bb523d0cfd207445b94d699a11b9e97982ef77..3279d2073e88bf2de43949e0af37985f3f3a3784 100644
--- a/demos/optical_bench/src/lens.hpp
+++ b/demos/optical_bench/src/lens.hpp
@@ -39,7 +39,7 @@ class Lens {
 
   void SetThickness(float f) {
     geometry["halfCylinderLength"]->setFloat(getCylinderLength(f) / 2);
-    markDirty();
+    manager_->ChangedLens();
     recalcBB();
   };
   float GetThickness() {
@@ -48,20 +48,20 @@ class Lens {
 
   void SetRadius(float f) {
     geometry["radius"]->setFloat(f);
-    markDirty();
+    manager_->ChangedLens();
     recalcBB();
   }
   float GetRadius() { return geometry["radius"]->getFloat(); };
   void SetRadius2(float f) {
     geometry["radius2"]->setFloat(f);
-    markDirty();
+    manager_->ChangedLens();
     recalcBB();
   }
   float GetRadius2() { return geometry["radius2"]->getFloat(); };
 
   void SetLensRadius(float f) {
     geometry["lensRadius"]->setFloat(f);
-    markDirty();
+    manager_->ChangedLens();
     recalcBB();
   }
   float GetLensRadius() { return geometry["lensRadius"]->getFloat(); };
@@ -113,7 +113,6 @@ class Lens {
   GlassType glass_type_ = GlassType::BK7;
   float current_wavelength_nm_ = 0.0f;
   void recalcBB();
-  void markDirty();
   SupportRod* support_rod_;
   OptixContextManager* manager_;
   phx::Selector* selector_;
diff --git a/demos/optical_bench/src/optical_bench.cpp b/demos/optical_bench/src/optical_bench.cpp
index c90805387bda2b0f780942fd9d810006065bad8f..0cb7126ed513e03f50c0ebd8dc7f64da23204717 100644
--- a/demos/optical_bench/src/optical_bench.cpp
+++ b/demos/optical_bench/src/optical_bench.cpp
@@ -123,12 +123,16 @@ int main(int argc, char** args) {
                      .at(0);
 
   input_system->AddKeyPressCallback(
-      [&engine, &viewer_system, &rayPass](char key) {
+      [&engine, &viewer_system, &rayPass, &contextManager](char key) {
         if (key == 'q') engine->Stop();
         if (key == 'f')
           viewer_system->SetShowFramerate(!viewer_system->GetShowFramerate());
         if (key == 'p') rayPass->NextLaserPattern();
         if (key == 'o') rayPass->PreviousLaserPattern();
+
+        static bool usage = true;
+        if (key == 'l') contextManager->EnableUsageCallback(usage);
+        usage = !usage;
       });
 
   std::vector<glm::vec3> light_dir{glm::vec3(0, -1, 0), glm::vec3(0, 1, 0),
diff --git a/demos/optical_bench/src/optix_context_manager.cpp b/demos/optical_bench/src/optix_context_manager.cpp
index ab03ef90d3d9410c3f904906eda7926893874cdd..7bb40fa56886780199d8bc1b393bead9fbaed96b 100644
--- a/demos/optical_bench/src/optix_context_manager.cpp
+++ b/demos/optical_bench/src/optix_context_manager.cpp
@@ -22,11 +22,11 @@
 #include "phx/resources/types/shader_source.hpp"
 #include "phx/scripting/behavior_system.hpp"
 
-/*static void callbackUsageReport(int level, const char* tag, const char* msg,
+static void callbackUsageReport(int level, const char* tag, const char* msg,
                                 void*) {
   std::cout << "[" << level << "][" << std::left << std::setw(12) << tag << "] "
             << msg << std::endl;
-}*/
+}
 
 OptixContextManager::OptixContextManager() {
   phx::ResourceManager::instance().RegisterResourceType(
@@ -58,8 +58,16 @@ OptixContextManager::OptixContextManager() {
   context_->setRayGenerationProgram(0, rayProg);
 
   top_object = context_->createGroup();
-  top_object->setAcceleration(context_->createAcceleration(
-      "NoAccel"));  //("Bvh" , "Bvh") or "Trbvh" or "NoAccel"
+  mainAccel = context_->createAcceleration(
+      "Trbvh");  //("Bvh" , "Bvh") or "Trbvh" or "NoAccel"
+  mainAccel->setProperty("refit", "1");
+  lensAccel = context_->createAcceleration("Trbvh");
+  lensAccel->setProperty("refit", "1");
+  targetAccel = context_->createAcceleration("Trbvh");
+  targetAccel->setProperty("refit", "1");
+
+  top_object->setAcceleration(mainAccel);
+
   context_["top_object"]->set(top_object);
 
   createTargetGeometry();
@@ -68,7 +76,12 @@ OptixContextManager::OptixContextManager() {
   createTargetMaterial();
   createSkybox();
 
-  // context_->setUsageReportCallback(callbackUsageReport, 3, NULL);
+  glassProgPers = context_->createProgramFromPTXString(
+      OptixContextManager::getPtxString("glass_perspective_camera.cu"),
+      "closest_hit_radiance");
+  glassProgIter = context_->createProgramFromPTXString(
+      OptixContextManager::getPtxString("glass_iterative_camera.cu"),
+      "closest_hit_radiance");
 }
 
 OptixContextManager::~OptixContextManager() {
@@ -79,6 +92,13 @@ OptixContextManager::~OptixContextManager() {
     lensGeomerty->destroy();
     targetGeomerty->destroy();
 
+    mainAccel->destroy();
+    lensAccel->destroy();
+    targetAccel->destroy();
+
+    glassProgPers->destroy();
+    glassProgIter->destroy();
+
     context_->destroy();
     context_ = 0;
   }
@@ -114,6 +134,19 @@ void OptixContextManager::launch(unsigned int entryPoint, RTsize width,
   } catch (optix::Exception e) {
     phx::error(e.getErrorString().c_str());
   }
+
+  static bool after_first_launch = true;
+  if (after_first_launch) {
+    mainAccel->markDirty();
+    lensAccel->markDirty();
+    targetAccel->markDirty();
+    after_first_launch = false;
+  }
+}
+
+void OptixContextManager::EnableUsageCallback(bool enabled) {
+  context_->setUsageReportCallback(callbackUsageReport, (enabled) ? 3 : 0,
+                                   NULL);
 }
 
 void OptixContextManager::createDebugMaterial() {
diff --git a/demos/optical_bench/src/optix_context_manager.hpp b/demos/optical_bench/src/optix_context_manager.hpp
index 2af04859d08a9343d6e69a8103c6990ed85cf5d8..b25a5b7000dafba7a895033e3b6ff8c82ead64f1 100644
--- a/demos/optical_bench/src/optix_context_manager.hpp
+++ b/demos/optical_bench/src/optix_context_manager.hpp
@@ -30,6 +30,23 @@ class OptixContextManager {
   optix::Geometry& GetLensGeometry() { return lensGeomerty; }
   optix::Geometry& GetTargetGeometry() { return targetGeomerty; }
 
+  optix::Acceleration& GetLensAcceleration() { return lensAccel; }
+  optix::Acceleration& GetTargetAcceleration() { return targetAccel; }
+
+  optix::Program GetGlassProgramPerspective() { return glassProgPers; }
+  optix::Program GetGlassProgramIterative() { return glassProgIter; }
+
+  void ChangedLens() {
+    lensAccel->markDirty();
+    mainAccel->markDirty();
+  }
+  void ChangedTarget() {
+    targetAccel->markDirty();
+    mainAccel->markDirty();
+  }
+
+  void EnableUsageCallback(bool enabled);
+
  private:
   optix::Context context_;
   optix::Group top_object;
@@ -37,6 +54,11 @@ class OptixContextManager {
   optix::Material targetMaterial;
   optix::Geometry lensGeomerty;
   optix::Geometry targetGeomerty;
+  optix::Acceleration mainAccel;
+  optix::Acceleration lensAccel;
+  optix::Acceleration targetAccel;
+  optix::Program glassProgIter;
+  optix::Program glassProgPers;
 
   void createDebugMaterial();
   void createTargetMaterial();
diff --git a/demos/optical_bench/src/test_pattern_frame.cpp b/demos/optical_bench/src/test_pattern_frame.cpp
index 66903f4e0aef186ae267c7dcde53a2363f26149d..d7e464e571d750b351fa298a568397eab9190159 100644
--- a/demos/optical_bench/src/test_pattern_frame.cpp
+++ b/demos/optical_bench/src/test_pattern_frame.cpp
@@ -25,7 +25,7 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene,
       manager_->GetTargetGeometry(), &material, &material + 1);
   geometry_group = manager_->getContext()->createGeometryGroup();
   geometry_group->addChild(geometry);
-  acceleration = manager_->getContext()->createAcceleration("Trbvh");
+  acceleration = manager_->GetTargetAcceleration();
   geometry_group->setAcceleration(acceleration);
 
   auto image_loaded = phx::ResourceUtils::LoadResourceFromFile<phx::Image>(
@@ -62,6 +62,7 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene,
     glm::mat4 trans =
         entity_->GetFirstComponent<phx::Transform>()->GetGlobalMatrix();
     transform->setMatrix(true, &(trans[0][0]), &(inverse(trans)[0][0]));
+    manager_->ChangedTarget();
   });
 
   selector->SetExternalUpdate([this, selector]() {
@@ -84,7 +85,6 @@ TestPatternFrame::TestPatternFrame(phx::Scene* scene,
 TestPatternFrame::~TestPatternFrame() {
   manager_->getTopObject()->removeChild(transform);
   geometry->destroy();
-  acceleration->destroy();
   geometry_group->destroy();
   transform->destroy();
   delete support_rod_;