 				delete _effectToMeshes[meshEffect];
 				meshEffect.passesChanged.remove(effectPassesChangedHandler);
 			}
+			
+			//remove to visibility change signal
+			mesh.visibilityChanged.remove(meshVisibilityChangedHandler);
 		}
 		
 		private function meshVisibilityChangedHandler(mesh		 : Mesh,

			for (var drawCallId : uint = 0; drawCallId < numPasses; ++drawCallId)
			{
				// retrieve drawcall, and shaderInstance
				var drawCall		: DrawCall		= drawCalls[drawCallId];
				var passInstance	: ShaderInstance	= _drawCallToPassInstance[drawCall];
				
				unbind(passInstance, drawCall, meshBindings);

			{
				// fork pass if needed
				var asShader		: ActionScriptShader	= meshEffect.getPass(i);
				var passInstance	: ShaderInstance		= asShader.fork(meshBindings, sceneBindings);
				
				// create drawcall
				var drawCall		: DrawCall		= new DrawCall();
