 			scene.bindings.removeCallback('worldToScreen', worldToScreenChangedHandler);
             
 			mesh.localToWorldTransformChanged.remove(meshLocalToWorldChangedHandler);
-            mesh.visibilityChanged.remove(visiblityChangedHandler);
-            mesh.removed.remove(meshRemovedHandler);
-			if (mesh.parent)
-				mesh.parent.computedVisibilityChanged.remove(visiblityChangedHandler);
-		}
-		
-        private function visiblityChangedHandler(node : ISceneNode, visibility : Boolean) : void
+            mesh.computedVisibilityChanged.remove(computedVisiblityChangedHandler);
+            mesh.bindings.removeProvider(_data);
+		}
+		
+        private function computedVisiblityChangedHandler(node               : ISceneNode,
+                                                         computedVisibility : Boolean) : void
         {
-			var computedVisibility : Boolean = _mesh.visible && _mesh.parent.computedVisibility
-				&& (_frustumCulling == FrustumCulling.DISABLED || _insideFrustum);
-			
-			_data.computedVisibility = computedVisibility;
-            _mesh.computedVisibilityChanged.execute(_mesh, computedVisibility);
+            _data.computedVisibility = computedVisibility;
         }
         
 		private function worldToScreenChangedHandler(bindings	    : DataBindings,

		
		override public function clone() : AbstractController
		{
			return new MeshVisibilityController();;
		}
	}
}

            
            meshLocalToWorldChangedHandler(mesh, mesh.getLocalToWorldTransform());
			mesh.localToWorldTransformChanged.add(meshLocalToWorldChangedHandler);
            mesh.computedVisibilityChanged.add(computedVisiblityChangedHandler);
            mesh.bindings.addProvider(_data);
		}
		
		private function removedHandler(mesh : Mesh, ancestor : Group) : void
		{
			var scene : Scene = ancestor.scene;
