diff --git a/public/index.html b/public/index.html
index c61f3e13257323db2e72432b8920612a193dd8fe..2a104e3d8696c1de9e4fa22013743260848752cd 100644
--- a/public/index.html
+++ b/public/index.html
@@ -8,104 +8,121 @@
 
   <!-- three.js -->
   <script src="https://unpkg.com/three@0.126.0/build/three.js"></script>
+
   <script src="https://unpkg.com/three@0.126.0/examples/js/loaders/GLTFLoader.js"></script>
 </head>
 <body>
 
+<!-- Starting an immersive WebXR session requires user interaction.
+    We start this one with a simple button. -->
 <button onclick="activateXR()">Start Hit to Place Demo</button>
 <script>
 async function activateXR() {
-  try {
-    const canvas = document.createElement("canvas");
-    document.body.appendChild(canvas);
-    const gl = canvas.getContext("webgl", {xrCompatible: true});
-
-    const scene = new THREE.Scene();
-
-    const directionalLight = new THREE.DirectionalLight(0xffffff, 1.0);
-    directionalLight.position.set(10, 15, 10);
-    scene.add(directionalLight);
-
-    const renderer = new THREE.WebGLRenderer({
-      alpha: true,
-      preserveDrawingBuffer: true,
-      canvas: canvas,
-      context: gl
-    });
-    renderer.autoClear = false;
-
-    const camera = new THREE.PerspectiveCamera();
-    camera.matrixAutoUpdate = false;
-
-    const session = await navigator.xr.requestSession("immersive-ar", {requiredFeatures: ['hit-test']});
-    session.updateRenderState({
-      baseLayer: new XRWebGLLayer(session, gl)
-    });
-
-    const referenceSpace = await session.requestReferenceSpace('local');
-    const viewerSpace = await session.requestReferenceSpace('viewer');
-    const hitTestSource = await session.requestHitTestSource({ space: viewerSpace });
-
-    const loader = new THREE.GLTFLoader();
-    let reticle;
-    loader.load("https://transfer.hft-stuttgart.de/gitlab/32esla1mpg/webarTTP/-/blolb/master/media/reticle.gltf", function(gltf) {
-      reticle = gltf.scene;
-      reticle.visible = false;
-      scene.add(reticle);
-      console.log("Reticle loaded successfully");
-    }, undefined, function(error) {
-      console.error("Error loading reticle:", error);
-    });
-
-    let model;
-    loader.load("https://transfer.hft-stuttgart.de/gitlab/32esla1mpg/webarTTP/-/blob/master/gltf/sunflower.gltf", function(gltf) {
-      model = gltf.scene;
-      console.log("Model loaded successfully");
-    }, undefined, function(error) {
-      console.error("Error loading model:", error);
-    });
-
-    session.addEventListener("select", (event) => {
-      if (model && reticle.visible) {
-        const clone = model.clone();
-        clone.position.copy(reticle.position);
-        scene.add(clone);
-        console.log("Model placed in scene");
-      }
-    });
-
-    const onXRFrame = (time, frame) => {
-      session.requestAnimationFrame(onXRFrame);
-
-      gl.bindFramebuffer(gl.FRAMEBUFFER, session.renderState.baseLayer.framebuffer);
-
-      const pose = frame.getViewerPose(referenceSpace);
-      if (pose) {
-        const view = pose.views[0];
-        const viewport = session.renderState.baseLayer.getViewport(view);
-        renderer.setSize(viewport.width, viewport.height);
-
-        camera.matrix.fromArray(view.transform.matrix);
-        camera.projectionMatrix.fromArray(view.projectionMatrix);
-        camera.updateMatrixWorld(true);
-
-        const hitTestResults = frame.getHitTestResults(hitTestSource);
-        if (hitTestResults.length > 0 && reticle) {
-          const hitPose = hitTestResults[0].getPose(referenceSpace);
-          reticle.visible = true;
-          reticle.position.set(hitPose.transform.position.x, hitPose.transform.position.y, hitPose.transform.position.z);
-          reticle.updateMatrixWorld(true);
-        } else if (reticle) {
-          reticle.visible = false;
-        }
-
-        renderer.render(scene, camera);
-      }
-    };
-    session.requestAnimationFrame(onXRFrame);
-  } catch (error) {
-    console.error("Error in activateXR:", error);
+  // Add a canvas element and initialize a WebGL context that is compatible with WebXR.
+  const canvas = document.createElement("canvas");
+  document.body.appendChild(canvas);
+  const gl = canvas.getContext("webgl", {xrCompatible: true});
+
+  const scene = new THREE.Scene();
+
+  const directionalLight = new THREE.DirectionalLight(0xffffff, 1.0);
+  directionalLight.position.set(10, 15, 10);
+  scene.add(directionalLight);
+
+// Set up the WebGLRenderer, which handles rendering to the session's base layer.
+const renderer = new THREE.WebGLRenderer({
+  alpha: true,
+  preserveDrawingBuffer: true,
+  canvas: canvas,
+  context: gl
+});
+renderer.autoClear = false;
+
+// The API directly updates the camera matrices.
+// Disable matrix auto updates so three.js doesn't attempt
+// to handle the matrices independently.
+const camera = new THREE.PerspectiveCamera();
+camera.matrixAutoUpdate = false;
+
+// Initialize a WebXR session using "immersive-ar".
+const session = await navigator.xr.requestSession("immersive-ar", {requiredFeatures: ['hit-test']});
+session.updateRenderState({
+  baseLayer: new XRWebGLLayer(session, gl)
+});
+
+// A 'local' reference space has a native origin that is located
+// near the viewer's position at the time the session was created.
+const referenceSpace = await session.requestReferenceSpace('local');
+
+// Create another XRReferenceSpace that has the viewer as the origin.
+const viewerSpace = await session.requestReferenceSpace('viewer');
+// Perform hit testing using the viewer as origin.
+const hitTestSource = await session.requestHitTestSource({ space: viewerSpace });
+
+
+
+
+const loader = new THREE.GLTFLoader();
+let reticle;
+loader.load("https://transfer.hft-stuttgart.de/gitlab/32esla1mpg/webarTTP/-/blolb/master/media/reticle.gltf", function(gltf) {
+  reticle = gltf.scene;
+  reticle.visible = false;
+  scene.add(reticle);
+})
+
+let flower;
+loader.load("https://transfer.hft-stuttgart.de/gitlab/32esla1mpg/webarTTP/-/blob/master/gltf/sunflower.gltf", function(gltf) {
+  flower = gltf.scene;
+});
+
+session.addEventListener("select", (event) => {
+  if (flower) {
+    const clone = flower.clone();
+    clone.position.copy(reticle.position);
+    scene.add(clone);
+  }
+});
+
+// Create a render loop that allows us to draw on the AR view.
+const onXRFrame = (time, frame) => {
+  // Queue up the next draw request.
+  session.requestAnimationFrame(onXRFrame);
+
+  // Bind the graphics framebuffer to the baseLayer's framebuffer
+  gl.bindFramebuffer(gl.FRAMEBUFFER, session.renderState.baseLayer.framebuffer)
+
+  // Retrieve the pose of the device.
+  // XRFrame.getViewerPose can return null while the session attempts to establish tracking.
+  const pose = frame.getViewerPose(referenceSpace);
+  if (pose) {
+    // In mobile AR, we only have one view.
+    const view = pose.views[0];
+
+    const viewport = session.renderState.baseLayer.getViewport(view);
+    renderer.setSize(viewport.width, viewport.height)
+
+    // Use the view's transform matrix and projection matrix to configure the THREE.camera.
+    camera.matrix.fromArray(view.transform.matrix)
+    camera.projectionMatrix.fromArray(view.projectionMatrix);
+    camera.updateMatrixWorld(true);
+
+    const hitTestResults = frame.getHitTestResults(hitTestSource);
+    if (hitTestResults.length > 0 && reticle) {
+      const hitPose = hitTestResults[0].getPose(referenceSpace);
+      reticle.visible = true;
+      reticle.position.set(hitPose.transform.position.x, hitPose.transform.position.y, hitPose.transform.position.z)
+      reticle.updateMatrixWorld(true);
+    }
+
+    
+
+    // Render the scene with THREE.WebGLRenderer.
+    renderer.render(scene, camera)
   }
+}
+session.requestAnimationFrame(onXRFrame);
+
+
 }
 </script>
 </body>