 			dispatchEvent(marshaledEvent);
 	}
 
-	private function eventListenerRequestHandler(event:Event):void
-	{
-		if (event is EventListenerRequest)
-			return;
+    private function eventListenerRequestHandler(event:Event):void
+    {
+        if (event is EventListenerRequest)
+            return;
 
         var actualType:String;
-		var request:EventListenerRequest = EventListenerRequest.marshal(event);
-		if (event.type == EventListenerRequest.ADD_EVENT_LISTENER_REQUEST)
-		{
-			if (!eventProxy)
-			{
-				eventProxy = new EventProxy(this);
-			}
-			
-			actualType = EventUtil.sandboxMouseEventMap[request.eventType];
-			if (actualType)
-			{
-				if (isTopLevelRoot())
-				{
-					stage.addEventListener(MouseEvent.MOUSE_MOVE, resetMouseCursorTracking, true, EventPriority.CURSOR_MANAGEMENT + 1, true);
-				}
-				else
-				{
-					super.addEventListener(MouseEvent.MOUSE_MOVE, resetMouseCursorTracking, true, EventPriority.CURSOR_MANAGEMENT + 1, true);
-				}
-
-				addEventListenerToSandboxes(request.eventType, sandboxMouseListener,
-							request.useCapture, request.priority, request.useWeakReference, event.target as IEventDispatcher);
-				if (getSandboxRoot() == this)
+        var request:EventListenerRequest = EventListenerRequest.marshal(event);
+        if (event.type == EventListenerRequest.ADD_EVENT_LISTENER_REQUEST)
+        {
+            if (!eventProxy)
+            {
+                eventProxy = new EventProxy(this);
+            }
+            
+            actualType = EventUtil.sandboxMouseEventMap[request.eventType];
+            if (actualType)
+            {
+                if (isTopLevelRoot())
+                {
+                    stage.addEventListener(MouseEvent.MOUSE_MOVE, resetMouseCursorTracking, true, EventPriority.CURSOR_MANAGEMENT + 1, true);
+                }
+                else
+                {
+                    super.addEventListener(MouseEvent.MOUSE_MOVE, resetMouseCursorTracking, true, EventPriority.CURSOR_MANAGEMENT + 1, true);
+                }
+
+                // add listeners in other sandboxes in capture mode so we don't miss anything
+                addEventListenerToSandboxes(request.eventType, sandboxMouseListener,
+                            true, request.priority, request.useWeakReference, event.target as IEventDispatcher);
+                addEventListenerToOtherSystemManagers(request.eventType, otherSystemManagerMouseListener, 
+                            true, request.priority, request.useWeakReference);
+                if (getSandboxRoot() == this)
+                {
+                    if (isTopLevelRoot() && actualType == MouseEvent.MOUSE_UP)
+                    {
+                        stage.addEventListener(actualType, eventProxy.marshalListener,
+                            false, request.priority, request.useWeakReference);
+                    }
+
                     super.addEventListener(actualType, eventProxy.marshalListener,
-                            request.useCapture, request.priority, request.useWeakReference);
-			}
-		}
-		else if (event.type == EventListenerRequest.REMOVE_EVENT_LISTENER_REQUEST)
+                        true, request.priority, request.useWeakReference);
+                }
+            }
+        }
+        else if (event.type == EventListenerRequest.REMOVE_EVENT_LISTENER_REQUEST)
         {
             actualType = EventUtil.sandboxMouseEventMap[request.eventType];
             if (actualType)
             {
+                removeEventListenerFromOtherSystemManagers(request.eventType, otherSystemManagerMouseListener, true);
                 removeEventListenerFromSandboxes(request.eventType, sandboxMouseListener,
-                            request.useCapture, event.target as IEventDispatcher);
+                            true, event.target as IEventDispatcher);
                 if (getSandboxRoot() == this)
-                    super.removeEventListener(actualType, eventProxy.marshalListener,
-                            request.useCapture);
+                {
+                    if (isTopLevelRoot() && actualType == MouseEvent.MOUSE_UP)
+                    {
+                        stage.removeEventListener(actualType, eventProxy.marshalListener);
+                    }
+
+                    super.removeEventListener(actualType, eventProxy.marshalListener, true);
+                }
             }
-        }		
-	}
- 
+        }       
+    }
 	
 	/**
 	 *  Returns <code>true</code> if the given DisplayObject is the 

        // popup, then don't host the pop up.
        if (event.target != this)
        {
            var bridgeProvider:ISWFBridgeProvider = swfBridgeGroup.getChildBridgeProvider(popUpRequest.requestor);
            if (!SecurityUtil.hasMutualTrustBetweenParentAndChild(bridgeProvider))
            {
                return;

		var parentBridge:IEventDispatcher = swfBridgeGroup.parentBridge;
		if (parentBridge && parentBridge != skip)
		{
            // Ensure the requestor property has the correct bridge.
            if (clone is SWFBridgeRequest)
                SWFBridgeRequest(clone).requestor = parentBridge;
                
			parentBridge.dispatchEvent(clone);
		}
		
		var children:Array = swfBridgeGroup.getChildBridges();
		for (var i:int = 0; i < children.length; i++)
		{
			if (children[i] != skip)
			{
