 			}
 			super.attach(obj);
 			if (obj != null) {
-				obj.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
-				obj.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
-				obj.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
-				DisplayObjectContainer(obj).addChild(_shape);
+				obj.addEventListener(Event.ADDED_TO_STAGE, onAdd);
+				obj.addEventListener(Event.REMOVED_FROM_STAGE, onRemove);
+				if (obj.stage != null) onAdd();
 			}
 		}
 		
 		/** @inheritDoc */
 		public override function detach():InteractiveObject
 		{
+			onRemove();
 			if (_object != null) {
-				_object.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
-				_object.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
-				_object.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
+				_object.removeEventListener(Event.ADDED_TO_STAGE, onAdd);
+				_object.removeEventListener(Event.REMOVED_FROM_STAGE, onRemove);
+			}
+			_hit = null;
+			return super.detach();
+		}
+		
+		private function onAdd(evt:Event=null):void
+		{
+			_stage = _object.stage;
+			if (_hit == null) _hit = _stage;
+			_hit.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
+			DisplayObjectContainer(_object).addChild(_shape);
+		}
+		
+		private function onRemove(evt:Event=null):void
+		{
+			if (_hit)
+				_hit.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
+			if (_object)
 				DisplayObjectContainer(_object).removeChild(_shape);
-			}
-			return super.detach();
 		}
 		
 		private function mouseDown(evt:MouseEvent):void
 		{
+			if (_stage == null) return;
+			_stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
+			_stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
+			
 			_r.x = _object.mouseX;
 			_r.y = _object.mouseY;
 			_r.width = 0;

		{
			_drag = false;
			_shape.graphics.clear();
		}
		
		private function renderShape():void {

		private var _r:Rectangle = new Rectangle();
		private var _drag:Boolean = false;
		private var _shape:Shape = new Shape();
		private var _hit:InteractiveObject;
		private var _stage:Stage;
		
		/** Boolean-valued filter function determining which items are eligible
		 *  for selection. */
