public DropTarget getDropTarget(Point pLocation) {
    
    //Convert the point to be relative to the stage
    Point _point = pLocation.getLocation();
    
    //Go through the registered windows and get its components
    Iterator _it = windows.iterator();
    while(_it.hasNext()) {
      Window _win = (Window)_it.next();
      if(_win == currentDragWindow) continue;
      
      //If the WIndow has been disposed
      if(_win == null) {
        _it.remove();
        continue;
      }
      
      //Window must be Visible
      if(_win.isVisible()==false) continue;
                        
      //Point must be in visible stage area
      Dimension _size = _win.getSize();
      Point _loc = _win.getLocation();
      Rectangle _bounds = new Rectangle(_loc, _size);
      
      if(_bounds.contains(_point)==false) continue;
            
      //At this point we know that the point is contained in the stage boundaries
      //and that the stage is Visible
            
      //Get the Component at that location
      SwingUtilities.convertPointFromScreen(_point, _win);
      currentlyOverComp = _win.getComponentAt(_point);
      if(currentlyOverComp != null)
        currentlyOverComp = SwingUtilities.getDeepestComponentAt(currentlyOverComp, _point.x, _point.y);
      else
        currentlyOverComp = _win;
                  
      //Get the Drop Target
      if(currentlyOverComp == null) return defaultDropTarget;
            
      DropTarget _dropTarget = currentlyOverComp.getDropTarget();
      if(_dropTarget != null && _dropTarget.getComponent() != null) return _dropTarget;
      
      //Seach up components for Drop Targets
      return getParentDropTarget(currentlyOverComp);
    }
    
    //Clear currect over Comp
    currentlyOverComp = null;
    
    return defaultDropTarget;
  }