diff --git a/src/assets/images/tunnel.png b/src/assets/images/tunnel.png
new file mode 100644
index 0000000000000000000000000000000000000000..05449ee3c0fe5ca9159614633d25c61d66c85ca9
Binary files /dev/null and b/src/assets/images/tunnel.png differ
diff --git a/src/assets/images/tunnel@2x.png b/src/assets/images/tunnel@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba9524eeb0747fc720f1a1556f2ebf6cb7e2638d
Binary files /dev/null and b/src/assets/images/tunnel@2x.png differ
diff --git a/src/components/shaderlib/CopyShader.js b/src/components/shaderlib/CopyShader.js
deleted file mode 100644
index 8f34f8d49098c4e9d28ad6261cb082626ea66913..0000000000000000000000000000000000000000
--- a/src/components/shaderlib/CopyShader.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * @author alteredq / http://alteredqualia.com/
- *
- * Full-screen textured quad shader
- */
-
-THREE.CopyShader = {
-
-	uniforms: {
-
-		"tDiffuse": { value: null },
-		"opacity":  { value: 1.0 }
-
-	},
-
-	vertexShader: [
-
-		"varying vec2 vUv;",
-
-		"void main() {",
-
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
-
-		"}"
-
-	].join( "\n" ),
-
-	fragmentShader: [
-
-		"uniform float opacity;",
-
-		"uniform sampler2D tDiffuse;",
-
-		"varying vec2 vUv;",
-
-		"void main() {",
-
-			"vec4 texel = texture2D( tDiffuse, vUv );",
-			"gl_FragColor = opacity * texel;",
-
-		"}"
-
-	].join( "\n" )
-
-};
\ No newline at end of file
diff --git a/src/components/shaderlib/EffectComposer.js b/src/components/shaderlib/EffectComposer.js
deleted file mode 100644
index 661c5d44a95197e3a5a20023d371e2c08431da2d..0000000000000000000000000000000000000000
--- a/src/components/shaderlib/EffectComposer.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * @author alteredq / http://alteredqualia.com/
- */
-/* global AFRAME, THREE */
-
-THREE.EffectComposer = function ( renderer, renderTarget ) {
-
-	this.renderer = renderer;
-
-	if ( renderTarget === undefined ) {
-
-		var parameters = {
-			minFilter: THREE.LinearFilter,
-			magFilter: THREE.LinearFilter,
-			format: THREE.RGBAFormat,
-			stencilBuffer: false
-		};
-
-		var size = renderer.getDrawingBufferSize();
-		renderTarget = new THREE.WebGLRenderTarget( size.width, size.height, parameters );
-		renderTarget.texture.name = 'EffectComposer.rt1';
-
-	}
-
-	this.renderTarget1 = renderTarget;
-	this.renderTarget2 = renderTarget.clone();
-	this.renderTarget2.texture.name = 'EffectComposer.rt2';
-
-	this.writeBuffer = this.renderTarget1;
-	this.readBuffer = this.renderTarget2;
-
-	this.passes = [];
-
-	// dependencies
-
-	if ( THREE.CopyShader === undefined ) {
-
-		console.error( 'THREE.EffectComposer relies on THREE.CopyShader' );
-
-	}
-
-	if ( THREE.ShaderPass === undefined ) {
-
-		console.error( 'THREE.EffectComposer relies on THREE.ShaderPass' );
-
-	}
-
-	this.copyPass = new THREE.ShaderPass( THREE.CopyShader );
-
-};
-
-Object.assign( THREE.EffectComposer.prototype, {
-
-	swapBuffers: function () {
-
-		var tmp = this.readBuffer;
-		this.readBuffer = this.writeBuffer;
-		this.writeBuffer = tmp;
-
-	},
-
-	addPass: function ( pass ) {
-
-		this.passes.push( pass );
-
-		var size = this.renderer.getDrawingBufferSize();
-		pass.setSize( size.width, size.height );
-
-	},
-
-	insertPass: function ( pass, index ) {
-
-		this.passes.splice( index, 0, pass );
-
-	},
-
-	render: function ( delta ) {
-
-		var maskActive = false;
-
-		var pass, i, il = this.passes.length;
-
-		for ( i = 0; i < il; i ++ ) {
-
-			pass = this.passes[ i ];
-
-			if ( pass.enabled === false ) continue;
-
-			pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );
-      
-
-			if ( pass.needsSwap ) {
-
-				if ( maskActive ) {
-
-					var context = this.renderer.context;
-
-					context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );
-
-					this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );
-
-					context.stencilFunc( context.EQUAL, 1, 0xffffffff );
-
-				}
-
-				this.swapBuffers();
-
-			}
-
-			if ( THREE.MaskPass !== undefined ) {
-
-				if ( pass instanceof THREE.MaskPass ) {
-
-					maskActive = true;
-
-				} else if ( pass instanceof THREE.ClearMaskPass ) {
-
-					maskActive = false;
-
-				}
-
-			}
-
-		}
-
-	},
-
-	reset: function ( renderTarget ) {
-
-		if ( renderTarget === undefined ) {
-
-			var size = this.renderer.getDrawingBufferSize();
-
-			renderTarget = this.renderTarget1.clone();
-			renderTarget.setSize( size.width, size.height );
-
-		}
-
-		this.renderTarget1.dispose();
-		this.renderTarget2.dispose();
-		this.renderTarget1 = renderTarget;
-		this.renderTarget2 = renderTarget.clone();
-
-		this.writeBuffer = this.renderTarget1;
-		this.readBuffer = this.renderTarget2;
-
-	},
-
-	setSize: function ( width, height ) {
-
-		this.renderTarget1.setSize( width, height );
-		this.renderTarget2.setSize( width, height );
-
-		for ( var i = 0; i < this.passes.length; i ++ ) {
-
-			this.passes[ i ].setSize( width, height );
-
-		}
-
-	}
-
-} );
-
-
-THREE.Pass = function () {
-
-	// if set to true, the pass is processed by the composer
-	this.enabled = true;
-
-	// if set to true, the pass indicates to swap read and write buffer after rendering
-	this.needsSwap = true;
-
-	// if set to true, the pass clears its buffer before rendering
-	this.clear = false;
-
-	// if set to true, the result of the pass is rendered to screen
-	this.renderToScreen = false;
-
-};
-
-Object.assign( THREE.Pass.prototype, {
-
-	setSize: function ( width, height ) {},
-
-	render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
-
-		console.error( 'THREE.Pass: .render() must be implemented in derived pass.' );
-
-	}
-
-} );
\ No newline at end of file
diff --git a/src/components/shaderlib/MaskPass.js b/src/components/shaderlib/MaskPass.js
deleted file mode 100644
index a79834591d8795e21a79c4f77240865966157d58..0000000000000000000000000000000000000000
--- a/src/components/shaderlib/MaskPass.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * @author alteredq / http://alteredqualia.com/
- */
-
-THREE.MaskPass = function ( scene, camera ) {
-
-	THREE.Pass.call( this );
-
-	this.scene = scene;
-	this.camera = camera;
-
-	this.clear = true;
-	this.needsSwap = false;
-
-	this.inverse = false;
-
-};
-
-THREE.MaskPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
-
-	constructor: THREE.MaskPass,
-
-	render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
-
-		var context = renderer.context;
-		var state = renderer.state;
-
-		// don't update color or depth
-
-		state.buffers.color.setMask( false );
-		state.buffers.depth.setMask( false );
-
-		// lock buffers
-
-		state.buffers.color.setLocked( true );
-		state.buffers.depth.setLocked( true );
-
-		// set up stencil
-
-		var writeValue, clearValue;
-
-		if ( this.inverse ) {
-
-			writeValue = 0;
-			clearValue = 1;
-
-		} else {
-
-			writeValue = 1;
-			clearValue = 0;
-
-		}
-
-		state.buffers.stencil.setTest( true );
-		state.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );
-		state.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );
-		state.buffers.stencil.setClear( clearValue );
-
-		// draw into the stencil buffer
-
-		renderer.render( this.scene, this.camera, readBuffer, this.clear );
-		renderer.render( this.scene, this.camera, writeBuffer, this.clear );
-
-		// unlock color and depth buffer for subsequent rendering
-
-		state.buffers.color.setLocked( false );
-		state.buffers.depth.setLocked( false );
-
-		// only render where stencil is set to 1
-
-		state.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff );  // draw if == 1
-		state.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );
-
-	}
-
-} );
-
-
-THREE.ClearMaskPass = function () {
-
-	THREE.Pass.call( this );
-
-	this.needsSwap = false;
-
-};
-
-THREE.ClearMaskPass.prototype = Object.create( THREE.Pass.prototype );
-
-Object.assign( THREE.ClearMaskPass.prototype, {
-
-	render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
-
-		renderer.state.buffers.stencil.setTest( false );
-
-	}
-
-} );
\ No newline at end of file
diff --git a/src/components/shaderlib/RenderPass.js b/src/components/shaderlib/RenderPass.js
deleted file mode 100644
index 94186562860d2f490ba8ad327ad93bac1e387be7..0000000000000000000000000000000000000000
--- a/src/components/shaderlib/RenderPass.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * @author alteredq / http://alteredqualia.com/
- */
-
-THREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {
-
-	THREE.Pass.call( this );
-
-	this.scene = scene;
-	this.camera = camera;
-
-	this.overrideMaterial = overrideMaterial;
-
-	this.clearColor = clearColor;
-	this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0;
-
-	this.clear = true;
-	this.clearDepth = false;
-	this.needsSwap = false;
-
-};
-
-THREE.RenderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
-
-	constructor: THREE.RenderPass,
-
-	render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
-
-		var oldAutoClear = renderer.autoClear;
-		renderer.autoClear = false;
-
-		this.scene.overrideMaterial = this.overrideMaterial;
-
-		var oldClearColor, oldClearAlpha;
-
-		if ( this.clearColor ) {
-
-			oldClearColor = renderer.getClearColor().getHex();
-			oldClearAlpha = renderer.getClearAlpha();
-
-			renderer.setClearColor( this.clearColor, this.clearAlpha );
-
-		}
-
-		if ( this.clearDepth ) {
-
-			renderer.clearDepth();
-
-		}
-
-		renderer.render( this.scene, this.camera, this.renderToScreen ? null : readBuffer, this.clear );
-
-		if ( this.clearColor ) {
-
-			renderer.setClearColor( oldClearColor, oldClearAlpha );
-
-		}
-
-		this.scene.overrideMaterial = null;
-		renderer.autoClear = oldAutoClear;
-	}
-
-} );
\ No newline at end of file
diff --git a/src/components/shaderlib/ShaderPass.js b/src/components/shaderlib/ShaderPass.js
deleted file mode 100644
index 916470f409e826702fd2ef4f497147ba19372b10..0000000000000000000000000000000000000000
--- a/src/components/shaderlib/ShaderPass.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * @author alteredq / http://alteredqualia.com/
- */
-
-/* global variable: AFRAME, THREE */
-
-THREE.ShaderPass = function ( shader, textureID ) {
-
-	THREE.Pass.call( this );
-
-	this.textureID = ( textureID !== undefined ) ? textureID : "tDiffuse";
-
-	if ( shader instanceof THREE.ShaderMaterial ) {
-
-		this.uniforms = shader.uniforms;
-
-		this.material = shader;
-
-	} else if ( shader ) {
-
-		this.uniforms = THREE.UniformsUtils.clone( shader.uniforms );
-
-		this.material = new THREE.ShaderMaterial( {
-
-			defines: Object.assign( {}, shader.defines ),
-			uniforms: this.uniforms,
-			vertexShader: shader.vertexShader,
-			fragmentShader: shader.fragmentShader
-
-		} );
-
-	}
-
-	this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
-	this.scene = new THREE.Scene();
-
-	this.quad = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), null );
-	this.quad.frustumCulled = false; // Avoid getting clipped
-	this.scene.add( this.quad );
-
-};
-
-THREE.ShaderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
-
-	constructor: THREE.ShaderPass,
-
-	render: function( renderer, writeBuffer, readBuffer, delta, maskActive ) {
-
-		if ( this.uniforms[ this.textureID ] ) {
-
-			this.uniforms[ this.textureID ].value = readBuffer.texture;
-
-		}
-
-		this.quad.material = this.material;
-
-		if ( this.renderToScreen ) {
-
-			renderer.render( this.scene, this.camera );
-
-		} else {
-
-			renderer.render( this.scene, this.camera, writeBuffer, this.clear );
-
-		}
-
-	}
-
-} );
\ No newline at end of file
diff --git a/src/components/shaderlib/VignetteShader.js b/src/components/shaderlib/VignetteShader.js
deleted file mode 100644
index e438b8abdb3c11391b589aaf138c760eb23c8cca..0000000000000000000000000000000000000000
--- a/src/components/shaderlib/VignetteShader.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * @author alteredq / http://alteredqualia.com/
- *
- * Vignette shader
- * based on PaintEffect postprocess from ro.me
- * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js
- */
-
-THREE.VignetteShader = {
-
-	uniforms: {
-
-		"tDiffuse": { value: null },
-		"offset":   { value: 1.5 },
-		"darkness": { value: 1.6 }
-
-	},
-
-	vertexShader: [
-
-		"varying vec2 vUv;",
-
-		"void main() {",
-
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
-
-		"}"
-
-	].join( "\n" ),
-
-	fragmentShader: [
-
-		"uniform float offset;",
-		"uniform float darkness;",
-
-		"uniform sampler2D tDiffuse;",
-
-		"varying vec2 vUv;",
-
-		"void main() {",
-
-			// Eskil's vignette
-
-			"vec4 texel = texture2D( tDiffuse, vUv );",
-			"vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );",
-			"gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );",
-
-			/*
-			// alternative version from glfx.js
-			// this one makes more "dusty" look (as opposed to "burned")
-			"vec4 color = texture2D( tDiffuse, vUv );",
-			"float dist = distance( vUv, vec2( 0.5 ) );",
-			"color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );",
-			"gl_FragColor = color;",
-			*/
-
-		"}"
-
-	].join( "\n" )
-
-};
\ No newline at end of file
diff --git a/src/components/tunnel-effect.js b/src/components/tunnel-effect.js
index 4e0790592581eeacb0aeca721d814a9a8847f496..a9e0b2d322c72a3c845267e75643768affa58c33 100644
--- a/src/components/tunnel-effect.js
+++ b/src/components/tunnel-effect.js
@@ -5,72 +5,48 @@ import "./shaderlib/MaskPass";
 import "./shaderlib/CopyShader";
 import "./shaderlib/VignetteShader";
 
-AFRAME.registerComponent('tunnel-effect', {
-  init: function () {
-    console.log('init');
-    this.obj = null;
-    this.vrStarted = false;
-    var self = this;
-    var initVars = this._initVars.bind(self);
-    this.el.addEventListener('renderstart', initVars);
+AFRAME.registerComponent('tunneleffect', {
+  schema: {
+    checkThresholdMs: {type: 'number', default: 200},
+    
   },
-
-  _initVars: function () {
-    console.log('vars');
-    this.obj = this.el;
-    this.scene = this.obj.object3D;
-    this.camera = this.obj.camera;
-    this.renderer = this.obj.renderer;
-    this.composer = new THREE.EffectComposer(this.renderer);
-    this.pass = new THREE.RenderPass(this.scene, this.camera);
-    this.composer.addPass(this.pass);
-    this._vignetteEffect();
-    this.vrStarted = true;
-    this.t = 0;
+  init: function () {
+    this.scene = this.el.sceneEl;
+    this.image = document.querySelector('#tunnel-effect');
+    this.isMoving = 0;
+    this.image.setAttribute('visible', false);
+    const openTunnelEffect = this._openTunnelEffect.bind(this);
+    this.scene.addEventListener('move', openTunnelEffect);
     this.dt = 0;
-    this.bind();
-  },
-
-  _vignetteEffect: function () {
-    this.shaderVignette = THREE.VignetteShader;
-	  this.effectVignette = new THREE.ShaderPass( this.shaderVignette );
-    this.effectVignette.renderToScreen = true;
-    this.composer.addPass(this.effectVignette);
+    this.t = 0;
+    this.threshold = 300;
   },
 
-  tick: function (t, dt) {
-    // console.log('system ticks');
-    this.t = t;
-    this.dt = dt;
+  _openTunnelEffect: function () {
+    if (!this.isMoving) {
+      this.image.setAttribute('visible', true);
+      this.isMoving = true;
+    }
+    this.t = this.scene.time;
   },
 
-  tock: function (t, dt) {
+  _closeTunnelEffect: function () {
+    console.log('visible false');
   },
 
-  renderPass: function (t) {
-    // console.log(this.composer);
-    this.composer.render(t);
-  },
+  tick: function (time, deltaTime) {
+    if (this.isMoving && time - this.t > this.threshold) {
+      this.isMoving = false;
+      this.image.setAttribute('visible', false);
+      this.t = time;
+    }
 
-  registerComponent: function () {
   },
 
-  bind: function () {
-    const renderer = this.obj.renderer;
-    const render = renderer.render;
-    const system = this;
-    let isDigest = false;
+  play: function () {
+    // this._closeTunnelEffect();
 
-    renderer.render = function () {
-      if (isDigest) {
-        render.apply(this, arguments);
-      } else {
-        isDigest = true;
-        system.composer.render(system.dt);
-        isDigest = false;
-      }
-    };
-}
+  }
 
 });
 
diff --git a/src/hub.html b/src/hub.html
index 5a41374424ee13ce96b1b7e9b7b43e735fc8bf98..5553349f291a6e49a319ab7fb9ba849acb72af73 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -34,7 +34,6 @@
     </audio>
 
     <a-scene
-        tunnel-effect
         renderer="antialias: true"
         networked-scene="adapter: janus; audio: true; debug: true; connectOnLoad: false;"
         physics="gravity: -6;"
@@ -268,10 +267,12 @@
                 id="player-camera"
                 class="camera"
                 camera
+                tunneleffect
                 position="0 1.6 0"
                 personal-space-bubble="radius: 0.4"
                 pitch-yaw-rotator
             >
+              <a-image id="tunnel-effect" src="#tunnel" visible="false" position="0.00 0 -0.03" width="0.36" height="0.12"></a-image>
                 <a-entity
                     id="gaze-teleport"
                     position = "0.15 0 0"