changeset 11757:28ef4bffb994

Merge
author ddehaven
date Tue, 14 Apr 2015 10:15:54 -0700
parents 5c30932415d8 (current diff) 7f272eeff5ab (diff)
children 4614108d5295 2b5dd8a936de
files
diffstat 117 files changed, 36484 insertions(+), 213 deletions(-) [+]
line wrap: on
line diff
--- a/make/copy/Copy-java.base.gmk	Tue Apr 14 14:22:13 2015 +0200
+++ b/make/copy/Copy-java.base.gmk	Tue Apr 14 10:15:54 2015 -0700
@@ -170,9 +170,6 @@
 
 ifeq ($(OPENJDK_TARGET_OS), windows)
   POLICY_SRC_LIST += $(JDK_TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS)/conf/security/java.policy
-  ifndef OPENJDK
-    POLICY_SRC_LIST += $(JDK_TOPDIR)/src/closed/java.base/$(OPENJDK_TARGET_OS)/conf/security/java.policy
-  endif
 endif
 
 POLICY_SRC_LIST += $(POLICY_SRC)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/copy/Copy-jdk.accessibility.gmk	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2104, 2015, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+include CopyCommon.gmk
+
+################################################################################
+
+ifeq ($(OPENJDK_TARGET_OS), windows)
+  TARGETS += $(INCLUDE_DST_OS_DIR)/bridge/AccessBridgeCallbacks.h \
+      $(INCLUDE_DST_OS_DIR)/bridge/AccessBridgeCalls.h \
+      $(INCLUDE_DST_OS_DIR)/bridge/AccessBridgePackages.h \
+      $(INCLUDE_DST_OS_DIR)/bridge/AccessBridgeCalls.c \
+      $(CONF_DST_DIR)/accessibility.properties
+
+  $(INCLUDE_DST_OS_DIR)/bridge/%: \
+      $(JDK_TOPDIR)/src/jdk.accessibility/windows/native/include/bridge/%
+		$(install-file)
+
+  $(CONF_DST_DIR)/accessibility.properties: \
+      $(JDK_TOPDIR)/src/jdk.accessibility/windows/conf/accessibility.properties
+		$(install-file)
+
+endif
+
+################################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/launcher/Launcher-jdk.accessibility.gmk	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+include LauncherCommon.gmk
+
+################################################################################
+# jabswitch
+
+ifeq ($(OPENJDK_TARGET_OS), windows)
+
+  JABSWITCH_SRC := $(JDK_TOPDIR)/src/jdk.accessibility/windows/native/jabswitch
+  ACCESSBRIDGE_SRC := $(JDK_TOPDIR)/src/jdk.accessibility/windows/native/common
+
+  $(eval $(call SetupNativeCompilation,BUILD_JABSWITCH, \
+      SRC := $(JABSWITCH_SRC), \
+      INCLUDE_FILES := jabswitch.cpp, \
+      LANG := C++, \
+      CFLAGS := $(filter-out -Zc:wchar_t-, $(CFLAGS_JDKEXE)) -Zc:wchar_t \
+          -analyze- -Od -Gd -D_WINDOWS \
+          -D_UNICODE -DUNICODE -RTC1 -EHsc, \
+      DISABLED_WARNINGS_microsoft := 4267, \
+      LDFLAGS := $(LDFLAGS_JDKEXE) \
+          Advapi32.lib Version.lib User32.lib, \
+      OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/jdk.accessibility/jabswitch, \
+      OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/modules_cmds/jdk.accessibility, \
+      PROGRAM := jabswitch, \
+      DEBUG_SYMBOLS := true, \
+      VERSIONINFO_RESOURCE := $(ACCESSBRIDGE_SRC)/AccessBridgeStatusWindow.RC, \
+      RC_FLAGS := $(RC_FLAGS) \
+          -D "JDK_FNAME=jabswitch.exe" \
+          -D "JDK_INTERNAL_NAME=jabswitch" \
+          -D "JDK_FTYPE=0x01L", \
+      MANIFEST := $(JABSWITCH_SRC)/jabswitch.manifest))
+
+  TARGETS += $(BUILD_JABSWITCH)
+endif
+
+################################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/lib/Lib-jdk.accessibility.gmk	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,138 @@
+#
+# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+include LibCommon.gmk
+
+################################################################################
+
+ifeq ($(OPENJDK_TARGET_OS), windows)
+
+  ROOT_SRCDIR := $(JDK_TOPDIR)/src/jdk.accessibility/windows/native
+  JAVA_AB_SRCDIR := $(ROOT_SRCDIR)/libjavaaccessbridge $(ROOT_SRCDIR)/common
+  WIN_AB_SRCDIR := $(ROOT_SRCDIR)/libwindowsaccessbridge $(ROOT_SRCDIR)/common
+  SYSINFO_SRCDIR := $(ROOT_SRCDIR)/libjabsysinfo
+  ACCESSBRIDGE_CFLAGS := -I$(SUPPORT_OUTPUTDIR)/headers/jdk.accessibility \
+      -I$(JDK_TOPDIR)/src/java.desktop/windows/native/include \
+      -I$(JDK_TOPDIR)/src/java.desktop/share/native/include
+
+  define SetupJavaDLL
+    # Parameter 1 Suffix
+    # Parameter 2 ACCESSBRIDGE_ARCH_ suffix
+
+    $(call SetupNativeCompilation,BUILD_JAVAACCESSBRIDGE$1, \
+        LIBRARY = javaaccessbridge$1, \
+        OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
+        SRC := $(JAVA_AB_SRCDIR), \
+        LANG := C++, \
+        OPTIMIZATION := LOW, \
+        CFLAGS := $(CFLAGS_JDKLIB) $(ACCESSBRIDGE_CFLAGS) \
+            $(addprefix -I,$(JAVA_AB_SRCDIR)) \
+            -I$(JDK_TOPDIR)/src/jdk.accessibility/windows/native/include/bridge \
+            -DACCESSBRIDGE_ARCH_$2, \
+        LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \
+            winspool.lib comdlg32.lib advapi32.lib shell32.lib \
+            $(SUPPORT_OUTPUTDIR)/native/java.desktop/libjawt/jawt.lib \
+            ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \
+            -subsystem:windows, \
+        VERSIONINFO_RESOURCE := $(ROOT_SRCDIR)/common/AccessBridgeStatusWindow.rc, \
+        RC_FLAGS := $(RC_FLAGS) \
+            -D "JDK_FNAME=javaaccessbridge$1.dll" \
+            -D "JDK_INTERNAL_NAME=javaaccessbridge$1" \
+            -D "JDK_FTYPE=0x02L", \
+        OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjavaaccessbridge$1, \
+        DEBUG_SYMBOLS := true)
+
+    $$(BUILD_JAVAACCESSBRIDGE$1): $(SUPPORT_OUTPUTDIR)/native/java.desktop/libjawt/jawt.lib
+
+    TARGETS += $$(BUILD_JAVAACCESSBRIDGE$1)
+  endef
+
+  define SetupWinDLL
+    # Parameter 1 Suffix
+    # Parameter 2 ACCESSBRIDGE_ARCH_ suffix
+    $(call SetupNativeCompilation,BUILD_WINDOWSACCESSBRIDGE$1, \
+        LIBRARY = windowsaccessbridge$1, \
+        OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
+        SRC := $(WIN_AB_SRCDIR), \
+        LANG := C++, \
+        OPTIMIZATION := LOW, \
+        CFLAGS := $(filter-out -MD, $(CFLAGS_JDKLIB)) -MT $(ACCESSBRIDGE_CFLAGS) \
+            $(addprefix -I,$(WIN_AB_SRCDIR)) \
+            -I$(JDK_TOPDIR)/src/jdk.accessibility/windows/native/include/bridge \
+            -DACCESSBRIDGE_ARCH_$2, \
+        LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \
+            winspool.lib comdlg32.lib advapi32.lib shell32.lib \
+            ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \
+            -subsystem:windows \
+            -def:$(ROOT_SRCDIR)/libwindowsaccessbridge/WinAccessBridge.DEF, \
+        VERSIONINFO_RESOURCE := $(ROOT_SRCDIR)/common/AccessBridgeStatusWindow.rc, \
+        RC_FLAGS := $(RC_FLAGS) \
+            -D "JDK_FNAME=windowsaccessbridge$1.dll" \
+            -D "JDK_INTERNAL_NAME=windowsaccessbridge$1" \
+            -D "JDK_FTYPE=0x02L", \
+        OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libwindowsaccessbridge$1, \
+        DEBUG_SYMBOLS := true)
+
+    TARGETS += $$(BUILD_WINDOWSACCESSBRIDGE$1)
+
+  endef
+
+  define SetupAccessBridgeSysInfo
+
+    $(call SetupNativeCompilation,BUILD_ACCESSBRIDGESYSINFO, \
+        LIBRARY = jabsysinfo, \
+        OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
+        SRC := $(SYSINFO_SRCDIR), \
+        LANG := C++, \
+        OPTIMIZATION := LOW, \
+        CFLAGS := $(CFLAGS_JDKLIB) $(ACCESSBRIDGE_CFLAGS), \
+        LDFLAGS := $(LDFLAGS_JDKLIB) \
+            -subsystem:windows -machine:I386, \
+        VERSIONINFO_RESOURCE := $(ROOT_SRCDIR)/common/AccessBridgeStatusWindow.rc, \
+        RC_FLAGS := $(RC_FLAGS) \
+            -D "JDK_FNAME=jabsysinfo.dll" \
+            -D "JDK_INTERNAL_NAME=jabsysinfo" \
+            -D "JDK_FTYPE=0x02L", \
+        OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/lib/libjabsysinfo, \
+        DEBUG_SYMBOLS := true)
+
+    TARGETS += $$(BUILD_ACCESSBRIDGESYSINFO)
+
+  endef
+
+  ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
+    $(eval $(call SetupAccessBridgeSysInfo))
+    $(eval $(call SetupJavaDLL,-32,32))
+    $(eval $(call SetupJavaDLL,,LEGACY))
+    $(eval $(call SetupWinDLL,-32,32))
+    $(eval $(call SetupWinDLL,,LEGACY))
+  else
+    $(eval $(call SetupJavaDLL,,64))
+    $(eval $(call SetupWinDLL,-64,64))
+  endif
+
+endif
+
+################################################################################
--- a/make/src/classes/build/tools/module/ext.modules	Tue Apr 14 14:22:13 2015 +0200
+++ b/make/src/classes/build/tools/module/ext.modules	Tue Apr 14 10:15:54 2015 -0700
@@ -4,7 +4,7 @@
 java.transaction
 java.xml.bind
 java.xml.ws
-jdk.accessbridge
+jdk.accessibility
 jdk.crypto.ec
 jdk.crypto.mscapi
 jdk.crypto.pkcs11
--- a/src/java.base/windows/conf/security/java.policy	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.base/windows/conf/security/java.policy	Tue Apr 14 10:15:54 2015 -0700
@@ -6,3 +6,7 @@
         permission java.security.SecurityPermission "clearProviderProperties.SunMSCAPI";
         permission java.security.SecurityPermission "removeProviderProperty.SunMSCAPI";
 };
+
+grant codeBase "jrt:/jdk.accessibility" {
+        permission java.security.AllPermission;
+};
--- a/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollPaneUI.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollPaneUI.java	Tue Apr 14 10:15:54 2015 -0700
@@ -29,6 +29,7 @@
 
 import javax.swing.*;
 import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.basic.BasicScrollPaneUI;
 
 public class AquaScrollPaneUI extends javax.swing.plaf.basic.BasicScrollPaneUI {
     public static ComponentUI createUI(final JComponent x) {
@@ -39,28 +40,9 @@
         return new XYMouseWheelHandler();
     }
 
-    // This is a grody hack to trick BasicScrollPaneUI into scrolling horizontally
-    // when we notice that the shift key is down. This should be removed when AWT/Swing
-    // becomes aware of multi-axis scroll wheels.
-    protected class XYMouseWheelHandler extends javax.swing.plaf.basic.BasicScrollPaneUI.MouseWheelHandler {
+    protected class XYMouseWheelHandler extends BasicScrollPaneUI.MouseWheelHandler {
         public void mouseWheelMoved(final MouseWheelEvent e) {
-            JScrollBar vScrollBar = null;
-            boolean wasVisible = false;
-
-            if (e.isShiftDown()) {
-                vScrollBar = scrollpane.getVerticalScrollBar();
-                if (vScrollBar != null) {
-                    wasVisible = vScrollBar.isVisible();
-                    vScrollBar.setVisible(false);
-                }
-            }
-
             super.mouseWheelMoved(e);
-
-            if (wasVisible) {
-                vScrollBar.setVisible(true);
-            }
-
             // Consume the event even when the scrollBar is invisible
             // see #7124320
             e.consume();
--- a/src/java.desktop/macosx/classes/sun/lwawt/LWCheckboxPeer.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/macosx/classes/sun/lwawt/LWCheckboxPeer.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -132,7 +132,9 @@
     @Override
     public void setState(final boolean state) {
         synchronized (getDelegateLock()) {
+            getDelegate().getCurrentButton().removeItemListener(this);
             getDelegate().setSelected(state);
+            getDelegate().getCurrentButton().addItemListener(this);
         }
         repaintPeer();
     }
--- a/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1296,6 +1296,12 @@
         }
 
         KeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance();
+
+        if (!becomesFocused && kfmPeer.getCurrentFocusedWindow() != getTarget()) {
+            // late window focus lost event - ingoring
+            return;
+        }
+
         kfmPeer.setCurrentFocusedWindow(becomesFocused ? getTarget() : null);
 
         int eventID = becomesFocused ? WindowEvent.WINDOW_GAINED_FOCUS : WindowEvent.WINDOW_LOST_FOCUS;
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CClipboard.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CClipboard.java	Tue Apr 14 10:15:54 2015 -0700
@@ -57,6 +57,18 @@
     }
 
     @Override
+    public synchronized Transferable getContents(Object requestor) {
+        checkPasteboardAndNotify();
+        return super.getContents(requestor);
+    }
+
+    @Override
+    protected synchronized Transferable getContextContents() {
+        checkPasteboardAndNotify();
+        return super.getContextContents();
+    }
+
+    @Override
     protected void setContentsNative(Transferable contents) {
         FlavorTable flavorMap = getDefaultFlavorTable();
         // Don't use delayed Clipboard rendering for the Transferable's data.
@@ -116,13 +128,20 @@
     private native void declareTypes(long[] formats, SunClipboard newOwner);
     private native void setData(byte[] data, long format);
 
+    void checkPasteboardAndNotify() {
+        if (checkPasteboardWithoutNotification()) {
+            notifyChanged();
+            lostOwnershipNow(null);
+        }
+    }
+
     /**
      * Invokes native check whether a change count on the general pasteboard is different
      * than when we set it. The different count value means the current owner lost
      * pasteboard ownership and someone else put data on the clipboard.
      * @since 1.7
      */
-    native void checkPasteboard();
+    native boolean checkPasteboardWithoutNotification();
 
     /*** Native Callbacks ***/
     private void notifyLostOwnership() {
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java	Tue Apr 14 10:15:54 2015 -0700
@@ -123,7 +123,7 @@
             // it won't be invoced if focuse is moved to a html element
             // on the same page.
             CClipboard clipboard = (CClipboard) Toolkit.getDefaultToolkit().getSystemClipboard();
-            clipboard.checkPasteboard();
+            clipboard.checkPasteboardAndNotify();
         }
         if (parentWindowActive) {
             responder.handleWindowFocusEvent(focused, null);
@@ -164,7 +164,7 @@
         }
         // ignore focus "lost" native request as it may mistakenly
         // deactivate active window (see 8001161)
-        if (globalFocusedWindow == this && parentWindowActive) {
+        if (globalFocusedWindow == this) {
             responder.handleWindowFocusEvent(parentWindowActive, null);
         }
     }
--- a/src/java.desktop/macosx/native/libawt_lwawt/awt/CClipboard.m	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/CClipboard.m	Tue Apr 14 10:15:54 2015 -0700
@@ -107,6 +107,19 @@
     }
 }
 
+- (BOOL) checkPasteboardWithoutNotification:(id)application {
+    AWT_ASSERT_APPKIT_THREAD;
+    
+    NSInteger newChangeCount = [[NSPasteboard generalPasteboard] changeCount];
+    
+    if (self.changeCount != newChangeCount) {
+        self.changeCount = newChangeCount;    
+        return YES;
+    } else {
+        return NO;
+    }
+}
+
 @end
 
 /*
@@ -260,21 +273,20 @@
     return returnValue;
 }
 
-/*
- * Class:     sun_lwawt_macosx_CClipboard
- * Method:    checkPasteboard
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CClipboard_checkPasteboard
-(JNIEnv *env, jobject inObject )
-{
-JNF_COCOA_ENTER(env);
-
-    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
-        [[CClipboard sharedClipboard] checkPasteboard:nil];
-    }];
-        
-JNF_COCOA_EXIT(env);
-}
-
-
+/*                                                                                            
+ * Class:     sun_lwawt_macosx_CClipboard                                                     
+ * Method:    checkPasteboard                                                                 
+ * Signature: ()V                                                                             
+ */                                                                                           
+JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CClipboard_checkPasteboardWithoutNotification
+(JNIEnv *env, jobject inObject)                                                               
+{                                                                                             
+    __block BOOL ret = NO;                                                                    
+    JNF_COCOA_ENTER(env);                                                                     
+    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){                                
+        ret = [[CClipboard sharedClipboard] checkPasteboardWithoutNotification:nil];          
+    }];                                                                                       
+                                                                                              
+    JNF_COCOA_EXIT(env);                                                                      
+    return ret;                                                                               
+}                                                                                             
\ No newline at end of file
--- a/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsDesktopManager.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsDesktopManager.java	Tue Apr 14 10:15:54 2015 -0700
@@ -68,7 +68,7 @@
             if (currentFrame != null && f != currentFrame) {
                 // If the current frame is maximized, transfer that
                 // attribute to the frame being activated.
-                if (currentFrame.isMaximum() &&
+                if (!currentFrame.isClosed() && currentFrame.isMaximum() &&
                     (f.getClientProperty("JInternalFrame.frameType") !=
                     "optionDialog") ) {
                     //Special case.  If key binding was used to select next
--- a/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java	Tue Apr 14 10:15:54 2015 -0700
@@ -197,6 +197,10 @@
                 root = null;
                 winAncestor = null;
             } else {
+                if (WindowsLookAndFeel.isMnemonicHidden() && ev.isAltDown()) {
+                    WindowsLookAndFeel.setMnemonicHidden(false);
+                    WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor);
+                }
                 altKeyPressed = false;
             }
             return false;
--- a/src/java.desktop/share/classes/java/awt/AWTEventMulticaster.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/AWTEventMulticaster.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1088,6 +1088,7 @@
      * contains only the specified listener. If no such listeners are chained,
      * this method returns an empty array.
      *
+     * @param <T> the listener type
      * @param l the specified <code>java.util.EventListener</code>
      * @param listenerType the type of listeners requested; this parameter
      *          should specify an interface that descends from
--- a/src/java.desktop/share/classes/java/awt/Component.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/Component.java	Tue Apr 14 10:15:54 2015 -0700
@@ -4316,9 +4316,12 @@
          */
         protected boolean validatedContents; // = false
         /**
-         * Size of the back buffers
+         * Width of the back buffers
          */
         protected int width;
+        /**
+         * Height of the back buffers
+         */
         protected int height;
 
         /**
@@ -6013,6 +6016,7 @@
      *
      * If no such listeners exist, this method returns an empty array.
      *
+     * @param <T> the type of the listeners
      * @param listenerType the type of listeners requested; this parameter
      *          should specify an interface that descends from
      *          <code>java.util.EventListener</code>
--- a/src/java.desktop/share/classes/java/awt/GridBagLayout.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/GridBagLayout.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -353,7 +353,7 @@
  *     }
  * }
  * </pre></blockquote><hr>
- * <p>
+ *
  * @author Doug Stein
  * @author Bill Spitzak (orignial NeWS &amp; OLIT implementation)
  * @see       java.awt.GridBagConstraints
@@ -770,7 +770,7 @@
      * components.  The value should be a number between 0 and 1
      * where 0 represents alignment along the origin, 1 is aligned
      * the furthest away from the origin, 0.5 is centered, etc.
-     * <p>
+     *
      * @return the value <code>0.5f</code> to indicate centered
      */
     public float getLayoutAlignmentX(Container parent) {
@@ -783,7 +783,7 @@
      * components.  The value should be a number between 0 and 1
      * where 0 represents alignment along the origin, 1 is aligned
      * the furthest away from the origin, 0.5 is centered, etc.
-     * <p>
+     *
      * @return the value <code>0.5f</code> to indicate centered
      */
     public float getLayoutAlignmentY(Container parent) {
--- a/src/java.desktop/share/classes/java/awt/MenuComponent.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/MenuComponent.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -328,6 +328,7 @@
      * Its use is discouraged, and it may not be supported
      * in the future.
      * @param evt the event which is to take place
+     * @return unconditionally returns false
      * @deprecated As of JDK version 1.1, replaced by {@link
      * #dispatchEvent(AWTEvent) dispatchEvent}.
      */
--- a/src/java.desktop/share/classes/java/awt/MenuContainer.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/MenuContainer.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -50,6 +50,7 @@
      * Posts an event to the listeners.
      *
      * @param  evt the event to dispatch
+     * @return the results of posting the event
      * @deprecated As of JDK version 1.1
      * replaced by dispatchEvent(AWTEvent).
      */
--- a/src/java.desktop/share/classes/java/awt/MenuItem.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/MenuItem.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -595,6 +595,7 @@
      *
      * If no such listeners exist, this method returns an empty array.
      *
+     * @param <T> the type of the listeners
      * @param listenerType the type of listeners requested; this parameter
      *          should specify an interface that descends from
      *          <code>java.util.EventListener</code>
--- a/src/java.desktop/share/classes/java/awt/Toolkit.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/Toolkit.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1766,6 +1766,7 @@
      *
      * subclasses should override this to provide their own implementation
      *
+     * @param <T> the type of DragGestureRecognizer to create
      * @param abstractRecognizerClass The abstract class of the required recognizer
      * @param ds                      The DragSource
      * @param c                       The Component target for the DragGestureRecognizer
@@ -1867,7 +1868,9 @@
     }
 
     /**
-     * an opportunity to lazily evaluate desktop property values.
+     * An opportunity to lazily evaluate desktop property values.
+     * @return the desktop property or null
+     * @param name the name
      */
     protected Object lazilyLoadDesktopProperty(String name) {
         return null;
@@ -1947,8 +1950,14 @@
         return desktopPropsSupport.getPropertyChangeListeners(propertyName);
     }
 
+    /**
+     * The desktop properties.
+     */
     protected final Map<String,Object> desktopProperties =
             new HashMap<String,Object>();
+    /**
+     * The desktop properties change support.
+     */
     protected final PropertyChangeSupport desktopPropsSupport =
             Toolkit.createPropertyChangeSupport(this);
 
--- a/src/java.desktop/share/classes/java/awt/Window.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/Window.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -2789,6 +2789,7 @@
     /**
      * @deprecated As of J2SE 1.4, replaced by
      * {@link Component#applyComponentOrientation Component.applyComponentOrientation}.
+     * @param rb the resource bundle
      */
     @Deprecated
     public void applyResourceBundle(ResourceBundle rb) {
@@ -2798,6 +2799,7 @@
     /**
      * @deprecated As of J2SE 1.4, replaced by
      * {@link Component#applyComponentOrientation Component.applyComponentOrientation}.
+     * @param rbName the resource name
      */
     @Deprecated
     public void applyResourceBundle(String rbName) {
--- a/src/java.desktop/share/classes/java/awt/doc-files/Modality.html	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/doc-files/Modality.html	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 <!--
- Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
  This code is free software; you can redistribute it and/or modify it
@@ -89,7 +89,6 @@
       <u>Scope of blocking (SB)</u> - the set of windows (instances of
       <code>java.awt.Window</code> and all derived classes) that are blocked by 
       the modal dialog while it is visible.
-    </p><p>
      <blockquote><hr>
       <b>Note</b>: Everywhere in this document the notion of "window" is equal
       to a top-level window in the Java programming language &mdash; in other words
@@ -109,8 +108,7 @@
       </li></ul>
       A dialog is, by default, modeless.  A modal dialog is, by default,
       application-modal.
-    <p>
-    </p><ol>
+    <ol>
       <li><u>Modeless dialogs</u><br>
         A modeless dialog doesn't block any windows while visible.
       </li><li><u>Document-modal dialogs</u><br>
@@ -156,7 +154,6 @@
           its owner. Thus, in this case the only thing that the owner
           affects is the Z-order: the dialog always stays on top of its owner.
       </li></ul>
-    <p>
     <blockquote><hr>
       <b>Implementation note</b>: Changing the modality type for a visible
       dialog may have no effect until it is hidden and then shown again.
@@ -277,8 +274,7 @@
         </li><li>Exclusion from blocking of application-modal dialogs
       </li></ul>
       By default, a window's modal exclusion property is turned off.
-    <p>
-      </p><ol>
+      <ol>
         <li><u>Application-modal exclusion</u><br>
           If a window is application-modal excluded, it is not blocked by any
           application-modal dialogs. Also, it is not blocked by document-modal
@@ -288,7 +284,6 @@
           by any application- or toolkit-modal dialogs. Also, it is not
           blocked by document-modal dialogs from outside of their child hierarchy.
       </li></ol>
-    <p>
     <blockquote>
       <hr>
         <b>Implementation note</b>: Changing the modal exclusion type for a visible window
@@ -399,7 +394,7 @@
           <br>
         </td>
         <td align="center">
-          <img src="modal-example1.gif">
+          <img src="modal-example1.gif" alt="Example 1">
           <br>
         </td>
       </tr>
@@ -418,7 +413,7 @@
 	 <br>
         </td>
         <td align="center">
-          <img src="modal-example2.gif">
+          <img src="modal-example2.gif" alt="Example 2">
           <br>
         </td>
       </tr>
@@ -440,7 +435,7 @@
           <br>
         </td>
         <td align="center">
-          <img src="modal-example3.gif">
+          <img src="modal-example3.gif" alt="Example 3">
           <br>
         </td>
       </tr>
@@ -462,7 +457,7 @@
           <br>
         </td>
         <td align="center">
-          <img src="modal-example4.gif">
+          <img src="modal-example4.gif" alt="Example 4">
           <br>
         </td>
       </tr>
--- a/src/java.desktop/share/classes/java/awt/geom/Path2D.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/java/awt/geom/Path2D.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -224,8 +224,8 @@
                 Path2D p2d = (Path2D) s;
                 setWindingRule(p2d.windingRule);
                 this.numTypes = p2d.numTypes;
-                this.pointTypes = Arrays.copyOf(p2d.pointTypes,
-                                                p2d.pointTypes.length);
+                // trim arrays:
+                this.pointTypes = Arrays.copyOf(p2d.pointTypes, p2d.numTypes);
                 this.numCoords = p2d.numCoords;
                 this.floatCoords = p2d.cloneCoordsFloat(at);
             } else {
@@ -237,19 +237,23 @@
             }
         }
 
+        @Override
         float[] cloneCoordsFloat(AffineTransform at) {
+            // trim arrays:
             float ret[];
             if (at == null) {
-                ret = Arrays.copyOf(this.floatCoords, this.floatCoords.length);
+                ret = Arrays.copyOf(floatCoords, numCoords);
             } else {
-                ret = new float[floatCoords.length];
+                ret = new float[numCoords];
                 at.transform(floatCoords, 0, ret, 0, numCoords / 2);
             }
             return ret;
         }
 
+        @Override
         double[] cloneCoordsDouble(AffineTransform at) {
-            double ret[] = new double[floatCoords.length];
+            // trim arrays:
+            double ret[] = new double[numCoords];
             if (at == null) {
                 for (int i = 0; i < numCoords; i++) {
                     ret[i] = floatCoords[i];
@@ -475,6 +479,9 @@
         }
 
         int pointCrossings(double px, double py) {
+            if (numTypes == 0) {
+                return 0;
+            }
             double movx, movy, curx, cury, endx, endy;
             float coords[] = floatCoords;
             curx = movx = coords[0];
@@ -552,6 +559,9 @@
         int rectCrossings(double rxmin, double rymin,
                           double rxmax, double rymax)
         {
+            if (numTypes == 0) {
+                return 0;
+            }
             float coords[] = floatCoords;
             double curx, cury, movx, movy, endx, endy;
             curx = movx = coords[0];
@@ -1061,8 +1071,8 @@
                 Path2D p2d = (Path2D) s;
                 setWindingRule(p2d.windingRule);
                 this.numTypes = p2d.numTypes;
-                this.pointTypes = Arrays.copyOf(p2d.pointTypes,
-                                                p2d.pointTypes.length);
+                // trim arrays:
+                this.pointTypes = Arrays.copyOf(p2d.pointTypes, p2d.numTypes);
                 this.numCoords = p2d.numCoords;
                 this.doubleCoords = p2d.cloneCoordsDouble(at);
             } else {
@@ -1074,8 +1084,10 @@
             }
         }
 
+        @Override
         float[] cloneCoordsFloat(AffineTransform at) {
-            float ret[] = new float[doubleCoords.length];
+            // trim arrays:
+            float ret[] = new float[numCoords];
             if (at == null) {
                 for (int i = 0; i < numCoords; i++) {
                     ret[i] = (float) doubleCoords[i];
@@ -1086,13 +1098,14 @@
             return ret;
         }
 
+        @Override
         double[] cloneCoordsDouble(AffineTransform at) {
+            // trim arrays:
             double ret[];
             if (at == null) {
-                ret = Arrays.copyOf(this.doubleCoords,
-                                    this.doubleCoords.length);
+                ret = Arrays.copyOf(doubleCoords, numCoords);
             } else {
-                ret = new double[doubleCoords.length];
+                ret = new double[numCoords];
                 at.transform(doubleCoords, 0, ret, 0, numCoords / 2);
             }
             return ret;
@@ -1202,6 +1215,9 @@
         }
 
         int pointCrossings(double px, double py) {
+            if (numTypes == 0) {
+                return 0;
+            }
             double movx, movy, curx, cury, endx, endy;
             double coords[] = doubleCoords;
             curx = movx = coords[0];
@@ -1279,6 +1295,9 @@
         int rectCrossings(double rxmin, double rymin,
                           double rxmax, double rymax)
         {
+            if (numTypes == 0) {
+                return 0;
+            }
             double coords[] = doubleCoords;
             double curx, cury, movx, movy, endx, endy;
             curx = movx = coords[0];
--- a/src/java.desktop/share/classes/javax/imageio/metadata/doc-files/gif_metadata.html	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/imageio/metadata/doc-files/gif_metadata.html	Tue Apr 14 10:15:54 2015 -0700
@@ -2,7 +2,7 @@
 <html>
 <head>
 <!--
-Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
 This code is free software; you can redistribute it and/or modify it
@@ -34,12 +34,11 @@
 <center><h1>
 GIF Metadata Format Specification
 </h1></center>
-
-<a name="gif_stream_metadata_format">
+<a name="gif_stream_metadata_format"></a>
 <center><h2>
 GIF Stream Metadata Format Specification
 </h2></center>
-</a>
+
 <p>
 
 The GIF stream metadata format encodes the information stored in the
@@ -136,11 +135,10 @@
           &lt;!-- Max value: 255 (inclusive) --&gt;
 ]&gt;
 </pre>
-<a name="gif_image_metadata_format">
+<a name="gif_image_metadata_format"></a>
 <center><h2>
 GIF Image Metadata Format Specification
 </h2></center>
-</a>
 <p>
 
 The GIF image metadata format encodes the image descriptor, local
@@ -352,7 +350,7 @@
 </pre>
 
 <p>
-<a name="mapping">
+<a name="mapping"></a>
 <center>
 <table border=1>
 <caption><b>Mapping of Standard to GIF Native Stream Metadata</b></caption>
@@ -402,9 +400,7 @@
 </tr>
 </table>
 </center>
-</p>
 
-<p>
 <center>
 <table border=1>
 <caption><b>Mapping of Standard to GIF Native Image Metadata</b></caption>
--- a/src/java.desktop/share/classes/javax/imageio/metadata/doc-files/jpeg_metadata.html	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/imageio/metadata/doc-files/jpeg_metadata.html	Tue Apr 14 10:15:54 2015 -0700
@@ -2,7 +2,7 @@
 <html>
 <head>
 <!--
-Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
 This code is free software; you can redistribute it and/or modify it
@@ -46,7 +46,7 @@
 <a href=#image>Image Metadata DTD</a><br>
 <a href=#stream>Stream Metadata DTD</a>
 <p>
-<bold>NOTE</bold>: It is important to call <code>dispose()</code> 
+<b>NOTE</b>: It is important to call <code>dispose()</code> 
 on the JPEG reader and writer objects when they are no longer needed, as 
 they consume significant native resources which are not adequately recovered 
 by garbage collection.  Both reader and writer call <code>dispose()</code> 
@@ -57,7 +57,6 @@
 
 The JPEG writer does not support replacing pixels.
 
-<p>
 <h2>
 <a name=metadata>JPEG Metadata</a>
 </h2>
@@ -95,7 +94,7 @@
 the returned object will contain default tables.
 
 <p>The <code>ImageWriter.getDefaultImageMetadata</code> method returns a 
-metadata object containing <bold>no</bold> tables if the 
+metadata object containing <b>no</b> tables if the 
 <code>ImageWriteParam</code> argument contains tables.  Otherwise the 
 returned metadata object will contain default visually lossless tables.  
 Of course, only a <code>JPEGImageWriteParam</code> may contain tables.
@@ -105,7 +104,6 @@
 is set on the reader, stream metadata will not be available, but image
 metadata will.
 
-<p>
 <h2>
 <a name=abbrev>Abbreviated Streams</a>
 </h2>
@@ -194,7 +192,6 @@
 Note that if no image metadata object is specified for a particular image, a 
 default object is used, which includes default tables.
 
-<p>
 <h2>
 <a name=color>Colorspace Transformations and Conventional Markers</a>
 </h2>
@@ -235,7 +232,6 @@
        the YCbCr is converted to RGB according to the formulas given in the
        JFIF spec, and the ICC profile is assumed to refer to the resulting RGB
        space.
-  <p>
   <li> If an Adobe <code>APP14</code> marker segment is present, the 
        colorspace is determined by consulting the <code>transform</code> flag.
        The <code>transform</code> flag takes one of three values:
@@ -249,7 +245,6 @@
       <li> 0 - Unknown.  3-channel images are assumed to be RGB, 4-channel 
            images are assumed to be CMYK.
     </ul>
-   <p>
   <li> If neither marker segment is present, the following procedure is
        followed: Single-channel images are assumed to be grayscale, and
        2-channel images are assumed to be grayscale with an alpha channel.
@@ -273,13 +268,12 @@
        subsampled images are assumed to be YCCK, and 4-channel, non-subsampled
        images are assumed to be CMYK.
 
-  <p>
   <li> All other images are declared uninterpretable and an exception is
        thrown if an attempt is made to read one as a 
        <code>BufferedImage</code>.  Such an image may be read only as a 
        <code>Raster</code>.  If an image is interpretable but there is no Java
        <code>ColorSpace</code> available corresponding to the encoded 
-       colorspace (<italic>e.g.</italic> YCbCr), then 
+       colorspace (<i>e.g.</i> YCbCr), then 
        <code>ImageReader.getRawImageType</code> will return <code>null</code>.
 </ul>
 
@@ -308,7 +302,7 @@
 
   <li> An exception is thrown if an attempt is made to read an image in an 
        unsupported jpeg colorspace as a <code>BufferedImage</code> 
-       (<italic>e.g.</italic> CMYK).  Such images may be read as
+       (<i>e.g.</i> CMYK).  Such images may be read as
        <code>Raster</code>s.  If an image colorspace is unsupported or
        uninterpretable, then <code>ImageReader.getImageTypes</code> will
        return an empty <code>Iterator</code>.   If a subset of the raw bands
@@ -514,7 +508,6 @@
     </ul>
 </ul>
 
-<p>
 <h2>
 <a name=thumbs>Thumbnail Images</a>
 </h2>
@@ -591,7 +584,7 @@
        that no thumbnail is placed in the JFIF <code>APP0</code> segment, and
        the <code>app0JFXX</code> node consulted for each thumbnail is the
        <code>app0JFXX</code> node from the metadata that occurs in the same
-       sequence as the thumbnail.  <italic>I.e.</italic> the first
+       sequence as the thumbnail.  <i>I.e.</i> the first
        <code>app0JFXX</code> node applies to the first thumbnail, the second
        node to the second thumbnail, and so on.  If there are fewer
        <code>app0JFXX</code> nodes in the metadata than thumbnails, then 
@@ -610,7 +603,6 @@
 of image, the thumbnails are ignored and a warning is sent to any warning
 listeners.
 
-<p>
 <h2>
 <a name=prog>Progressive Encoding</a>
 </h2>
@@ -631,7 +623,6 @@
 itself are ignored, and a warning will be sent to any warning listeners if 
 any such tables are present.
 
-<p>
 <h2>
 <a name=tree>Native Metadata Format Tree Structure and Editing</a>
 </h2>
@@ -673,7 +664,7 @@
 This is true regardless of where the JFXX <code>APP0</code> and 
 <code>APP2</code> marker segments actually occur in the stream.  The ordering 
 of nodes within the <code>markerSequence</code> node corresponds to the 
-ordering of marker segments found in the JPEG stream.  
+ordering of marker segments found in the JPEG stream.
 <p>
 On writing, any <code>JFXX</code> and <code>app2ICC</code> nodes must 
 occur as children of an <code>app0JFIF</code> node, itself a child of a 
--- a/src/java.desktop/share/classes/javax/swing/GroupLayout.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/GroupLayout.java	Tue Apr 14 10:15:54 2015 -0700
@@ -2190,7 +2190,7 @@
                     }
                 } else {
                     // Not a padding spring
-                    if (newLeading.size() > 0 && insert) {
+                    if (newLeading.size() > 0 && newLeadingPadding.isEmpty() && insert) {
                         // There's leading ComponentSprings, create an
                         // autopadding spring.
                         AutoPreferredGapSpring padding =
--- a/src/java.desktop/share/classes/javax/swing/JTable.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/JTable.java	Tue Apr 14 10:15:54 2015 -0700
@@ -49,6 +49,7 @@
 import java.text.NumberFormat;
 import java.text.DateFormat;
 import java.text.MessageFormat;
+import java.util.List;
 
 import javax.print.attribute.*;
 import javax.print.PrintService;
@@ -4419,8 +4420,13 @@
         }
 
         if (sortManager != null) {
-            sortedTableChanged(null, e);
-            return;
+            List<? extends RowSorter.SortKey> sortKeys =
+                    sortManager.sorter.getSortKeys();
+            if (sortKeys.size() != 0 &&
+                    sortKeys.get(0).getSortOrder() != SortOrder.UNSORTED) {
+                sortedTableChanged(null, e);
+                return;
+            }
         }
 
         // The totalRowHeight calculated below will be incorrect if
--- a/src/java.desktop/share/classes/javax/swing/colorchooser/ColorChooserComponentFactory.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/colorchooser/ColorChooserComponentFactory.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -48,6 +48,10 @@
 
     private ColorChooserComponentFactory() { } // can't instantiate
 
+    /**
+     * Returns the default chooser panels.
+     * @return the default chooser panels
+     */
     public static AbstractColorChooserPanel[] getDefaultChooserPanels() {
         return new AbstractColorChooserPanel[] {
                 new DefaultSwatchChooserPanel(),
@@ -58,6 +62,10 @@
         };
     }
 
+    /**
+     * Returns the preview panel.
+     * @return the preview panel
+     */
     public static JComponent getPreviewPanel() {
         return new DefaultPreviewPanel();
     }
--- a/src/java.desktop/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -47,6 +47,9 @@
      */
     protected transient ChangeEvent changeEvent = null;
 
+    /**
+     * The listener list.
+     */
     protected EventListenerList listenerList = new EventListenerList();
 
     private Color selectedColor;
--- a/src/java.desktop/share/classes/javax/swing/event/EventListenerList.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/event/EventListenerList.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -101,7 +101,7 @@
 public class EventListenerList implements Serializable {
     /* A null array to be shared by all empty listener lists*/
     private final static Object[] NULL_ARRAY = new Object[0];
-    /* The list of ListenerType - Listener pairs */
+    /** The list of ListenerType - Listener pairs */
     protected transient Object[] listenerList = NULL_ARRAY;
 
     /**
--- a/src/java.desktop/share/classes/javax/swing/event/TableModelEvent.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/event/TableModelEvent.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -85,9 +85,21 @@
 //  Instance Variables
 //
 
+    /**
+     * The type of the event.
+     */
     protected int       type;
+    /**
+     * The first row that has changed.
+     */
     protected int       firstRow;
+    /**
+     * The last row that has changed.
+     */
     protected int       lastRow;
+    /**
+     * The column for the event.
+     */
     protected int       column;
 
 //
--- a/src/java.desktop/share/classes/javax/swing/filechooser/FileSystemView.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/filechooser/FileSystemView.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -73,6 +73,10 @@
     private boolean useSystemExtensionHiding =
             UIManager.getDefaults().getBoolean("FileChooser.useSystemExtensionHiding");
 
+    /**
+     * Returns the file system view.
+     * @return the file system view
+     */
     public static FileSystemView getFileSystemView() {
         if(File.separatorChar == '\\') {
             if(windowsFileSystemView == null) {
@@ -101,6 +105,9 @@
         return genericFileSystemView;
     }
 
+    /**
+     * Constructs a FileSystemView.
+     */
     public FileSystemView() {
         final WeakReference<FileSystemView> weakReference = new WeakReference<FileSystemView>(this);
 
@@ -424,6 +431,10 @@
     // code. If a given OS can't, override these methods in its
     // implementation.
 
+    /**
+     * Returns the home directory.
+     * @return the home directory
+     */
     public File getHomeDirectory() {
         return createFileObject(System.getProperty("user.home"));
     }
--- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java	Tue Apr 14 10:15:54 2015 -0700
@@ -962,6 +962,12 @@
                         return;
                     }
                     orientation = SwingConstants.HORIZONTAL;
+                } else if(e.isShiftDown()){
+                    JScrollBar hScroll = scrollpane.getHorizontalScrollBar();
+                    if (hScroll != null && hScroll.isVisible()) {
+                        toScroll = hScroll;
+                        orientation = SwingConstants.HORIZONTAL;
+                    }
                 }
 
                 e.consume();
--- a/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java	Tue Apr 14 10:15:54 2015 -0700
@@ -569,7 +569,9 @@
         return super.createListSelectionListener(fc);
     }
 
-    // Obsolete class, not used in this version.
+    /**
+     * Obsolete class, not used in this version.
+     */
     protected class SingleClickListener extends MouseAdapter {
         /**
          * Constructs an instance of {@code SingleClickListener}.
@@ -580,7 +582,9 @@
         }
     }
 
-    // Obsolete class, not used in this version.
+    /**
+     * Obsolete class, not used in this version.
+     */
     @SuppressWarnings("serial") // Superclass is not serializable across versions
     protected class FileRenderer extends DefaultListCellRenderer  {
     }
--- a/src/java.desktop/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -495,8 +495,16 @@
      * control points and bezier curve anchors.
      */
     protected static class PaintContext {
+        /**
+         * Cache mode.
+         */
         protected static enum CacheMode {
-            NO_CACHING, FIXED_SIZES, NINE_SQUARE_SCALE
+            /** No caching.*/
+            NO_CACHING,
+            /** Fixed sizes.*/
+            FIXED_SIZES,
+            /** Nine square scale.*/
+            NINE_SQUARE_SCALE
         }
 
         private static Insets EMPTY_INSETS = new Insets(0, 0, 0, 0);
@@ -632,6 +640,9 @@
         // check if we can scale to the requested size
         Dimension canvas = ctx.canvasSize;
         Insets insets = ctx.stretchingInsets;
+        if (insets.left + insets.right > w || insets.top + insets.bottom > h) {
+            return;
+        }
 
         if (w <= (canvas.width * ctx.maxHorizontalScaleFactor) && h <= (canvas.height * ctx.maxVerticalScaleFactor)) {
             // get image at canvas size
--- a/src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -120,11 +120,17 @@
  */
 public final class NimbusStyle extends SynthStyle {
     /* Keys and scales for large/small/mini components, based on Apples sizes */
+    /** Large key */
     public static final String LARGE_KEY = "large";
+    /** Small key */
     public static final String SMALL_KEY = "small";
+    /** Mini key */
     public static final String MINI_KEY = "mini";
+    /** Large scale */
     public static final double LARGE_SCALE = 1.15;
+    /** Small scale */
     public static final double SMALL_SCALE = 0.857;
+    /** Mini scale */
     public static final double MINI_SCALE = 0.714;
 
     /**
--- a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -56,6 +56,10 @@
         return new SynthInternalFrameUI((JInternalFrame)b);
     }
 
+    /**
+     * Constructs a {@code SynthInternalFrameUI}.
+     * @param b an internal frame
+     */
     protected SynthInternalFrameUI(JInternalFrame b) {
         super(b);
     }
--- a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -48,6 +48,11 @@
 
     private boolean validMinimumThumbSize;
 
+    /**
+     * Returns a UI.
+     * @return a UI
+     * @param c a component
+     */
     public static ComponentUI createUI(JComponent c)    {
         return new SynthScrollBarUI();
     }
--- a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthSliderUI.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthSliderUI.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -93,6 +93,10 @@
         return new SynthSliderUI((JSlider)c);
     }
 
+    /**
+     * Constructs a {@code SynthSliderUI}.
+     * @param c a slider
+     */
     protected SynthSliderUI(JSlider c) {
         super(c);
     }
--- a/src/java.desktop/share/classes/javax/swing/table/AbstractTableModel.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/table/AbstractTableModel.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -320,9 +320,8 @@
      *
      * If no such listeners exist, this method returns an empty array.
      *
-     * @param listenerType the type of listeners requested; this parameter
-     *          should specify an interface that descends from
-     *          <code>java.util.EventListener</code>
+     * @param <T> the listener type
+     * @param listenerType the type of listeners requested
      * @return an array of all objects registered as
      *          <code><em>Foo</em>Listener</code>s on this component,
      *          or an empty array if no such
--- a/src/java.desktop/share/classes/javax/swing/table/DefaultTableCellRenderer.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/table/DefaultTableCellRenderer.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -95,6 +95,9 @@
     */
     private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
     private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
+    /**
+     * A border without focus.
+     */
     protected static Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER;
 
     // We need a place to store the color the JLabel should be returned
--- a/src/java.desktop/share/classes/javax/swing/table/DefaultTableColumnModel.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/table/DefaultTableColumnModel.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -652,9 +652,8 @@
      *
      * If no such listeners exist, this method returns an empty array.
      *
-     * @param listenerType the type of listeners requested; this parameter
-     *          should specify an interface that descends from
-     *          <code>java.util.EventListener</code>
+     * @param <T> the listener type
+     * @param listenerType the type of listeners requested
      * @return an array of all objects registered as
      *          <code><em>Foo</em>Listener</code>s on this model,
      *          or an empty array if no such
--- a/src/java.desktop/share/classes/javax/swing/table/DefaultTableModel.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/table/DefaultTableModel.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -314,15 +314,7 @@
 
     /**
      * Obsolete as of Java 2 platform v1.3.  Please use <code>setRowCount</code> instead.
-     */
-    /*
-     *  Sets the number of rows in the model.  If the new size is greater
-     *  than the current size, new rows are added to the end of the model
-     *  If the new size is less than the current size, all
-     *  rows at index <code>rowCount</code> and greater are discarded.
-     *
      * @param   rowCount   the new number of rows
-     * @see #setRowCount
      */
     public void setNumRows(int rowCount) {
         int old = getRowCount();
--- a/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -281,14 +281,8 @@
     /**
      * Obsolete as of Java 2 platform v1.3.  Real time repaints, in response to
      * column dragging or resizing, are now unconditional.
-     */
-    /*
-     *  Sets whether the body of the table updates in real time when
-     *  a column is resized or dragged.
-     *
-     * @param   flag                    true if tableView should update
-     *                                  the body of the table in real time
-     * @see #getUpdateTableInRealTime
+     * @param flag true if tableView should update the body of the
+     * table in real time
      */
     public void setUpdateTableInRealTime(boolean flag) {
         updateTableInRealTime = flag;
@@ -297,15 +291,7 @@
     /**
      * Obsolete as of Java 2 platform v1.3.  Real time repaints, in response to
      * column dragging or resizing, are now unconditional.
-     */
-    /*
-     * Returns true if the body of the table view updates in real
-     * time when a column is resized or dragged.  User can set this flag to
-     * false to speed up the table's response to user resize or drag actions.
-     * The default is true.
-     *
      * @return  true if the table updates in real time
-     * @see #setUpdateTableInRealTime
      */
     public boolean getUpdateTableInRealTime() {
         return updateTableInRealTime;
--- a/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeCellEditor.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeCellEditor.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -477,6 +477,15 @@
         return true;
     }
 
+    /**
+     * Determine the offset.
+     * @param tree      a <code>JTree</code> object
+     * @param value a value
+     * @param isSelected selection status
+     * @param expanded expansion status
+     * @param leaf leaf status
+     * @param row current row
+     */
     protected void determineOffset(JTree tree, Object value,
                                    boolean isSelected, boolean expanded,
                                    boolean leaf, int row) {
@@ -653,6 +662,9 @@
 
         // This should not be used. It will be removed when new API is
         // allowed.
+        /**
+         * Do not use.
+         */
         public void EditorContainer() {
             setLayout(null);
         }
--- a/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeModel.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeModel.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -657,9 +657,8 @@
      *
      * If no such listeners exist, this method returns an empty array.
      *
-     * @param listenerType the type of listeners requested; this parameter
-     *          should specify an interface that descends from
-     *          <code>java.util.EventListener</code>
+     * @param <T> the listener type
+     * @param listenerType the type of listeners requested
      * @return an array of all objects registered as
      *          <code><em>Foo</em>Listener</code>s on this component,
      *          or an empty array if no such
--- a/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -664,9 +664,8 @@
      *
      * If no such listeners exist, this method returns an empty array.
      *
-     * @param listenerType the type of listeners requested; this parameter
-     *          should specify an interface that descends from
-     *          <code>java.util.EventListener</code>
+     * @param <T> the listener type
+     * @param listenerType the type of listeners requested
      * @return an array of all objects registered as
      *          <code><em>Foo</em>Listener</code>s on this component,
      *          or an empty array if no such
--- a/src/java.desktop/share/classes/javax/swing/tree/FixedHeightLayoutCache.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/tree/FixedHeightLayoutCache.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -74,7 +74,9 @@
 
     private Stack<Stack<TreePath>> tempStacks;
 
-
+    /**
+     * Constructs a {@code FixedHeightLayoutCache}.
+     */
     public FixedHeightLayoutCache() {
         super();
         tempStacks = new Stack<Stack<TreePath>>();
--- a/src/java.desktop/share/classes/javax/swing/tree/VariableHeightLayoutCache.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/tree/VariableHeightLayoutCache.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -88,6 +88,9 @@
     private Stack<Stack<TreePath>> tempStacks;
 
 
+    /**
+     * Constructs a {@code VariableHeightLayoutCache}.
+     */
     public VariableHeightLayoutCache() {
         super();
         tempStacks = new Stack<Stack<TreePath>>();
--- a/src/java.desktop/share/classes/javax/swing/undo/CompoundEdit.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/undo/CompoundEdit.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -45,6 +45,9 @@
      */
     protected Vector<UndoableEdit> edits;
 
+    /**
+     * Constructs a {@code CompoundEdit}.
+     */
     public CompoundEdit() {
         super();
         inProgress = true;
--- a/src/java.desktop/share/classes/javax/swing/undo/StateEdit.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/undo/StateEdit.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -59,6 +59,9 @@
 public class StateEdit
         extends AbstractUndoableEdit {
 
+    /**
+     * Obsolete RCS version identity.
+     */
     protected static final String RCSID = "$Id: StateEdit.java,v 1.6 1997/10/01 20:05:51 sandipc Exp $";
 
     //
@@ -114,6 +117,11 @@
         init (anObject,name);
     }
 
+    /**
+     * Initialize the state edit.
+     * @param anObject The object to watch for changing state
+     * @param name The presentation name to be used for this edit
+     */
     protected void init (StateEditable anObject, String name) {
         this.object = anObject;
         this.preState = new Hashtable<Object, Object>(11);
--- a/src/java.desktop/share/classes/javax/swing/undo/UndoableEditSupport.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/javax/swing/undo/UndoableEditSupport.java	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,9 +34,21 @@
  * @author Ray Ryan
  */
 public class UndoableEditSupport {
+    /**
+     * The update level.
+     */
     protected int updateLevel;
+    /**
+     * The compound edit.
+     */
     protected CompoundEdit compoundEdit;
+    /**
+     * The list of listeners.
+     */
     protected Vector<UndoableEditListener> listeners;
+    /**
+     * The real source.
+     */
     protected Object realSource;
 
     /**
--- a/src/java.desktop/share/classes/sun/awt/datatransfer/SunClipboard.java	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/share/classes/sun/awt/datatransfer/SunClipboard.java	Tue Apr 14 10:15:54 2015 -0700
@@ -144,7 +144,7 @@
      *         AppContext as it is currently retrieved or null otherwise
      * @since 1.5
      */
-    private synchronized Transferable getContextContents() {
+    protected synchronized Transferable getContextContents() {
         AppContext context = AppContext.getAppContext();
         return (context == contentsContext) ? contents : null;
     }
@@ -275,42 +275,41 @@
             return;
         }
 
-        final Runnable runnable = new Runnable() {
-                public void run() {
-                    final SunClipboard sunClipboard = SunClipboard.this;
-                    ClipboardOwner owner = null;
-                    Transferable contents = null;
-
-                    synchronized (sunClipboard) {
-                        final AppContext context = sunClipboard.contentsContext;
-
-                        if (context == null) {
-                            return;
-                        }
-
-                        if (disposedContext == null || context == disposedContext) {
-                            owner = sunClipboard.owner;
-                            contents = sunClipboard.contents;
-                            sunClipboard.contentsContext = null;
-                            sunClipboard.owner = null;
-                            sunClipboard.contents = null;
-                            sunClipboard.clearNativeContext();
-                            context.removePropertyChangeListener
-                                (AppContext.DISPOSED_PROPERTY_NAME, sunClipboard);
-                        } else {
-                            return;
-                        }
-                    }
-                    if (owner != null) {
-                        owner.lostOwnership(sunClipboard, contents);
-                    }
-                }
-            };
-
-        SunToolkit.postEvent(context, new PeerEvent(this, runnable,
+        SunToolkit.postEvent(context, new PeerEvent(this, () -> lostOwnershipNow(disposedContext),
                                                     PeerEvent.PRIORITY_EVENT));
     }
 
+    protected void lostOwnershipNow(final AppContext disposedContext) {
+        final SunClipboard sunClipboard = SunClipboard.this;
+        ClipboardOwner owner = null;
+        Transferable contents = null;
+
+        synchronized (sunClipboard) {
+            final AppContext context = sunClipboard.contentsContext;
+
+            if (context == null) {
+                return;
+            }
+
+            if (disposedContext == null || context == disposedContext) {
+                owner = sunClipboard.owner;
+                contents = sunClipboard.contents;
+                sunClipboard.contentsContext = null;
+                sunClipboard.owner = null;
+                sunClipboard.contents = null;
+                sunClipboard.clearNativeContext();
+                context.removePropertyChangeListener
+                        (AppContext.DISPOSED_PROPERTY_NAME, sunClipboard);
+            } else {
+                return;
+            }
+        }
+        if (owner != null) {
+            owner.lostOwnership(sunClipboard, contents);
+        }
+    }
+
+
     protected abstract void clearNativeContext();
 
     protected abstract void setContentsNative(Transferable contents);
--- a/src/java.desktop/windows/native/libawt/windows/awt_InputTextInfor.cpp	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/windows/native/libawt/windows/awt_InputTextInfor.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -310,6 +310,8 @@
             readingMergedClauseW = new jstring[cMergedClauseW];
         } catch (std::bad_alloc&) {
             delete [] bndMergedClauseW;
+            delete [] bndClauseW;
+            delete [] readingClauseW;
             throw;
         }
 
@@ -394,6 +396,8 @@
             valMergedAttrW = new BYTE[cMergedAttrW];
         } catch (std::bad_alloc&) {
             delete [] bndMergedAttrW;
+            delete [] bndAttrW;
+            delete [] valAttrW;
             throw;
         }
         bndMergedAttrW[0] = 0;
--- a/src/java.desktop/windows/native/libawt/windows/awt_TrayIcon.cpp	Tue Apr 14 14:22:13 2015 +0200
+++ b/src/java.desktop/windows/native/libawt/windows/awt_TrayIcon.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -709,7 +709,7 @@
 {
     if (tooltip == NULL) {
         m_nid.szTip[0] = '\0';
-    } else if (lstrlen(tooltip) > TRAY_ICON_TOOLTIP_MAX_SIZE) {
+    } else if (lstrlen(tooltip) >= TRAY_ICON_TOOLTIP_MAX_SIZE) {
         _tcsncpy(m_nid.szTip, tooltip, TRAY_ICON_TOOLTIP_MAX_SIZE);
         m_nid.szTip[TRAY_ICON_TOOLTIP_MAX_SIZE - 1] = '\0';
     } else {
@@ -814,7 +814,7 @@
     if (caption[0] == '\0') {
         m_nid.szInfoTitle[0] = '\0';
 
-    } else if (lstrlen(caption) > TRAY_ICON_BALLOON_TITLE_MAX_SIZE) {
+    } else if (lstrlen(caption) >= TRAY_ICON_BALLOON_TITLE_MAX_SIZE) {
 
         _tcsncpy(m_nid.szInfoTitle, caption, TRAY_ICON_BALLOON_TITLE_MAX_SIZE);
         m_nid.szInfoTitle[TRAY_ICON_BALLOON_TITLE_MAX_SIZE - 1] = '\0';
@@ -827,7 +827,7 @@
         m_nid.szInfo[0] = ' ';
         m_nid.szInfo[1] = '\0';
 
-    } else if (lstrlen(text) > TRAY_ICON_BALLOON_INFO_MAX_SIZE) {
+    } else if (lstrlen(text) >= TRAY_ICON_BALLOON_INFO_MAX_SIZE) {
 
         _tcsncpy(m_nid.szInfo, text, TRAY_ICON_BALLOON_INFO_MAX_SIZE);
         m_nid.szInfo[TRAY_ICON_BALLOON_INFO_MAX_SIZE - 1] = '\0';
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/AWTEventMonitor.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,1526 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.util.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.accessibility.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import sun.awt.AWTPermissions;
+
+/**
+ * <P>The {@code AWTEventMonitor} implements a suite of listeners that are
+ * conditionally installed on every AWT component instance in the Java
+ * Virtual Machine.  The events captured by these listeners are made
+ * available through a unified set of listeners supported by {@code AWTEventMonitor}.
+ * With this, all the individual events on each of the AWT component
+ * instances are funneled into one set of listeners broken down by category
+ * (see {@link EventID} for the categories).
+ * <p>This class depends upon {@link EventQueueMonitor}, which provides the base
+ * level support for capturing the top-level containers as they are created.
+ */
+
+@jdk.Exported
+public class AWTEventMonitor {
+
+    static private boolean runningOnJDK1_4 = false;
+
+    /**
+     * The current component with keyboard focus.
+     *
+     * @see #getComponentWithFocus
+     *
+     * @deprecated This field is unused; to get the component with focus use the
+     * getComponentWithFocus method.
+     */
+    @Deprecated
+    static protected Component componentWithFocus = null;
+
+    static private Component componentWithFocus_private = null;
+
+    // Low-level listeners
+    /**
+     * The current list of registered ComponentListener classes.
+     *
+     * @see #addComponentListener
+     * @see #removeComponentListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected ComponentListener     componentListener     = null;
+
+    static private ComponentListener componentListener_private = null;
+
+    /**
+     * The current list of registered ContainerListener classes.
+     *
+     * @see #addContainerListener
+     * @see #removeContainerListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected ContainerListener     containerListener     = null;
+
+    static private ContainerListener containerListener_private = null;
+
+    /**
+     * The current list of registered FocusListener classes.
+     *
+     * @see #addFocusListener
+     * @see #removeFocusListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected FocusListener         focusListener         = null;
+
+    static private FocusListener focusListener_private = null;
+
+    /**
+     * The current list of registered KeyListener classes.
+     *
+     * @see #addKeyListener
+     * @see #removeKeyListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected KeyListener           keyListener           = null;
+
+    static private KeyListener keyListener_private = null;
+
+    /**
+     * The current list of registered MouseListener classes.
+     *
+     * @see #addMouseListener
+     * @see #removeMouseListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected MouseListener         mouseListener         = null;
+
+    static private MouseListener mouseListener_private = null;
+
+    /**
+     * The current list of registered MouseMotionListener classes.
+     *
+     * @see #addMouseMotionListener
+     * @see #removeMouseMotionListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected MouseMotionListener   mouseMotionListener   = null;
+
+    static private MouseMotionListener mouseMotionListener_private = null;
+
+    /**
+     * The current list of registered WindowListener classes.
+     *
+     * @see #addWindowListener
+     * @see #removeWindowListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected WindowListener        windowListener        = null;
+
+    static private WindowListener windowListener_private = null;
+
+
+    // Semantic listeners
+    /**
+     * The current list of registered ActionListener classes.
+     *
+     * @see #addActionListener
+     * @see #removeActionListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected ActionListener        actionListener        = null;
+
+    static private ActionListener actionListener_private = null;
+
+    /**
+     * The current list of registered AdjustmentListener classes.
+     *
+     * @see #addAdjustmentListener
+     * @see #removeAdjustmentListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected AdjustmentListener    adjustmentListener    = null;
+
+    static private AdjustmentListener adjustmentListener_private = null;
+
+    /**
+     * The current list of registered ItemListener classes.
+     *
+     * @see #addItemListener
+     * @see #removeItemListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected ItemListener          itemListener          = null;
+
+    static private ItemListener itemListener_private = null;
+
+    /**
+     * The current list of registered TextListener classes.
+     *
+     * @see #addTextListener
+     * @see #removeTextListener
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected TextListener          textListener          = null;
+
+    static private TextListener textListener_private = null;
+
+
+    /**
+     * The actual listener that is installed on the component instances.
+     * This listener calls the other registered listeners when an event
+     * occurs.  By doing things this way, the actual number of listeners
+     * installed on a component instance is drastically reduced.
+     *
+     * @deprecated This field is unused.
+     */
+    @Deprecated
+    static protected AWTEventsListener awtListener = new AWTEventsListener();
+
+    static private final AWTEventsListener awtListener_private = new AWTEventsListener();
+
+    /**
+     * Returns the component that currently has keyboard focus.  The return
+     * value can be null.
+     *
+     * @return the component that has keyboard focus
+     */
+    static public Component getComponentWithFocus() {
+        return componentWithFocus_private;
+    }
+
+    /*
+     * Check permissions
+     */
+    static private void checkInstallPermission() {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+            security.checkPermission(AWTPermissions.ALL_AWT_EVENTS_PERMISSION);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#COMPONENT COMPONENT}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeComponentListener
+     */
+    static public void addComponentListener(ComponentListener l) {
+        if (componentListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.COMPONENT);
+        }
+        componentListener_private = AWTEventMulticaster.add(componentListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#COMPONENT COMPONENT} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addComponentListener
+     */
+    static public void removeComponentListener(ComponentListener l) {
+        componentListener_private = AWTEventMulticaster.remove(componentListener_private, l);
+        if (componentListener_private == null) {
+            awtListener_private.removeListeners(EventID.COMPONENT);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#CONTAINER CONTAINER}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeContainerListener
+     */
+    static public void addContainerListener(ContainerListener l) {
+        containerListener_private = AWTEventMulticaster.add(containerListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#CONTAINER CONTAINER} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addContainerListener
+     */
+    static public void removeContainerListener(ContainerListener l) {
+        containerListener_private = AWTEventMulticaster.remove(containerListener_private, l);
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#FOCUS FOCUS} events
+     * on each component instance in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeFocusListener
+     */
+    static public void addFocusListener(FocusListener l) {
+        focusListener_private = AWTEventMulticaster.add(focusListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives {@link EventID#FOCUS FOCUS}
+     * events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addFocusListener
+     */
+    static public void removeFocusListener(FocusListener l) {
+        focusListener_private = AWTEventMulticaster.remove(focusListener_private, l);
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#KEY KEY} events on each
+     * component instance in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeKeyListener
+     */
+    static public void addKeyListener(KeyListener l) {
+        if (keyListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.KEY);
+        }
+        keyListener_private = AWTEventMulticaster.add(keyListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives {@link EventID#KEY KEY}
+     * events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addKeyListener
+     */
+    static public void removeKeyListener(KeyListener l) {
+        keyListener_private = AWTEventMulticaster.remove(keyListener_private, l);
+        if (keyListener_private == null)  {
+            awtListener_private.removeListeners(EventID.KEY);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#MOUSE MOUSE} events
+     * on each component instance in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeMouseListener
+     */
+    static public void addMouseListener(MouseListener l) {
+        if (mouseListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.MOUSE);
+        }
+        mouseListener_private = AWTEventMulticaster.add(mouseListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#MOUSE MOUSE} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addMouseListener
+     */
+    static public void removeMouseListener(MouseListener l) {
+        mouseListener_private = AWTEventMulticaster.remove(mouseListener_private, l);
+        if (mouseListener_private == null) {
+            awtListener_private.removeListeners(EventID.MOUSE);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all mouse {@link EventID#MOTION MOTION}
+     * events on each component instance in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeMouseMotionListener
+     */
+    static public void addMouseMotionListener(MouseMotionListener l) {
+        if (mouseMotionListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.MOTION);
+        }
+        mouseMotionListener_private = AWTEventMulticaster.add(mouseMotionListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#MOTION MOTION} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addMouseMotionListener
+     */
+    static public void removeMouseMotionListener(MouseMotionListener l) {
+        mouseMotionListener_private = AWTEventMulticaster.remove(mouseMotionListener_private, l);
+        if (mouseMotionListener_private == null) {
+            awtListener_private.removeListeners(EventID.MOTION);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#WINDOW WINDOW}
+     * events on each component instance in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeWindowListener
+     */
+    static public void addWindowListener(WindowListener l) {
+        if (windowListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.WINDOW);
+        }
+        windowListener_private = AWTEventMulticaster.add(windowListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#WINDOW WINDOW} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addWindowListener
+     */
+    static public void removeWindowListener(WindowListener l) {
+        windowListener_private = AWTEventMulticaster.remove(windowListener_private, l);
+        if (windowListener_private == null) {
+            awtListener_private.removeListeners(EventID.WINDOW);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#ACTION ACTION}
+     * events on each component instance in the Java Virtual Machine when they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeActionListener
+     */
+    static public void addActionListener(ActionListener l) {
+        if (actionListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.ACTION);
+        }
+        actionListener_private = AWTEventMulticaster.add(actionListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#ACTION ACTION} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addActionListener
+     */
+    static public void removeActionListener(ActionListener l) {
+        actionListener_private = AWTEventMulticaster.remove(actionListener_private, l);
+        if (actionListener_private == null) {
+            awtListener_private.removeListeners(EventID.ACTION);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all
+     * {@link EventID#ADJUSTMENT ADJUSTMENT} events on each component instance
+     * in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeAdjustmentListener
+     */
+    static public void addAdjustmentListener(AdjustmentListener l) {
+        if (adjustmentListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.ADJUSTMENT);
+        }
+        adjustmentListener_private = AWTEventMulticaster.add(adjustmentListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#ADJUSTMENT ADJUSTMENT} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addAdjustmentListener
+     */
+    static public void removeAdjustmentListener(AdjustmentListener l) {
+        adjustmentListener_private = AWTEventMulticaster.remove(adjustmentListener_private, l);
+        if (adjustmentListener_private == null) {
+            awtListener_private.removeListeners(EventID.ADJUSTMENT);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#ITEM ITEM} events
+     * on each component instance in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeItemListener
+     */
+    static public void addItemListener(ItemListener l) {
+        if (itemListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.ITEM);
+        }
+        itemListener_private = AWTEventMulticaster.add(itemListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives {@link EventID#ITEM ITEM}
+     * events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addItemListener
+     */
+    static public void removeItemListener(ItemListener l) {
+        itemListener_private = AWTEventMulticaster.remove(itemListener_private, l);
+        if (itemListener_private == null) {
+            awtListener_private.removeListeners(EventID.ITEM);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#TEXT TEXT} events
+     * on each component instance in the Java Virtual Machine when they occur.
+     * <P>Note: this listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeTextListener
+     */
+    static public void addTextListener(TextListener l) {
+        if (textListener_private == null) {
+            checkInstallPermission();
+            awtListener_private.installListeners(EventID.TEXT);
+        }
+        textListener_private = AWTEventMulticaster.add(textListener_private, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives {@link EventID#TEXT TEXT}
+     * events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addTextListener
+     */
+    static public void removeTextListener(TextListener l) {
+        textListener_private = AWTEventMulticaster.remove(textListener_private, l);
+        if (textListener_private == null) {
+            awtListener_private.removeListeners(EventID.TEXT);
+        }
+    }
+
+
+    /**
+     * AWTEventsListener is the class that does all the work for AWTEventMonitor.
+     * It is not intended for use by any other class except AWTEventMonitor.
+     *
+     */
+
+    static class AWTEventsListener implements TopLevelWindowListener,
+        ActionListener, AdjustmentListener, ComponentListener,
+        ContainerListener, FocusListener, ItemListener, KeyListener,
+        MouseListener, MouseMotionListener, TextListener, WindowListener,
+        ChangeListener {
+
+        /**
+         * internal variables for Action introspection
+         */
+        private java.lang.Class<?>[] actionListeners;
+        private java.lang.reflect.Method removeActionMethod;
+        private java.lang.reflect.Method addActionMethod;
+        private java.lang.Object[] actionArgs;
+
+        /**
+         * internal variables for Item introspection
+         */
+        private java.lang.Class<?>[] itemListeners;
+        private java.lang.reflect.Method removeItemMethod;
+        private java.lang.reflect.Method addItemMethod;
+        private java.lang.Object[] itemArgs;
+
+        /**
+         * internal variables for Text introspection
+         */
+        private java.lang.Class<?>[] textListeners;
+        private java.lang.reflect.Method removeTextMethod;
+        private java.lang.reflect.Method addTextMethod;
+        private java.lang.Object[] textArgs;
+
+        /**
+         * internal variables for Window introspection
+         */
+        private java.lang.Class<?>[] windowListeners;
+        private java.lang.reflect.Method removeWindowMethod;
+        private java.lang.reflect.Method addWindowMethod;
+        private java.lang.Object[] windowArgs;
+
+        /**
+         * Create a new instance of this class and install it on each component
+         * instance in the virtual machine that supports any of the currently
+         * registered listeners in AWTEventMonitor.  Also registers itself
+         * as a TopLevelWindowListener with EventQueueMonitor so it can
+         * automatically add new listeners to new components.
+         *
+         * @see EventQueueMonitor
+         * @see AWTEventMonitor
+         */
+        public AWTEventsListener() {
+            String version = System.getProperty("java.version");
+            if (version != null) {
+                runningOnJDK1_4 = (version.compareTo("1.4") >= 0);
+            }
+            initializeIntrospection();
+            installListeners();
+            if (runningOnJDK1_4) {
+                MenuSelectionManager.defaultManager().addChangeListener(this);
+            }
+            EventQueueMonitor.addTopLevelWindowListener(this);
+        }
+
+        /**
+         * Set up all of the variables needed for introspection
+         */
+        private boolean initializeIntrospection() {
+            actionListeners = new java.lang.Class<?>[1];
+            actionArgs = new java.lang.Object[1];
+            actionListeners[0] = java.awt.event.ActionListener.class;
+            actionArgs[0] = this;
+
+            itemListeners = new java.lang.Class<?>[1];
+            itemArgs = new java.lang.Object[1];
+            itemListeners[0] = java.awt.event.ItemListener.class;
+            itemArgs[0] = this;
+
+            textListeners = new java.lang.Class<?>[1];
+            textArgs = new java.lang.Object[1];
+            textListeners[0] = java.awt.event.TextListener.class;
+            textArgs[0] = this;
+
+            windowListeners = new java.lang.Class<?>[1];
+            windowArgs = new java.lang.Object[1];
+            windowListeners[0] = java.awt.event.WindowListener.class;
+            windowArgs[0] = this;
+
+            return true;
+        }
+
+        /**
+         * Installs all currently registered listeners on all components based
+         * upon the current topLevelWindows cached by EventQueueMonitor.
+         *
+         * @see EventQueueMonitor
+         * @see AWTEventMonitor
+         */
+        protected void installListeners() {
+            Window topLevelWindows[] = EventQueueMonitor.getTopLevelWindows();
+            if (topLevelWindows != null) {
+                for (int i = 0; i < topLevelWindows.length; i++) {
+                    installListeners(topLevelWindows[i]);
+                }
+            }
+        }
+
+        /**
+         * Installs listeners for the given event ID on all components based
+         * upon the current topLevelWindows cached by EventQueueMonitor.
+         *
+         * @param eventID the event ID
+         * @see EventID
+         */
+        protected void installListeners(int eventID) {
+            Window topLevelWindows[] = EventQueueMonitor.getTopLevelWindows();
+            if (topLevelWindows != null) {
+                for (int i = 0; i < topLevelWindows.length; i++) {
+                    installListeners(topLevelWindows[i], eventID);
+                }
+            }
+        }
+
+        /**
+         * Installs all currently registered listeners to just the component.
+         * @param c the component to add listeners to
+         */
+        protected void installListeners(Component c) {
+
+            // Container and focus listeners are always installed for our own use.
+            //
+            installListeners(c,EventID.CONTAINER);
+            installListeners(c,EventID.FOCUS);
+
+            // conditionally install low-level listeners
+            //
+            if (AWTEventMonitor.componentListener_private != null) {
+                installListeners(c,EventID.COMPONENT);
+            }
+            if (AWTEventMonitor.keyListener_private != null) {
+                installListeners(c,EventID.KEY);
+            }
+            if (AWTEventMonitor.mouseListener_private != null) {
+                installListeners(c,EventID.MOUSE);
+            }
+            if (AWTEventMonitor.mouseMotionListener_private != null) {
+                installListeners(c,EventID.MOTION);
+            }
+            if (AWTEventMonitor.windowListener_private != null) {
+                installListeners(c,EventID.WINDOW);
+            }
+
+            // conditionally install Semantic listeners
+            //
+            if (AWTEventMonitor.actionListener_private != null) {
+                installListeners(c,EventID.ACTION);
+            }
+            if (AWTEventMonitor.adjustmentListener_private != null) {
+                installListeners(c,EventID.ADJUSTMENT);
+            }
+            if (AWTEventMonitor.itemListener_private != null) {
+                installListeners(c,EventID.ITEM);
+            }
+            if (AWTEventMonitor.textListener_private != null) {
+                installListeners(c,EventID.TEXT);
+            }
+        }
+
+        public void stateChanged(ChangeEvent e) {
+            processFocusGained();
+        }
+
+        private void processFocusGained() {
+            Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+            if (focusOwner == null) {
+                return;
+            }
+            MenuSelectionManager.defaultManager().removeChangeListener(this);
+            MenuSelectionManager.defaultManager().addChangeListener(this);
+
+            // Only menus and popup selections are handled by the JRootPane.
+            if (focusOwner instanceof JRootPane) {
+                MenuElement [] path =
+                    MenuSelectionManager.defaultManager().getSelectedPath();
+                if (path.length > 1) {
+                    Component penult = path[path.length-2].getComponent();
+                    Component last = path[path.length-1].getComponent();
+
+                    if (last instanceof JPopupMenu ||
+                        last instanceof JMenu) {
+                        // This is a popup with nothing in the popup
+                        // selected. The menu itself is selected.
+                        componentWithFocus_private = last;
+                    } else if (penult instanceof JPopupMenu) {
+                        // This is a popup with an item selected
+                        componentWithFocus_private = penult;
+                    }
+                }
+            } else {
+                // The focus owner has the selection.
+                componentWithFocus_private = focusOwner;
+            }
+        }
+
+        /**
+         * Installs the given listener on the component and any of its children.
+         * As a precaution, it always attempts to remove itself as a listener
+         * first so it's always guaranteed to have installed itself just once.
+         *
+         * @param c the component to add listeners to
+         * @param eventID the eventID to add listeners for
+         * @see EventID
+         */
+        protected void installListeners(Component c, int eventID) {
+
+            // install the appropriate listener hook into this component
+            //
+            switch (eventID) {
+
+            case EventID.ACTION:
+                try {
+                    removeActionMethod = c.getClass().getMethod(
+                        "removeActionListener", actionListeners);
+                    addActionMethod = c.getClass().getMethod(
+                        "addActionListener", actionListeners);
+                    try {
+                        removeActionMethod.invoke(c, actionArgs);
+                        addActionMethod.invoke(c, actionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.ADJUSTMENT:
+                if (c instanceof Adjustable) {
+                    ((Adjustable) c).removeAdjustmentListener(this);
+                    ((Adjustable) c).addAdjustmentListener(this);
+                }
+                break;
+
+            case EventID.COMPONENT:
+                c.removeComponentListener(this);
+                c.addComponentListener(this);
+                break;
+
+            case EventID.CONTAINER:
+                if (c instanceof Container) {
+                    ((Container) c).removeContainerListener(this);
+                    ((Container) c).addContainerListener(this);
+                }
+                break;
+
+            case EventID.FOCUS:
+                c.removeFocusListener(this);
+                c.addFocusListener(this);
+
+                if (runningOnJDK1_4) {
+                    processFocusGained();
+
+                } else {        // not runningOnJDK1_4
+                    if ((c != componentWithFocus_private) && c.hasFocus()) {
+                        componentWithFocus_private = c;
+                    }
+                }
+                break;
+
+            case EventID.ITEM:
+                try {
+                    removeItemMethod = c.getClass().getMethod(
+                        "removeItemListener", itemListeners);
+                    addItemMethod = c.getClass().getMethod(
+                        "addItemListener", itemListeners);
+                    try {
+                        removeItemMethod.invoke(c, itemArgs);
+                        addItemMethod.invoke(c, itemArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                // [PK] CheckboxMenuItem isn't a component but it does
+                // implement Interface ItemSelectable!!
+                // if (c instanceof CheckboxMenuItem) {
+                //     ((CheckboxMenuItem) c).removeItemListener(this);
+                //     ((CheckboxMenuItem) c).addItemListener(this);
+                break;
+
+            case EventID.KEY:
+                c.removeKeyListener(this);
+                c.addKeyListener(this);
+                break;
+
+            case EventID.MOUSE:
+                c.removeMouseListener(this);
+                c.addMouseListener(this);
+                break;
+
+            case EventID.MOTION:
+                c.removeMouseMotionListener(this);
+                c.addMouseMotionListener(this);
+                break;
+
+            case EventID.TEXT:
+                try {
+                    removeTextMethod = c.getClass().getMethod(
+                        "removeTextListener", textListeners);
+                    addTextMethod = c.getClass().getMethod(
+                        "addTextListener", textListeners);
+                    try {
+                        removeTextMethod.invoke(c, textArgs);
+                        addTextMethod.invoke(c, textArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.WINDOW:
+                try {
+                    removeWindowMethod = c.getClass().getMethod(
+                        "removeWindowListener", windowListeners);
+                    addWindowMethod = c.getClass().getMethod(
+                        "addWindowListener", windowListeners);
+                    try {
+                        removeWindowMethod.invoke(c, windowArgs);
+                        addWindowMethod.invoke(c, windowArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            // Don't bother recursing the children if this isn't going to
+            // accomplish anything.
+            //
+            default:
+                return;
+            }
+
+            // if this component is a container, recurse through children
+            //
+            if (c instanceof Container) {
+                int count = ((Container) c).getComponentCount();
+                for (int i = 0; i < count; i++) {
+                    installListeners(((Container) c).getComponent(i), eventID);
+                }
+            }
+        }
+
+        /**
+         * Removes all listeners for the given event ID on all components based
+         * upon the topLevelWindows cached by EventQueueMonitor.
+         *
+         * @param eventID the event ID
+         * @see EventID
+         */
+        protected void removeListeners(int eventID) {
+            Window topLevelWindows[] = EventQueueMonitor.getTopLevelWindows();
+            if (topLevelWindows != null) {
+                for (int i = 0; i < topLevelWindows.length; i++) {
+                    removeListeners(topLevelWindows[i], eventID);
+                }
+            }
+        }
+
+        /**
+         * Removes all listeners for the given component and all its children.
+         * @param c the component
+         */
+        protected void removeListeners(Component c) {
+
+            // conditionally remove low-level listeners
+            //
+            if (AWTEventMonitor.componentListener_private != null) {
+                removeListeners(c,EventID.COMPONENT);
+            }
+            if (AWTEventMonitor.keyListener_private != null) {
+                removeListeners(c,EventID.KEY);
+            }
+            if (AWTEventMonitor.mouseListener_private != null) {
+                removeListeners(c,EventID.MOUSE);
+            }
+            if (AWTEventMonitor.mouseMotionListener_private != null) {
+                removeListeners(c,EventID.MOTION);
+            }
+            if (AWTEventMonitor.windowListener_private != null) {
+                removeListeners(c,EventID.WINDOW);
+            }
+
+            // Remove semantic listeners
+            //
+            if (AWTEventMonitor.actionListener_private != null) {
+                removeListeners(c,EventID.ACTION);
+            }
+            if (AWTEventMonitor.adjustmentListener_private != null) {
+                removeListeners(c,EventID.ADJUSTMENT);
+            }
+            if (AWTEventMonitor.itemListener_private != null) {
+                removeListeners(c,EventID.ITEM);
+            }
+            if (AWTEventMonitor.textListener_private != null) {
+                removeListeners(c,EventID.TEXT);
+            }
+        }
+
+        /**
+         * Removes all listeners for the event ID from the component and all
+         * of its children.
+         *
+         * @param c the component to remove listeners from
+         * @see EventID
+         */
+        protected void removeListeners(Component c, int eventID) {
+
+            // remove the appropriate listener hook into this component
+            //
+            switch (eventID) {
+
+            case EventID.ACTION:
+                try {
+                    removeActionMethod = c.getClass().getMethod(
+                        "removeActionListener",
+                        actionListeners);
+                    try {
+                        removeActionMethod.invoke(c, actionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.ADJUSTMENT:
+                if (c instanceof Adjustable) {
+                    ((Adjustable) c).removeAdjustmentListener(this);
+                }
+                break;
+
+            case EventID.COMPONENT:
+                c.removeComponentListener(this);
+                break;
+
+            // Never remove these because we're always interested in them
+            // for our own use.
+            //case EventID.CONTAINER:
+            //    if (c instanceof Container) {
+            //        ((Container) c).removeContainerListener(this);
+            //    }
+            //    break;
+            //
+            //case EventID.FOCUS:
+            //    c.removeFocusListener(this);
+            //    break;
+
+            case EventID.ITEM:
+                try {
+                    removeItemMethod = c.getClass().getMethod(
+                        "removeItemListener", itemListeners);
+                    try {
+                        removeItemMethod.invoke(c, itemArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                // [PK] CheckboxMenuItem isn't a component but it does
+                // implement Interface ItemSelectable!!
+                // if (c instanceof CheckboxMenuItem) {
+                //     ((CheckboxMenuItem) c).removeItemListener(this);
+                break;
+
+            case EventID.KEY:
+                c.removeKeyListener(this);
+                break;
+
+            case EventID.MOUSE:
+                c.removeMouseListener(this);
+                break;
+
+            case EventID.MOTION:
+                c.removeMouseMotionListener(this);
+                break;
+
+            case EventID.TEXT:
+                try {
+                    removeTextMethod = c.getClass().getMethod(
+                        "removeTextListener", textListeners);
+                    try {
+                        removeTextMethod.invoke(c, textArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.WINDOW:
+                try {
+                    removeWindowMethod = c.getClass().getMethod(
+                        "removeWindowListener", windowListeners);
+                    try {
+                        removeWindowMethod.invoke(c, windowArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            default:
+                return;
+            }
+
+            if (c instanceof Container) {
+                int count = ((Container) c).getComponentCount();
+                for (int i = 0; i < count; i++) {
+                    removeListeners(((Container) c).getComponent(i), eventID);
+                }
+            }
+        }
+
+        /********************************************************************/
+        /*                                                                  */
+        /* Listener Interface Methods                                       */
+        /*                                                                  */
+        /********************************************************************/
+
+        /* TopLevelWindow Methods ***************************************/
+
+        /**
+         * Called when top level window is created.
+         *
+         * @see EventQueueMonitor
+         * @see EventQueueMonitor#addTopLevelWindowListener
+         */
+        public void topLevelWindowCreated(Window w) {
+            installListeners(w);
+        }
+
+        /**
+         * Called when top level window is destroyed.
+         *
+         * @see EventQueueMonitor
+         * @see EventQueueMonitor#addTopLevelWindowListener
+         */
+        public void topLevelWindowDestroyed(Window w) {
+        }
+
+        /* ActionListener Methods ***************************************/
+
+        /**
+         * Called when an action is performed.
+         *
+         * @see AWTEventMonitor#addActionListener
+         */
+        public void actionPerformed(ActionEvent e) {
+            if (AWTEventMonitor.actionListener_private != null) {
+                AWTEventMonitor.actionListener_private.actionPerformed(e);
+            }
+        }
+
+        /* AdjustmentListener Methods ***********************************/
+
+        /**
+         * Called when an adjustment is made.
+         *
+         * @see AWTEventMonitor#addAdjustmentListener
+         */
+        public void adjustmentValueChanged(AdjustmentEvent e) {
+            if (AWTEventMonitor.adjustmentListener_private != null) {
+                AWTEventMonitor.adjustmentListener_private.adjustmentValueChanged(e);
+            }
+        }
+
+        /* ComponentListener Methods ************************************/
+
+        /**
+         * Called when a component is hidden.
+         *
+         * @see AWTEventMonitor#addComponentListener
+         */
+        public void componentHidden(ComponentEvent e) {
+            if (AWTEventMonitor.componentListener_private != null) {
+                AWTEventMonitor.componentListener_private.componentHidden(e);
+            }
+        }
+
+        /**
+         * Called when a component is moved.
+         *
+         * @see AWTEventMonitor#addComponentListener
+         */
+        public void componentMoved(ComponentEvent e) {
+            if (AWTEventMonitor.componentListener_private != null) {
+                AWTEventMonitor.componentListener_private.componentMoved(e);
+            }
+        }
+
+        /**
+         * Called when a component is resized.
+         *
+         * @see AWTEventMonitor#addComponentListener
+         */
+        public void componentResized(ComponentEvent e) {
+            if (AWTEventMonitor.componentListener_private != null) {
+                AWTEventMonitor.componentListener_private.componentResized(e);
+            }
+        }
+
+        /**
+         * Called when a component is shown.
+         *
+         * @see AWTEventMonitor#addComponentListener
+         */
+        public void componentShown(ComponentEvent e) {
+            if (AWTEventMonitor.componentListener_private != null) {
+                AWTEventMonitor.componentListener_private.componentShown(e);
+            }
+        }
+
+        /* ContainerListener Methods ************************************/
+
+        /**
+         * Called when a component is added to a container.
+         *
+         * @see AWTEventMonitor#addContainerListener
+         */
+        public void componentAdded(ContainerEvent e) {
+            installListeners(e.getChild());
+            if (AWTEventMonitor.containerListener_private != null) {
+                AWTEventMonitor.containerListener_private.componentAdded(e);
+            }
+        }
+
+        /**
+         * Called when a component is removed from a container.
+         *
+         * @see AWTEventMonitor#addContainerListener
+         */
+        public void componentRemoved(ContainerEvent e) {
+            removeListeners(e.getChild());
+            if (AWTEventMonitor.containerListener_private != null) {
+                AWTEventMonitor.containerListener_private.componentRemoved(e);
+            }
+        }
+
+        /* FocusListener Methods ****************************************/
+
+        /**
+         * Called when a component gains keyboard focus.
+         *
+         * @see AWTEventMonitor#addFocusListener
+         */
+        public void focusGained(FocusEvent e) {
+            AWTEventMonitor.componentWithFocus_private = (Component) e.getSource();
+            if (AWTEventMonitor.focusListener_private != null) {
+                AWTEventMonitor.focusListener_private.focusGained(e);
+            }
+        }
+
+        /**
+         * Called when a component loses keyboard focus.
+         *
+         * @see AWTEventMonitor#addFocusListener
+         */
+        public void focusLost(FocusEvent e) {
+            AWTEventMonitor.componentWithFocus_private = null;
+            if (AWTEventMonitor.focusListener_private != null) {
+                AWTEventMonitor.focusListener_private.focusLost(e);
+            }
+        }
+
+        /* ItemListener Methods *****************************************/
+
+        /**
+         * Called when an item's state changes.
+         *
+         * @see AWTEventMonitor#addItemListener
+         */
+        public void itemStateChanged(ItemEvent e) {
+            if (AWTEventMonitor.itemListener_private != null) {
+                AWTEventMonitor.itemListener_private.itemStateChanged(e);
+            }
+        }
+
+        /* KeyListener Methods ******************************************/
+
+        /**
+         * Called when a key is pressed.
+         *
+         * @see AWTEventMonitor#addKeyListener
+         */
+        public void keyPressed(KeyEvent e) {
+            if (AWTEventMonitor.keyListener_private != null) {
+                AWTEventMonitor.keyListener_private.keyPressed(e);
+            }
+        }
+
+        /**
+         * Called when a key is typed.
+         *
+         * @see AWTEventMonitor#addKeyListener
+         */
+        public void keyReleased(KeyEvent e) {
+            if (AWTEventMonitor.keyListener_private != null) {
+                AWTEventMonitor.keyListener_private.keyReleased(e);
+            }
+        }
+
+        /**
+         * Called when a key is released.
+         *
+         * @see AWTEventMonitor#addKeyListener
+         */
+        public void keyTyped(KeyEvent e) {
+            if (AWTEventMonitor.keyListener_private != null) {
+                AWTEventMonitor.keyListener_private.keyTyped(e);
+            }
+        }
+
+        /* MouseListener Methods ****************************************/
+
+        /**
+         * Called when the mouse is clicked.
+         *
+         * @see AWTEventMonitor#addMouseListener
+         */
+        public void mouseClicked(MouseEvent e) {
+            if (AWTEventMonitor.mouseListener_private != null) {
+                AWTEventMonitor.mouseListener_private.mouseClicked(e);
+            }
+        }
+
+        /**
+         * Called when the mouse enters a component.
+         *
+         * @see AWTEventMonitor#addMouseListener
+         */
+        public void mouseEntered(MouseEvent e) {
+            if (AWTEventMonitor.mouseListener_private != null) {
+                AWTEventMonitor.mouseListener_private.mouseEntered(e);
+            }
+        }
+
+        /**
+         * Called when the mouse leaves a component.
+         *
+         * @see AWTEventMonitor#addMouseListener
+         */
+        public void mouseExited(MouseEvent e) {
+            if (AWTEventMonitor.mouseListener_private != null) {
+                AWTEventMonitor.mouseListener_private.mouseExited(e);
+            }
+        }
+
+        /**
+         * Called when the mouse is pressed.
+         *
+         * @see AWTEventMonitor#addMouseListener
+         */
+        public void mousePressed(MouseEvent e) {
+            if (AWTEventMonitor.mouseListener_private != null) {
+                AWTEventMonitor.mouseListener_private.mousePressed(e);
+            }
+        }
+
+        /**
+         * Called when the mouse is released.
+         *
+         * @see AWTEventMonitor#addMouseListener
+         */
+        public void mouseReleased(MouseEvent e) {
+            if (AWTEventMonitor.mouseListener_private != null) {
+                AWTEventMonitor.mouseListener_private.mouseReleased(e);
+            }
+        }
+
+        /* MouseMotionListener Methods **********************************/
+
+        /**
+         * Called when the mouse is dragged.
+         *
+         * @see AWTEventMonitor#addMouseMotionListener
+         */
+        public void mouseDragged(MouseEvent e) {
+            if (AWTEventMonitor.mouseMotionListener_private != null) {
+                AWTEventMonitor.mouseMotionListener_private.mouseDragged(e);
+            }
+        }
+
+        /**
+         * Called when the mouse is moved.
+         *
+         * @see AWTEventMonitor#addMouseMotionListener
+         */
+        public void mouseMoved(MouseEvent e) {
+            if (AWTEventMonitor.mouseMotionListener_private != null) {
+                AWTEventMonitor.mouseMotionListener_private.mouseMoved(e);
+            }
+        }
+
+        /* TextListener Methods *****************************************/
+
+        /**
+         * Called when a component's text value changed.
+         *
+         * @see AWTEventMonitor#addTextListener
+         */
+        public void textValueChanged(TextEvent e) {
+            if (AWTEventMonitor.textListener_private != null) {
+                AWTEventMonitor.textListener_private.textValueChanged(e);
+            }
+        }
+
+        /* WindowListener Methods ***************************************/
+
+        /**
+         * Called when a window is opened.
+         *
+         * @see AWTEventMonitor#addWindowListener
+         */
+        public void windowOpened(WindowEvent e) {
+            if (AWTEventMonitor.windowListener_private != null) {
+                AWTEventMonitor.windowListener_private.windowOpened(e);
+            }
+        }
+
+        /**
+         * Called when a window is in the process of closing.
+         *
+         * @see AWTEventMonitor#addWindowListener
+         */
+        public void windowClosing(WindowEvent e) {
+            if (AWTEventMonitor.windowListener_private != null) {
+                AWTEventMonitor.windowListener_private.windowClosing(e);
+            }
+        }
+
+        /**
+         * Called when a window is closed.
+         *
+         * @see AWTEventMonitor#addWindowListener
+         */
+        public void windowClosed(WindowEvent e) {
+            if (AWTEventMonitor.windowListener_private != null) {
+                AWTEventMonitor.windowListener_private.windowClosed(e);
+            }
+        }
+
+        /**
+         * Called when a window is iconified.
+         *
+         * @see AWTEventMonitor#addWindowListener
+         */
+        public void windowIconified(WindowEvent e) {
+            if (AWTEventMonitor.windowListener_private != null) {
+                AWTEventMonitor.windowListener_private.windowIconified(e);
+            }
+        }
+
+        /**
+         * Called when a window is deiconified.
+         *
+         * @see AWTEventMonitor#addWindowListener
+         */
+        public void windowDeiconified(WindowEvent e) {
+            if (AWTEventMonitor.windowListener_private != null) {
+                AWTEventMonitor.windowListener_private.windowDeiconified(e);
+            }
+        }
+
+        /**
+         * Called when a window is activated.
+         *
+         * @see AWTEventMonitor#addWindowListener
+         */
+        public void windowActivated(WindowEvent e) {
+            if (AWTEventMonitor.windowListener_private != null) {
+                AWTEventMonitor.windowListener_private.windowActivated(e);
+            }
+        }
+
+        /**
+         * Called when a window is deactivated.
+         *
+         * @see AWTEventMonitor#addWindowListener
+         */
+        public void windowDeactivated(WindowEvent e) {
+            if (AWTEventMonitor.windowListener_private != null) {
+                AWTEventMonitor.windowListener_private.windowDeactivated(e);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/AccessibilityEventMonitor.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,376 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.util.*;
+import java.beans.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.accessibility.*;
+
+/**
+ * <P>{@code AccessibilityEventMonitor} implements a PropertyChange listener
+ * on every UI object that implements interface {@code Accessible} in the Java
+ * Virtual Machine.  The events captured by these listeners are made available
+ * through listeners supported by {@code AccessibilityEventMonitor}.
+ * With this, all the individual events on each of the UI object
+ * instances are funneled into one set of PropertyChange listeners.
+ * <p>This class depends upon {@link EventQueueMonitor}, which provides the base
+ * level support for capturing the top-level containers as they are created.
+ *
+ */
+
+@jdk.Exported
+public class AccessibilityEventMonitor {
+
+    // listeners
+    /**
+     * The current list of registered {@link java.beans.PropertyChangeListener
+     * PropertyChangeListener} classes.
+     *
+     * @see #addPropertyChangeListener
+     * @see #removePropertyChangeListener
+     */
+    static protected final AccessibilityListenerList listenerList =
+        new AccessibilityListenerList();
+
+
+    /**
+     * The actual listener that is installed on the component instances.
+     * This listener calls the other registered listeners when an event
+     * occurs.  By doing things this way, the actual number of listeners
+     * installed on a component instance is drastically reduced.
+     */
+    static protected final AccessibilityEventListener accessibilityListener =
+        new AccessibilityEventListener();
+
+    /**
+     * Adds the specified listener to receive all PropertyChange events on
+     * each UI object instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to UI object instances that support this listener type.
+     *
+     * @param l the listener to add
+     *
+     * @see #removePropertyChangeListener
+     */
+    static public void addPropertyChangeListener(PropertyChangeListener l) {
+        if (listenerList.getListenerCount(PropertyChangeListener.class) == 0) {
+            accessibilityListener.installListeners();
+        }
+        listenerList.add(PropertyChangeListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives PropertyChange
+     * events when they occur.
+     * @see #addPropertyChangeListener
+     * @param l the listener to remove
+     */
+    static public void removePropertyChangeListener(PropertyChangeListener l) {
+        listenerList.remove(PropertyChangeListener.class, l);
+        if (listenerList.getListenerCount(PropertyChangeListener.class) == 0) {
+            accessibilityListener.removeListeners();
+        }
+    }
+
+
+    /**
+     * AccessibilityEventListener is the class that does all the work for
+     * AccessibilityEventMonitor.  It is not intended for use by any other
+     * class except AccessibilityEventMonitor.
+     *
+     */
+
+    static class AccessibilityEventListener implements TopLevelWindowListener,
+                PropertyChangeListener {
+
+        /**
+         * Create a new instance of this class and install it on each component
+         * instance in the virtual machine that supports any of the currently
+         * registered listeners in AccessibilityEventMonitor.  Also registers
+         * itself as a TopLevelWindowListener with EventQueueMonitor so it can
+         * automatically add new listeners to new components.
+         * @see EventQueueMonitor
+         * @see AccessibilityEventMonitor
+         */
+        public AccessibilityEventListener() {
+            EventQueueMonitor.addTopLevelWindowListener(this);
+        }
+
+        /**
+         * Installs PropertyChange listeners on all Accessible objects based
+         * upon the current topLevelWindows cached by EventQueueMonitor.
+         * @see EventQueueMonitor
+         * @see AWTEventMonitor
+         */
+        protected void installListeners() {
+            Window topLevelWindows[] = EventQueueMonitor.getTopLevelWindows();
+            if (topLevelWindows != null) {
+                for (int i = 0; i < topLevelWindows.length; i++) {
+                    if (topLevelWindows[i] instanceof Accessible) {
+                        installListeners((Accessible) topLevelWindows[i]);
+                    }
+                }
+            }
+        }
+
+        /**
+         * Installs PropertyChange listeners to the Accessible object, and it's
+         * children (so long as the object isn't of TRANSIENT state).
+         * @param a the Accessible object to add listeners to
+         */
+        protected void installListeners(Accessible a) {
+            installListeners(a.getAccessibleContext());
+        }
+
+        /**
+         * Installs PropertyChange listeners to the AccessibleContext object,
+         * and it's * children (so long as the object isn't of TRANSIENT state).
+         * @param a the Accessible object to add listeners to
+         */
+        private void installListeners(AccessibleContext ac) {
+
+            if (ac != null) {
+                AccessibleStateSet states = ac.getAccessibleStateSet();
+                if (!states.contains(AccessibleState.TRANSIENT)) {
+                    ac.addPropertyChangeListener(this);
+                    /*
+                     * Don't add listeners to transient children. Components
+                     * with transient children should return an AccessibleStateSet
+                     * containing AccessibleState.MANAGES_DESCENDANTS. Components
+                     * may not explicitly return the MANAGES_DESCENDANTS state.
+                     * In this case, don't add listeners to the children of
+                     * lists, tables and trees.
+                     */
+                    AccessibleStateSet set = ac.getAccessibleStateSet();
+                    if (set.contains(_AccessibleState.MANAGES_DESCENDANTS)) {
+                        return;
+                    }
+                    AccessibleRole role = ac.getAccessibleRole();
+                    if (role == AccessibleRole.LIST ||
+                        role == AccessibleRole.TREE) {
+                        return;
+                    }
+                    if (role == AccessibleRole.TABLE) {
+                        // handle Oracle tables containing tables
+                        Accessible child = ac.getAccessibleChild(0);
+                        if (child != null) {
+                            AccessibleContext ac2 = child.getAccessibleContext();
+                            if (ac2 != null) {
+                                role = ac2.getAccessibleRole();
+                                if (role != null && role != AccessibleRole.TABLE) {
+                                    return;
+                                }
+                            }
+                        }
+                    }
+                    int count = ac.getAccessibleChildrenCount();
+                    for (int i = 0; i < count; i++) {
+                        Accessible child = ac.getAccessibleChild(i);
+                        if (child != null) {
+                            installListeners(child);
+                        }
+                    }
+                }
+            }
+        }
+
+        /**
+         * Removes PropertyChange listeners on all Accessible objects based
+         * upon the topLevelWindows cached by EventQueueMonitor.
+         * @param eventID the event ID
+         * @see EventID
+         */
+        protected void removeListeners() {
+            Window topLevelWindows[] = EventQueueMonitor.getTopLevelWindows();
+            if (topLevelWindows != null) {
+                for (int i = 0; i < topLevelWindows.length; i++) {
+                    if (topLevelWindows[i] instanceof Accessible) {
+                        removeListeners((Accessible) topLevelWindows[i]);
+                    }
+                }
+            }
+        }
+
+        /**
+         * Removes PropertyChange listeners for the given Accessible object,
+         * it's children (so long as the object isn't of TRANSIENT state).
+         * @param a the Accessible object to remove listeners from
+         */
+        protected void removeListeners(Accessible a) {
+            removeListeners(a.getAccessibleContext());
+        }
+
+        /**
+         * Removes PropertyChange listeners for the given AccessibleContext
+         * object, it's children (so long as the object isn't of TRANSIENT
+         * state).
+         * @param a the Accessible object to remove listeners from
+         */
+        private void removeListeners(AccessibleContext ac) {
+
+
+            if (ac != null) {
+                // Listeners are not added to transient components.
+                AccessibleStateSet states = ac.getAccessibleStateSet();
+                if (!states.contains(AccessibleState.TRANSIENT)) {
+                    ac.removePropertyChangeListener(this);
+                    /*
+                     * Listeners are not added to transient children. Components
+                     * with transient children should return an AccessibleStateSet
+                     * containing AccessibleState.MANAGES_DESCENDANTS. Components
+                     * may not explicitly return the MANAGES_DESCENDANTS state.
+                     * In this case, don't remove listeners from the children of
+                     * lists, tables and trees.
+                     */
+                    if (states.contains(_AccessibleState.MANAGES_DESCENDANTS)) {
+                        return;
+                    }
+                    AccessibleRole role = ac.getAccessibleRole();
+                    if (role == AccessibleRole.LIST ||
+                        role == AccessibleRole.TABLE ||
+                        role == AccessibleRole.TREE) {
+                        return;
+                    }
+                    int count = ac.getAccessibleChildrenCount();
+                    for (int i = 0; i < count; i++) {
+                        Accessible child = ac.getAccessibleChild(i);
+                        if (child != null) {
+                            removeListeners(child);
+                        }
+                    }
+                }
+            }
+        }
+
+        /********************************************************************/
+        /*                                                                  */
+        /* Listener Interface Methods                                       */
+        /*                                                                  */
+        /********************************************************************/
+
+        /* TopLevelWindow Methods ***************************************/
+
+        /**
+         * Called when top level window is created.
+         * @see EventQueueMonitor
+         * @see EventQueueMonitor#addTopLevelWindowListener
+         */
+        public void topLevelWindowCreated(Window w) {
+            if (w instanceof Accessible) {
+                installListeners((Accessible) w);
+            }
+        }
+
+        /**
+         * Called when top level window is destroyed.
+         * @see EventQueueMonitor
+         * @see EventQueueMonitor#addTopLevelWindowListener
+         */
+        public void topLevelWindowDestroyed(Window w) {
+            if (w instanceof Accessible) {
+                removeListeners((Accessible) w);
+            }
+        }
+
+
+        /* PropertyChangeListener Methods **************************************/
+
+        public void propertyChange(PropertyChangeEvent e) {
+            // propogate the event
+            Object[] listeners =
+                    AccessibilityEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==PropertyChangeListener.class) {
+                    ((PropertyChangeListener)listeners[i+1]).propertyChange(e);
+                }
+            }
+
+            // handle childbirth/death
+            String name = e.getPropertyName();
+            if (name.compareTo(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY) == 0) {
+                Object oldValue = e.getOldValue();
+                Object newValue = e.getNewValue();
+
+                if ((oldValue == null) ^ (newValue == null)) { // one null, not both
+                    if (oldValue != null) {
+                        // this Accessible is a child that's going away
+                        if (oldValue instanceof Accessible) {
+                            Accessible a = (Accessible) oldValue;
+                            removeListeners(a.getAccessibleContext());
+                        } else if (oldValue instanceof AccessibleContext) {
+                            removeListeners((AccessibleContext) oldValue);
+                        }
+                    } else if (newValue != null) {
+                        // this Accessible is a child was just born
+                        if (newValue instanceof Accessible) {
+                            Accessible a = (Accessible) newValue;
+                            installListeners(a.getAccessibleContext());
+                        } else if (newValue instanceof AccessibleContext) {
+                            installListeners((AccessibleContext) newValue);
+                        }
+                    }
+                } else {
+                    System.out.println("ERROR in usage of PropertyChangeEvents for: " + e.toString());
+                }
+            }
+        }
+    }
+}
+
+/*
+ * workaround for no public AccessibleState constructor
+ */
+class _AccessibleState extends AccessibleState {
+    /**
+     * Indicates this object is responsible for managing its
+     * subcomponents.  This is typically used for trees and tables
+     * that have a large number of subcomponents and where the
+     * objects are created only when needed and otherwise remain virtual.
+     * The application should not manage the subcomponents directly.
+     */
+    public static final _AccessibleState MANAGES_DESCENDANTS
+        = new _AccessibleState ("managesDescendants");
+
+    /**
+     * Creates a new AccessibleState using the given locale independent key.
+     * This should not be a public method.  Instead, it is used to create
+     * the constants in this file to make it a strongly typed enumeration.
+     * Subclasses of this class should enforce similar policy.
+     * <p>
+     * The key String should be a locale independent key for the state.
+     * It is not intended to be used as the actual String to display
+     * to the user.  To get the localized string, use toDisplayString.
+     *
+     * @param key the locale independent name of the state.
+     * @see AccessibleBundle#toDisplayString
+     */
+    protected _AccessibleState(String key) {
+        super(key);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/AccessibilityListenerList.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.util.*;
+import java.beans.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.accessibility.*;
+
+/**
+ * <P>The {@code AccessibilityListenerList} is a copy of the Swing
+ * {@link javax.swing.event.EventListenerList EventListerList} class.
+ *
+ */
+
+@jdk.Exported
+public class AccessibilityListenerList {
+    /* A null array to be shared by all empty listener lists */
+    private final static Object[] NULL_ARRAY = new Object[0];
+
+    /**
+     * The list of listener type, listener pairs
+     */
+    protected transient Object[] listenerList = NULL_ARRAY;
+
+    /**
+     * Passes back the event listener list as an array of listener type, listener pairs.
+     * Note that for performance reasons, this implementation passes back the actual
+     * data structure in which the listener data is stored internally. This method
+     * is guaranteed to pass back a non-null array, so that no null-checking
+     * is required in fire methods. A zero-length array of Object is returned if
+     * there are currently no listeners.
+     * <p>
+     * Absolutely no modification of the data contained in this array should be
+     * made.  If any such manipulation is necessary, it should be done on a copy
+     * of the array returned rather than the array itself.
+     *
+     * @return an array of listener type, listener pairs.
+     */
+    public Object[] getListenerList() {
+        return listenerList;
+    }
+
+    /**
+     * Returns the total number of listeners for this listener list.
+     *
+     * @return the total number of listeners for this listener list.
+     */
+    public int getListenerCount() {
+        return listenerList.length/2;
+    }
+
+    /**
+     * Return the total number of listeners of the supplied type
+     * for this listener list.
+     *
+     * @param t the type of the listener to be counted
+     * @return the number of listeners found
+     */
+    public int getListenerCount(Class<? extends EventListener> t) {
+        int count = 0;
+        Object[] lList = listenerList;
+        for (int i = 0; i < lList.length; i+=2) {
+            if (t == (Class)lList[i])
+                count++;
+        }
+        return count;
+    }
+
+    /**
+     * Add the listener as a listener of the specified type.
+     *
+     * @param t the type of the listener to be added
+     * @param l the listener to be added
+     */
+    public synchronized void add(Class<? extends EventListener> t, EventListener l) {
+        if (!t.isInstance(l)) {
+            throw new IllegalArgumentException("Listener " + l +
+                                         " is not of type " + t);
+        }
+        if (l ==null) {
+            throw new IllegalArgumentException("Listener " + l +
+                                         " is null");
+        }
+        if (listenerList == NULL_ARRAY) {
+            // if this is the first listener added,
+            // initialize the lists
+            listenerList = new Object[] { t, l };
+        } else {
+            // Otherwise copy the array and add the new listener
+            int i = listenerList.length;
+            Object[] tmp = new Object[i+2];
+            System.arraycopy(listenerList, 0, tmp, 0, i);
+
+            tmp[i] = t;
+            tmp[i+1] = l;
+
+            listenerList = tmp;
+        }
+    }
+
+    /**
+     * Remove the listener as a listener of the specified type.
+     *
+     * @param t the type of the listener to be removed
+     * @param l the listener to be removed
+     */
+    public synchronized void remove(Class<? extends EventListener> t, EventListener l) {
+        if (!t.isInstance(l)) {
+            throw new IllegalArgumentException("Listener " + l +
+                                         " is not of type " + t);
+        }
+        if (l ==null) {
+            throw new IllegalArgumentException("Listener " + l +
+                                         " is null");
+        }
+
+        // Is l on the list?
+        int index = -1;
+        for (int i = listenerList.length-2; i>=0; i-=2) {
+            if ((listenerList[i]==t) && (listenerList[i+1] == l)) {
+                index = i;
+                break;
+            }
+        }
+
+        // If so,  remove it
+        if (index != -1) {
+            Object[] tmp = new Object[listenerList.length-2];
+            // Copy the list up to index
+            System.arraycopy(listenerList, 0, tmp, 0, index);
+            // Copy from two past the index, up to
+            // the end of tmp (which is two elements
+            // shorter than the old list)
+            if (index < tmp.length)
+                System.arraycopy(listenerList, index+2, tmp, index,
+                                 tmp.length - index);
+            // set the listener array to the new array or null
+            listenerList = (tmp.length == 0) ? NULL_ARRAY : tmp;
+            }
+    }
+
+    /**
+     * Return a string representation of the {@code AccessibilityListenerList}.
+     *
+     * @return a string representation of the {@code AccessibilityListenerList}.
+     */
+    public String toString() {
+        Object[] lList = listenerList;
+        String s = "EventListenerList: ";
+        s += lList.length/2 + " listeners: ";
+        for (int i = 0 ; i <= lList.length-2 ; i+=2) {
+            s += " type " + ((Class)lList[i]).getName();
+            s += " listener " + lList[i+1];
+        }
+        return s;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/EventID.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+/**
+ * EventID contains integer constants that map to event support in
+ * AWT and Swing.  They are used by primarily by AWTEventMonitor,
+ * AWTEventsListener, SwingEventMonitor, and SwingEventListener, but
+ * can be freely used by any other class.
+ *
+ * @see AWTEventMonitor
+ * @see SwingEventMonitor
+ *
+ */
+@jdk.Exported
+public class EventID {
+
+    /**
+     * Maps to AWT Action support (i.e., ActionListener and ActionEvent)
+     */
+    static public final int ACTION              = 0;
+
+    /**
+     * Maps to AWT Adjustment support (i.e., AdjustmentListener
+     * and AdjustmentEvent)
+     */
+    static public final int ADJUSTMENT          = 1;
+
+    /**
+     * Maps to AWT Component support (i.e., ComponentListener
+     * and ComponentEvent)
+     */
+    static public final int COMPONENT           = 2;
+
+    /**
+     * Maps to AWT Container support (i.e., ContainerListener
+     * and ContainerEvent)
+     */
+    static public final int CONTAINER           = 3;
+
+    /**
+     * Maps to AWT Focus support (i.e., FocusListener and FocusEvent)
+     */
+    static public final int FOCUS               = 4;
+
+    /**
+     * Maps to AWT Item support (i.e., ItemListener and ItemEvent)
+     */
+    static public final int ITEM                = 5;
+
+    /**
+     * Maps to AWT Key support (i.e., KeyListener and KeyEvent)
+     */
+    static public final int KEY                 = 6;
+
+    /**
+     * Maps to AWT Mouse support (i.e., MouseListener and MouseEvent)
+     */
+    static public final int MOUSE               = 7;
+
+    /**
+     * Maps to AWT MouseMotion support (i.e., MouseMotionListener
+     * and MouseMotionEvent)
+     */
+    static public final int MOTION              = 8;
+
+    /**
+     * Maps to AWT Text support (i.e., TextListener and TextEvent)
+     */
+    static public final int TEXT                = 10;
+
+    /**
+     * Maps to AWT Window support (i.e., WindowListener and WindowEvent)
+     */
+    static public final int WINDOW              = 11;
+
+    /**
+     * Maps to Swing Ancestor support (i.e., AncestorListener and
+     * AncestorEvent)
+     */
+    static public final int ANCESTOR           = 12;
+
+    /**
+     * Maps to Swing Text Caret support (i.e., CaretListener and
+     * CaretEvent)
+     */
+    static public final int CARET              = 13;
+
+    /**
+     * Maps to Swing CellEditor support (i.e., CellEditorListener and
+     * CellEditorEvent)
+     */
+    static public final int CELLEDITOR         = 14;
+
+    /**
+     * Maps to Swing Change support (i.e., ChangeListener and
+     * ChangeEvent)
+     */
+    static public final int CHANGE             = 15;
+
+    /**
+     * Maps to Swing TableColumnModel support (i.e.,
+     * TableColumnModelListener and TableColumnModelEvent)
+     */
+    static public final int COLUMNMODEL        = 16;
+
+    /**
+     * Maps to Swing Document support (i.e., DocumentListener and
+     * DocumentEvent)
+     */
+    static public final int DOCUMENT           = 17;
+
+    /**
+     * Maps to Swing ListData support (i.e., ListDataListener and
+     * ListDataEvent)
+     */
+    static public final int LISTDATA           = 18;
+
+    /**
+     * Maps to Swing ListSelection support (i.e., ListSelectionListener and
+     * ListSelectionEvent)
+     */
+    static public final int LISTSELECTION      = 19;
+
+    /**
+     * Maps to Swing Menu support (i.e., MenuListener and
+     * MenuEvent)
+     */
+    static public final int MENU               = 20;
+
+    /**
+     * Maps to Swing PopupMenu support (i.e., PopupMenuListener and
+     * PopupMenuEvent)
+     */
+    static public final int POPUPMENU          = 21;
+
+    /**
+     * Maps to Swing TableModel support (i.e., TableModelListener and
+     * TableModelEvent)
+     */
+    static public final int TABLEMODEL         = 22;
+
+    /**
+     * Maps to Swing TreeExpansion support (i.e., TreeExpansionListener and
+     * TreeExpansionEvent)
+     */
+    static public final int TREEEXPANSION      = 23;
+
+    /**
+     * Maps to Swing TreeModel support (i.e., TreeModelListener and
+     * TreeModelEvent)
+     */
+    static public final int TREEMODEL          = 24;
+
+    /**
+     * Maps to Swing TreeSelection support (i.e., TreeSelectionListener and
+     * TreeSelectionEvent)
+     */
+    static public final int TREESELECTION      = 25;
+
+    /**
+     * Maps to Swing UndoableEdit support (i.e., UndoableEditListener and
+     * UndoableEditEvent)
+     */
+    static public final int UNDOABLEEDIT       = 26;
+
+    /**
+     * Maps to Beans PropertyChange support (i.e., PropertyChangeListener
+     * and PropertyChangeEvent)
+     */
+    static public final int PROPERTYCHANGE     = 27;
+
+    /**
+     * Maps to Beans VetoableChange support (i.e., VetoableChangeListener
+     * and VetoableChangeEvent)
+     */
+    static public final int VETOABLECHANGE     = 28;
+
+    /**
+     * Maps to Swing InternalFrame support (i.e., InternalFrameListener)
+     */
+    static public final int INTERNALFRAME      = 29;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/EventQueueMonitor.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,619 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.util.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.accessibility.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+/**
+ * The {@code EventQueueMonitor} class provides key core functionality for Assistive
+ * Technologies (and other system-level technologies that need some of the same
+ * things that Assistive Technology needs).
+ *
+ * @see AWTEventMonitor
+ * @see SwingEventMonitor
+ */
+@jdk.Exported
+public class EventQueueMonitor
+        implements AWTEventListener {
+
+    // NOTE:  All of the following properties are static.  The reason
+    //        for this is that there may be multiple EventQueue instances
+    //        in use in the same VM.  By making these properties static,
+    //        we can guarantee we get the information from all of the
+    //        EventQueue instances.
+
+    // The stuff that is cached.
+    //
+    static Vector<Container>topLevelWindows = new Vector<>();
+    static Window topLevelWindowWithFocus  = null;
+    static Point currentMousePosition      = null;
+    static Component currentMouseComponent = null;
+
+    // Low-level listener interfaces
+    //
+    static GUIInitializedListener guiInitializedListener = null;
+    static TopLevelWindowListener topLevelWindowListener = null;
+    static MouseMotionListener    mouseMotionListener    = null;
+
+    /**
+     * Class variable stating whether the assistive technologies have
+     * been loaded yet or not.  The assistive technologies won't be
+     * loaded until the first event is posted to the EventQueue.  This
+     * gives the toolkit a chance to do all the necessary initialization
+     * it needs to do.
+     */
+
+    /**
+     * Class variable stating whether the GUI subsystem has been initialized
+     * or not.
+     *
+     * @see #isGUIInitialized
+     */
+    static boolean guiInitialized = false;
+
+    /**
+     * Queue that holds events for later processing.
+     */
+    static EventQueueMonitorItem componentEventQueue = null;
+
+    /**
+     * Class that tells us what the component event dispatch thread is.
+     */
+    static private ComponentEvtDispatchThread cedt = null;
+
+    /**
+     * Handle the synchronization between the thing that populates the
+     * component event dispatch thread ({@link #queueComponentEvent})
+     * and the thing that processes the events ({@link ComponentEvtDispatchThread}).
+     */
+    static Object componentEventQueueLock = new Object();
+
+    /**
+     * Create a new {@code EventQueueMonitor} instance.  Normally, this will
+     * be called only by the AWT Toolkit during initialization time.
+     * Assistive technologies should not create instances of
+     * EventQueueMonitor by themselves.  Instead, they should either
+     * refer to it directly via the static methods in this class, e.g.,
+     * {@link #getCurrentMousePosition} or obtain the instance by asking the
+     * Toolkit, e.g., {@link java.awt.Toolkit#getSystemEventQueue}.
+     */
+    public EventQueueMonitor() {
+        if (cedt == null) {
+            cedt = new ComponentEvtDispatchThread("EventQueueMonitor-ComponentEvtDispatch");
+
+            cedt.setDaemon(true);
+            cedt.start();
+        }
+    }
+
+    /**
+     * Queue up a {@link java.awt.event.ComponentEvent ComponentEvent} for later
+     * processing by the {@link ComponentEvtDispatch} thread.
+     *
+     * @param e a {@code ComponentEvent}
+     */
+    static void queueComponentEvent(ComponentEvent e) {
+        synchronized(componentEventQueueLock) {
+            EventQueueMonitorItem eqi = new EventQueueMonitorItem(e);
+            if (componentEventQueue == null) {
+                componentEventQueue = eqi;
+            } else {
+                EventQueueMonitorItem q = componentEventQueue;
+                while (true) {
+                    if (q.next != null) {
+                        q = q.next;
+                    } else {
+                        break;
+                    }
+                }
+                q.next = eqi;
+            }
+            componentEventQueueLock.notifyAll();
+        }
+    }
+
+    /**
+     * Tell the {@code EventQueueMonitor} to start listening for events.
+     */
+    public static void maybeInitialize() {
+        if (cedt == null) {
+            java.security.AccessController.doPrivileged(
+                new java.security.PrivilegedAction<Void>() {
+                    public Void run() {
+                        try {
+                            long eventMask = AWTEvent.WINDOW_EVENT_MASK |
+                                AWTEvent.FOCUS_EVENT_MASK |
+                                AWTEvent.MOUSE_MOTION_EVENT_MASK;
+
+                            Toolkit.getDefaultToolkit().addAWTEventListener(new EventQueueMonitor(), eventMask);
+                        } catch (Exception e) {
+                        }
+                        return null;
+                    }
+                }
+            );
+        }
+    }
+
+    /**
+     * Handle events as a result of registering a listener
+     * on the {@link java.awt.EventQueue EventQueue} in {@link #maybeInitialize}.
+     */
+    public void eventDispatched(AWTEvent theEvent) {
+        processEvent(theEvent);
+    }
+
+    /**
+     * Assisitive technologies that have
+     * registered a {@link GUIInitializedListener} will be notified.
+     *
+     * @see #addGUIInitializedListener
+     */
+    static void maybeNotifyAssistiveTechnologies() {
+
+        if (!guiInitialized) {
+            guiInitialized = true;
+            if (guiInitializedListener != null) {
+                guiInitializedListener.guiInitialized();
+            }
+        }
+
+    }
+
+    /********************************************************************/
+    /*                                                                  */
+    /* Package Private Methods                                          */
+    /*                                                                  */
+    /********************************************************************/
+
+    /**
+     * Add a Container to the list of top-level containers
+     * in the cache.  This follows the object's hierarchy up the
+     * tree until it finds the top most parent.  If the parent is
+     * not already in the list of Containers, it adds it to the list.
+     *
+     * @param c the Container
+     */
+    static void addTopLevelWindow(Component c) {
+        Container parent;
+
+        if (c == null) {
+            return;
+        }
+
+        if (!(c instanceof Window)) {
+            addTopLevelWindow(c.getParent());
+            return;
+        }
+
+        if ((c instanceof Dialog) || (c instanceof Window)) {
+            parent = (Container) c;
+        } else {
+            parent = c.getParent();
+            if (parent != null) {
+                addTopLevelWindow(parent);
+                return;
+            }
+        }
+
+        if (parent == null) {
+            parent = (Container) c;
+        }
+
+        // Because this method is static, do not make it synchronized because
+        // it can lock the whole class.  Instead, just lock what needs to be
+        // locked.
+        //
+        synchronized (topLevelWindows) {
+            if ((parent != null) && !topLevelWindows.contains(parent)) {
+                topLevelWindows.addElement(parent);
+                if (topLevelWindowListener != null) {
+                    topLevelWindowListener.topLevelWindowCreated((Window) parent);
+                }
+            }
+        }
+    }
+
+    /**
+     * Removes a container from the list of top level containers in the cache.
+     *
+     * @param c the top level container to remove
+     */
+    static void removeTopLevelWindow(Window w) {
+
+        // Because this method is static, do not make it synchronized because
+        // it can lock the whole class.  Instead, just lock what needs to be
+        // locked.
+        //
+        synchronized (topLevelWindows) {
+            if (topLevelWindows.contains(w)) {
+                topLevelWindows.removeElement(w);
+                if (topLevelWindowListener != null) {
+                    topLevelWindowListener.topLevelWindowDestroyed(w);
+                }
+            }
+        }
+    }
+
+    /**
+     * Update current mouse position.
+     *
+     * @param mouseEvent the MouseEvent that holds the new mouse position.
+     */
+    static void updateCurrentMousePosition(MouseEvent mouseEvent) {
+        Point oldMousePos = currentMousePosition;
+        // Be careful here.  The component in the event might be
+        // hidden by the time we process the event.
+        try {
+            Point eventPoint      = mouseEvent.getPoint();
+            currentMouseComponent = (Component) (mouseEvent.getSource());
+            currentMousePosition  = currentMouseComponent.getLocationOnScreen();
+            currentMousePosition.translate(eventPoint.x,eventPoint.y);
+        } catch (Exception e) {
+            currentMousePosition = oldMousePos;
+        }
+    }
+
+    /**
+     * Process the event.  This maintains the event cache in addition
+     * to calling all the registered listeners.  NOTE: The events that
+     * come through here are from peered Components.
+     *
+     * @param theEvent the AWTEvent
+     */
+    static void processEvent(AWTEvent theEvent) {
+        switch (theEvent.getID()) {
+        case MouseEvent.MOUSE_MOVED:
+        case MouseEvent.MOUSE_DRAGGED:
+        case FocusEvent.FOCUS_GAINED:
+        case WindowEvent.WINDOW_DEACTIVATED:
+            queueComponentEvent((ComponentEvent) theEvent);
+            break;
+
+        case WindowEvent.WINDOW_ACTIVATED:
+            // Dialogs fire WINDOW_ACTIVATED and FOCUS_GAINED events
+            // before WINDOW_OPENED so we need to add topLevelListeners
+            // for the dialog when it is first activated to get a
+            // focus gained event for the focus component in the dialog.
+            if (theEvent instanceof ComponentEvent) {
+                ComponentEvent ce = (ComponentEvent)theEvent;
+                if (ce.getComponent() instanceof Window) {
+                    EventQueueMonitor.addTopLevelWindow(ce.getComponent());
+                    EventQueueMonitor.maybeNotifyAssistiveTechnologies();
+                } else {
+                    EventQueueMonitor.maybeNotifyAssistiveTechnologies();
+                    EventQueueMonitor.addTopLevelWindow(ce.getComponent());
+                }
+            }
+            queueComponentEvent((ComponentEvent) theEvent);
+            break;
+
+            // handle WINDOW_OPENED and WINDOW_CLOSED events synchronously
+        case WindowEvent.WINDOW_OPENED:
+            if (theEvent instanceof ComponentEvent) {
+                ComponentEvent ce = (ComponentEvent)theEvent;
+                if (ce.getComponent() instanceof Window) {
+                    EventQueueMonitor.addTopLevelWindow(ce.getComponent());
+                    EventQueueMonitor.maybeNotifyAssistiveTechnologies();
+                } else {
+                    EventQueueMonitor.maybeNotifyAssistiveTechnologies();
+                    EventQueueMonitor.addTopLevelWindow(ce.getComponent());
+                }
+            }
+            break;
+        case WindowEvent.WINDOW_CLOSED:
+            if (theEvent instanceof ComponentEvent) {
+                ComponentEvent ce = (ComponentEvent)theEvent;
+                EventQueueMonitor.removeTopLevelWindow((Window) (ce.getComponent()));
+            }
+            break;
+
+        default:
+            break;
+        }
+    }
+
+    /**
+     * Internal test
+     */
+    static synchronized Component getShowingComponentAt(Container c, int x, int y) {
+        if (!c.contains(x, y)) {
+            return null;
+        }
+        int ncomponents = c.getComponentCount();
+        for (int i = 0 ; i < ncomponents ; i++) {
+            Component comp = c.getComponent(i);
+            if (comp != null && comp.isShowing()) {
+                Point location = comp.getLocation();
+                if (comp.contains(x - location.x, y - location.y)) {
+                    return comp;
+                }
+            }
+        }
+        return c;
+    }
+
+    /**
+     * Return the Component at the given Point on the screen in the
+     * given Container.
+     *
+     * @param c the Container to search
+     * @param p the Point in screen coordinates
+     * @return the Component at the given Point on the screen in the
+     * given Container -- can be null if no Component is at that Point
+     */
+    static synchronized Component getComponentAt(Container c, Point p) {
+        if (!c.isShowing()) {
+            return null;
+        }
+
+        Component comp;
+        Point containerLoc = c.getLocationOnScreen();
+        Point containerPoint = new Point(p.x - containerLoc.x,
+                                         p.y - containerLoc.y);
+
+        comp = getShowingComponentAt(c, containerPoint.x, containerPoint.y);
+
+        if ((comp != c) && (comp instanceof Container)) {
+            return getComponentAt((Container)comp,p);
+        } else {
+            return comp;
+        }
+    }
+
+    /**
+     * Obtain the {@link javax.accessibility.Accessible Accessible} object at the given point on the Screen.
+     * The return value may be null if an {@code Accessible} object cannot be
+     * found at the particular point.
+     *
+     * @param p the point to be accessed
+     * @return the {@code Accessible} at the specified point
+     */
+    static public Accessible getAccessibleAt(Point p) {
+        Window w = getTopLevelWindowWithFocus();
+        Window[] wins = getTopLevelWindows();
+        Component c = null;
+
+        // See if the point we're being asked about is the
+        // currentMousePosition.  If so, start with the component
+        // that we know the currentMousePostion is over
+        //
+        if (currentMousePosition == null) {
+            return null;
+        }
+        if (currentMousePosition.equals(p)) {
+            if (currentMouseComponent instanceof Container) {
+                c = getComponentAt((Container) currentMouseComponent, p);
+            }
+        }
+
+        // Try the window with focus next
+        //
+        if (c == null && w != null) {
+            c = getComponentAt(w,p);
+        }
+
+        // Try the other windows next.  [[[WDW: Stacking order???]]]
+        if (c == null) {
+            for (int i = 0; i < wins.length; i++) {
+                c = getComponentAt(wins[i],p);
+                if (c != null) {
+                    break;
+                }
+            }
+        }
+
+        if (c instanceof Accessible) {
+            AccessibleContext ac = ((Accessible) c).getAccessibleContext();
+            if (ac != null) {
+                AccessibleComponent acmp = ac.getAccessibleComponent();
+                if ((acmp != null) && (ac.getAccessibleChildrenCount() != 0)) {
+                    Point location = acmp.getLocationOnScreen();
+                    location.move(p.x - location.x, p.y - location.y);
+                    return acmp.getAccessibleAt(location);
+                }
+            }
+            return (Accessible) c;
+        } else {
+            return Translator.getAccessible(c);
+        }
+    }
+
+    /********************************************************************/
+    /*                                                                  */
+    /* Public Methods                                                   */
+    /*                                                                  */
+    /********************************************************************/
+
+    /**
+     * Says whether the GUI subsystem has been initialized or not.
+     * If this returns true, the assistive technology can freely
+     * create GUI component instances.  If the return value is false,
+     * the assistive technology should register a {@link GUIInitializedListener}
+     * and wait to create GUI component instances until the listener is
+     * called.
+     *
+     * @return true if the GUI subsystem has been initialized
+     * @see #addGUIInitializedListener
+     */
+    static public boolean isGUIInitialized() {
+        maybeInitialize();
+        return guiInitialized;
+    }
+
+    /**
+     * Adds the specified listener to be notified when the GUI subsystem
+     * is initialized.  Assistive technologies should get the results of
+     * {@link #isGUIInitialized} before calling this method.
+     *
+     * @param l the listener to add
+     * @see #isGUIInitialized
+     * @see #removeTopLevelWindowListener
+     */
+    static public void addGUIInitializedListener(GUIInitializedListener l) {
+        maybeInitialize();
+        guiInitializedListener =
+            GUIInitializedMulticaster.add(guiInitializedListener,l);
+    }
+
+    /**
+     * Removes the specified listener to be notified when the GUI subsystem
+     * is initialized.
+     *
+     * @param l the listener to remove
+     * @see #addGUIInitializedListener
+     */
+    static public void removeGUIInitializedListener(GUIInitializedListener l) {
+        guiInitializedListener =
+            GUIInitializedMulticaster.remove(guiInitializedListener,l);
+    }
+
+    /**
+     * Adds the specified listener to be notified when a top level window
+     * is created or destroyed.
+     *
+     * @param l the listener to add
+     * @see #removeTopLevelWindowListener
+     */
+    static public void addTopLevelWindowListener(TopLevelWindowListener l) {
+        topLevelWindowListener =
+            TopLevelWindowMulticaster.add(topLevelWindowListener,l);
+    }
+
+    /**
+     * Removes the specified listener to be notified when a top level window
+     * is created or destroyed.
+     *
+     * @param l the listener to remove
+     * @see #addTopLevelWindowListener
+     */
+    static public void removeTopLevelWindowListener(TopLevelWindowListener l) {
+        topLevelWindowListener =
+            TopLevelWindowMulticaster.remove(topLevelWindowListener,l);
+    }
+
+    /**
+     * Return the last recorded position of the mouse in screen coordinates.
+     *
+     * @return the last recorded position of the mouse in screen coordinates
+     */
+    static public Point getCurrentMousePosition() {
+        return currentMousePosition;
+    }
+
+    /**
+     * Return the list of top level Windows in use in the Java Virtual Machine.
+     *
+     * @return an array of top level {@code Window}s in use in the Java Virtual Machine
+     */
+    static public Window[] getTopLevelWindows() {
+
+        // Because this method is static, do not make it synchronized because
+        // it can lock the whole class.  Instead, just lock what needs to be
+        // locked.
+        //
+        synchronized (topLevelWindows) {
+            int count = topLevelWindows.size();
+            if (count > 0) {
+                Window[] w = new Window[count];
+                for (int i = 0; i < count; i++) {
+                    w[i] = (Window)topLevelWindows.elementAt(i);
+                }
+                return w;
+            } else {
+                return new Window[0];
+            }
+        }
+    }
+
+    /**
+     * Return the top level {@code Window} that currently has keyboard focus.
+     *
+     * @return the top level {@code Window} that currently has keyboard focus
+     */
+    static public Window getTopLevelWindowWithFocus() {
+        return topLevelWindowWithFocus;
+    }
+}
+
+/**
+ * Handle all Component events in a separate thread.  The reason for this is
+ * that WindowEvents tend to be used to do lots of processing on the Window
+ * hierarchy.  As a result, it can frequently result in deadlock situations.
+ */
+class ComponentEvtDispatchThread extends Thread {
+    public ComponentEvtDispatchThread(String name) {
+        super(name);
+    }
+    public void run() {
+        ComponentEvent ce = null;
+        while (true) {
+            synchronized(EventQueueMonitor.componentEventQueueLock) {
+                while (EventQueueMonitor.componentEventQueue == null) {
+                    try {
+                        EventQueueMonitor.componentEventQueueLock.wait();
+                    } catch (InterruptedException e) {
+                    }
+                }
+                ce = (ComponentEvent)EventQueueMonitor.componentEventQueue.event;
+                EventQueueMonitor.componentEventQueue =
+                    EventQueueMonitor.componentEventQueue.next;
+            }
+            switch (ce.getID()) {
+            case MouseEvent.MOUSE_MOVED:
+            case MouseEvent.MOUSE_DRAGGED:
+                EventQueueMonitor.updateCurrentMousePosition((MouseEvent) ce);
+                break;
+            case WindowEvent.WINDOW_ACTIVATED:
+                EventQueueMonitor.maybeNotifyAssistiveTechnologies();
+                EventQueueMonitor.topLevelWindowWithFocus = ((WindowEvent) ce).getWindow();
+                break;
+
+            default:
+                break;
+            }
+        }
+    }
+}
+
+/**
+ * EventQueueMonitorItem is the basic type that handles the
+ * queue for queueComponentEvent and the ComponentEvtDispatchThread.
+ */
+class EventQueueMonitorItem {
+    AWTEvent event;
+    EventQueueMonitorItem next;
+
+    EventQueueMonitorItem(AWTEvent evt) {
+        event = evt;
+            next = null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/GUIInitializedListener.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.awt.*;
+import java.util.*;
+import javax.accessibility.*;
+
+/**
+ * The {@code GUIInitializedListener} interface is used by the {@link EventQueueMonitor}
+ * class to notify an interested party when the GUI subsystem has been
+ * initialized.  This is necessary because assistive technologies can
+ * be loaded before the GUI subsystem is initialized.  As a result,
+ * assistive technologies should check the
+ * {@link EventQueueMonitor#isGUIInitialized isGUIInitialized} method
+ * of {@code EventQueueMonitor} before creating any GUI components.  If the
+ * return value is true, assistive technologies can create GUI components
+ * following the same thread restrictions as any other application.  If
+ * the return value is false, the assistive technology should register
+ * a {@code GUIInitializedListener} with the {@code EventQueueMonitor} to be notified
+ * when the GUI subsystem is initialized.
+ *
+ * @see EventQueueMonitor
+ * @see EventQueueMonitor#isGUIInitialized
+ * @see EventQueueMonitor#addGUIInitializedListener
+ * @see EventQueueMonitor#removeGUIInitializedListener
+ *
+ */
+@jdk.Exported
+public interface GUIInitializedListener extends EventListener {
+
+    /**
+     * Invoked when the GUI subsystem is initialized and it's OK for
+     * the assisitive technology to create instances of GUI objects.
+     */
+    public void guiInitialized();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/GUIInitializedMulticaster.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.awt.*;
+import java.util.EventListener;
+import javax.accessibility.*;
+
+
+/**
+ * The GUIInitializedMulticaster class is used to maintain a list of
+ * GUIInitializedListener classes.  It is intended to be used primarily
+ * for internal support in the EventQueueMonitor class, and is not intended
+ * to be used by classes outside the Java Accessibility Utility package.
+ *
+ * @see EventQueueMonitor
+ * @see EventQueueMonitor#addGUIInitializedListener
+ * @see EventQueueMonitor#removeGUIInitializedListener
+ *
+ */
+class GUIInitializedMulticaster
+    extends AWTEventMulticaster implements GUIInitializedListener
+{
+    protected GUIInitializedMulticaster(EventListener a, EventListener b) {
+        super(a, b);
+    }
+
+    public void guiInitialized() {
+        ((GUIInitializedListener)a).guiInitialized();
+        ((GUIInitializedListener)b).guiInitialized();
+    }
+
+    public static GUIInitializedListener add(GUIInitializedListener a, GUIInitializedListener b) {
+        return (GUIInitializedListener)addInternal(a, b);
+    }
+
+    public static GUIInitializedListener remove(GUIInitializedListener l, GUIInitializedListener oldl) {
+        return (GUIInitializedListener)removeInternal(l, oldl);
+    }
+
+    protected static EventListener addInternal(EventListener a, EventListener b) {
+        if (a == null)  return b;
+        if (b == null)  return a;
+        return new GUIInitializedMulticaster(a, b);
+    }
+
+    protected static EventListener removeInternal(EventListener l, EventListener oldl) {
+        if (l == oldl || l == null) {
+            return null;
+        } else if (l instanceof GUIInitializedMulticaster) {
+            return ((GUIInitializedMulticaster)l).remove(oldl);
+        } else {
+            return l;           // it's not here
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/SwingEventMonitor.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,2530 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.util.*;
+import java.beans.*;
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.table.*;
+import javax.swing.tree.*;
+import javax.swing.text.*;
+import javax.swing.undo.*;
+import javax.accessibility.*;
+
+
+/**
+ * <P>{@code SwingEventMonitor} extends {@link AWTEventMonitor} by adding a suite of
+ * listeners conditionally installed on every Swing component instance
+ * in the Java Virtual Machine.  The events captured by these listeners
+ * are made available through a unified set of listeners supported by
+ * {@code SwingEventMonitor}.  With this, all the individual events on each of the
+ * AWT and Swing component instances are funneled into one set of listeners
+ * broken down by category (see {@link EventID} for the categories).
+ * <p>This class depends upon {@link EventQueueMonitor}, which provides the base
+ * level support for capturing the top-level containers as they are created.
+ * <p>Because this class extends {@code AWTEventMonitor}, it is not
+ * necessary to use this class and {@code AWTEventMonitor} at the same time.
+ * If you want to monitor both AWT and Swing components, you should
+ * use just this class.
+ *
+ * @see AWTEventMonitor
+ *
+ */
+@jdk.Exported
+public class SwingEventMonitor extends AWTEventMonitor {
+
+    /**
+     * The master list of all listeners registered by other classes.
+     * This can only be publicly modified by calling the add or
+     * remove listener methods in this class.
+     */
+    static protected final EventListenerList listenerList = new EventListenerList();
+
+    /**
+     * The actual listener that is installed on the component instances.
+     * This listener calls the other registered listeners when an event
+     * occurs.  By doing things this way, the actual number of listeners
+     * installed on a component instance is drastically reduced.
+     */
+    static protected final SwingEventListener swingListener = new SwingEventListener();
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#ANCESTOR ANCESTOR}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeAncestorListener
+     */
+    static public void addAncestorListener(AncestorListener l) {
+        if (listenerList.getListenerCount(AncestorListener.class) == 0) {
+            swingListener.installListeners(EventID.ANCESTOR);
+        }
+        listenerList.add(AncestorListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#ANCESTOR ANCESTOR} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addAncestorListener
+     */
+    static public void removeAncestorListener(AncestorListener l) {
+        listenerList.remove(AncestorListener.class, l);
+        if (listenerList.getListenerCount(AncestorListener.class) == 0) {
+            swingListener.removeListeners(EventID.ANCESTOR);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#CARET CARET} events
+     * on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeCaretListener
+     */
+    static public void addCaretListener(CaretListener l) {
+        if (listenerList.getListenerCount(CaretListener.class) == 0) {
+            swingListener.installListeners(EventID.CARET);
+        }
+        listenerList.add(CaretListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#CARET CARET} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addCaretListener
+     */
+    static public void removeCaretListener(CaretListener l) {
+        listenerList.remove(CaretListener.class, l);
+        if (listenerList.getListenerCount(CaretListener.class) == 0) {
+            swingListener.removeListeners(EventID.CARET);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all
+     * {@link EventID#CELLEDITOR CELLEDITOR} events on each
+     * component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeCellEditorListener
+     */
+    static public void addCellEditorListener(CellEditorListener l) {
+        if (listenerList.getListenerCount(CellEditorListener.class) == 0) {
+            swingListener.installListeners(EventID.CELLEDITOR);
+        }
+        listenerList.add(CellEditorListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#CELLEDITOR CELLEDITOR} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addCellEditorListener
+     */
+    static public void removeCellEditorListener(CellEditorListener l) {
+        listenerList.remove(CellEditorListener.class, l);
+        if (listenerList.getListenerCount(CellEditorListener.class) == 0) {
+            swingListener.removeListeners(EventID.CELLEDITOR);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#CHANGE CHANGE}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeChangeListener
+     */
+    static public void addChangeListener(ChangeListener l) {
+        if (listenerList.getListenerCount(ChangeListener.class) == 0) {
+            swingListener.installListeners(EventID.CHANGE);
+        }
+        listenerList.add(ChangeListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#CHANGE CHANGE} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addChangeListener
+     */
+    static public void removeChangeListener(ChangeListener l) {
+        listenerList.remove(ChangeListener.class, l);
+        if (listenerList.getListenerCount(ChangeListener.class) == 0) {
+            swingListener.removeListeners(EventID.CHANGE);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#COLUMNMODEL COLUMNMODEL}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeColumnModelListener
+     */
+    static public void addColumnModelListener(TableColumnModelListener l) {
+        if (listenerList.getListenerCount(TableColumnModelListener.class) == 0) {
+            swingListener.installListeners(EventID.COLUMNMODEL);
+        }
+        listenerList.add(TableColumnModelListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#COLUMNMODEL COLUMNMODEL} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addColumnModelListener
+     */
+    static public void removeColumnModelListener(TableColumnModelListener l) {
+        listenerList.remove(TableColumnModelListener.class, l);
+        if (listenerList.getListenerCount(TableColumnModelListener.class) == 0) {
+            swingListener.removeListeners(EventID.COLUMNMODEL);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#DOCUMENT DOCUMENT}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeDocumentListener
+     */
+    static public void addDocumentListener(DocumentListener l) {
+        if (listenerList.getListenerCount(DocumentListener.class) == 0) {
+            swingListener.installListeners(EventID.DOCUMENT);
+        }
+        listenerList.add(DocumentListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#DOCUMENT DOCUMENT} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addDocumentListener
+     */
+    static public void removeDocumentListener(DocumentListener l) {
+        listenerList.remove(DocumentListener.class, l);
+        if (listenerList.getListenerCount(DocumentListener.class) == 0) {
+            swingListener.removeListeners(EventID.DOCUMENT);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#LISTDATA LISTDATA}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeListDataListener
+     */
+    static public void addListDataListener(ListDataListener l) {
+        if (listenerList.getListenerCount(ListDataListener.class) == 0) {
+            swingListener.installListeners(EventID.LISTDATA);
+        }
+        listenerList.add(ListDataListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#LISTDATA LISTDATA} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addListDataListener
+     */
+    static public void removeListDataListener(ListDataListener l) {
+        listenerList.remove(ListDataListener.class, l);
+        if (listenerList.getListenerCount(ListDataListener.class) == 0) {
+            swingListener.removeListeners(EventID.LISTDATA);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#LISTSELECTION LISTSELECTION}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeListSelectionListener
+     */
+    static public void addListSelectionListener(ListSelectionListener l) {
+        if (listenerList.getListenerCount(ListSelectionListener.class) == 0) {
+            swingListener.installListeners(EventID.LISTSELECTION);
+        }
+        listenerList.add(ListSelectionListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#LISTSELECTION LISTSELECTION} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addListSelectionListener
+     */
+    static public void removeListSelectionListener(ListSelectionListener l) {
+        listenerList.remove(ListSelectionListener.class, l);
+        if (listenerList.getListenerCount(ListSelectionListener.class) == 0) {
+            swingListener.removeListeners(EventID.LISTSELECTION);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#MENU MENU} events
+     * on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeMenuListener
+     */
+    static public void addMenuListener(MenuListener l) {
+        if (listenerList.getListenerCount(MenuListener.class) == 0) {
+            swingListener.installListeners(EventID.MENU);
+        }
+        listenerList.add(MenuListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#MENU MENU} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addMenuListener
+     */
+    static public void removeMenuListener(MenuListener l) {
+        listenerList.remove(MenuListener.class, l);
+        if (listenerList.getListenerCount(MenuListener.class) == 0) {
+            swingListener.removeListeners(EventID.MENU);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#POPUPMENU POPUPMENU}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removePopupMenuListener
+     */
+    static public void addPopupMenuListener(PopupMenuListener l) {
+        if (listenerList.getListenerCount(PopupMenuListener.class) == 0) {
+            swingListener.installListeners(EventID.POPUPMENU);
+        }
+        listenerList.add(PopupMenuListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#POPUPMENU POPUPMENU} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addPopupMenuListener
+     */
+    static public void removePopupMenuListener(PopupMenuListener l) {
+        listenerList.remove(PopupMenuListener.class, l);
+        if (listenerList.getListenerCount(PopupMenuListener.class) == 0) {
+            swingListener.removeListeners(EventID.POPUPMENU);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#TABLEMODEL TABLEMODEL}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeTableModelListener
+     */
+    static public void addTableModelListener(TableModelListener l) {
+        if (listenerList.getListenerCount(TableModelListener.class) == 0) {
+            swingListener.installListeners(EventID.TABLEMODEL);
+        }
+        listenerList.add(TableModelListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#TABLEMODEL TABLEMODEL} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addTableModelListener
+     */
+    static public void removeTableModelListener(TableModelListener l) {
+        listenerList.remove(TableModelListener.class, l);
+        if (listenerList.getListenerCount(TableModelListener.class) == 0) {
+            swingListener.removeListeners(EventID.TABLEMODEL);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#TREEEXPANSION TREEEXPANSION}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeTreeExpansionListener
+     */
+    static public void addTreeExpansionListener(TreeExpansionListener l) {
+        if (listenerList.getListenerCount(TreeExpansionListener.class) == 0) {
+            swingListener.installListeners(EventID.TREEEXPANSION);
+        }
+        listenerList.add(TreeExpansionListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#TREEEXPANSION TREEEXPANSION} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addTreeExpansionListener
+     */
+    static public void removeTreeExpansionListener(TreeExpansionListener l) {
+        listenerList.remove(TreeExpansionListener.class, l);
+        if (listenerList.getListenerCount(TreeExpansionListener.class) == 0) {
+            swingListener.removeListeners(EventID.TREEEXPANSION);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#TREEMODEL TREEMODEL}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeTreeModelListener
+     */
+    static public void addTreeModelListener(TreeModelListener l) {
+        if (listenerList.getListenerCount(TreeModelListener.class) == 0) {
+            swingListener.installListeners(EventID.TREEMODEL);
+        }
+        listenerList.add(TreeModelListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#TREEMODEL TREEMODEL} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addTreeModelListener
+     */
+    static public void removeTreeModelListener(TreeModelListener l) {
+        listenerList.remove(TreeModelListener.class, l);
+        if (listenerList.getListenerCount(TreeModelListener.class) == 0) {
+            swingListener.removeListeners(EventID.TREEMODEL);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#TREESELECTION TREESELECTION}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeTreeSelectionListener
+     */
+    static public void addTreeSelectionListener(TreeSelectionListener l) {
+        if (listenerList.getListenerCount(TreeSelectionListener.class) == 0) {
+            swingListener.installListeners(EventID.TREESELECTION);
+        }
+        listenerList.add(TreeSelectionListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#TREESELECTION TREESELECTION} events when they occur.
+     * @see #addTreeSelectionListener
+     * @param l the listener to remove
+     */
+    static public void removeTreeSelectionListener(TreeSelectionListener l) {
+        listenerList.remove(TreeSelectionListener.class, l);
+        if (listenerList.getListenerCount(TreeSelectionListener.class) == 0) {
+            swingListener.removeListeners(EventID.TREESELECTION);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#UNDOABLEEDIT UNDOABLEEDIT}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeUndoableEditListener
+     */
+    static public void addUndoableEditListener(UndoableEditListener l) {
+        if (listenerList.getListenerCount(UndoableEditListener.class) == 0) {
+            swingListener.installListeners(EventID.UNDOABLEEDIT);
+        }
+        listenerList.add(UndoableEditListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#UNDOABLEEDIT UNDOABLEEDIT} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addUndoableEditListener
+     */
+    static public void removeUndoableEditListener(UndoableEditListener l) {
+        listenerList.remove(UndoableEditListener.class, l);
+        if (listenerList.getListenerCount(UndoableEditListener.class) == 0) {
+            swingListener.removeListeners(EventID.UNDOABLEEDIT);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#INTERNALFRAME INTERNALFRAME}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeInternalFrameListener
+     */
+    static public void addInternalFrameListener(InternalFrameListener l) {
+        if (listenerList.getListenerCount(InternalFrameListener.class) == 0) {
+            swingListener.installListeners(EventID.INTERNALFRAME);
+        }
+        listenerList.add(InternalFrameListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#INTERNALFRAME INTERNALFRAME} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addInternalFrameListener
+     */
+    static public void removeInternalFrameListener(InternalFrameListener l) {
+        listenerList.remove(InternalFrameListener.class, l);
+        if (listenerList.getListenerCount(InternalFrameListener.class) == 0) {
+            swingListener.removeListeners(EventID.INTERNALFRAME);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#PROPERTYCHANGE PROPERTYCHANGE}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removePropertyChangeListener
+     */
+    static public void addPropertyChangeListener(PropertyChangeListener l) {
+        if (listenerList.getListenerCount(PropertyChangeListener.class) == 0) {
+            swingListener.installListeners(EventID.PROPERTYCHANGE);
+        }
+        listenerList.add(PropertyChangeListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#PROPERTYCHANGE PROPERTYCHANGE} events when they occur.
+     * @see #addPropertyChangeListener
+     * @param l the listener to remove
+     */
+    static public void removePropertyChangeListener(PropertyChangeListener l) {
+        listenerList.remove(PropertyChangeListener.class, l);
+        if (listenerList.getListenerCount(PropertyChangeListener.class) == 0) {
+            swingListener.removeListeners(EventID.PROPERTYCHANGE);
+        }
+    }
+
+    /**
+     * Adds the specified listener to receive all {@link EventID#VETOABLECHANGE VETOABLECHANGE}
+     * events on each component instance in the Java Virtual Machine as they occur.
+     * <P>Note: This listener is automatically added to all component
+     * instances created after this method is called.  In addition, it
+     * is only added to component instances that support this listener type.
+     *
+     * @param l the listener to add
+     * @see #removeVetoableChangeListener
+     */
+    static public void addVetoableChangeListener(VetoableChangeListener l) {
+        if (listenerList.getListenerCount(VetoableChangeListener.class) == 0) {
+            swingListener.installListeners(EventID.VETOABLECHANGE);
+        }
+        listenerList.add(VetoableChangeListener.class, l);
+    }
+
+    /**
+     * Removes the specified listener so it no longer receives
+     * {@link EventID#VETOABLECHANGE VETOABLECHANGE} events when they occur.
+     *
+     * @param l the listener to remove
+     * @see #addVetoableChangeListener
+     */
+    static public void removeVetoableChangeListener(VetoableChangeListener l) {
+        listenerList.remove(VetoableChangeListener.class, l);
+        if (listenerList.getListenerCount(VetoableChangeListener.class) == 0) {
+            swingListener.removeListeners(EventID.VETOABLECHANGE);
+        }
+    }
+
+
+    /**
+     * SwingEventListener is the class that does all the work for
+     * SwingEventMonitor.  It is not intended for use by any other class
+     * except SwingEventMonitor.
+     *
+     */
+    static class SwingEventListener extends AWTEventsListener
+            implements AncestorListener, CaretListener, CellEditorListener,
+            ChangeListener, DocumentListener, ListDataListener,
+            ListSelectionListener, MenuListener, PopupMenuListener,
+            TableColumnModelListener, TableModelListener, TreeExpansionListener,
+            TreeModelListener, TreeSelectionListener, UndoableEditListener,
+            InternalFrameListener,
+            PropertyChangeListener, VetoableChangeListener {
+
+        /**
+         * internal variables for Caret introspection
+         */
+        private java.lang.Class<?>[] caretListeners;
+        private java.lang.reflect.Method removeCaretMethod;
+        private java.lang.reflect.Method addCaretMethod;
+        private java.lang.Object[] caretArgs;
+
+        /**
+         * internal variables for CellEditor introspection
+         */
+        private java.lang.Class<?>[] cellEditorListeners;
+        private java.lang.reflect.Method removeCellEditorMethod;
+        private java.lang.reflect.Method addCellEditorMethod;
+        private java.lang.Object[] cellEditorArgs;
+        private java.lang.reflect.Method getCellEditorMethod;
+
+        /**
+         * internal variables for Change introspection
+         */
+        private java.lang.Class<?>[] changeListeners;
+        private java.lang.reflect.Method removeChangeMethod;
+        private java.lang.reflect.Method addChangeMethod;
+        private java.lang.Object[] changeArgs;
+
+        /**
+         * internal variable for ColumnModel introspection
+         */
+        private java.lang.reflect.Method getColumnModelMethod;
+
+        /**
+         * internal variables for Document introspection
+         */
+        private java.lang.Class<?>[] documentListeners;
+        private java.lang.reflect.Method removeDocumentMethod;
+        private java.lang.reflect.Method addDocumentMethod;
+        private java.lang.Object[] documentArgs;
+        private java.lang.reflect.Method getDocumentMethod;
+
+        /**
+         * internal variable for ListData, Table, and Tree introspection
+         */
+        private java.lang.reflect.Method getModelMethod;
+
+        /**
+         * internal variables for ListSelection introspection
+         */
+        private java.lang.Class<?>[] listSelectionListeners;
+        private java.lang.reflect.Method removeListSelectionMethod;
+        private java.lang.reflect.Method addListSelectionMethod;
+        private java.lang.Object[] listSelectionArgs;
+        private java.lang.reflect.Method getSelectionModelMethod;
+
+        /**
+         * internal variables for Menu introspection
+         */
+        private java.lang.Class<?>[] menuListeners;
+        private java.lang.reflect.Method removeMenuMethod;
+        private java.lang.reflect.Method addMenuMethod;
+        private java.lang.Object[] menuArgs;
+
+        /**
+         * internal variables for PopupMenu introspection
+         */
+        private java.lang.Class<?>[] popupMenuListeners;
+        private java.lang.reflect.Method removePopupMenuMethod;
+        private java.lang.reflect.Method addPopupMenuMethod;
+        private java.lang.Object[] popupMenuArgs;
+        private java.lang.reflect.Method getPopupMenuMethod;
+
+        /**
+         * internal variables for TreeExpansion introspection
+         */
+        private java.lang.Class<?>[] treeExpansionListeners;
+        private java.lang.reflect.Method removeTreeExpansionMethod;
+        private java.lang.reflect.Method addTreeExpansionMethod;
+        private java.lang.Object[] treeExpansionArgs;
+
+        /**
+         * internal variables for TreeSelection introspection
+         */
+        private java.lang.Class<?>[] treeSelectionListeners;
+        private java.lang.reflect.Method removeTreeSelectionMethod;
+        private java.lang.reflect.Method addTreeSelectionMethod;
+        private java.lang.Object[] treeSelectionArgs;
+
+        /**
+         * internal variables for UndoableEdit introspection
+         */
+        private java.lang.Class<?>[] undoableEditListeners;
+        private java.lang.reflect.Method removeUndoableEditMethod;
+        private java.lang.reflect.Method addUndoableEditMethod;
+        private java.lang.Object[] undoableEditArgs;
+
+        /**
+         * internal variables for InternalFrame introspection
+         */
+        private java.lang.Class<?>[] internalFrameListeners;
+        private java.lang.reflect.Method removeInternalFrameMethod;
+        private java.lang.reflect.Method addInternalFrameMethod;
+        private java.lang.Object[] internalFrameArgs;
+
+        /**
+         * internal variables for PropertyChange introspection
+         */
+        private java.lang.Class<?>[] propertyChangeListeners;
+        private java.lang.reflect.Method removePropertyChangeMethod;
+        private java.lang.reflect.Method addPropertyChangeMethod;
+        private java.lang.Object[] propertyChangeArgs;
+
+        /**
+         * internal variables for a variety of change introspections
+         */
+        private java.lang.Class<?>[] nullClass;
+        private java.lang.Object[] nullArgs;
+
+        /**
+         * Create a new instance of this class and install it on each component
+         * instance in the virtual machine that supports any of the currently
+         * registered listeners in SwingEventMonitor.  Also registers itself
+         * as a TopLevelWindowListener with EventQueueMonitor so it can
+         * automatically add new listeners to new components.
+         * @see EventQueueMonitor
+         * @see SwingEventMonitor
+         */
+        public SwingEventListener() {
+            initializeIntrospection();
+            installListeners();
+            EventQueueMonitor.addTopLevelWindowListener(this);
+        }
+
+        /**
+         * Set up all of the variables needed for introspection
+         */
+        private boolean initializeIntrospection() {
+            caretListeners = new java.lang.Class<?>[1];
+            caretArgs = new java.lang.Object[1];
+            caretListeners[0] = javax.swing.event.CaretListener.class;
+            caretArgs[0] = this;
+
+            cellEditorListeners = new java.lang.Class<?>[1];
+            cellEditorArgs = new java.lang.Object[1];
+            cellEditorListeners[0] = javax.swing.event.CellEditorListener.class;
+            cellEditorArgs[0] = this;
+
+            changeListeners = new java.lang.Class<?>[1];
+            changeArgs = new java.lang.Object[1];
+            changeListeners[0] = javax.swing.event.ChangeListener.class;
+            changeArgs[0] = this;
+
+            documentListeners = new java.lang.Class<?>[1];
+            documentArgs = new java.lang.Object[1];
+            documentListeners[0] = javax.swing.event.DocumentListener.class;
+            documentArgs[0] = this;
+
+            listSelectionListeners = new java.lang.Class<?>[1];
+            listSelectionArgs = new java.lang.Object[1];
+            listSelectionListeners[0] = javax.swing.event.ListSelectionListener.class;
+            listSelectionArgs[0] = this;
+
+            menuListeners = new java.lang.Class<?>[1];
+            menuArgs = new java.lang.Object[1];
+            menuListeners[0] = javax.swing.event.MenuListener.class;
+            menuArgs[0] = this;
+
+            popupMenuListeners = new java.lang.Class<?>[1];
+            popupMenuArgs = new java.lang.Object[1];
+            popupMenuListeners[0] = javax.swing.event.PopupMenuListener.class;
+            popupMenuArgs[0] = this;
+
+            treeExpansionListeners = new java.lang.Class<?>[1];
+            treeExpansionArgs = new java.lang.Object[1];
+            treeExpansionListeners[0] = javax.swing.event.TreeExpansionListener.class;
+            treeExpansionArgs[0] = this;
+
+            treeSelectionListeners = new java.lang.Class<?>[1];
+            treeSelectionArgs = new java.lang.Object[1];
+            treeSelectionListeners[0] = javax.swing.event.TreeSelectionListener.class;
+            treeSelectionArgs[0] = this;
+
+            undoableEditListeners = new java.lang.Class<?>[1];
+            undoableEditArgs = new java.lang.Object[1];
+            undoableEditListeners[0] = javax.swing.event.UndoableEditListener.class;
+            undoableEditArgs[0] = this;
+
+            internalFrameListeners = new java.lang.Class<?>[1];
+            internalFrameArgs = new java.lang.Object[1];
+            internalFrameListeners[0] = javax.swing.event.InternalFrameListener.class;
+            internalFrameArgs[0] = this;
+
+            nullClass = new java.lang.Class<?>[0];
+            nullArgs = new java.lang.Object[0];
+
+            propertyChangeListeners = new java.lang.Class<?>[1];
+            propertyChangeArgs = new java.lang.Object[1];
+            propertyChangeListeners[0] = java.beans.PropertyChangeListener.class;
+            propertyChangeArgs[0] = this;
+
+            return true;
+        }
+
+        /**
+         * Installs all appropriate Swing listeners to just the component.
+         * Also calls super (AWTEventsListener.installListeners()) to install
+         * the requested AWT listeners.
+         * @param c the component to add listeners to
+         */
+        protected void installListeners(Component c) {
+
+            // This SwingEventListener needs to be notified when a new
+            // Swing component has been added so it can add Swing listeners
+            // to these components.  As a result, we always need a Container
+            // listener on every Container.
+            //
+            installListeners(c,EventID.CONTAINER);
+
+            // conditionally install Swing listeners
+            //
+            if (SwingEventMonitor.listenerList.getListenerCount(AncestorListener.class) > 0) {
+                installListeners(c,EventID.ANCESTOR);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(CaretListener.class) > 0) {
+                installListeners(c,EventID.CARET);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(CellEditorListener.class) > 0) {
+                installListeners(c,EventID.CELLEDITOR);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(ChangeListener.class) > 0) {
+                installListeners(c,EventID.CHANGE);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TableColumnModelListener.class) > 0) {
+                installListeners(c,EventID.COLUMNMODEL);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(DocumentListener.class) > 0) {
+                installListeners(c,EventID.DOCUMENT);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(ListDataListener.class) > 0) {
+                installListeners(c,EventID.LISTDATA);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(ListSelectionListener.class) > 0) {
+                installListeners(c,EventID.LISTSELECTION);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(MenuListener.class) > 0) {
+                installListeners(c,EventID.MENU);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(PopupMenuListener.class) > 0) {
+                installListeners(c,EventID.POPUPMENU);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TableModelListener.class) > 0) {
+                installListeners(c,EventID.TABLEMODEL);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TreeExpansionListener.class) > 0) {
+                installListeners(c,EventID.TREEEXPANSION);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TreeModelListener.class) > 0) {
+                installListeners(c,EventID.TREEMODEL);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TreeSelectionListener.class) > 0) {
+                installListeners(c,EventID.TREESELECTION);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(UndoableEditListener.class) > 0) {
+                installListeners(c,EventID.UNDOABLEEDIT);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(InternalFrameListener.class) > 0) {
+                installListeners(c,EventID.INTERNALFRAME);
+            }
+
+            // Conditionally install Beans listeners
+            //
+            if (SwingEventMonitor.listenerList.getListenerCount(PropertyChangeListener.class) > 0) {
+                installListeners(c,EventID.PROPERTYCHANGE);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(VetoableChangeListener.class) > 0) {
+                installListeners(c,EventID.VETOABLECHANGE);
+            }
+
+            // Now install the AWT listeners if needed.
+            //
+            super.installListeners(c);
+        }
+
+        /**
+         * Installs all appropriate Swing listeners to the component and all its
+         * children.  As a precaution, it always attempts to remove itself as
+         * a listener first so we're always guaranteed it will installed itself
+         * just once.
+         * @param c the component to add listeners to
+         * @param eventID the eventID to add listeners for
+         */
+        protected void installListeners(Component c, int eventID) {
+
+            // install the appropriate listener hook into this component
+            //
+            switch (eventID) {
+
+            case EventID.CONTAINER:
+                if (c instanceof Container) {
+                    ((Container) c).removeContainerListener(this);
+                    ((Container) c).addContainerListener(this);
+                }
+                break;
+
+            case EventID.ANCESTOR:
+                if (c instanceof JComponent) {
+                    ((JComponent) c).removeAncestorListener(this);
+                    ((JComponent) c).addAncestorListener(this);
+                }
+                break;
+
+            case EventID.CARET:
+                try {
+                    removeCaretMethod = c.getClass().getMethod(
+                        "removeCaretListener", caretListeners);
+                    addCaretMethod = c.getClass().getMethod(
+                        "addCaretListener", caretListeners);
+                    try {
+                        removeCaretMethod.invoke(c, caretArgs);
+                        addCaretMethod.invoke(c, caretArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.CELLEDITOR:
+                //  Look for components which support the getCellEditor method
+                //  (e.g. JTable, JTree)
+                //
+                try {
+                    getCellEditorMethod = c.getClass().getMethod(
+                        "getCellEditorMethod", nullClass);
+                    try {
+                        Object o = getCellEditorMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof CellEditor) {
+                            ((CellEditor) o).removeCellEditorListener(this);
+                            ((CellEditor) o).addCellEditorListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support CellEditor listeners
+                //  (no current example)
+                //
+                try {
+                    removeCellEditorMethod = c.getClass().getMethod(
+                        "removeCellEditorListener", cellEditorListeners);
+                    addCellEditorMethod = c.getClass().getMethod(
+                        "addCellEditorListener", cellEditorListeners);
+                    try {
+                        removeCellEditorMethod.invoke(c, cellEditorArgs);
+                        addCellEditorMethod.invoke(c, cellEditorArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.CHANGE:
+    //  [[[FIXME:  Need to add support for Style, StyleContext  -pk]]]
+
+                //  Look for components which support Change listeners
+                //  (e.g. AbstractButton, Caret, JProgressBar, JSlider,
+                //   JTabbedpane, JTextComponent, JViewport)
+                //
+                try {
+                    removeChangeMethod = c.getClass().getMethod(
+                        "removeChangeListener", changeListeners);
+                    addChangeMethod = c.getClass().getMethod(
+                        "addChangeListener", changeListeners);
+                    try {
+                        removeChangeMethod.invoke(c, changeArgs);
+                        addChangeMethod.invoke(c, changeArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support the getModel method
+                //  whose model supports Change listeners
+                //  (e.g. BoundedRangeModel, ButtonModel, SingleSelectionModel)
+                //
+                try {
+                    getModelMethod = c.getClass().getMethod(
+                        "getModel", nullClass);
+                    try {
+                        Object o = getModelMethod.invoke(c, nullArgs);
+                        if (o != null) {
+                            removeChangeMethod = o.getClass().getMethod(
+                                "removeChangeListener", changeListeners);
+                            addChangeMethod = o.getClass().getMethod(
+                                "addChangeListener", changeListeners);
+                            removeChangeMethod.invoke(o, changeArgs);
+                            addChangeMethod.invoke(o, changeArgs);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                break;
+
+            case EventID.COLUMNMODEL:
+                try {
+                    getColumnModelMethod = c.getClass().getMethod(
+                        "getTableColumnModel", nullClass);
+                    try {
+                        Object o = getColumnModelMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof TableColumnModel) {
+                            ((TableColumnModel) o).removeColumnModelListener(this);
+                            ((TableColumnModel) o).addColumnModelListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.DOCUMENT:
+                //  Look for components which support the getDocument method
+                //  (e.g. JTextComponent)
+                //
+                try {
+                    getDocumentMethod = c.getClass().getMethod(
+                        "getDocument", nullClass);
+                    try {
+                        Object o = getDocumentMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof Document) {
+                            ((Document) o).removeDocumentListener(this);
+                            ((Document) o).addDocumentListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support Document listeners
+                //  (no current example)
+                //
+                try {
+                    removeDocumentMethod = c.getClass().getMethod(
+                        "removeDocumentListener", documentListeners);
+                    addDocumentMethod = c.getClass().getMethod(
+                        "addDocumentListener", documentListeners);
+                    try {
+                        removeDocumentMethod.invoke(c, documentArgs);
+                        addDocumentMethod.invoke(c, documentArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                //  Add the monitor as a PropertyChangeListener for document
+                //  change events from text components.
+                //
+                if (c instanceof JTextComponent) {
+                    try {
+                        removePropertyChangeMethod = c.getClass().getMethod(
+                            "removePropertyChangeListener",
+                            propertyChangeListeners);
+                        addPropertyChangeMethod = c.getClass().getMethod(
+                            "addPropertyChangeListener",
+                            propertyChangeListeners);
+                        try {
+                            removePropertyChangeMethod.invoke(c,
+                                propertyChangeArgs);
+                            addPropertyChangeMethod.invoke(c,
+                                propertyChangeArgs);
+                        } catch (java.lang.reflect.InvocationTargetException e) {
+                            System.out.println("Exception: " + e.toString());
+                        } catch (IllegalAccessException e) {
+                            System.out.println("Exception: " + e.toString());
+                        }
+                    } catch (NoSuchMethodException e) {
+                        // System.out.println("Exception: " + e.toString());
+                    } catch (SecurityException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                }
+                break;
+
+            case EventID.LISTDATA:
+            case EventID.TABLEMODEL:
+            case EventID.TREEMODEL:
+                try {
+                    getModelMethod = c.getClass().getMethod(
+                        "getModel", nullClass);
+                    try {
+                        Object o = getModelMethod.invoke(c, nullArgs);
+                        if (o != null) {
+                            if (eventID == EventID.LISTDATA &&
+                                o instanceof ListModel) {
+                                ((ListModel) o).removeListDataListener(this);
+                                ((ListModel) o).addListDataListener(this);
+                            } else if (eventID == EventID.TABLEMODEL &&
+                                o instanceof TableModel) {
+                                ((TableModel) o).removeTableModelListener(this);
+                                ((TableModel) o).addTableModelListener(this);
+                            } else if (
+                                o instanceof TreeModel) {
+                                ((TreeModel) o).removeTreeModelListener(this);
+                                ((TreeModel) o).addTreeModelListener(this);
+                            }
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.LISTSELECTION:
+                //  Look for components which support ListSelectionListeners
+                //  (e.g. JList)
+                //
+                try {
+                    removeListSelectionMethod = c.getClass().getMethod(
+                        "removeListSelectionListener", listSelectionListeners);
+                    addListSelectionMethod = c.getClass().getMethod(
+                        "addListSelectionListener", listSelectionListeners);
+                    try {
+                        removeListSelectionMethod.invoke(c, listSelectionArgs);
+                        addListSelectionMethod.invoke(c, listSelectionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for selection models which support ListSelectionListeners
+                //  (e.g. JTable's selection model)
+                //
+                try {
+                    getSelectionModelMethod = c.getClass().getMethod(
+                        "getSelectionModel", nullClass);
+                    try {
+                        Object o = getSelectionModelMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof ListSelectionModel) {
+                            ((ListSelectionModel) o).removeListSelectionListener(this);
+                            ((ListSelectionModel) o).addListSelectionListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.MENU:
+                try {
+                    removeMenuMethod = c.getClass().getMethod(
+                        "removeMenuListener", menuListeners);
+                    addMenuMethod = c.getClass().getMethod(
+                        "addMenuListener", menuListeners);
+                    try {
+                        removeMenuMethod.invoke(c, menuArgs);
+                        addMenuMethod.invoke(c, menuArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.POPUPMENU:
+                //  Look for components which support PopupMenuListeners
+                //  (e.g. JPopupMenu)
+                //
+                try {
+                    removePopupMenuMethod = c.getClass().getMethod(
+                        "removePopupMenuListener", popupMenuListeners);
+                    addPopupMenuMethod = c.getClass().getMethod(
+                        "addPopupMenuListener", popupMenuListeners);
+                    try {
+                        removePopupMenuMethod.invoke(c, popupMenuArgs);
+                        addPopupMenuMethod.invoke(c, popupMenuArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support getPopupMenu
+                //  (e.g. JMenu)
+                //
+                try {
+                    getPopupMenuMethod = c.getClass().getMethod(
+                        "getPopupMenu", nullClass);
+                    try {
+                        Object o = getPopupMenuMethod.invoke(c, nullArgs);
+                        if (o != null) {
+                            removePopupMenuMethod = o.getClass().getMethod(
+                                "removePopupMenuListener", popupMenuListeners);
+                            addPopupMenuMethod = o.getClass().getMethod(
+                                "addPopupMenuListener", popupMenuListeners);
+                            removePopupMenuMethod.invoke(o, popupMenuArgs);
+                            addPopupMenuMethod.invoke(o, popupMenuArgs);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.TREEEXPANSION:
+                try {
+                    removeTreeExpansionMethod = c.getClass().getMethod(
+                        "removeTreeExpansionListener", treeExpansionListeners);
+                    addTreeExpansionMethod = c.getClass().getMethod(
+                        "addTreeExpansionListener", treeExpansionListeners);
+                    try {
+                        removeTreeExpansionMethod.invoke(c, treeExpansionArgs);
+                        addTreeExpansionMethod.invoke(c, treeExpansionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.TREESELECTION:
+                try {
+                    removeTreeSelectionMethod = c.getClass().getMethod(
+                        "removeTreeSelectionListener", treeSelectionListeners);
+                    addTreeSelectionMethod = c.getClass().getMethod(
+                        "addTreeSelectionListener", treeSelectionListeners);
+                    try {
+                        removeTreeSelectionMethod.invoke(c, treeSelectionArgs);
+                        addTreeSelectionMethod.invoke(c, treeSelectionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.UNDOABLEEDIT:
+                //  Look for components which support the getDocument method
+                //  (e.g. JTextComponent)
+                //
+                try {
+                    getDocumentMethod = c.getClass().getMethod(
+                        "getDocument", nullClass);
+                    try {
+                        Object o = getDocumentMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof Document) {
+                            ((Document) o).removeUndoableEditListener(this);
+                            ((Document) o).addUndoableEditListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support UndoableEdit listeners
+                //  (no current example)
+                //
+                try {
+                    removeUndoableEditMethod = c.getClass().getMethod(
+                        "removeUndoableEditListener", undoableEditListeners);
+                    addUndoableEditMethod = c.getClass().getMethod(
+                        "addUndoableEditListener", undoableEditListeners);
+                    try {
+                        removeUndoableEditMethod.invoke(c, undoableEditArgs);
+                        addUndoableEditMethod.invoke(c, undoableEditArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.INTERNALFRAME:
+                //  Look for components which support InternalFrame listeners
+                //  (e.g. JInternalFrame)
+                //
+              try {
+                    removeInternalFrameMethod = c.getClass().getMethod(
+                        "removeInternalFrameListener", internalFrameListeners);
+                    addInternalFrameMethod = c.getClass().getMethod(
+                        "addInternalFrameListener", internalFrameListeners);
+                    try {
+                        removeInternalFrameMethod.invoke(c, internalFrameArgs);
+                        addInternalFrameMethod.invoke(c, internalFrameArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.PROPERTYCHANGE:
+                //  Look for components which support PropertyChange listeners
+                //  (e.g. JComponent)
+                //
+                try {
+                    removePropertyChangeMethod = c.getClass().getMethod(
+                        "removePropertyChangeListener", propertyChangeListeners);
+                    addPropertyChangeMethod = c.getClass().getMethod(
+                        "addPropertyChangeListener", propertyChangeListeners);
+                    try {
+                        removePropertyChangeMethod.invoke(c, propertyChangeArgs);
+                        addPropertyChangeMethod.invoke(c, propertyChangeArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support the getSelectionModel method
+                //  (e.g. JTextComponent)
+                //
+                try {
+                    getSelectionModelMethod = c.getClass().getMethod(
+                        "getSelectionModel", nullClass);
+                    try {
+                        Object o = getSelectionModelMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof TreeSelectionModel) {
+                            ((TreeSelectionModel) o).removePropertyChangeListener(this);
+                            ((TreeSelectionModel) o).addPropertyChangeListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.VETOABLECHANGE:
+                if (c instanceof JComponent) {
+                    ((JComponent) c).removeVetoableChangeListener(this);
+                    ((JComponent) c).addVetoableChangeListener(this);
+                }
+                break;
+
+            // Don't bother recursing the children if this isn't going to
+            // accomplish anything.
+            //
+            default:
+                return;
+            }
+
+            if (c instanceof Container) {
+                int count = ((Container) c).getComponentCount();
+                for (int i = 0; i < count; i++) {
+                    installListeners(((Container) c).getComponent(i), eventID);
+                }
+            }
+        }
+
+        /**
+         * Removes all listeners for the given component and all its children.
+         * @param c the component
+         */
+        protected void removeListeners(Component c) {
+
+            // conditionaly remove the Swing listeners
+            //
+            if (SwingEventMonitor.listenerList.getListenerCount(AncestorListener.class) > 0) {
+                removeListeners(c,EventID.ANCESTOR);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(CaretListener.class) > 0) {
+                removeListeners(c,EventID.CARET);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(CellEditorListener.class) > 0) {
+                removeListeners(c,EventID.CELLEDITOR);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(ChangeListener.class) > 0) {
+                removeListeners(c,EventID.CHANGE);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TableColumnModelListener.class) > 0) {
+                removeListeners(c,EventID.COLUMNMODEL);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(DocumentListener.class) > 0) {
+                removeListeners(c,EventID.DOCUMENT);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(ListDataListener.class) > 0) {
+                removeListeners(c,EventID.LISTDATA);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(ListSelectionListener.class) > 0) {
+                removeListeners(c,EventID.LISTSELECTION);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(MenuListener.class) > 0) {
+                removeListeners(c,EventID.MENU);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(PopupMenuListener.class) > 0) {
+                removeListeners(c,EventID.POPUPMENU);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TableModelListener.class) > 0) {
+                removeListeners(c,EventID.TABLEMODEL);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TreeExpansionListener.class) > 0) {
+                removeListeners(c,EventID.TREEEXPANSION);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TreeModelListener.class) > 0) {
+                removeListeners(c,EventID.TREEMODEL);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(TreeSelectionListener.class) > 0) {
+                removeListeners(c,EventID.TREESELECTION);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(UndoableEditListener.class) > 0) {
+                removeListeners(c,EventID.UNDOABLEEDIT);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(InternalFrameListener.class) > 0) {
+                removeListeners(c,EventID.INTERNALFRAME);
+            }
+
+            // conditionaly remove the beans listeners
+            //
+            if (SwingEventMonitor.listenerList.getListenerCount(PropertyChangeListener.class) > 0) {
+                removeListeners(c,EventID.PROPERTYCHANGE);
+            }
+            if (SwingEventMonitor.listenerList.getListenerCount(VetoableChangeListener.class) > 0) {
+                removeListeners(c,EventID.VETOABLECHANGE);
+            }
+
+            // Now remove the AWT listeners if needed.
+            //
+            super.removeListeners(c);
+        }
+
+        /**
+         * Removes all Swing listeners for the event ID from the component and
+         * all of its children.
+         * @param c the component to remove listeners from
+         */
+        protected void removeListeners(Component c, int eventID) {
+
+            // remove the appropriate listener hook into this component
+            //
+            switch (eventID) {
+
+            case EventID.CONTAINER:
+                //Never remove these because we're always interested in them
+                // for our own use.
+                break;
+
+            case EventID.ANCESTOR:
+                if (c instanceof JComponent) {
+                    ((JComponent) c).removeAncestorListener(this);
+                }
+                break;
+
+            case EventID.CARET:
+                try {
+                    removeCaretMethod = c.getClass().getMethod(
+                        "removeCaretListener", caretListeners);
+                    try {
+                        removeCaretMethod.invoke(c, caretArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.CELLEDITOR:
+                //  Look for components which support the getCellEditor method
+                //  (e.g. JTable, JTree)
+                //
+                try {
+                    getCellEditorMethod = c.getClass().getMethod(
+                        "getCellEditorMethod", nullClass);
+                    try {
+                        Object o = getCellEditorMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof CellEditor) {
+                            ((CellEditor) o).removeCellEditorListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support CellEditor listeners
+                //  (no current example)
+                //
+                try {
+                    removeCellEditorMethod = c.getClass().getMethod(
+                        "removeCellEditorListener", cellEditorListeners);
+                    try {
+                        removeCellEditorMethod.invoke(c, cellEditorArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.CHANGE:
+    //  [[[FIXME:  Need to add support for Style, StyleContext -pk ]]]
+
+                //  Look for components which support Change listeners
+                //  (e.g. AbstractButton, Caret, JProgressBar, JSlider,
+                //   JTabbedpane, JTextComponent, JViewport)
+                //
+                try {
+                    removeChangeMethod = c.getClass().getMethod(
+                        "removeChangeListener", changeListeners);
+                    try {
+                        removeChangeMethod.invoke(c, changeArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support the getModel method
+                //  whose model supports Change listeners
+                //  (e.g. BoundedRangeModel, ButtonModel, SingleSelectionModel)
+                //
+                try {
+                    getModelMethod = c.getClass().getMethod(
+                        "getModel", nullClass);
+                    try {
+                        Object o = getModelMethod.invoke(c, nullArgs);
+                        if (o != null) {
+                            removeChangeMethod = o.getClass().getMethod(
+                                "removeChangeListener", changeListeners);
+                            removeChangeMethod.invoke(o, changeArgs);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.COLUMNMODEL:
+                try {
+                    getColumnModelMethod = c.getClass().getMethod(
+                        "getTableColumnModel", nullClass);
+                    try {
+                        Object o = getColumnModelMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof TableColumnModel) {
+                            ((TableColumnModel) o).removeColumnModelListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.DOCUMENT:
+                //  Look for components which support the getDocument method
+                //  (e.g. JTextComponent)
+                //
+                try {
+                    getDocumentMethod = c.getClass().getMethod(
+                        "getDocument", nullClass);
+                    try {
+                        Object o = getDocumentMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof Document) {
+                            ((Document) o).removeDocumentListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support Document listeners
+                //  (no current example)
+                //
+                try {
+                    removeDocumentMethod = c.getClass().getMethod(
+                        "removeDocumentListener", documentListeners);
+                    try {
+                        removeDocumentMethod.invoke(c, documentArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.LISTDATA:
+            case EventID.TABLEMODEL:
+            case EventID.TREEMODEL:
+                try {
+                    getModelMethod = c.getClass().getMethod(
+                        "getModel", nullClass);
+                    try {
+                        Object o = getModelMethod.invoke(c, nullArgs);
+                        if (o != null) {
+                            if (eventID == EventID.LISTDATA &&
+                                o instanceof ListModel) {
+                                ((ListModel) o).removeListDataListener(this);
+                            } else if (eventID == EventID.TABLEMODEL &&
+                                o instanceof TableModel) {
+                                ((TableModel) o).removeTableModelListener(this);
+                            } else if (
+                                o instanceof TreeModel) {
+                                ((TreeModel) o).removeTreeModelListener(this);
+                            }
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.LISTSELECTION:
+                //  Look for components which support ListSelectionListeners
+                //  (e.g. JList)
+                //
+                try {
+                    removeListSelectionMethod = c.getClass().getMethod(
+                        "removeListSelectionListener", listSelectionListeners);
+                    try {
+                        removeListSelectionMethod.invoke(c, listSelectionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                // Look for selection models which support
+                // ListSelectionListeners (e.g. JTable's selection model)
+                //
+                try {
+                    getSelectionModelMethod = c.getClass().getMethod(
+                        "getSelectionModel", nullClass);
+                    try {
+                        Object o = getSelectionModelMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof ListSelectionModel) {
+                            ((ListSelectionModel) o).removeListSelectionListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.MENU:
+                try {
+                    removeMenuMethod = c.getClass().getMethod(
+                        "removeMenuListener", menuListeners);
+                    try {
+                        removeMenuMethod.invoke(c, menuArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.POPUPMENU:
+                //  Look for components which support PopupMenuListeners
+                //  (e.g. JPopupMenu)
+                //
+                try {
+                    removePopupMenuMethod = c.getClass().getMethod(
+                        "removePopupMenuListener", popupMenuListeners);
+                    try {
+                        removePopupMenuMethod.invoke(c, popupMenuArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support getPopupMenu
+                //  (e.g. JMenu)
+                //
+                try {
+                    getPopupMenuMethod = c.getClass().getMethod(
+                        "getPopupMenu", nullClass);
+                    try {
+                        Object o = getPopupMenuMethod.invoke(c, nullArgs);
+                        if (o != null) {
+                            removePopupMenuMethod = o.getClass().getMethod(
+                                "removePopupMenuListener", popupMenuListeners);
+                            removePopupMenuMethod.invoke(o, popupMenuArgs);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.TREEEXPANSION:
+                try {
+                    removeTreeExpansionMethod = c.getClass().getMethod(
+                        "removeTreeExpansionListener", treeExpansionListeners);
+                    try {
+                        removeTreeExpansionMethod.invoke(c, treeExpansionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.TREESELECTION:
+                try {
+                    removeTreeSelectionMethod = c.getClass().getMethod(
+                        "removeTreeSelectionListener", treeSelectionListeners);
+                    try {
+                        removeTreeSelectionMethod.invoke(c, treeSelectionArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.UNDOABLEEDIT:
+                //  Look for components which support the getDocument method
+                //  (e.g. JTextComponent)
+                //
+                try {
+                    getDocumentMethod = c.getClass().getMethod(
+                        "getDocument", nullClass);
+                    try {
+                        Object o = getDocumentMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof Document) {
+                            ((Document) o).removeUndoableEditListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                //  Look for components which support UndoableEdit listeners
+                //  (no current example)
+                //
+                try {
+                    removeUndoableEditMethod = c.getClass().getMethod(
+                        "removeUndoableEditListener", undoableEditListeners);
+                    try {
+                        removeUndoableEditMethod.invoke(c, undoableEditArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.INTERNALFRAME:
+              try {
+                    removeInternalFrameMethod = c.getClass().getMethod(
+                        "removeInternalFrameListener", internalFrameListeners);
+                    try {
+                        removeInternalFrameMethod.invoke(c, internalFrameArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.PROPERTYCHANGE:
+                //  Look for components which support PropertyChange listeners
+                //  (e.g. JComponent)
+                //
+                try {
+                    removePropertyChangeMethod = c.getClass().getMethod(
+                        "removePropertyChangeListener", propertyChangeListeners);
+                    try {
+                        removePropertyChangeMethod.invoke(c, propertyChangeArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+
+                // Look for components which support the getSelectionModel
+                // method (e.g. JTextComponent)
+                //
+                try {
+                    getSelectionModelMethod = c.getClass().getMethod(
+                        "getSelectionModel", nullClass);
+                    try {
+                        Object o = getSelectionModelMethod.invoke(c, nullArgs);
+                        if (o != null && o instanceof TreeSelectionModel) {
+                            ((TreeSelectionModel) o).removePropertyChangeListener(this);
+                        }
+                    } catch (java.lang.reflect.InvocationTargetException e) {
+                        System.out.println("Exception: " + e.toString());
+                    } catch (IllegalAccessException e) {
+                        System.out.println("Exception: " + e.toString());
+                    }
+                } catch (NoSuchMethodException e) {
+                    // System.out.println("Exception: " + e.toString());
+                } catch (SecurityException e) {
+                    System.out.println("Exception: " + e.toString());
+                }
+                break;
+
+            case EventID.VETOABLECHANGE:
+                if (c instanceof JComponent) {
+                    ((JComponent) c).removeVetoableChangeListener(this);
+                }
+                break;
+
+            default:
+                return;
+            }
+
+            if (c instanceof Container) {
+                int count = ((Container) c).getComponentCount();
+                for (int i = 0; i < count; i++) {
+                    removeListeners(((Container) c).getComponent(i), eventID);
+                }
+            }
+        }
+
+        /********************************************************************/
+        /*                                                                  */
+        /* Listener Interface Methods                                       */
+        /*                                                                  */
+        /********************************************************************/
+
+        /* ContainerListener Methods ************************************/
+
+        public void componentAdded(ContainerEvent e) {
+            installListeners(e.getChild());
+        }
+        public void componentRemoved(ContainerEvent e) {
+            removeListeners(e.getChild());
+        }
+
+        /* AncestorListener Methods ******************************************/
+
+        public void ancestorAdded(AncestorEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==AncestorListener.class) {
+                    ((AncestorListener)listeners[i+1]).ancestorAdded(e);
+                }
+            }
+        }
+
+        public void ancestorRemoved(AncestorEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==AncestorListener.class) {
+                    ((AncestorListener)listeners[i+1]).ancestorRemoved(e);
+                }
+            }
+        }
+
+        public void ancestorMoved(AncestorEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==AncestorListener.class) {
+                    ((AncestorListener)listeners[i+1]).ancestorMoved(e);
+                }
+            }
+        }
+
+        /* CaretListener Methods ******************************************/
+
+        public void caretUpdate(CaretEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==CaretListener.class) {
+                    ((CaretListener)listeners[i+1]).caretUpdate(e);
+                }
+            }
+        }
+
+        /* CellEditorListener Methods *****************************************/
+
+        public void editingStopped(ChangeEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==CellEditorListener.class) {
+                    ((CellEditorListener)listeners[i+1]).editingStopped(e);
+                }
+            }
+        }
+
+        public void editingCanceled(ChangeEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==CellEditorListener.class) {
+                    ((CellEditorListener)listeners[i+1]).editingCanceled(e);
+                }
+            }
+        }
+
+        /* ChangeListener Methods *****************************************/
+
+        public void stateChanged(ChangeEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==ChangeListener.class) {
+                    ((ChangeListener)listeners[i+1]).stateChanged(e);
+                }
+            }
+        }
+
+        /* TableColumnModelListener Methods *******************************/
+
+        public void columnAdded(TableColumnModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TableColumnModelListener.class) {
+                    ((TableColumnModelListener)listeners[i+1]).columnAdded(e);
+                }
+            }
+        }
+        public void columnMarginChanged(ChangeEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TableColumnModelListener.class) {
+                    ((TableColumnModelListener)listeners[i+1]).columnMarginChanged(e);
+                }
+            }
+        }
+        public void columnMoved(TableColumnModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TableColumnModelListener.class) {
+                    ((TableColumnModelListener)listeners[i+1]).columnMoved(e);
+                }
+            }
+        }
+        public void columnRemoved(TableColumnModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TableColumnModelListener.class) {
+                    ((TableColumnModelListener)listeners[i+1]).columnRemoved(e);
+                }
+            }
+        }
+        public void columnSelectionChanged(ListSelectionEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TableColumnModelListener.class) {
+                    ((TableColumnModelListener)listeners[i+1]).columnSelectionChanged(e);
+                }
+            }
+        }
+
+        /* DocumentListener Methods **************************************/
+
+        public void changedUpdate(DocumentEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==DocumentListener.class) {
+                    ((DocumentListener)listeners[i+1]).changedUpdate(e);
+                }
+            }
+        }
+        public void insertUpdate(DocumentEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==DocumentListener.class) {
+                    ((DocumentListener)listeners[i+1]).insertUpdate(e);
+                }
+            }
+        }
+        public void removeUpdate(DocumentEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==DocumentListener.class) {
+                    ((DocumentListener)listeners[i+1]).removeUpdate(e);
+                }
+            }
+        }
+
+        /* ListDataListener Methods *****************************************/
+
+        public void contentsChanged(ListDataEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==ListDataListener.class) {
+                    ((ListDataListener)listeners[i+1]).contentsChanged(e);
+                }
+            }
+        }
+        public void intervalAdded(ListDataEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==ListDataListener.class) {
+                    ((ListDataListener)listeners[i+1]).intervalAdded(e);
+                }
+            }
+        }
+        public void intervalRemoved(ListDataEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==ListDataListener.class) {
+                    ((ListDataListener)listeners[i+1]).intervalRemoved(e);
+                }
+            }
+        }
+
+        /* ListSelectionListener Methods ***********************************/
+
+        public void valueChanged(ListSelectionEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==ListSelectionListener.class) {
+                    ((ListSelectionListener)listeners[i+1]).valueChanged(e);
+                }
+            }
+        }
+
+        /* MenuListener Methods *****************************************/
+
+        public void menuCanceled(MenuEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==MenuListener.class) {
+                    ((MenuListener)listeners[i+1]).menuCanceled(e);
+                }
+            }
+        }
+        public void menuDeselected(MenuEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==MenuListener.class) {
+                    ((MenuListener)listeners[i+1]).menuDeselected(e);
+                }
+            }
+        }
+        public void menuSelected(MenuEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==MenuListener.class) {
+                    ((MenuListener)listeners[i+1]).menuSelected(e);
+                }
+            }
+        }
+
+        /* PopupMenuListener Methods **************************************/
+
+        public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==PopupMenuListener.class) {
+                    ((PopupMenuListener)listeners[i+1]).popupMenuWillBecomeVisible(e);
+                }
+            }
+        }
+
+        public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==PopupMenuListener.class) {
+                    ((PopupMenuListener)listeners[i+1]).popupMenuWillBecomeInvisible(e);
+                }
+            }
+        }
+
+        public void popupMenuCanceled(PopupMenuEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==PopupMenuListener.class) {
+                    ((PopupMenuListener)listeners[i+1]).popupMenuCanceled(e);
+                }
+            }
+        }
+
+        /* TableModelListener Methods **************************************/
+
+        public void tableChanged(TableModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TableModelListener.class) {
+                    ((TableModelListener)listeners[i+1]).tableChanged(e);
+                }
+            }
+        }
+
+        /* TreeExpansionListener Methods **********************************/
+
+        public void treeCollapsed(TreeExpansionEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TreeExpansionListener.class) {
+                    ((TreeExpansionListener)listeners[i+1]).treeCollapsed(e);
+                }
+            }
+        }
+        public void treeExpanded(TreeExpansionEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TreeExpansionListener.class) {
+                    ((TreeExpansionListener)listeners[i+1]).treeExpanded(e);
+                }
+            }
+        }
+
+        /* TreeModelListener Methods **********************************/
+
+        public void treeNodesChanged(TreeModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TreeModelListener.class) {
+                    ((TreeModelListener)listeners[i+1]).treeNodesChanged(e);
+                }
+            }
+        }
+        public void treeNodesInserted(TreeModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TreeModelListener.class) {
+                    ((TreeModelListener)listeners[i+1]).treeNodesInserted(e);
+                }
+            }
+        }
+        public void treeNodesRemoved(TreeModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TreeModelListener.class) {
+                    ((TreeModelListener)listeners[i+1]).treeNodesRemoved(e);
+                }
+            }
+        }
+        public void treeStructureChanged(TreeModelEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TreeModelListener.class) {
+                    ((TreeModelListener)listeners[i+1]).treeStructureChanged(e);
+                }
+            }
+        }
+
+        /* TreeSelectionListener Methods ***********************************/
+
+        public void valueChanged(TreeSelectionEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==TreeSelectionListener.class) {
+                    ((TreeSelectionListener)listeners[i+1]).valueChanged(e);
+                }
+            }
+        }
+
+        /* UndoableEditListener Methods **************************************/
+
+        public void undoableEditHappened(UndoableEditEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==UndoableEditListener.class) {
+                    ((UndoableEditListener)listeners[i+1]).undoableEditHappened(e);
+                }
+            }
+        }
+
+        /* InternalFrame Methods **********************************/
+
+        public void internalFrameOpened(InternalFrameEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==InternalFrameListener.class) {
+                    ((InternalFrameListener)listeners[i+1]).internalFrameOpened(e);
+                }
+            }
+        }
+
+        public void internalFrameActivated(InternalFrameEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==InternalFrameListener.class) {
+                    ((InternalFrameListener)listeners[i+1]).internalFrameActivated(e);
+                }
+            }
+        }
+
+        public void internalFrameDeactivated(InternalFrameEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==InternalFrameListener.class) {
+                    ((InternalFrameListener)listeners[i+1]).internalFrameDeactivated(e);
+                }
+            }
+        }
+
+        public void internalFrameIconified(InternalFrameEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==InternalFrameListener.class) {
+                    ((InternalFrameListener)listeners[i+1]).internalFrameIconified(e);
+                }
+            }
+        }
+
+        public void internalFrameDeiconified(InternalFrameEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==InternalFrameListener.class) {
+                    ((InternalFrameListener)listeners[i+1]).internalFrameDeiconified(e);
+                }
+            }
+        }
+
+        public void internalFrameClosing(InternalFrameEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==InternalFrameListener.class) {
+                    ((InternalFrameListener)listeners[i+1]).internalFrameClosing(e);
+                }
+            }
+        }
+
+        public void internalFrameClosed(InternalFrameEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==InternalFrameListener.class) {
+                    ((InternalFrameListener)listeners[i+1]).internalFrameClosed(e);
+                }
+            }
+        }
+
+        /* PropertyChangeListener Methods **********************************/
+
+        public void propertyChange(PropertyChangeEvent e) {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==PropertyChangeListener.class) {
+                ((PropertyChangeListener)listeners[i+1]).propertyChange(e);
+                }
+            }
+            // Re-add the monitor as a DocumentChangeListener if
+            // the document changed in the text component.
+            if (e.getSource() instanceof JTextComponent) {
+                Document c = ((JTextComponent)e.getSource()).getDocument();
+                if (c == null) {
+                    return;
+                }
+                try {
+                    removeDocumentMethod = c.getClass().getMethod(
+                        "removeDocumentListener", documentListeners);
+                    addDocumentMethod = c.getClass().getMethod(
+                        "addDocumentListener", documentListeners);
+                    try {
+                        removeDocumentMethod.invoke(c, documentArgs);
+                        addDocumentMethod.invoke(c, documentArgs);
+                    } catch (java.lang.reflect.InvocationTargetException e2) {
+                        System.out.println("Exception: " + e2.toString());
+                    } catch (IllegalAccessException e2) {
+                        System.out.println("Exception: " + e2.toString());
+                    }
+                } catch (NoSuchMethodException e2) {
+                    // System.out.println("Exception: " + e2.toString());
+                } catch (SecurityException e2) {
+                    System.out.println("Exception: " + e2.toString());
+                }
+            }
+
+        }
+
+        /* VetoableChangeListener Methods **********************************/
+
+        public void vetoableChange(PropertyChangeEvent e)
+                throws PropertyVetoException {
+            Object[] listeners = SwingEventMonitor.listenerList.getListenerList();
+            for (int i = listeners.length-2; i>=0; i-=2) {
+                if (listeners[i]==VetoableChangeListener.class) {
+                    ((VetoableChangeListener)listeners[i+1]).vetoableChange(e);
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/TopLevelWindowListener.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.awt.*;
+import java.util.*;
+import javax.accessibility.*;
+
+/**
+ * The {@code TopLevelWindowListener} interface is used by the {@link EventQueueMonitor}
+ * class to notify an interested party when a top level window is created
+ * or destroyed in the Java Virtual Machine.  Classes wishing to express
+ * an interest in top level window events should implement this interface
+ * and register themselves with the {@code EventQueueMonitor} by calling the
+ * {@link EventQueueMonitor#addTopLevelWindowListener EventQueueMonitor.addTopLevelWindowListener}
+ * class method.
+ *
+ * @see EventQueueMonitor
+ * @see EventQueueMonitor#addTopLevelWindowListener
+ * @see EventQueueMonitor#removeTopLevelWindowListener
+ *
+ */
+@jdk.Exported
+public interface TopLevelWindowListener extends EventListener {
+
+    /**
+     * Invoked when a new top level window has been created.
+     *
+     * @param w the Window that was created
+     */
+    public void topLevelWindowCreated(Window w);
+
+    /**
+     * Invoked when a top level window has been destroyed.
+     *
+     * @param w the Window that was destroyed
+     */
+    public void topLevelWindowDestroyed(Window w);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/TopLevelWindowMulticaster.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util;
+
+import java.awt.*;
+import java.util.EventListener;
+import javax.accessibility.*;
+
+
+/**
+ * The TopLevelWindowMulticaster class is used to maintain a list of
+ * TopLevelWindowListener classes.  It is intended to be used primarily
+ * for internal support in the EventQueueMonitor class, and is not intended
+ * to be used by classes outside the Java Accessibility Utility package.
+ *
+ * @see EventQueueMonitor
+ * @see EventQueueMonitor#addTopLevelWindowListener
+ * @see EventQueueMonitor#removeTopLevelWindowListener
+ *
+ */
+class TopLevelWindowMulticaster
+    extends AWTEventMulticaster implements TopLevelWindowListener
+{
+    protected TopLevelWindowMulticaster(EventListener a, EventListener b) {
+        super(a, b);
+    }
+
+    public void topLevelWindowCreated(Window w) {
+        ((TopLevelWindowListener)a).topLevelWindowCreated(w);
+        ((TopLevelWindowListener)b).topLevelWindowCreated(w);
+    }
+
+    public void topLevelWindowDestroyed(Window w) {
+        ((TopLevelWindowListener)a).topLevelWindowDestroyed(w);
+        ((TopLevelWindowListener)b).topLevelWindowDestroyed(w);
+    }
+
+    public static TopLevelWindowListener add(TopLevelWindowListener a, TopLevelWindowListener b) {
+        return (TopLevelWindowListener)addInternal(a, b);
+    }
+
+    public static TopLevelWindowListener remove(TopLevelWindowListener l, TopLevelWindowListener oldl) {
+        return (TopLevelWindowListener)removeInternal(l, oldl);
+    }
+
+    protected static EventListener addInternal(EventListener a, EventListener b) {
+        if (a == null)  return b;
+        if (b == null)  return a;
+        return new TopLevelWindowMulticaster(a, b);
+    }
+
+    protected static EventListener removeInternal(EventListener l, EventListener oldl) {
+        if (l == oldl || l == null) {
+            return null;
+        } else if (l instanceof TopLevelWindowMulticaster) {
+            return ((TopLevelWindowMulticaster)l).remove(oldl);
+        } else {
+            return l;           // it's not here
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/Translator.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,744 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+package com.sun.java.accessibility.util;
+
+import java.lang.*;
+import java.beans.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.image.*;
+// Do not import Swing classes.  This module is intended to work
+// with both Swing and AWT.
+// import javax.swing.*;
+import javax.accessibility.*;
+
+/**
+ * <p>The {@code Translator} class provides a translation to interface
+ * {@link javax.accessibility.Accessible Accessible}
+ * for objects that do not implement interface {@code Accessible}.  Assistive
+ * technologies can use the {@link #getAccessible getAccessible} class method of
+ * {@code Translator} to obtain an object that implements interface {@code Accessible}.
+ * If the object passed in already implements interface {@code Accessible},
+ * {@code getAccessible} merely returns the object.
+ *
+ * <p>An example of how an assistive technology might use the {@code Translator}
+ * class is as follows:
+ *
+ * <PRE>
+ *    Accessible accessible = Translator.getAccessible(someObj);
+ *    // obtain information from the 'accessible' object.
+ * </PRE>
+ *
+ * <P>Note:  This implementation is missing many things and is not a recommended way
+ * to implement accessibility features for a toolkit.  Instead of relying upon this
+ * code, a toolkit's components should implement interface {@code Accessible} directly.
+ */
+@jdk.Exported
+public class Translator extends AccessibleContext
+        implements Accessible, AccessibleComponent {
+
+    /** The source object needing translating. */
+    protected Object source;
+
+    /**
+     * Find a translator for this class.  If one doesn't exist for this
+     * class explicitly, try its superclass and so on.
+     *
+     * @param c a Class
+     * @return the {@code Translator} Class for the Class passed in
+     */
+    protected static Class<?> getTranslatorClass(Class<?> c) {
+        Class<?> t = null;
+        if (c == null) {
+            return null;
+        }
+        try {
+            t = Class.forName("com.sun.java.accessibility.util."
+                              + c.getName()
+                              + "Translator");
+            return t;
+        } catch (Exception e) {
+            return getTranslatorClass(c.getSuperclass());
+        }
+    }
+
+    /**
+     * Obtain an object that implements interface {@code Accessible}.  If the object
+     * passed in already implements interface {@code Accessible}, {@code getAccessible}
+     * merely returns the object.
+     *
+     * @param o an Object; if a null is passed in a null is returned
+     * @return an {@code Object}, possibly the {@code Object} passed in, that
+     *     implements the {@code Accessible} interface for the {@code Object}
+     *     which was passed in
+     */
+    public static Accessible getAccessible(Object o) {
+        Accessible a = null;
+
+        if (o == null) {
+            return null;
+        }
+        if (o instanceof Accessible) {
+            a = (Accessible)o;
+        } else {
+            Class<?> translatorClass = getTranslatorClass(o.getClass());
+            if (translatorClass != null) {
+                try {
+                    Translator t = (Translator)translatorClass.newInstance();
+                    t.setSource(o);
+                    a = t;
+                } catch (Exception e) {
+                }
+            }
+        }
+        if (a == null) {
+            a = new Translator(o);
+        }
+        return a;
+    }
+
+    /**
+     * Create a new {@code Translator}.  You must call the {@link #setSource setSource}
+     * method to set the object to be translated after calling this constructor.
+     */
+    public Translator() {
+    }
+
+    /**
+     * Create a new {@code Translator} with the source object o.
+     *
+     * @param o the Component that does not implement interface
+     *     {@link javax.accessibility.Accessible Accessible}
+     */
+    public Translator(Object o) {
+        source = o;
+    }
+
+    /**
+     * Get the source {@code Object} of the {@code Translator}.
+     *
+     * @return the source {@code Object} of the {@code Translator}
+     */
+    public Object getSource() {
+        return source;
+    }
+
+    /**
+     * Set the source object of the {@code Translator}.
+     *
+     * @param o the Component that does not implement interface Accessible
+     */
+    public void setSource(Object o) {
+        source = o;
+    }
+
+    /**
+     * Returns true if this object is the same as the one passed in.
+     *
+     * @param o the {@code Object} to check against
+     * @return true if this is the same object
+     */
+    public boolean equals(Object o) {
+        if (o instanceof Translator) {
+            return java.util.Objects.equals(source, o);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Return hashcode.
+     *
+     * @return hashcode
+     */
+    public int hashCode() {
+        return java.util.Objects.hashCode(source);
+    }
+
+
+// Accessible methods
+
+    /**
+     * Returns this object.
+     */
+    public AccessibleContext getAccessibleContext() {
+        return this;
+    }
+
+// AccessibleContext methods
+
+    /**
+     * Get the accessible name of this object.
+     *
+     * @return the localized name of the object; can be null if this object
+     *     does not have a name
+     */
+    public String getAccessibleName() {
+        if (source instanceof MenuItem) {
+            return ((MenuItem) source).getLabel();
+        } else if (source instanceof Component) {
+            return ((Component) source).getName();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Set the name of this object.
+     */
+    public void setAccessibleName(String s) {
+        if (source instanceof MenuItem) {
+            ((MenuItem) source).setLabel(s);
+        } else if (source instanceof Component) {
+            ((Component) source).setName(s);
+        }
+    }
+
+    /**
+     * Get the accessible description of this object.
+     *
+     * @return the description of the object; can be null if this object does
+     * not have a description
+     */
+    public String getAccessibleDescription() {
+        return null;
+    }
+
+    /**
+     * Set the accessible description of this object.
+     *
+     * @param s the new localized description of the object
+     */
+    public void setAccessibleDescription(String s) {
+    }
+
+    /**
+     * Get the role of this object.
+     *
+     * @return an instance of AccessibleRole describing the role of the object
+     */
+    public AccessibleRole getAccessibleRole() {
+        return AccessibleRole.UNKNOWN;
+    }
+
+
+    /**
+     * Get the state of this object, given an already populated state.
+     * This method is intended for use by subclasses so they don't have
+     * to check for everything.
+     *
+     * @return an instance of {@code AccessibleStateSet}
+     *     containing the current state of the object
+     */
+    public AccessibleStateSet getAccessibleStateSet() {
+        AccessibleStateSet states = new AccessibleStateSet();
+        if (source instanceof Component) {
+            Component c = (Component) source;
+            for (Container p = c.getParent(); p != null; p = p.getParent()) {
+                if (p instanceof Window) {
+                    if (((Window)p).getFocusOwner() == c) {
+                        states.add(AccessibleState.FOCUSED);
+                    }
+                }
+            }
+        }
+        if (isEnabled()) {
+            states.add(AccessibleState.ENABLED);
+        }
+        if (isFocusTraversable()) {
+            states.add(AccessibleState.FOCUSABLE);
+        }
+        if (source instanceof MenuItem) {
+            states.add(AccessibleState.FOCUSABLE);
+        }
+        return states;
+    }
+
+    /**
+     * Get the accessible parent of this object.
+     *
+     * @return the accessible parent of this object; can be null if this
+     *     object does not have an accessible parent
+     */
+    public Accessible getAccessibleParent() {
+        if (accessibleParent != null) {
+            return accessibleParent;
+        } else if (source instanceof Component) {
+            return getAccessible(((Component) source).getParent());
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Get the index of this object in its accessible parent.
+     *
+     * @return -1 of this object does not have an accessible parent; otherwise,
+     * the index of the child in its accessible parent
+     */
+    public int getAccessibleIndexInParent() {
+        if (source instanceof Component) {
+            Container parent = ((Component) source).getParent();
+            if (parent != null) {
+                Component ca[] = parent.getComponents();
+                for (int i = 0; i < ca.length; i++) {
+                    if (source.equals(ca[i])) {
+                        return i;
+                    }
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * Returns the number of accessible children in the object.
+     *
+     * @return the number of accessible children in the object
+     */
+    public int getAccessibleChildrenCount() {
+        if (source instanceof Container) {
+            Component[] children = ((Container) source).getComponents();
+            int count = 0;
+            for (int i = 0; i < children.length; i++) {
+                Accessible a = getAccessible(children[i]);
+                if (a != null) {
+                    count++;
+                }
+            }
+            return count;
+        } else {
+            return 0;
+        }
+    }
+
+    /**
+     * Return the nth accessible child of the object.
+     *
+     * @param i zero-based index of child
+     * @return the nth accessible child of the object
+     */
+    public Accessible getAccessibleChild(int i) {
+        if (source instanceof Container) {
+            Component[] children = ((Container) source).getComponents();
+            int count = 0;
+
+            for (int j = 0; j < children.length; j++) {
+                Accessible a = getAccessible(children[j]);
+                if (a != null) {
+                    if (count == i) {
+                        AccessibleContext ac = a.getAccessibleContext();
+                        if (ac != null) {
+                            ac.setAccessibleParent(this);
+                        }
+                        return a;
+                    } else {
+                        count++;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Gets the {@code Locale} of the component. If the component does not have a
+     * locale, the locale of its parent is returned.
+     *
+     * @return the {@code Locale} of the object
+     */
+    public Locale getLocale() throws IllegalComponentStateException {
+        if (source instanceof Component) {
+            return ((Component) source).getLocale();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Add a {@code PropertyChangeListener} to the listener list.  The listener
+     * is registered for all properties.
+     */
+    public void addPropertyChangeListener(PropertyChangeListener l) {
+    }
+
+    /**
+     * Remove the {@code PropertyChangeListener} from the listener list.
+     */
+    public void removePropertyChangeListener(PropertyChangeListener l) {
+    }
+
+// AccessibleComponent methods
+
+    /**
+     * Get the background {@code Color} of this object.
+     *
+     * @return if supported, the background {@code Color} of the object;
+     *     otherwise, null
+     *
+     */
+    public Color getBackground() {
+        if (source instanceof Component) { // MenuComponent doesn't do background
+            return ((Component) source).getBackground();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Set the background {@code Color} of this object.
+     *
+     * @param c the new {@code Color} for the background
+     */
+    public void setBackground(Color c) {
+        if (source instanceof Component) { // MenuComponent doesn't do background
+            ((Component) source).setBackground(c);
+        }
+    }
+
+    /**
+     * Get the foreground {@code Color} of this object.
+     *
+     * @return if supported, the foreground {@code Color} of the object; otherwise, null
+     */
+    public Color getForeground() {
+        if (source instanceof Component) { // MenuComponent doesn't do foreground
+            return ((Component) source).getForeground();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Set the foreground {@code Color} of this object.
+     *
+     * @param c the new {@code Color} for the foreground
+     */
+    public void setForeground(Color c) {
+        if (source instanceof Component) { // MenuComponent doesn't do foreground
+            ((Component) source).setForeground(c);
+        }
+    }
+
+    /**
+     * Get the {@code Cursor} of this object.
+     *
+     * @return if supported, the Cursor of the object; otherwise, null
+     */
+    public Cursor getCursor() {
+        if (source instanceof Component) { // MenuComponent doesn't do cursor
+            return ((Component) source).getCursor();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Set the {@code Cursor} of this object.
+     * @param c the new {@code Cursor} for the object
+     */
+    public void setCursor(Cursor c) {
+        if (source instanceof Component) { // MenuComponent doesn't do cursor
+            ((Component) source).setCursor(c);
+        }
+    }
+
+    /**
+     * Get the {@code Font} of this object.
+     *
+     * @return if supported, the {@code Font} for the object; otherwise, null
+     */
+    public Font getFont() {
+        if (source instanceof Component) {
+            return ((Component) source).getFont();
+        } else if (source instanceof MenuComponent) {
+            return ((MenuComponent) source).getFont();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Set the {@code Font} of this object.
+     *
+     * @param f the new {@code Font} for the object
+     */
+    public void setFont(Font f) {
+        if (source instanceof Component) {
+            ((Component) source).setFont(f);
+        } else if (source instanceof MenuComponent) {
+            ((MenuComponent) source).setFont(f);
+        }
+    }
+
+    /**
+     * Get the {@code FontMetrics} of this object.
+     *
+     * @param f the {@code Font}
+     * @return if supported, the {@code FontMetrics} the object; otherwise, null
+     * @see #getFont
+     */
+    public FontMetrics getFontMetrics(Font f) {
+        if (source instanceof Component) {
+            return ((Component) source).getFontMetrics(f);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Determine if the object is enabled.
+     *
+     * @return true if object is enabled; otherwise, false
+     */
+    public boolean isEnabled() {
+        if (source instanceof Component) {
+            return ((Component) source).isEnabled();
+        } else if (source instanceof MenuItem) {
+            return ((MenuItem) source).isEnabled();
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * Set the enabled state of the object.
+     *
+     * @param b if true, enables this object; otherwise, disables it
+     */
+    public void setEnabled(boolean b) {
+        if (source instanceof Component) {
+            ((Component) source).setEnabled(b);
+        } else if (source instanceof MenuItem) {
+            ((MenuItem) source).setEnabled(b);
+        }
+    }
+
+    /**
+     * Determine if the object is visible.
+     *
+     * @return true if object is visible; otherwise, false
+     */
+    public boolean isVisible() {
+        if (source instanceof Component) {
+            return ((Component) source).isVisible();
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Set the visible state of the object.
+     *
+     * @param b if true, shows this object; otherwise, hides it
+     */
+    public void setVisible(boolean b) {
+        if (source instanceof Component) {
+            ((Component) source).setVisible(b);
+        }
+    }
+
+    /**
+     * Determine if the object is showing.  This is determined by checking
+     * the visibility of the object and ancestors of the object.
+     *
+     * @return true if object is showing; otherwise, false
+     */
+    public boolean isShowing() {
+        if (source instanceof Component) {
+            return ((Component) source).isShowing();
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Checks whether the specified {@code Point} is within this
+     * object's bounds, where the {@code Point} is relative to the coordinate
+     * system of the object.
+     *
+     * @param p the {@code Point} relative to the coordinate system of the object
+     * @return true if object contains {@code Point}; otherwise false
+     */
+    public boolean contains(Point p) {
+        if (source instanceof Component) {
+            return ((Component) source).contains(p);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the location of the object on the screen.
+     *
+     * @return location of object on screen; can be null if this object
+     *     is not on the screen
+     */
+    public Point getLocationOnScreen() {
+        if (source instanceof Component) {
+            return ((Component) source).getLocationOnScreen();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Returns the location of the object relative to parent.
+     *
+     * @return location of object relative to parent; can be null if
+     *     this object or its parent are not on the screen
+     */
+    public Point getLocation() {
+        if (source instanceof Component) {
+            return ((Component) source).getLocation();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Sets the location of the object relative to parent.
+     */
+    public void setLocation(Point p) {
+        if (source instanceof Component) {
+            ((Component) source).setLocation(p);
+        }
+    }
+
+    /**
+     * Returns the current bounds of this object.
+     *
+     * @return current bounds of object; can be null if this object
+     *     is not on the screen
+     */
+    public Rectangle getBounds() {
+        if (source instanceof Component) {
+            return ((Component) source).getBounds();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Sets the current bounds of this object.
+     */
+    public void setBounds(Rectangle r) {
+        if (source instanceof Component) {
+            ((Component) source).setBounds(r);
+        }
+    }
+
+    /**
+     * Returns the current size of this object.
+     *
+     * @return current size of object; can be null if this object is
+     *     not on the screen
+     */
+    public Dimension getSize() {
+        if (source instanceof Component) {
+            return ((Component) source).getSize();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Sets the current size of this object.
+     */
+    public void setSize(Dimension d) {
+        if (source instanceof Component) {
+            ((Component) source).setSize(d);
+        }
+    }
+
+    /**
+     * Returns the accessible child contained at the local coordinate
+     * Point, if one exists.
+     *
+     * @return the Accessible at the specified location, if it exists
+     */
+    public Accessible getAccessibleAt(Point p) {
+        if (source instanceof Component) {
+            Component c = ((Component) source).getComponentAt(p);
+            if (c != null) {
+                return (getAccessible(c));
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns whether this object can accept focus or not.
+     *
+     * @return true if object can accept focus; otherwise false
+     */
+    @SuppressWarnings("deprecation")
+    public boolean isFocusTraversable() {
+        if (source instanceof Component) {
+            return ((Component) source).isFocusTraversable();
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Requests focus for this object.
+     */
+    public void requestFocus() {
+        if (source instanceof Component) {
+            ((Component) source).requestFocus();
+        }
+    }
+
+    /**
+     * Adds the specified {@code FocusListener} to receive focus events from
+     * this component.
+     *
+     * @param l the focus listener
+     */
+    public synchronized void addFocusListener(FocusListener l) {
+        if (source instanceof Component) {
+            ((Component) source).addFocusListener(l);
+        }
+    }
+
+    /**
+     * Removes the specified focus listener so it no longer receives focus
+     * events from this component.
+     *
+     * @param l the focus listener; this method performs no function, nor does it
+     *     throw an exception if the listener specified was not previously added
+     *     to this component; if listener is null, no exception is thrown and no
+     *     action is performed.
+     */
+    public synchronized void removeFocusListener(FocusListener l) {
+        if (source instanceof Component) {
+            ((Component) source).removeFocusListener(l);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/java/awt/ButtonTranslator.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util.java.awt;
+
+import java.lang.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.image.*;
+import javax.accessibility.*;
+import com.sun.java.accessibility.util.*;
+
+/**
+ * <p>The Translator class provides a translation to interface Accessible
+ * for objects that do not implement interface Accessible.  Assistive
+ * technologies can use the 'getAccessible' class method of Translator to
+ * obtain an object that implements interface Accessible.  If the object
+ * passed in already implements interface Accessible, getAccessible merely
+ * returns the object.
+ *
+ * <p>An example of how an assistive technology might use the Translator
+ * class is as follows:
+ *
+ * <PRE>
+ *    Accessible accessible = Translator.getAccessible(someObj);
+ *    // obtain information from the 'accessible' object.
+ * </PRE>
+ *
+ * <P>This class extends the Translator class to provide specific support
+ * for the Button class.  Translator.getAccessible() will automatically
+ * load this class when an assistive technology asks for an accessible
+ * translator for Button.
+ *
+ */
+public class ButtonTranslator extends Translator {
+
+    /**
+     * Get the name of this object.
+     * @return the name of the object -- can be null if this object does
+     * not have a name
+     */
+    public String getAccessibleName() {
+        return ((Button) source).getLabel();
+    }
+
+    /**
+     * Set the name of this object.
+     */
+    public void setAccessibleName(String s) {
+        ((Button) source).setLabel(s);
+    }
+
+    public AccessibleRole getAccessibleRole() {
+        return AccessibleRole.PUSH_BUTTON;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/java/awt/CheckboxTranslator.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util.java.awt;
+
+import java.lang.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.image.*;
+import javax.accessibility.*;
+import com.sun.java.accessibility.util.*;
+
+/**
+ * <p>The Translator class provides a translation to interface Accessible
+ * for objects that do not implement interface Accessible.  Assistive
+ * technologies can use the 'getAccessible' class method of Translator to
+ * obtain an object that implements interface Accessible.  If the object
+ * passed in already implements interface Accessible, getAccessible merely
+ * returns the object.
+ *
+ * <p>An example of how an assistive technology might use the Translator
+ * class is as follows:
+ *
+ * <PRE>
+ *    Accessible accessible = Translator.getAccessible(someObj);
+ *    // obtain information from the 'accessible' object.
+ * </PRE>
+ *
+ * <P>This class extends the Translator class to provide specific support
+ * for the Checkbox class.  Translator.getAccessible() will automatically
+ * load this class when an assistive technology asks for an accessible
+ * translator for Checkbox.
+ *
+ */
+public class CheckboxTranslator extends Translator {
+
+    /**
+     * Get the state of this object.
+     * @return an instance of AccessibleState containing the current state of the object
+     * @see AccessibleState
+     */
+    public AccessibleStateSet getAccessibleStateSet() {
+        AccessibleStateSet states = super.getAccessibleStateSet();
+        if (((Checkbox) source).getState()) {
+            states.add(AccessibleState.CHECKED);
+        }
+        return states;
+    }
+
+    /**
+     * Get the name of this object.
+     * @return the name of the object -- can be null if this object does
+     * not have a name
+     */
+    public String getAccessibleName() {
+        return ((Checkbox) source).getLabel();
+    }
+
+    /**
+     * Set the name of this object.
+     */
+    public void setAccessibleName(String s) {
+        ((Checkbox) source).setLabel(s);
+    }
+
+    public AccessibleRole getAccessibleRole() {
+        return AccessibleRole.CHECK_BOX;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/java/awt/LabelTranslator.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util.java.awt;
+
+import java.lang.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.image.*;
+import javax.accessibility.*;
+import com.sun.java.accessibility.util.*;
+
+/**
+ * <p>The Translator class provides a translation to interface Accessible
+ * for objects that do not implement interface Accessible.  Assistive
+ * technologies can use the 'getAccessible' class method of Translator to
+ * obtain an object that implements interface Accessible.  If the object
+ * passed in already implements interface Accessible, getAccessible merely
+ * returns the object.
+ *
+ * <p>An example of how an assistive technology might use the Translator
+ * class is as follows:
+ *
+ * <PRE>
+ *    Accessible accessible = Translator.getAccessible(someObj);
+ *    // obtain information from the 'accessible' object.
+ * </PRE>
+ *
+ * <P>This class extends the Translator class to provide specific support
+ * for the Label class.  Translator.getAccessible() will automatically
+ * load this class when an assistive technology asks for an accessible
+ * translator for Label.
+ *
+ */
+public class LabelTranslator extends Translator {
+
+    public String getAccessibleName() {
+        return ((Label) source).getText();
+    }
+
+    /**
+     * Set the name of this object.
+     */
+    public void setAccessibleName(String s) {
+        ((Label) source).setText(s);
+    }
+
+    public AccessibleRole getAccessibleRole() {
+        return AccessibleRole.LABEL;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/java/awt/ListTranslator.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util.java.awt;
+
+import java.lang.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.image.*;
+import javax.accessibility.*;
+import com.sun.java.accessibility.util.*;
+
+/**
+ * <p>The Translator class provides a translation to interface Accessible
+ * for objects that do not implement interface Accessible.  Assistive
+ * technologies can use the 'getAccessible' class method of Translator to
+ * obtain an object that implements interface Accessible.  If the object
+ * passed in already implements interface Accessible, getAccessible merely
+ * returns the object.
+ *
+ * <p>An example of how an assistive technology might use the Translator
+ * class is as follows:
+ *
+ * <PRE>
+ *    Accessible accessible = Translator.getAccessible(someObj);
+ *    // obtain information from the 'accessible' object.
+ * </PRE>
+ *
+ * <P>This class extends the Translator class to provide specific support
+ * for the List class.  Translator.getAccessible() will automatically
+ * load this class when an assistive technology asks for an accessible
+ * translator for List.
+ *
+ */
+public class ListTranslator extends Translator {
+
+    /**
+     * Get the state of this object.
+     * @return an instance of AccessibleState containing the current state of the object
+     * @see AccessibleState
+     */
+    public AccessibleStateSet getAccessibleStateSet() {
+        AccessibleStateSet states = super.getAccessibleStateSet();
+        if (((java.awt.List) source).isMultipleMode()) {
+            states.add(AccessibleState.MULTISELECTABLE);
+        }
+        if (((java.awt.List) source).getSelectedItems().length > 0) {
+            states.add(AccessibleState.SELECTED);
+        }
+        return states;
+    }
+
+    public AccessibleRole getAccessibleRole() {
+        return AccessibleRole.LIST;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/java/awt/TextComponentTranslator.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility.util.java.awt;
+
+import java.lang.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.image.*;
+import javax.accessibility.*;
+import com.sun.java.accessibility.util.*;
+
+/**
+ * <p>The Translator class provides a translation to interface Accessible
+ * for objects that do not implement interface Accessible.  Assistive
+ * technologies can use the 'getAccessible' class method of Translator to
+ * obtain an object that implements interface Accessible.  If the object
+ * passed in already implements interface Accessible, getAccessible merely
+ * returns the object.
+ *
+ * <p>An example of how an assistive technology might use the Translator
+ * class is as follows:
+ *
+ * <PRE>
+ *    Accessible accessible = Translator.getAccessible(someObj);
+ *    // obtain information from the 'accessible' object.
+ * </PRE>
+ *
+ * <P>This class extends the Translator class to provide specific support
+ * for the TextComponent class.  Translator.getAccessible() will automatically
+ * load this class when an assistive technology asks for an accessible
+ * translator for TextComponent.
+ *
+ */
+public class TextComponentTranslator extends Translator {
+
+    public AccessibleRole getAccessibleRole() {
+        return AccessibleRole.TEXT;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/package-info.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2013, 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Provides a collection of interfaces and classes that compose the Java Accessibility
+ * Utilities.  The classes are used by Assistive Technologies, such as the screen
+ * readers which are used by those who are blind, and help provide access to GUI
+ * toolkits that implement the Java Accessibility API.  An overview of the important
+ * classes follows.
+ *
+ * <p>The class {@code AccessibilityEventMonitor} implements a PropertyChange
+ * listener on every UI object that implements interface {@code Accessible} in the Java
+ * Virtual Machine.
+ *
+ * <p> The class {@code AWTEventMonitor} implements a suite of listeners that are
+ * conditionally installed on every AWT component instance in the Java Virtual Machine.
+ *
+ * <p>The class {@code EventQueueMonitor} provides key core functionality for
+ * Assistive Technologies (and other system-level technologies that need some of
+ * the same things that Assistive Technology needs).
+ *
+ * <p>The class {@code GUIInitializedMulticaster} is used to maintain a list of
+ * {@code GUIInitializedListener} classes which are used by the {@code EventQueueMonitor}
+ * class to notify an interested party when the GUI subsystem has been initialized.
+ * Note that this class is intended to be used primarily for internal support in
+ * the {@code EventQueueMonitor} class, and is not intended to be used by classes
+ * outside the Java Accessibility Utility package.
+ *
+ * <p>The class {@code SwingEventMonitor} extends {@code AWTEventMonitor} by adding
+ * a suite of listeners conditionally installed on every Swing component instance
+ * in the Java Virtual Machine.
+ *
+ * <p>The class {@code TopLevelWindowMulticaster} is used to maintain a list of
+ * {@code TopLevelWindowListener} classes which are used by the {@code EventQueueMonitor}
+ * class to notify an interested party when a top level window is created or destroyed
+ * in the Java Virtual Machine  Note that this class is intended to be used primarily
+ * for internal support in the {@code EventQueueMonitor} class, and is not intended
+ * to be used by classes outside the Java Accessibility Utility package.
+ *
+ * <p>The class {@code Translator} provides a translation to interface {@code Accessible}
+ * for objects that do not implement interface {@code Accessible}.
+ *
+ * @since JDK1.7
+ */
+package com.sun.java.accessibility.util;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/classes/com/sun/java/accessibility/AccessBridge.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,7170 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.accessibility;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import java.lang.*;
+import java.lang.reflect.*;
+
+import java.beans.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.text.*;
+import javax.swing.tree.*;
+import javax.swing.table.*;
+import javax.swing.plaf.TreeUI;
+
+import javax.accessibility.*;
+import com.sun.java.accessibility.util.*;
+import sun.awt.AWTAccessor;
+import sun.awt.AppContext;
+import sun.awt.SunToolkit;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+
+/*
+ * Note: This class has to be public.  It's loaded from the VM like this:
+ *       Class.forName(atName).newInstance();
+ */
+@jdk.Exported(false)
+final public class AccessBridge {
+
+    private static AccessBridge theAccessBridge;
+    private ObjectReferences references;
+    private EventHandler eventHandler;
+
+    // Maps AccessibleRoles strings to AccessibleRoles.
+    private ConcurrentHashMap<String,AccessibleRole> accessibleRoleMap = new ConcurrentHashMap<>();
+
+    /**
+       If the object's role is in the following array getVirtualAccessibleName
+       will use the extended search algorithm.
+    */
+    private ArrayList<AccessibleRole> extendedVirtualNameSearchRoles = new ArrayList<>();
+    /**
+       If the role of the object's parent is in the following array
+       getVirtualAccessibleName will NOT use the extended search
+       algorithm even if the object's role is in the
+       extendedVirtualNameSearchRoles array.
+    */
+    private ArrayList<AccessibleRole> noExtendedVirtualNameSearchParentRoles = new ArrayList<>();
+
+    private static native boolean isSysWow();
+
+
+    /**
+     * Load DLLs
+     */
+    static {
+        // Load the appropriate DLLs
+        boolean is32on64 = false;
+        if (System.getProperty("os.arch").equals("x86")) {
+            // 32 bit JRE
+            // Load jabsysinfo.dll so can determine Win bitness
+            java.security.AccessController.doPrivileged(
+                new java.security.PrivilegedAction<Void>() {
+                    public Void run() {
+                        System.loadLibrary("jabsysinfo");
+                        return null;
+                    }
+                }, null, new java.lang.RuntimePermission("loadLibrary.jabsysinfo")
+            );
+            if (isSysWow()) {
+                // 32 bit JRE on 64 bit OS
+                is32on64 = true;
+                java.security.AccessController.doPrivileged(
+                    new java.security.PrivilegedAction<Void>() {
+                        public Void run() {
+                            System.loadLibrary("javaaccessbridge-32");
+                            return null;
+                        }
+                    }, null, new java.lang.RuntimePermission("loadLibrary.javaaccessbridge-32")
+                );
+            }
+        }
+        if (!is32on64) {
+            // 32 bit JRE on 32 bit OS or 64 bit JRE on 64 bit OS
+            java.security.AccessController.doPrivileged(
+                new java.security.PrivilegedAction<Void>() {
+                    public Void run() {
+                        System.loadLibrary("javaaccessbridge");
+                        return null;
+                    }
+                }, null, new java.lang.RuntimePermission("loadLibrary.javaaccessbridge")
+            );
+        }
+    }
+
+    /**
+     * AccessBridge constructor
+     *
+     * Note: This constructor has to be public.  It's called from the VM like this:
+     *       Class.forName(atName).newInstance();
+     */
+    public AccessBridge() {
+        theAccessBridge = this;
+        references = new ObjectReferences();
+
+        // initialize shutdown hook
+        Runtime runTime = Runtime.getRuntime();
+        shutdownHook hook = new shutdownHook();
+        runTime.addShutdownHook(new Thread(hook));
+
+        // initialize AccessibleRole map
+        initAccessibleRoleMap();
+
+        // determine which version of the JDK is running
+        String version = getJavaVersionProperty();
+        debugString("JDK version = "+version);
+
+        // initialize the methods that map HWNDs and Java top-level
+        // windows
+        initHWNDcalls();
+
+        // is this a JVM we can use?
+        // install JDK 1.2 and later Swing ToolKit listener
+        EventQueueMonitor.isGUIInitialized();
+
+        // start the Java event handler
+        eventHandler = new EventHandler(this);
+
+        // register for menu selection events
+        MenuSelectionManager.defaultManager().addChangeListener(eventHandler);
+
+        // register as a NativeWindowHandler
+        addNativeWindowHandler(new DefaultNativeWindowHandler());
+
+        // start in a new thread
+        Thread abthread = new Thread(new dllRunner());
+        abthread.setDaemon(true);
+        abthread.start();
+        debugString("AccessBridge started");
+    }
+
+    /*
+     * adaptor to run the AccessBridge DLL
+     */
+    private class dllRunner implements Runnable {
+        public void run() {
+            runDLL();
+        }
+    }
+
+    /*
+     * shutdown hook
+     */
+    private class shutdownHook implements Runnable {
+
+        public void run() {
+            debugString("***** shutdownHook: shutting down...");
+            javaShutdown();
+        }
+    }
+
+
+    /*
+     * Initialize the hashtable that maps Strings to AccessibleRoles.
+     */
+    private void initAccessibleRoleMap() {
+        /*
+         * Initialize the AccessibleRoles map. This code uses methods in
+         * java.lang.reflect.* to build the map.
+         */
+        try {
+            Class<?> clAccessibleRole = Class.forName ("javax.accessibility.AccessibleRole");
+            if (null != clAccessibleRole) {
+                AccessibleRole roleUnknown = AccessibleRole.UNKNOWN;
+                Field [] fields = clAccessibleRole.getFields ();
+                int i = 0;
+                for (i = 0; i < fields.length; i ++) {
+                    Field f = fields [i];
+                    if (javax.accessibility.AccessibleRole.class == f.getType ()) {
+                        AccessibleRole nextRole = (AccessibleRole) (f.get (roleUnknown));
+                        String nextRoleString = nextRole.toDisplayString (Locale.US);
+                        accessibleRoleMap.put (nextRoleString, nextRole);
+                    }
+                }
+            }
+        } catch (Exception e) {}
+
+    /*
+      Build the extendedVirtualNameSearchRoles array list.  I chose this method
+      because some of the Accessible Roles that need to be added to it are not
+      available in all versions of the J2SE that we want to support.
+    */
+    extendedVirtualNameSearchRoles.add (AccessibleRole.COMBO_BOX);
+    try {
+        /*
+          Added in J2SE 1.4
+        */
+        extendedVirtualNameSearchRoles.add (AccessibleRole.DATE_EDITOR);
+    } catch (NoSuchFieldError e) {}
+    extendedVirtualNameSearchRoles.add (AccessibleRole.LIST);
+    extendedVirtualNameSearchRoles.add (AccessibleRole.PASSWORD_TEXT);
+    extendedVirtualNameSearchRoles.add (AccessibleRole.SLIDER);
+    try {
+        /*
+          Added in J2SE 1.3
+        */
+        extendedVirtualNameSearchRoles.add (AccessibleRole.SPIN_BOX);
+    } catch (NoSuchFieldError e) {}
+    extendedVirtualNameSearchRoles.add (AccessibleRole.TABLE);
+    extendedVirtualNameSearchRoles.add (AccessibleRole.TEXT);
+    extendedVirtualNameSearchRoles.add (AccessibleRole.UNKNOWN);
+
+    noExtendedVirtualNameSearchParentRoles.add (AccessibleRole.TABLE);
+    noExtendedVirtualNameSearchParentRoles.add (AccessibleRole.TOOL_BAR);
+    }
+
+    /**
+     * start the AccessBridge DLL running in its own thread
+     */
+    private native void runDLL();
+
+    /**
+     * debugging output (goes to OutputDebugStr())
+     */
+    private native void sendDebugString(String debugStr);
+
+    /**
+     * debugging output (goes to OutputDebugStr())
+     */
+    private void debugString(String debugStr) {
+    sendDebugString(debugStr);
+    }
+
+    /* ===== utility methods ===== */
+
+    /**
+     * decrement the reference to the object (called by native code)
+     */
+    private void decrementReference(Object o) {
+    references.decrement(o);
+    }
+
+    /**
+     * get the java.version property from the JVM
+     */
+    private String getJavaVersionProperty() {
+        String s = System.getProperty("java.version");
+        if (s != null) {
+            references.increment(s);
+            return s;
+        }
+        return null;
+    }
+
+    /* ===== HWND/Java window mapping methods ===== */
+
+    // Java toolkit methods for mapping HWNDs to Java components
+    private Method javaGetComponentFromNativeWindowHandleMethod;
+    private Method javaGetNativeWindowHandleFromComponentMethod;
+
+    // native jawt methods for mapping HWNDs to Java components
+    private native int jawtGetNativeWindowHandleFromComponent(Component comp);
+
+    private native Component jawtGetComponentFromNativeWindowHandle(int handle);
+
+    Toolkit toolkit;
+
+    /**
+     * map an HWND to an AWT Component
+     */
+    private void initHWNDcalls() {
+        Class<?> integerParemter[] = new Class<?>[1];
+        integerParemter[0] = Integer.TYPE;
+        Class<?> componentParemter[] = new Class<?>[1];
+        try {
+            componentParemter[0] = Class.forName("java.awt.Component");
+        } catch (ClassNotFoundException e) {
+            debugString("Exception: " + e.toString());
+        }
+        toolkit = Toolkit.getDefaultToolkit();
+        return;
+    }
+
+    // native window handler interface
+    private interface NativeWindowHandler {
+        public Accessible getAccessibleFromNativeWindowHandle(int nativeHandle);
+    }
+
+    // hash table of native window handle to AccessibleContext mappings
+    static private ConcurrentHashMap<Integer,AccessibleContext> windowHandleToContextMap = new ConcurrentHashMap<>();
+
+    // hash table of AccessibleContext to native window handle mappings
+    static private ConcurrentHashMap<AccessibleContext,Integer> contextToWindowHandleMap = new ConcurrentHashMap<>();
+
+    /*
+     * adds a virtual window handler to our hash tables
+     */
+    static private void registerVirtualFrame(final Accessible a,
+                                             Integer nativeWindowHandle ) {
+        if (a != null) {
+            AccessibleContext ac = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                @Override
+                public AccessibleContext call() throws Exception {
+                    return a.getAccessibleContext();
+                }
+            }, a);
+            windowHandleToContextMap.put(nativeWindowHandle, ac);
+            contextToWindowHandleMap.put(ac, nativeWindowHandle);
+        }
+    }
+
+    /*
+     * removes a virtual window handler to our hash tables
+     */
+    static private void revokeVirtualFrame(final Accessible a,
+                                           Integer nativeWindowHandle ) {
+        AccessibleContext ac = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                return a.getAccessibleContext();
+            }
+        }, a);
+        windowHandleToContextMap.remove(nativeWindowHandle);
+        contextToWindowHandleMap.remove(ac);
+    }
+
+    // vector of native window handlers
+    private static Vector<NativeWindowHandler> nativeWindowHandlers = new Vector<>();
+
+    /*
+    * adds a native window handler to our list
+    */
+    private static void addNativeWindowHandler(NativeWindowHandler handler) {
+        if (handler == null) {
+            throw new IllegalArgumentException();
+        }
+        nativeWindowHandlers.addElement(handler);
+    }
+
+    /*
+     * removes a native window handler to our list
+     */
+    private static boolean removeNativeWindowHandler(NativeWindowHandler handler) {
+        if (handler == null) {
+            throw new IllegalArgumentException();
+        }
+        return nativeWindowHandlers.removeElement(handler);
+    }
+
+    /**
+     * verifies that a native window handle is a Java window
+     */
+    private boolean isJavaWindow(int nativeHandle) {
+        AccessibleContext ac = getContextFromNativeWindowHandle(nativeHandle);
+        if (ac != null) {
+            saveContextToWindowHandleMapping(ac, nativeHandle);
+            return true;
+        }
+        return false;
+    }
+
+    /*
+     * saves the mapping between an AccessibleContext and a window handle
+     */
+    private void saveContextToWindowHandleMapping(AccessibleContext ac,
+                                                  int nativeHandle) {
+        debugString("saveContextToWindowHandleMapping...");
+        if (ac == null) {
+            return;
+        }
+        if (! contextToWindowHandleMap.containsKey(ac)) {
+            debugString("saveContextToWindowHandleMapping: ac = "+ac+"; handle = "+nativeHandle);
+            contextToWindowHandleMap.put(ac, nativeHandle);
+        }
+    }
+
+    /**
+     * maps a native window handle to an Accessible Context
+     */
+    private AccessibleContext getContextFromNativeWindowHandle(int nativeHandle) {
+        // First, look for the Accessible in our hash table of
+        // virtual window handles.
+        AccessibleContext ac = windowHandleToContextMap.get(nativeHandle);
+        if(ac!=null) {
+            saveContextToWindowHandleMapping(ac, nativeHandle);
+            return ac;
+        }
+
+        // Next, look for the native window handle in our vector
+        // of native window handles.
+        int numHandlers = nativeWindowHandlers.size();
+        for (int i = 0; i < numHandlers; i++) {
+            NativeWindowHandler nextHandler = nativeWindowHandlers.elementAt(i);
+            final Accessible a = nextHandler.getAccessibleFromNativeWindowHandle(nativeHandle);
+            if (a != null) {
+                ac = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                    @Override
+                    public AccessibleContext call() throws Exception {
+                        return a.getAccessibleContext();
+                    }
+                }, a);
+                saveContextToWindowHandleMapping(ac, nativeHandle);
+                return ac;
+            }
+        }
+        // Not found.
+        return null;
+    }
+
+    /**
+     * maps an AccessibleContext to a native window handle
+     *     returns 0 on error
+     */
+    private int getNativeWindowHandleFromContext(AccessibleContext ac) {
+    debugString("getNativeWindowHandleFromContext: ac = "+ac);
+        try {
+            return contextToWindowHandleMap.get(ac);
+        } catch (Exception ex) {
+            return 0;
+        }
+    }
+
+    private class DefaultNativeWindowHandler implements NativeWindowHandler {
+        /*
+        * returns the Accessible associated with a native window
+        */
+        public Accessible getAccessibleFromNativeWindowHandle(int nativeHandle) {
+            final Component c = jawtGetComponentFromNativeWindowHandle(nativeHandle);
+            if (c instanceof Accessible) {
+                AccessibleContext ac = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                    @Override
+                    public AccessibleContext call() throws Exception {
+                        return c.getAccessibleContext();
+                    }
+                }, c);
+                saveContextToWindowHandleMapping(ac, nativeHandle);
+                return (Accessible)c;
+            } else {
+                return null;
+            }
+        }
+    }
+
+    /* ===== AccessibleContext methods =====*/
+
+    /*
+     * returns the inner-most AccessibleContext in parent at Point(x, y)
+     */
+    private AccessibleContext getAccessibleContextAt(int x, int y,
+                                                    AccessibleContext parent) {
+        if (parent == null) {
+            return null;
+        }
+        if (windowHandleToContextMap != null &&
+            windowHandleToContextMap.containsValue(getRootAccessibleContext(parent))) {
+            // Path for applications that register their top-level
+            // windows with the AccessBridge (e.g., StarOffice 6.1)
+            return getAccessibleContextAt_1(x, y, parent);
+        } else {
+            // Path for applications that do not register
+            // their top-level windows with the AccessBridge
+            // (e.g., Swing/AWT applications)
+            return getAccessibleContextAt_2(x, y, parent);
+        }
+    }
+
+    /*
+     * returns the root accessible context
+     */
+    private AccessibleContext getRootAccessibleContext(final AccessibleContext ac) {
+        if (ac == null) {
+            return null;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                Accessible parent = ac.getAccessibleParent();
+                if (parent == null) {
+                    return ac;
+                }
+                Accessible tmp = parent.getAccessibleContext().getAccessibleParent();
+                while (tmp != null) {
+                    parent = tmp;
+                    tmp = parent.getAccessibleContext().getAccessibleParent();
+                }
+                return parent.getAccessibleContext();
+            }
+        }, ac);
+    }
+
+    /*
+     * StarOffice version that does not use the EventQueueMonitor
+     */
+    private AccessibleContext getAccessibleContextAt_1(final int x, final int y,
+                                                      final AccessibleContext parent) {
+        debugString(" : getAccessibleContextAt_1 called");
+        debugString("   -> x = " + x + " y = " + y + " parent = " + parent);
+
+        if (parent == null) return null;
+            final AccessibleComponent acmp = InvocationUtils.invokeAndWait(new Callable<AccessibleComponent>() {
+                @Override
+                public AccessibleComponent call() throws Exception {
+                    return parent.getAccessibleComponent();
+                }
+            }, parent);
+        if (acmp!=null) {
+            final Point loc = InvocationUtils.invokeAndWait(new Callable<Point>() {
+                @Override
+                public Point call() throws Exception {
+                    return acmp.getLocation();
+                }
+            }, parent);
+            final Accessible a = InvocationUtils.invokeAndWait(new Callable<Accessible>() {
+                @Override
+                public Accessible call() throws Exception {
+                    return acmp.getAccessibleAt(new Point(x - loc.x, y - loc.y));
+                }
+            }, parent);
+            if (a != null) {
+                AccessibleContext foundAC = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                    @Override
+                    public AccessibleContext call() throws Exception {
+                        return a.getAccessibleContext();
+                    }
+                }, parent);
+                if (foundAC != null) {
+                    if (foundAC != parent) {
+                        // recurse down into the child
+                        return getAccessibleContextAt_1(x - loc.x, y - loc.y,
+                                                        foundAC);
+                    } else
+                        return foundAC;
+                }
+            }
+        }
+        return parent;
+    }
+
+    /*
+     * AWT/Swing version
+     */
+    private AccessibleContext getAccessibleContextAt_2(final int x, final int y,
+                                                      AccessibleContext parent) {
+        debugString("getAccessibleContextAt_2 called");
+        debugString("   -> x = " + x + " y = " + y + " parent = " + parent);
+
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                Accessible a = EventQueueMonitor.getAccessibleAt(new Point(x, y));
+                if (a != null) {
+                    AccessibleContext childAC = a.getAccessibleContext();
+                    if (childAC != null) {
+                        debugString("   returning childAC = " + childAC);
+                        return childAC;
+                    }
+                }
+                return null;
+            }
+        }, parent);
+    }
+
+    /**
+     * returns the Accessible that has focus
+     */
+    private AccessibleContext getAccessibleContextWithFocus() {
+        Component c = AWTEventMonitor.getComponentWithFocus();
+        if (c != null) {
+            final Accessible a = Translator.getAccessible(c);
+            if (a != null) {
+                AccessibleContext ac = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                    @Override
+                    public AccessibleContext call() throws Exception {
+                        return a.getAccessibleContext();
+                    }
+                }, c);
+                if (ac != null) {
+                    return ac;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * returns the AccessibleName from an AccessibleContext
+     */
+    private String getAccessibleNameFromContext(final AccessibleContext ac) {
+        debugString("***** ac = "+ac.getClass());
+        if (ac != null) {
+            String s = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    return ac.getAccessibleName();
+                }
+            }, ac);
+            if (s != null) {
+                references.increment(s);
+                debugString("Returning AccessibleName from Context: " + s);
+                return s;
+            } else {
+                return null;
+            }
+        } else {
+            debugString("getAccessibleNameFromContext; ac = null!");
+            return null;
+        }
+    }
+
+    /**
+     * Returns an AccessibleName for a component using an algorithm optimized
+     * for the JAWS screen reader.  This method is only intended for JAWS. All
+     * other uses are entirely optional.
+     */
+    private String getVirtualAccessibleNameFromContext(final AccessibleContext ac) {
+        if (null != ac) {
+            /*
+            Step 1:
+            =======
+            Determine if we can obtain the Virtual Accessible Name from the
+            Accessible Name or Accessible Description of the object.
+            */
+            String nameString = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    return ac.getAccessibleName();
+                }
+            }, ac);
+            if ( ( null != nameString ) && ( 0 != nameString.length () ) ) {
+                debugString ("bk -- The Virtual Accessible Name was obtained from AccessibleContext::getAccessibleName.");
+                references.increment (nameString);
+                return nameString;
+            }
+            String descriptionString = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    return ac.getAccessibleDescription();
+                }
+            }, ac);
+            if ( ( null != descriptionString ) && ( 0 != descriptionString.length () ) ) {
+                debugString ("bk -- The Virtual Accessible Name was obtained from AccessibleContext::getAccessibleDescription.");
+                references.increment (descriptionString);
+                return descriptionString;
+            }
+
+            debugString ("The Virtual Accessible Name was not found using AccessibleContext::getAccessibleDescription. or getAccessibleName");
+            /*
+            Step 2:
+            =======
+            Decide whether the extended name search algorithm should be
+            used for this object.
+            */
+            boolean bExtendedSearch = false;
+            AccessibleRole role = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                @Override
+                public AccessibleRole call() throws Exception {
+                    return ac.getAccessibleRole();
+                }
+            }, ac);
+            AccessibleContext parentContext = null;
+            AccessibleRole parentRole = AccessibleRole.UNKNOWN;
+
+            if ( extendedVirtualNameSearchRoles.contains (role) ) {
+                parentContext = getAccessibleParentFromContext (ac);
+                if ( null != parentContext ) {
+                    final AccessibleContext parentContextInnerTemp = parentContext;
+                    parentRole = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                        @Override
+                        public AccessibleRole call() throws Exception {
+                            return parentContextInnerTemp.getAccessibleRole();
+                        }
+                    }, ac);
+                    if ( AccessibleRole.UNKNOWN != parentRole ) {
+                        bExtendedSearch = true;
+                        if ( noExtendedVirtualNameSearchParentRoles.contains (parentRole) ) {
+                            bExtendedSearch = false;
+                        }
+                    }
+                }
+            }
+
+            if (false == bExtendedSearch) {
+                debugString ("bk -- getVirtualAccessibleNameFromContext will not use the extended name search algorithm.  role = " + role.toDisplayString (Locale.US) );
+                /*
+                Step 3:
+                =======
+                We have determined that we should not use the extended name
+                search algorithm for this object (we must obtain the name of
+                the object from the object itself and not from neighboring
+                objects).  However the object name cannot be obtained from
+                the Accessible Name or Accessible Description of the object.
+
+                Handle several special cases here that might yield a value for
+                the Virtual Accessible Name.  Return null if the object does
+                not match the criteria for any of these special cases.
+                */
+                if (AccessibleRole.LABEL == role) {
+                    /*
+                    Does the label support the Accessible Text Interface?
+                    */
+                    final AccessibleText at = InvocationUtils.invokeAndWait(new Callable<AccessibleText>() {
+                        @Override
+                        public AccessibleText call() throws Exception {
+                            return ac.getAccessibleText();
+                        }
+                    }, ac);
+                    if (null != at) {
+                        int charCount = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                            @Override
+                            public Integer call() throws Exception {
+                                return at.getCharCount();
+                            }
+                        }, ac);
+                        String text = getAccessibleTextRangeFromContext (ac, 0, charCount);
+                        if (null != text) {
+                            debugString ("bk -- The Virtual Accessible Name was obtained from the Accessible Text of the LABEL object.");
+                            references.increment (text);
+                            return text;
+                        }
+                    }
+                    /*
+                    Does the label support the Accessible Icon Interface?
+                    */
+                    debugString ("bk -- Attempting to obtain the Virtual Accessible Name from the Accessible Icon information.");
+                    final AccessibleIcon [] ai = InvocationUtils.invokeAndWait(new Callable<AccessibleIcon[]>() {
+                        @Override
+                        public AccessibleIcon[] call() throws Exception {
+                            return ac.getAccessibleIcon();
+                        }
+                    }, ac);
+                    if ( (null != ai) && (ai.length > 0) ) {
+                        String iconDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                            @Override
+                            public String call() throws Exception {
+                                return ai[0].getAccessibleIconDescription();
+                            }
+                        }, ac);
+                        if (iconDescription != null){
+                            debugString ("bk -- The Virtual Accessible Name was obtained from the description of the first Accessible Icon found in the LABEL object.");
+                            references.increment (iconDescription);
+                            return iconDescription;
+                        }
+                    } else {
+                        parentContext = getAccessibleParentFromContext (ac);
+                        if ( null != parentContext ) {
+                            final AccessibleContext parentContextInnerTemp = parentContext;
+                            parentRole = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                                @Override
+                                public AccessibleRole call() throws Exception {
+                                    return parentContextInnerTemp.getAccessibleRole();
+                                }
+                            }, ac);
+                            if ( AccessibleRole.TABLE == parentRole ) {
+                                int indexInParent = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                                    @Override
+                                    public Integer call() throws Exception {
+                                        return ac.getAccessibleIndexInParent();
+                                    }
+                                }, ac);
+                                final AccessibleContext acTableCell = getAccessibleChildFromContext (parentContext, indexInParent);
+                                debugString ("bk -- Making a second attempt to obtain the Virtual Accessible Name from the Accessible Icon information for the Table Cell.");
+                                if (acTableCell != null) {
+                                    final AccessibleIcon [] aiRet =InvocationUtils.invokeAndWait(new Callable<AccessibleIcon[]>() {
+                                        @Override
+                                        public AccessibleIcon[] call() throws Exception {
+                                            return acTableCell.getAccessibleIcon();
+                                        }
+                                    }, ac);
+                                    if ( (null != aiRet) && (aiRet.length > 0) ) {
+                                        String iconDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                            @Override
+                                            public String call() throws Exception {
+                                                return aiRet[0].getAccessibleIconDescription();
+                                            }
+                                        }, ac);
+                                        if (iconDescription != null){
+                                            debugString ("bk -- The Virtual Accessible Name was obtained from the description of the first Accessible Icon found in the Table Cell object.");
+                                            references.increment (iconDescription);
+                                            return iconDescription;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } else if ( (AccessibleRole.TOGGLE_BUTTON == role) ||
+                            (AccessibleRole.PUSH_BUTTON == role) ) {
+                    /*
+                    Does the button support the Accessible Icon Interface?
+                    */
+                    debugString ("bk -- Attempting to obtain the Virtual Accessible Name from the Accessible Icon information.");
+                    final AccessibleIcon [] ai = InvocationUtils.invokeAndWait(new Callable<AccessibleIcon[]>() {
+                        @Override
+                        public AccessibleIcon[] call() throws Exception {
+                            return ac.getAccessibleIcon();
+                        }
+                    }, ac);
+                    if ( (null != ai) && (ai.length > 0) ) {
+                        String iconDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                            @Override
+                            public String call() throws Exception {
+                                return ai[0].getAccessibleIconDescription();
+                            }
+                        }, ac);
+                        if (iconDescription != null){
+                            debugString ("bk -- The Virtual Accessible Name was obtained from the description of the first Accessible Icon found in the TOGGLE_BUTTON or PUSH_BUTTON object.");
+                            references.increment (iconDescription);
+                            return iconDescription;
+                        }
+                    }
+                } else if ( AccessibleRole.CHECK_BOX == role ) {
+                    /*
+                    NOTE: The only case I know of in which a check box does not
+                    have a name is when that check box is contained in a table.
+
+                    In this case it would be appropriate to use the display string
+                    of the check box object as the name (in US English the display
+                    string is typically either "true" or "false").
+
+                    I am using the AccessibleValue interface to obtain the display
+                    string of the check box.  If the Accessible Value is 1, I am
+                    returning Boolean.TRUE.toString (),  If the Accessible Value is
+                    0, I am returning Boolean.FALSE.toString ().  If the Accessible
+                    Value is some other number, I will return the display string of
+                    the current numerical value of the check box.
+                    */
+                    final AccessibleValue av = InvocationUtils.invokeAndWait(new Callable<AccessibleValue>() {
+                        @Override
+                        public AccessibleValue call() throws Exception {
+                            return ac.getAccessibleValue();
+                        }
+                    }, ac);
+                    if ( null != av ) {
+                        nameString = null;
+                        Number value = InvocationUtils.invokeAndWait(new Callable<Number>() {
+                            @Override
+                            public Number call() throws Exception {
+                                return av.getCurrentAccessibleValue();
+                            }
+                        }, ac);
+                        if ( null != value ) {
+                            if ( 1 == value.intValue () ) {
+                                nameString = Boolean.TRUE.toString ();
+                            } else if ( 0 == value.intValue () ) {
+                                nameString = Boolean.FALSE.toString ();
+                            } else {
+                                nameString = value.toString ();
+                            }
+                            if ( null != nameString ) {
+                                references.increment (nameString);
+                                return nameString;
+                            }
+                        }
+                    }
+                }
+                return null;
+            }
+
+            /*
+            +
+            Beginning of the extended name search
+            +
+            */
+            final AccessibleContext parentContextOuterTemp = parentContext;
+            String parentName = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    return parentContextOuterTemp.getAccessibleName();
+                }
+            }, ac);
+            String parentDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    return parentContextOuterTemp.getAccessibleDescription();
+                }
+            }, ac);
+
+            /*
+            Step 4:
+            =======
+            Special case for Slider Bar objects.
+            */
+            if ( (AccessibleRole.SLIDER == role) &&
+                 (AccessibleRole.PANEL == parentRole) &&
+                 (null != parentName) ) {
+                debugString ("bk -- The Virtual Accessible Name was obtained from the Accessible Name of the SLIDER object's parent object.");
+                references.increment (parentName);
+                return parentName;
+            }
+
+            boolean bIsEditCombo = false;
+
+            AccessibleContext testContext = ac;
+            /*
+            Step 5:
+            =======
+            Special case for Edit Combo Boxes
+            */
+            if ( (AccessibleRole.TEXT == role) &&
+                 (AccessibleRole.COMBO_BOX == parentRole) ) {
+                bIsEditCombo = true;
+                if (null != parentName) {
+                    debugString ("bk -- The Virtual Accessible Name for this Edit Combo box was obtained from the Accessible Name of the object's parent object.");
+                    references.increment (parentName);
+                    return parentName;
+                } else if (null != parentDescription) {
+                    debugString ("bk -- The Virtual Accessible Name for this Edit Combo box was obtained from the Accessible Description of the object's parent object.");
+                    references.increment (parentDescription);
+                    return parentDescription;
+                }
+                testContext = parentContext;
+                parentRole = AccessibleRole.UNKNOWN;
+                parentContext = getAccessibleParentFromContext (testContext);
+                if ( null != parentContext ) {
+                    final AccessibleContext parentContextInnerTemp = parentContext;
+                    parentRole = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                        @Override
+                        public AccessibleRole call() throws Exception {
+                            return parentContextInnerTemp.getAccessibleRole();
+                        }
+                    }, ac);
+                }
+            }
+
+            /*
+            Step 6:
+            =======
+            Attempt to get the Virtual Accessible Name of the object using the
+            Accessible Relation Set Info (the LABELED_BY Accessible Relation).
+            */
+            {
+                final AccessibleContext parentContextTempInner = parentContext;
+                AccessibleRelationSet ars = InvocationUtils.invokeAndWait(new Callable<AccessibleRelationSet>() {
+                    @Override
+                    public AccessibleRelationSet call() throws Exception {
+                        return parentContextTempInner.getAccessibleRelationSet();
+                    }
+                }, ac);
+                if ( ars != null && (ars.size () > 0) && (ars.contains (AccessibleRelation.LABELED_BY)) ) {
+                    AccessibleRelation labeledByRelation = ars.get (AccessibleRelation.LABELED_BY);
+                    if (labeledByRelation != null) {
+                        Object [] targets = labeledByRelation.getTarget ();
+                        Object o = targets [0];
+                        if (o instanceof Accessible) {
+                            AccessibleContext labelContext = ((Accessible)o).getAccessibleContext ();
+                            if (labelContext != null) {
+                                String labelName = labelContext.getAccessibleName ();
+                                String labelDescription = labelContext.getAccessibleDescription ();
+                                if (null != labelName) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained using the LABELED_BY AccessibleRelation -- Name Case.");
+                                    references.increment (labelName);
+                                    return labelName;
+                                } else if (null != labelDescription) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained using the LABELED_BY AccessibleRelation -- Description Case.");
+                                    references.increment (labelDescription);
+                                    return labelDescription;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            //Note: add AccessibleContext to use InvocationUtils.invokeAndWait
+            /*
+            Step 7:
+            =======
+            Search for a label object that is positioned either just to the left
+            or just above the object and get the Accessible Name of the Label
+            object.
+            */
+            int testIndexMax = 0;
+            int testX = 0;
+            int testY = 0;
+            int testWidth = 0;
+            int testHeight = 0;
+            int targetX = 0;
+            int targetY = 0;
+            final AccessibleContext tempContext = testContext;
+            int testIndex = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                @Override
+                public Integer call() throws Exception {
+                    return tempContext.getAccessibleIndexInParent();
+                }
+            }, ac);
+            if ( null != parentContext ) {
+                final AccessibleContext parentContextInnerTemp = parentContext;
+                testIndexMax =  InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                    @Override
+                    public Integer call() throws Exception {
+                        return parentContextInnerTemp.getAccessibleChildrenCount() - 1;
+                    }
+                }, ac);
+            }
+            testX = getAccessibleXcoordFromContext (testContext);
+            testY = getAccessibleYcoordFromContext (testContext);
+            testWidth = getAccessibleWidthFromContext (testContext);
+            testHeight = getAccessibleHeightFromContext (testContext);
+            targetX = testX + 2;
+            targetY = testY + 2;
+
+            int childIndex = testIndex - 1;
+            /*Accessible child = null;
+            AccessibleContext childContext = null;
+            AccessibleRole childRole = AccessibleRole.UNKNOWN;*/
+            int childX = 0;
+            int childY = 0;
+            int childWidth = 0;
+            int childHeight = 0;
+            String childName = null;
+            String childDescription = null;
+            while (childIndex >= 0) {
+                final int childIndexTemp = childIndex;
+                final AccessibleContext parentContextInnerTemp = parentContext;
+                final Accessible child  =  InvocationUtils.invokeAndWait(new Callable<Accessible>() {
+                    @Override
+                    public Accessible call() throws Exception {
+                        return parentContextInnerTemp.getAccessibleChild(childIndexTemp);
+                    }
+                }, ac);
+                if ( null != child ) {
+                    final AccessibleContext childContext = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                        @Override
+                        public AccessibleContext call() throws Exception {
+                            return child.getAccessibleContext();
+                        }
+                    }, ac);
+                    if ( null != childContext ) {
+                        AccessibleRole childRole = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                            @Override
+                            public AccessibleRole call() throws Exception {
+                                return childContext.getAccessibleRole();
+                            }
+                        }, ac);
+                        if ( AccessibleRole.LABEL == childRole ) {
+                            childX = getAccessibleXcoordFromContext (childContext);
+                            childY = getAccessibleYcoordFromContext (childContext);
+                            childWidth = getAccessibleWidthFromContext (childContext);
+                            childHeight = getAccessibleHeightFromContext (childContext);
+                            if ( (childX < testX) &&
+                                 ((childY <= targetY) && (targetY <= (childY + childHeight))) ) {
+                                childName = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleName();
+                                    }
+                                }, ac);
+                                if ( null != childName ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Name of a LABEL object positioned to the left of the object.");
+                                    references.increment (childName);
+                                    return childName;
+                                }
+                                childDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleDescription();
+                                    }
+                                }, ac);
+                                if ( null != childDescription ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Description of a LABEL object positioned to the left of the object.");
+                                    references.increment (childDescription);
+                                    return childDescription;
+                                }
+                            } else if ( (childY < targetY) &&
+                                        ((childX <= targetX) && (targetX <= (childX + childWidth))) ) {
+                                childName = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleName();
+                                    }
+                                }, ac);
+                                if ( null != childName ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Name of a LABEL object positioned above the object.");
+                                    references.increment (childName);
+                                    return childName;
+                                }
+                                childDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleDescription();
+                                    }
+                                }, ac);
+                                if ( null != childDescription ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Description of a LABEL object positioned above the object.");
+                                    references.increment (childDescription);
+                                    return childDescription;
+                                }
+                            }
+                        }
+                    }
+                }
+                childIndex --;
+            }
+            childIndex = testIndex + 1;
+            while (childIndex <= testIndexMax) {
+                final int childIndexTemp = childIndex;
+                final AccessibleContext parentContextInnerTemp = parentContext;
+                final Accessible child  =  InvocationUtils.invokeAndWait(new Callable<Accessible>() {
+                    @Override
+                    public Accessible call() throws Exception {
+                        return parentContextInnerTemp.getAccessibleChild(childIndexTemp);
+                    }
+                }, ac);
+                if ( null != child ) {
+                    final AccessibleContext childContext = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                        @Override
+                        public AccessibleContext call() throws Exception {
+                            return child.getAccessibleContext();
+                        }
+                    }, ac);
+                    if ( null != childContext ) {
+                        AccessibleRole childRole = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                            @Override
+                            public AccessibleRole call() throws Exception {
+                                return childContext.getAccessibleRole();
+                            }
+                        }, ac);
+                        if ( AccessibleRole.LABEL == childRole ) {
+                            childX = getAccessibleXcoordFromContext (childContext);
+                            childY = getAccessibleYcoordFromContext (childContext);
+                            childWidth = getAccessibleWidthFromContext (childContext);
+                            childHeight = getAccessibleHeightFromContext (childContext);
+                            if ( (childX < testX) &&
+                                 ((childY <= targetY) && (targetY <= (childY + childHeight))) ) {
+                                childName = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleName();
+                                    }
+                                }, ac);
+                                if ( null != childName ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Name of a LABEL object positioned to the left of the object.");
+                                    references.increment (childName);
+                                    return childName;
+                                }
+                                childDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleDescription();
+                                    }
+                                }, ac);
+                                if ( null != childDescription ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Description of a LABEL object positioned to the left of the object.");
+                                    references.increment (childDescription);
+                                    return childDescription;
+                                }
+                            } else if ( (childY < targetY) &&
+                                        ((childX <= targetX) && (targetX <= (childX + childWidth))) ) {
+                                childName = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleName();
+                                    }
+                                }, ac);
+                                if ( null != childName ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Name of a LABEL object positioned above the object.");
+                                    references.increment (childName);
+                                    return childName;
+                                }
+                                childDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                    @Override
+                                    public String call() throws Exception {
+                                        return childContext.getAccessibleDescription();
+                                    }
+                                }, ac);
+                                if ( null != childDescription ) {
+                                    debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Description of a LABEL object positioned above the object.");
+                                    references.increment (childDescription);
+                                    return childDescription;
+                                }
+                            }
+                        }
+                    }
+                }
+                childIndex ++;
+            }
+            /*
+            Step 8:
+            =======
+            Special case for combo boxes and text objects, based on a
+            similar special case I found in some of our internal JAWS code.
+
+            Search for a button object that is positioned either just to the left
+            or just above the object and get the Accessible Name of the button
+            object.
+            */
+            if ( (AccessibleRole.TEXT == role) ||
+                 (AccessibleRole.COMBO_BOX == role) ||
+                 (bIsEditCombo) ) {
+                childIndex = testIndex - 1;
+                while (childIndex >= 0) {
+                    final int childIndexTemp = childIndex;
+                    final AccessibleContext parentContextInnerTemp = parentContext;
+                    final Accessible child = InvocationUtils.invokeAndWait(new Callable<Accessible>() {
+                        @Override
+                        public Accessible call() throws Exception {
+                            return parentContextInnerTemp.getAccessibleChild(childIndexTemp);
+                        }
+                    }, ac);
+                    if ( null != child ) {
+                        final AccessibleContext childContext = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                            @Override
+                            public AccessibleContext call() throws Exception {
+                                return child.getAccessibleContext();
+                            }
+                        }, ac);
+                        if ( null != childContext ) {
+                            AccessibleRole childRole = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                                @Override
+                                public AccessibleRole call() throws Exception {
+                                    return childContext.getAccessibleRole();
+                                }
+                            }, ac);
+                            if ( ( AccessibleRole.PUSH_BUTTON == childRole ) ||
+                                 ( AccessibleRole.TOGGLE_BUTTON == childRole )) {
+                                childX = getAccessibleXcoordFromContext (childContext);
+                                childY = getAccessibleYcoordFromContext (childContext);
+                                childWidth = getAccessibleWidthFromContext (childContext);
+                                childHeight = getAccessibleHeightFromContext (childContext);
+                                if ( (childX < testX) &&
+                                     ((childY <= targetY) && (targetY <= (childY + childHeight))) ) {
+                                    childName = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                        @Override
+                                        public String call() throws Exception {
+                                            return childContext.getAccessibleName();
+                                        }
+                                    }, ac);
+                                    if ( null != childName ) {
+                                        debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Name of a PUSH_BUTTON or TOGGLE_BUTTON object positioned to the left of the object.");
+                                        references.increment (childName);
+                                        return childName;
+                                    }
+                                    childDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                        @Override
+                                        public String call() throws Exception {
+                                            return childContext.getAccessibleDescription();
+                                        }
+                                    }, ac);
+                                    if ( null != childDescription ) {
+                                        debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Description of a PUSH_BUTTON or TOGGLE_BUTTON object positioned to the left of the object.");
+                                        references.increment (childDescription);
+                                        return childDescription;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    childIndex --;
+                }
+                childIndex = testIndex + 1;
+                while (childIndex <= testIndexMax) {
+                    final int childIndexTemp = childIndex;
+                    final AccessibleContext parentContextInnerTemp = parentContext;
+                    final Accessible child  =  InvocationUtils.invokeAndWait(new Callable<Accessible>() {
+                        @Override
+                        public Accessible call() throws Exception {
+                            return parentContextInnerTemp.getAccessibleChild(childIndexTemp);
+                        }
+                    }, ac);
+                    if ( null != child ) {
+                        final AccessibleContext childContext = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                            @Override
+                            public AccessibleContext call() throws Exception {
+                                return child.getAccessibleContext();
+                            }
+                        }, ac);
+                        if ( null != childContext ) {
+                            AccessibleRole childRole = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                                @Override
+                                public AccessibleRole call() throws Exception {
+                                    return childContext.getAccessibleRole();
+                                }
+                            }, ac);
+                            if ( ( AccessibleRole.PUSH_BUTTON == childRole ) ||
+                                    ( AccessibleRole.TOGGLE_BUTTON == childRole ) ) {
+                                childX = getAccessibleXcoordFromContext (childContext);
+                                childY = getAccessibleYcoordFromContext (childContext);
+                                childWidth = getAccessibleWidthFromContext (childContext);
+                                childHeight = getAccessibleHeightFromContext (childContext);
+                                if ( (childX < testX) &&
+                                     ((childY <= targetY) && (targetY <= (childY + childHeight))) ) {
+                                    childName = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                        @Override
+                                        public String call() throws Exception {
+                                            return childContext.getAccessibleName();
+                                        }
+                                    }, ac);
+                                    if ( null != childName ) {
+                                        debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Name of a PUSH_BUTTON or TOGGLE_BUTTON object positioned to the left of the object.");
+                                        references.increment (childName);
+                                        return childName;
+                                    }
+                                    childDescription = InvocationUtils.invokeAndWait(new Callable<String>() {
+                                        @Override
+                                        public String call() throws Exception {
+                                            return childContext.getAccessibleDescription();
+                                        }
+                                    }, ac);
+                                    if ( null != childDescription ) {
+                                        debugString ("bk -- The Virtual Accessible Name was obtained from Accessible Description of a PUSH_BUTTON or TOGGLE_BUTTON object positioned to the left of the object.");
+                                        references.increment (childDescription);
+                                        return childDescription;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    childIndex ++;
+                }
+            }
+            return null;
+        } else {
+            debugString ("AccessBridge::getVirtualAccessibleNameFromContext error - ac == null.");
+            return null;
+        }
+    }
+
+    /**
+     * returns the AccessibleDescription from an AccessibleContext
+     */
+    private String getAccessibleDescriptionFromContext(final AccessibleContext ac) {
+        if (ac != null) {
+            String s = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    return ac.getAccessibleDescription();
+                }
+            }, ac);
+            if (s != null) {
+                references.increment(s);
+                debugString("Returning AccessibleDescription from Context: " + s);
+                return s;
+            }
+        } else {
+            debugString("getAccessibleDescriptionFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * returns the AccessibleRole from an AccessibleContext
+     */
+    private String getAccessibleRoleStringFromContext(final AccessibleContext ac) {
+        if (ac != null) {
+            AccessibleRole role = InvocationUtils.invokeAndWait(new Callable<AccessibleRole>() {
+                @Override
+                public AccessibleRole call() throws Exception {
+                    return ac.getAccessibleRole();
+                }
+            }, ac);
+            if (role != null) {
+                String s = role.toDisplayString(Locale.US);
+                if (s != null) {
+                    references.increment(s);
+                    debugString("Returning AccessibleRole from Context: " + s);
+                    return s;
+                }
+            }
+        } else {
+            debugString("getAccessibleRoleStringFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the AccessibleRole from an AccessibleContext in the en_US locale
+     */
+    private String getAccessibleRoleStringFromContext_en_US(final AccessibleContext ac) {
+        return getAccessibleRoleStringFromContext(ac);
+    }
+
+    /**
+     * return the AccessibleStates from an AccessibleContext
+     */
+    private String getAccessibleStatesStringFromContext(final AccessibleContext ac) {
+        if (ac != null) {
+            AccessibleStateSet stateSet = InvocationUtils.invokeAndWait(new Callable<AccessibleStateSet>() {
+                @Override
+                public AccessibleStateSet call() throws Exception {
+                    return ac.getAccessibleStateSet();
+                }
+            }, ac);
+            if (stateSet != null) {
+                String s = stateSet.toString();
+                if (s != null &&
+                    s.indexOf(AccessibleState.MANAGES_DESCENDANTS.toDisplayString(Locale.US)) == -1) {
+                    // Indicate whether this component manages its own
+                    // children
+                    AccessibleRole role = ac.getAccessibleRole();
+                    if (role == AccessibleRole.LIST ||
+                        role == AccessibleRole.TABLE ||
+                        role == AccessibleRole.TREE) {
+                        s += ",";
+                        s += AccessibleState.MANAGES_DESCENDANTS.toDisplayString(Locale.US);
+                    }
+                    references.increment(s);
+                    debugString("Returning AccessibleStateSet from Context: " + s);
+                    return s;
+                }
+            }
+        } else {
+            debugString("getAccessibleStatesStringFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * returns the AccessibleStates from an AccessibleContext in the en_US locale
+     */
+    private String getAccessibleStatesStringFromContext_en_US(final AccessibleContext ac) {
+        if (ac != null) {
+            AccessibleStateSet stateSet = InvocationUtils.invokeAndWait(new Callable<AccessibleStateSet>() {
+                @Override
+                public AccessibleStateSet call() throws Exception {
+                    return ac.getAccessibleStateSet();
+                }
+            }, ac);
+            if (stateSet != null) {
+                String s = "";
+                AccessibleState[] states = stateSet.toArray();
+                if (states != null && states.length > 0) {
+                    s = states[0].toDisplayString(Locale.US);
+                    for (int i = 1; i < states.length; i++) {
+                        s = s + "," + states[i].toDisplayString(Locale.US);
+                    }
+                }
+                references.increment(s);
+                debugString("Returning AccessibleStateSet en_US from Context: " + s);
+                return s;
+            }
+        }
+        debugString("getAccessibleStatesStringFromContext; ac = null");
+        return null;
+    }
+
+    /**
+     * returns the AccessibleParent from an AccessibleContext
+     */
+    private AccessibleContext getAccessibleParentFromContext(final AccessibleContext ac) {
+        if (ac==null)
+            return null;
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                Accessible a = ac.getAccessibleParent();
+                if (a != null) {
+                    AccessibleContext apc = a.getAccessibleContext();
+                    if (apc != null) {
+                        return apc;
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the AccessibleIndexInParent from an AccessibleContext
+     */
+    private int getAccessibleIndexInParentFromContext(final AccessibleContext ac) {
+        if (ac==null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return ac.getAccessibleIndexInParent();
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the AccessibleChild count from an AccessibleContext
+     */
+    private int getAccessibleChildrenCountFromContext(final AccessibleContext ac) {
+        if (ac==null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return ac.getAccessibleChildrenCount();
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the AccessibleChild Context from an AccessibleContext
+     */
+    private AccessibleContext getAccessibleChildFromContext(final AccessibleContext ac, final int index) {
+
+        if (ac == null) {
+            return null;
+        }
+
+        final JTable table = InvocationUtils.invokeAndWait(new Callable<JTable>() {
+            @Override
+            public JTable call() throws Exception {
+                // work-around for AccessibleJTable.getCurrentAccessibleContext returning
+                // wrong renderer component when cell contains more than one component
+                Accessible parent = ac.getAccessibleParent();
+                if (parent != null) {
+                    int indexInParent = ac.getAccessibleIndexInParent();
+                    Accessible child =
+                            parent.getAccessibleContext().getAccessibleChild(indexInParent);
+                    if (child instanceof JTable) {
+                        return (JTable) child;
+                    }
+                }
+                return null;
+            }
+        }, ac);
+
+        if (table == null) {
+            return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                @Override
+                public AccessibleContext call() throws Exception {
+                    Accessible a = ac.getAccessibleChild(index);
+                    if (a != null) {
+                        return a.getAccessibleContext();
+                    }
+                    return null;
+                }
+            }, ac);
+        }
+
+        final AccessibleTable at = getAccessibleTableFromContext(ac);
+
+        final int row = getAccessibleTableRow(at, index);
+        final int column = getAccessibleTableColumn(at, index);
+
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                TableCellRenderer renderer = table.getCellRenderer(row, column);
+                if (renderer == null) {
+                    Class<?> columnClass = table.getColumnClass(column);
+                    renderer = table.getDefaultRenderer(columnClass);
+                }
+                Component component =
+                        renderer.getTableCellRendererComponent(table, table.getValueAt(row, column),
+                                false, false, row, column);
+                if (component instanceof Accessible) {
+                    return component.getAccessibleContext();
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the AccessibleComponent bounds on screen from an AccessibleContext
+     */
+    private Rectangle getAccessibleBoundsOnScreenFromContext(final AccessibleContext ac) {
+        if(ac==null)
+            return null;
+        return InvocationUtils.invokeAndWait(new Callable<Rectangle>() {
+            @Override
+            public Rectangle call() throws Exception {
+                AccessibleComponent acmp = ac.getAccessibleComponent();
+                if (acmp != null) {
+                    Rectangle r = acmp.getBounds();
+                    if (r != null) {
+                        try {
+                            Point p = acmp.getLocationOnScreen();
+                            if (p != null) {
+                                r.x = p.x;
+                                r.y = p.y;
+                                return r;
+                            }
+                        } catch (Exception e) {
+                            return null;
+                        }
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the AccessibleComponent x-coord from an AccessibleContext
+     */
+    private int getAccessibleXcoordFromContext(AccessibleContext ac) {
+        if (ac != null) {
+            Rectangle r = getAccessibleBoundsOnScreenFromContext(ac);
+            if (r != null) {
+                debugString(" - Returning Accessible x coord from Context: " + r.x);
+                return r.x;
+            }
+        } else {
+            debugString("getAccessibleXcoordFromContext ac = null");
+        }
+        return -1;
+    }
+
+    /**
+     * returns the AccessibleComponent y-coord from an AccessibleContext
+     */
+    private int getAccessibleYcoordFromContext(AccessibleContext ac) {
+        debugString("getAccessibleYcoordFromContext() called");
+        if (ac != null) {
+            Rectangle r = getAccessibleBoundsOnScreenFromContext(ac);
+            if (r != null) {
+                return r.y;
+            }
+        } else {
+        debugString("getAccessibleYcoordFromContext; ac = null");
+        }
+        return -1;
+    }
+
+    /**
+     * returns the AccessibleComponent height from an AccessibleContext
+     */
+    private int getAccessibleHeightFromContext(AccessibleContext ac) {
+        if (ac != null) {
+            Rectangle r = getAccessibleBoundsOnScreenFromContext(ac);
+            if (r != null) {
+                return r.height;
+            }
+        } else {
+            debugString("getAccessibleHeightFromContext; ac = null");
+        }
+        return -1;
+    }
+
+    /**
+     * returns the AccessibleComponent width from an AccessibleContext
+     */
+    private int getAccessibleWidthFromContext(AccessibleContext ac) {
+        if (ac != null) {
+            Rectangle r = getAccessibleBoundsOnScreenFromContext(ac);
+            if (r != null) {
+                return r.width;
+            }
+        } else {
+            debugString("getAccessibleWidthFromContext; ac = null");
+        }
+        return -1;
+    }
+
+
+    /**
+     * returns the AccessibleComponent from an AccessibleContext
+     */
+    private AccessibleComponent getAccessibleComponentFromContext(AccessibleContext ac) {
+        if (ac != null) {
+            AccessibleComponent acmp = ac.getAccessibleComponent();
+            if (acmp != null) {
+                debugString("Returning AccessibleComponent Context");
+                return acmp;
+            }
+        } else {
+            debugString("getAccessibleComponentFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * returns the AccessibleAction from an AccessibleContext
+     */
+    private AccessibleAction getAccessibleActionFromContext(final AccessibleContext ac) {
+        debugString("Returning AccessibleAction Context");
+        return ac == null ? null : InvocationUtils.invokeAndWait(new Callable<AccessibleAction>() {
+            @Override
+            public AccessibleAction call() throws Exception {
+                return ac.getAccessibleAction();
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the AccessibleSelection from an AccessibleContext
+     */
+    private AccessibleSelection getAccessibleSelectionFromContext(final AccessibleContext ac) {
+        return ac == null ? null : InvocationUtils.invokeAndWait(new Callable<AccessibleSelection>() {
+            @Override
+            public AccessibleSelection call() throws Exception {
+                return ac.getAccessibleSelection();
+            }
+        }, ac);
+    }
+
+    /**
+     * return the AccessibleText from an AccessibleContext
+     */
+    private AccessibleText getAccessibleTextFromContext(final AccessibleContext ac) {
+        return ac == null ? null : InvocationUtils.invokeAndWait(new Callable<AccessibleText>() {
+            @Override
+            public AccessibleText call() throws Exception {
+                return ac.getAccessibleText();
+            }
+        }, ac);
+    }
+
+    /**
+     * return the AccessibleComponent from an AccessibleContext
+     */
+    private AccessibleValue getAccessibleValueFromContext(final AccessibleContext ac) {
+        return ac == null ? null : InvocationUtils.invokeAndWait(new Callable<AccessibleValue>() {
+            @Override
+            public AccessibleValue call() throws Exception {
+                return ac.getAccessibleValue();
+            }
+        }, ac);
+    }
+
+    /* ===== AccessibleText methods ===== */
+
+    /**
+     * returns the bounding rectangle for the text cursor
+     * XXX
+     */
+    private Rectangle getCaretLocation(final AccessibleContext ac) {
+    debugString("getCaretLocation");
+        if (ac==null)
+            return null;
+        return InvocationUtils.invokeAndWait(new Callable<Rectangle>() {
+            @Override
+            public Rectangle call() throws Exception {
+                // workaround for JAAPI not returning cursor bounding rectangle
+                Rectangle r = null;
+                Accessible parent = ac.getAccessibleParent();
+                if (parent instanceof Accessible) {
+                    int indexInParent = ac.getAccessibleIndexInParent();
+                    Accessible child =
+                            parent.getAccessibleContext().getAccessibleChild(indexInParent);
+
+                    if (child instanceof JTextComponent) {
+                        JTextComponent text = (JTextComponent) child;
+                        try {
+                            r = text.modelToView(text.getCaretPosition());
+                            if (r != null) {
+                                Point p = text.getLocationOnScreen();
+                                r.translate(p.x, p.y);
+                            }
+                        } catch (BadLocationException ble) {
+                        }
+                    }
+                }
+                return r;
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the x-coordinate for the text cursor rectangle
+     */
+    private int getCaretLocationX(AccessibleContext ac) {
+        Rectangle r = getCaretLocation(ac);
+        if (r != null) {
+            return r.x;
+        } else {
+            return -1;
+        }
+    }
+
+    /**
+     * returns the y-coordinate for the text cursor rectangle
+     */
+    private int getCaretLocationY(AccessibleContext ac) {
+        Rectangle r = getCaretLocation(ac);
+        if (r != null) {
+            return r.y;
+        } else {
+            return -1;
+        }
+    }
+
+    /**
+     * returns the height for the text cursor rectangle
+     */
+    private int getCaretLocationHeight(AccessibleContext ac) {
+        Rectangle r = getCaretLocation(ac);
+        if (r != null) {
+            return r.height;
+        } else {
+            return -1;
+        }
+    }
+
+    /**
+     * returns the width for the text cursor rectangle
+     */
+    private int getCaretLocationWidth(AccessibleContext ac) {
+        Rectangle r = getCaretLocation(ac);
+        if (r != null) {
+            return r.width;
+        } else {
+            return -1;
+        }
+    }
+
+    /**
+     * returns the character count from an AccessibleContext
+     */
+    private int getAccessibleCharCountFromContext(final AccessibleContext ac) {
+        if (ac==null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (at != null) {
+                    return at.getCharCount();
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * returns the caret position from an AccessibleContext
+     */
+    private int getAccessibleCaretPositionFromContext(final AccessibleContext ac) {
+        if (ac==null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (at != null) {
+                    return at.getCaretPosition();
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * Return the index at a specific point from an AccessibleContext
+     * Point(x, y) is in screen coordinates.
+     */
+    private int getAccessibleIndexAtPointFromContext(final AccessibleContext ac,
+                                                    final int x, final int y) {
+        debugString("getAccessibleIndexAtPointFromContext: x = "+x+"; y = "+y);
+        if (ac==null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                AccessibleComponent acomp = ac.getAccessibleComponent();
+                if (at != null && acomp != null) {
+                    // Convert x and y from screen coordinates to
+                    // local coordinates.
+                    try {
+                        Point p = acomp.getLocationOnScreen();
+                        int x1, y1;
+                        if (p != null) {
+                            x1 = x - p.x;
+                            if (x1 < 0) {
+                                x1 = 0;
+                            }
+                            y1 = y - p.y;
+                            if (y1 < 0) {
+                                y1 = 0;
+                            }
+
+                            Point newPoint = new Point(x1, y1);
+                            int indexAtPoint = at.getIndexAtPoint(new Point(x1, y1));
+                            return indexAtPoint;
+                        }
+                    } catch (Exception e) {
+                    }
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * return the letter at a specific point from an AccessibleContext
+     */
+    private String getAccessibleLetterAtIndexFromContext(final AccessibleContext ac, final int index) {
+        if (ac != null) {
+            String s = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    AccessibleText at = ac.getAccessibleText();
+                    if (at == null) return null;
+                    return at.getAtIndex(AccessibleText.CHARACTER, index);
+                }
+            }, ac);
+            if (s != null) {
+                references.increment(s);
+                return s;
+            }
+        } else {
+            debugString("getAccessibleLetterAtIndexFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the word at a specific point from an AccessibleContext
+     */
+    private String getAccessibleWordAtIndexFromContext(final AccessibleContext ac, final int index) {
+        if (ac != null) {
+            String s = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    AccessibleText at = ac.getAccessibleText();
+                    if (at == null) return null;
+                    return at.getAtIndex(AccessibleText.WORD, index);
+                }
+            }, ac);
+            if (s != null) {
+                references.increment(s);
+                return s;
+            }
+        } else {
+            debugString("getAccessibleWordAtIndexFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the sentence at a specific point from an AccessibleContext
+     */
+    private String getAccessibleSentenceAtIndexFromContext(final AccessibleContext ac, final int index) {
+        if (ac != null) {
+            String s = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    AccessibleText at = ac.getAccessibleText();
+                    if (at == null) return null;
+                    return at.getAtIndex(AccessibleText.SENTENCE, index);
+                }
+            }, ac);
+            if (s != null) {
+                references.increment(s);
+                return s;
+            }
+        } else {
+            debugString("getAccessibleSentenceAtIndexFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the text selection start from an AccessibleContext
+     */
+    private int getAccessibleTextSelectionStartFromContext(final AccessibleContext ac) {
+        if (ac == null) return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (at != null) {
+                    return at.getSelectionStart();
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * return the text selection end from an AccessibleContext
+     */
+    private int getAccessibleTextSelectionEndFromContext(final AccessibleContext ac) {
+        if (ac == null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (at != null) {
+                    return at.getSelectionEnd();
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * return the selected text from an AccessibleContext
+     */
+    private String getAccessibleTextSelectedTextFromContext(final AccessibleContext ac) {
+        if (ac != null) {
+            String s = InvocationUtils.invokeAndWait(new Callable<String>() {
+                @Override
+                public String call() throws Exception {
+                    AccessibleText at = ac.getAccessibleText();
+                    if (at == null) return null;
+                    return at.getSelectedText();
+                }
+            }, ac);
+            if (s != null) {
+                references.increment(s);
+                return s;
+            }
+        } else {
+            debugString("getAccessibleTextSelectedTextFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the attribute string at a given index from an AccessibleContext
+     */
+    private String getAccessibleAttributesAtIndexFromContext(final AccessibleContext ac,
+                                                             final int index) {
+        if (ac == null)
+            return null;
+        AttributeSet as = InvocationUtils.invokeAndWait(new Callable<AttributeSet>() {
+            @Override
+            public AttributeSet call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (at != null) {
+                    return at.getCharacterAttribute(index);
+                }
+                return null;
+            }
+        }, ac);
+        String s = expandStyleConstants(as);
+        if (s != null) {
+            references.increment(s);
+            return s;
+        }
+        return null;
+    }
+
+    /**
+     * Get line info: left index of line
+     *
+     * algorithm:  cast back, doubling each time,
+     *             'till find line boundaries
+     *
+     * return -1 if we can't get the info (e.g. index or at passed in
+     * is bogus; etc.)
+     */
+    private int getAccessibleTextLineLeftBoundsFromContext(final AccessibleContext ac,
+                                                          final int index) {
+        if (ac == null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (at != null) {
+                    int lineStart;
+                    int offset;
+                    Rectangle charRect;
+                    Rectangle indexRect = at.getCharacterBounds(index);
+                    int textLen = at.getCharCount();
+                    if (indexRect == null) {
+                        return -1;
+                    }
+                    // find the start of the line
+                    //
+                    offset = 1;
+                    lineStart = index - offset < 0 ? 0 : index - offset;
+                    charRect = at.getCharacterBounds(lineStart);
+                    // slouch behind beginning of line
+                    while (charRect != null
+                            && charRect.y >= indexRect.y
+                            && lineStart > 0) {
+                        offset = offset << 1;
+                        lineStart = index - offset < 0 ? 0 : index - offset;
+                        charRect = at.getCharacterBounds(lineStart);
+                    }
+                    if (lineStart == 0) {    // special case: we're on the first line!
+                        // we found it!
+                    } else {
+                        offset = offset >> 1;   // know boundary within last expansion
+                        // ground forward to beginning of line
+                        while (offset > 0) {
+                            charRect = at.getCharacterBounds(lineStart + offset);
+                            if (charRect.y < indexRect.y) { // still before line
+                                lineStart += offset;
+                            } else {
+                                // leave lineStart alone, it's close!
+                            }
+                            offset = offset >> 1;
+                        }
+                        // subtract one 'cause we're already too far...
+                        lineStart += 1;
+                    }
+                    return lineStart;
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * Get line info: right index of line
+     *
+     * algorithm:  cast back, doubling each time,
+     *             'till find line boundaries
+     *
+     * return -1 if we can't get the info (e.g. index or at passed in
+     * is bogus; etc.)
+     */
+    private int getAccessibleTextLineRightBoundsFromContext(final AccessibleContext ac, final int index) {
+        if(ac == null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (at != null) {
+                    int lineEnd;
+                    int offset;
+                    Rectangle charRect;
+                    Rectangle indexRect = at.getCharacterBounds(index);
+                    int textLen = at.getCharCount();
+                    if (indexRect == null) {
+                        return -1;
+                    }
+                    // find the end of the line
+                    //
+                    offset = 1;
+                    lineEnd = index + offset > textLen - 1
+                            ? textLen - 1 : index + offset;
+                    charRect = at.getCharacterBounds(lineEnd);
+                    // push past end of line
+                    while (charRect != null &&
+                            charRect.y <= indexRect.y &&
+                            lineEnd < textLen - 1) {
+                        offset = offset << 1;
+                        lineEnd = index + offset > textLen - 1
+                                ? textLen - 1 : index + offset;
+                        charRect = at.getCharacterBounds(lineEnd);
+                    }
+                    if (lineEnd == textLen - 1) {    // special case: on the last line!
+                        // we found it!
+                    } else {
+                        offset = offset >> 1;   // know boundary within last expansion
+                        // pull back to end of line
+                        while (offset > 0) {
+                            charRect = at.getCharacterBounds(lineEnd - offset);
+                            if (charRect.y > indexRect.y) { // still beyond line
+                                lineEnd -= offset;
+                            } else {
+                                // leave lineEnd alone, it's close!
+                            }
+                            offset = offset >> 1;
+                        }
+                        // subtract one 'cause we're already too far...
+                        lineEnd -= 1;
+                    }
+                    return lineEnd;
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * Get a range of text; null if indicies are bogus
+     */
+    private String getAccessibleTextRangeFromContext(final AccessibleContext ac,
+                                                    final int start, final int end) {
+        String s = InvocationUtils.invokeAndWait(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                if (ac != null) {
+                    AccessibleText at = ac.getAccessibleText();
+                    if (at != null) {
+                        // start - end is inclusive
+                        if (start > end) {
+                            return null;
+                        }
+                        if (end >= at.getCharCount()) {
+                            return null;
+                        }
+                        StringBuffer buf = new StringBuffer(end - start + 1);
+                        for (int i = start; i <= end; i++) {
+                            buf.append(at.getAtIndex(AccessibleText.CHARACTER, i));
+                        }
+                        return buf.toString();
+                    }
+                }
+                return null;
+            }
+        }, ac);
+        if (s != null) {
+            references.increment(s);
+            return s;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * return the AttributeSet object at a given index from an AccessibleContext
+     */
+    private AttributeSet getAccessibleAttributeSetAtIndexFromContext(final AccessibleContext ac,
+                                                                    final int index) {
+        return InvocationUtils.invokeAndWait(new Callable<AttributeSet>() {
+            @Override
+            public AttributeSet call() throws Exception {
+                if (ac != null) {
+                    AccessibleText at = ac.getAccessibleText();
+                    if (at != null) {
+                        AttributeSet as = at.getCharacterAttribute(index);
+                        if (as != null) {
+                            AccessBridge.this.references.increment(as);
+                            return as;
+                        }
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+
+    /**
+     * return the bounding rectangle at index from an AccessibleContext
+     */
+    private Rectangle getAccessibleTextRectAtIndexFromContext(final AccessibleContext ac,
+                                                        final int index) {
+        // want to do this in global coords, so need to combine w/ac global coords
+        Rectangle r = InvocationUtils.invokeAndWait(new Callable<Rectangle>() {
+            @Override
+            public Rectangle call() throws Exception {
+                // want to do this in global coords, so need to combine w/ac global coords
+                if (ac != null) {
+                    AccessibleText at = ac.getAccessibleText();
+                    if (at != null) {
+                        Rectangle rect = at.getCharacterBounds(index);
+                        if (rect != null) {
+                            String s = at.getAtIndex(AccessibleText.CHARACTER, index);
+                            if (s != null && s.equals("\n")) {
+                                rect.width = 0;
+                            }
+                            return rect;
+                        }
+                    }
+                }
+                return null;
+            }
+        }, ac);
+        Rectangle acRect = getAccessibleBoundsOnScreenFromContext(ac);
+        if (r != null && acRect != null) {
+            r.translate(acRect.x, acRect.y);
+            return r;
+        }
+        return null;
+    }
+
+    /**
+     * return the AccessibleText character x-coord at index from an AccessibleContext
+     */
+    private int getAccessibleXcoordTextRectAtIndexFromContext(AccessibleContext ac, int index) {
+        if (ac != null) {
+            Rectangle r = getAccessibleTextRectAtIndexFromContext(ac, index);
+            if (r != null) {
+                return r.x;
+            }
+        } else {
+            debugString("getAccessibleXcoordTextRectAtIndexFromContext; ac = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the AccessibleText character y-coord at index from an AccessibleContext
+     */
+    private int getAccessibleYcoordTextRectAtIndexFromContext(AccessibleContext ac, int index) {
+        if (ac != null) {
+            Rectangle r = getAccessibleTextRectAtIndexFromContext(ac, index);
+            if (r != null) {
+                return r.y;
+            }
+        } else {
+            debugString("getAccessibleYcoordTextRectAtIndexFromContext; ac = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the AccessibleText character height at index from an AccessibleContext
+     */
+    private int getAccessibleHeightTextRectAtIndexFromContext(AccessibleContext ac, int index) {
+        if (ac != null) {
+            Rectangle r = getAccessibleTextRectAtIndexFromContext(ac, index);
+            if (r != null) {
+                return r.height;
+            }
+        } else {
+            debugString("getAccessibleHeightTextRectAtIndexFromContext; ac = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the AccessibleText character width at index from an AccessibleContext
+     */
+    private int getAccessibleWidthTextRectAtIndexFromContext(AccessibleContext ac, int index) {
+        if (ac != null) {
+            Rectangle r = getAccessibleTextRectAtIndexFromContext(ac, index);
+            if (r != null) {
+                return r.width;
+            }
+        } else {
+            debugString("getAccessibleWidthTextRectAtIndexFromContext; ac = null");
+        }
+        return -1;
+    }
+
+    /* ===== AttributeSet methods for AccessibleText ===== */
+
+    /**
+     * return the bold setting from an AttributeSet
+     */
+    private boolean getBoldFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.isBold(as);
+        } else {
+            debugString("getBoldFromAttributeSet; as = null");
+        }
+        return false;
+    }
+
+    /**
+     * return the italic setting from an AttributeSet
+     */
+    private boolean getItalicFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.isItalic(as);
+        } else {
+            debugString("getItalicFromAttributeSet; as = null");
+        }
+        return false;
+    }
+
+    /**
+     * return the underline setting from an AttributeSet
+     */
+    private boolean getUnderlineFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.isUnderline(as);
+        } else {
+            debugString("getUnderlineFromAttributeSet; as = null");
+        }
+        return false;
+    }
+
+    /**
+     * return the strikethrough setting from an AttributeSet
+     */
+    private boolean getStrikethroughFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.isStrikeThrough(as);
+        } else {
+            debugString("getStrikethroughFromAttributeSet; as = null");
+        }
+        return false;
+    }
+
+    /**
+     * return the superscript setting from an AttributeSet
+     */
+    private boolean getSuperscriptFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.isSuperscript(as);
+        } else {
+            debugString("getSuperscriptFromAttributeSet; as = null");
+        }
+        return false;
+    }
+
+    /**
+     * return the subscript setting from an AttributeSet
+     */
+    private boolean getSubscriptFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.isSubscript(as);
+        } else {
+            debugString("getSubscriptFromAttributeSet; as = null");
+        }
+        return false;
+    }
+
+    /**
+     * return the background color from an AttributeSet
+     */
+    private String getBackgroundColorFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            String s = StyleConstants.getBackground(as).toString();
+            if (s != null) {
+                references.increment(s);
+                return s;
+            }
+        } else {
+            debugString("getBackgroundColorFromAttributeSet; as = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the foreground color from an AttributeSet
+     */
+    private String getForegroundColorFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            String s = StyleConstants.getForeground(as).toString();
+            if (s != null) {
+                references.increment(s);
+                return s;
+            }
+        } else {
+            debugString("getForegroundColorFromAttributeSet; as = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the font family from an AttributeSet
+     */
+    private String getFontFamilyFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            String s = StyleConstants.getFontFamily(as).toString();
+            if (s != null) {
+                references.increment(s);
+                return s;
+            }
+        } else {
+            debugString("getFontFamilyFromAttributeSet; as = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the font size from an AttributeSet
+     */
+    private int getFontSizeFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getFontSize(as);
+        } else {
+            debugString("getFontSizeFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the alignment from an AttributeSet
+     */
+    private int getAlignmentFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getAlignment(as);
+        } else {
+            debugString("getAlignmentFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the BiDi level from an AttributeSet
+     */
+    private int getBidiLevelFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getBidiLevel(as);
+        } else {
+            debugString("getBidiLevelFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+
+    /**
+     * return the first line indent from an AttributeSet
+     */
+    private float getFirstLineIndentFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getFirstLineIndent(as);
+        } else {
+            debugString("getFirstLineIndentFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the left indent from an AttributeSet
+     */
+    private float getLeftIndentFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getLeftIndent(as);
+        } else {
+            debugString("getLeftIndentFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the right indent from an AttributeSet
+     */
+    private float getRightIndentFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getRightIndent(as);
+        } else {
+            debugString("getRightIndentFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the line spacing from an AttributeSet
+     */
+    private float getLineSpacingFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getLineSpacing(as);
+        } else {
+            debugString("getLineSpacingFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the space above from an AttributeSet
+     */
+    private float getSpaceAboveFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getSpaceAbove(as);
+        } else {
+            debugString("getSpaceAboveFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * return the space below from an AttributeSet
+     */
+    private float getSpaceBelowFromAttributeSet(AttributeSet as) {
+        if (as != null) {
+            return StyleConstants.getSpaceBelow(as);
+        } else {
+            debugString("getSpaceBelowFromAttributeSet; as = null");
+        }
+        return -1;
+    }
+
+    /**
+     * Enumerate all StyleConstants in the AttributeSet
+     *
+     * We need to check explicitly, 'cause of the HTML package conversion
+     * mechanism (they may not be stored as StyleConstants, just translated
+     * to them when asked).
+     *
+     * (Use convenience methods where they are defined...)
+     *
+     * Not checking the following (which the IBM SNS guidelines says
+     * should be defined):
+     *    - ComponentElementName
+     *    - IconElementName
+     *    - NameAttribute
+     *    - ResolveAttribute
+     */
+    private String expandStyleConstants(AttributeSet as) {
+        Color c;
+        Object o;
+        String attrString = "";
+
+        // ---------- check for various Character Constants
+
+        attrString += "BidiLevel = " + StyleConstants.getBidiLevel(as);
+
+        final Component comp = StyleConstants.getComponent(as);
+        if (comp != null) {
+            if (comp instanceof Accessible) {
+                final AccessibleContext ac = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                    @Override
+                    public AccessibleContext call() throws Exception {
+                        return comp.getAccessibleContext();
+                    }
+                }, comp);
+                if (ac != null) {
+                    attrString += "; Accessible Component = " + InvocationUtils.invokeAndWait(new Callable<String>() {
+                        @Override
+                        public String call() throws Exception {
+                            return ac.getAccessibleName();
+                        }
+                    }, ac);
+                } else {
+                    attrString += "; Innaccessible Component = " + comp;
+                }
+            } else {
+                attrString += "; Innaccessible Component = " + comp;
+            }
+        }
+
+        Icon i = StyleConstants.getIcon(as);
+        if (i != null) {
+            if (i instanceof ImageIcon) {
+                attrString += "; ImageIcon = " + ((ImageIcon) i).getDescription();
+            } else {
+                attrString += "; Icon = " + i;
+            }
+        }
+
+        attrString += "; FontFamily = " + StyleConstants.getFontFamily(as);
+
+        attrString += "; FontSize = " + StyleConstants.getFontSize(as);
+
+        if (StyleConstants.isBold(as)) {
+            attrString += "; bold";
+        }
+
+        if (StyleConstants.isItalic(as)) {
+            attrString += "; italic";
+        }
+
+        if (StyleConstants.isUnderline(as)) {
+            attrString += "; underline";
+        }
+
+        if (StyleConstants.isStrikeThrough(as)) {
+            attrString += "; strikethrough";
+        }
+
+        if (StyleConstants.isSuperscript(as)) {
+            attrString += "; superscript";
+        }
+
+        if (StyleConstants.isSubscript(as)) {
+            attrString += "; subscript";
+        }
+
+        c = StyleConstants.getForeground(as);
+        if (c != null) {
+            attrString += "; Foreground = " + c;
+        }
+
+        c = StyleConstants.getBackground(as);
+        if (c != null) {
+            attrString += "; Background = " + c;
+        }
+
+        attrString += "; FirstLineIndent = " + StyleConstants.getFirstLineIndent(as);
+
+        attrString += "; RightIndent = " + StyleConstants.getRightIndent(as);
+
+        attrString += "; LeftIndent = " + StyleConstants.getLeftIndent(as);
+
+        attrString += "; LineSpacing = " + StyleConstants.getLineSpacing(as);
+
+        attrString += "; SpaceAbove = " + StyleConstants.getSpaceAbove(as);
+
+        attrString += "; SpaceBelow = " + StyleConstants.getSpaceBelow(as);
+
+        attrString += "; Alignment = " + StyleConstants.getAlignment(as);
+
+        TabSet ts = StyleConstants.getTabSet(as);
+        if (ts != null) {
+            attrString += "; TabSet = " + ts;
+        }
+
+        return attrString;
+    }
+
+
+    /* ===== AccessibleValue methods ===== */
+
+    /**
+     * return the AccessibleValue current value from an AccessibleContext
+     * returned using a String 'cause the value is a java Number
+     *
+     */
+    private String getCurrentAccessibleValueFromContext(final AccessibleContext ac) {
+        if (ac != null) {
+            final Number value = InvocationUtils.invokeAndWait(new Callable<Number>() {
+                @Override
+                public Number call() throws Exception {
+                    AccessibleValue av = ac.getAccessibleValue();
+                    if (av == null) return null;
+                    return av.getCurrentAccessibleValue();
+                }
+            }, ac);
+            if (value != null) {
+                String s = value.toString();
+                if (s != null) {
+                    references.increment(s);
+                    return s;
+                }
+            }
+        } else {
+            debugString("getCurrentAccessibleValueFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the AccessibleValue maximum value from an AccessibleContext
+     * returned using a String 'cause the value is a java Number
+     *
+     */
+    private String getMaximumAccessibleValueFromContext(final AccessibleContext ac) {
+        if (ac != null) {
+            final Number value = InvocationUtils.invokeAndWait(new Callable<Number>() {
+                @Override
+                public Number call() throws Exception {
+                    AccessibleValue av = ac.getAccessibleValue();
+                    if (av == null) return null;
+                    return av.getMaximumAccessibleValue();
+                }
+            }, ac);
+            if (value != null) {
+                String s = value.toString();
+                if (s != null) {
+                    references.increment(s);
+                    return s;
+                }
+            }
+        } else {
+            debugString("getMaximumAccessibleValueFromContext; ac = null");
+        }
+        return null;
+    }
+
+    /**
+     * return the AccessibleValue minimum value from an AccessibleContext
+     * returned using a String 'cause the value is a java Number
+     *
+     */
+    private String getMinimumAccessibleValueFromContext(final AccessibleContext ac) {
+        if (ac != null) {
+            final Number value = InvocationUtils.invokeAndWait(new Callable<Number>() {
+                @Override
+                public Number call() throws Exception {
+                    AccessibleValue av = ac.getAccessibleValue();
+                    if (av == null) return null;
+                    return av.getMinimumAccessibleValue();
+                }
+            }, ac);
+            if (value != null) {
+                String s = value.toString();
+                if (s != null) {
+                    references.increment(s);
+                    return s;
+                }
+            }
+        } else {
+            debugString("getMinimumAccessibleValueFromContext; ac = null");
+        }
+        return null;
+    }
+
+
+    /* ===== AccessibleSelection methods ===== */
+
+    /**
+     * add to the AccessibleSelection of an AccessibleContext child i
+     *
+     */
+    private void addAccessibleSelectionFromContext(final AccessibleContext ac, final int i) {
+        try {
+            InvocationUtils.invokeAndWait(new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                    if (ac != null) {
+                        AccessibleSelection as = ac.getAccessibleSelection();
+                        if (as != null) {
+                            as.addAccessibleSelection(i);
+                        }
+                    }
+                    return null;
+                }
+            }, ac);
+        } catch(Exception e){}
+    }
+
+    /**
+     * clear all of the AccessibleSelection of an AccessibleContex
+     *
+     */
+    private void clearAccessibleSelectionFromContext(final AccessibleContext ac) {
+        try {
+            InvocationUtils.invokeAndWait(new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                    AccessibleSelection as = ac.getAccessibleSelection();
+                    if (as != null) {
+                        as.clearAccessibleSelection();
+                    }
+                    return null;
+                }
+            }, ac);
+        } catch(Exception e){}
+
+    }
+
+    /**
+     * get the AccessibleContext of the i-th AccessibleSelection of an AccessibleContext
+     *
+     */
+    private AccessibleContext getAccessibleSelectionFromContext(final AccessibleContext ac, final int i) {
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                if (ac != null) {
+                    AccessibleSelection as = ac.getAccessibleSelection();
+                    if (as != null) {
+                        Accessible a = as.getAccessibleSelection(i);
+                        if (a == null)
+                            return null;
+                        else
+                            return a.getAccessibleContext();
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /**
+     * get number of things selected in the AccessibleSelection of an AccessibleContext
+     *
+     */
+    private int getAccessibleSelectionCountFromContext(final AccessibleContext ac) {
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                if (ac != null) {
+                    AccessibleSelection as = ac.getAccessibleSelection();
+                    if (as != null) {
+                        return as.getAccessibleSelectionCount();
+                    }
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /**
+     * return true if the i-th child of the AccessibleSelection of an AccessibleContext is selected
+     *
+     */
+    private boolean isAccessibleChildSelectedFromContext(final AccessibleContext ac, final int i) {
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                if (ac != null) {
+                    AccessibleSelection as = ac.getAccessibleSelection();
+                    if (as != null) {
+                        return as.isAccessibleChildSelected(i);
+                    }
+                }
+                return false;
+            }
+        }, ac);
+    }
+
+    /**
+     * remove the i-th child from the AccessibleSelection of an AccessibleContext
+     *
+     */
+    private void removeAccessibleSelectionFromContext(final AccessibleContext ac, final int i) {
+        InvocationUtils.invokeAndWait(new Callable<Object>() {
+            @Override
+            public Object call() throws Exception {
+                if (ac != null) {
+                    AccessibleSelection as = ac.getAccessibleSelection();
+                    if (as != null) {
+                        as.removeAccessibleSelection(i);
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /**
+     * select all (if possible) of the children of the AccessibleSelection of an AccessibleContext
+     *
+     */
+    private void selectAllAccessibleSelectionFromContext(final AccessibleContext ac) {
+            InvocationUtils.invokeAndWait(new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                    if (ac != null) {
+                        AccessibleSelection as = ac.getAccessibleSelection();
+                        if (as != null) {
+                            as.selectAllAccessibleSelection();
+                        }
+                    }
+                    return null;
+                }
+            }, ac);
+    }
+
+    // ======== AccessibleTable ========
+
+    ConcurrentHashMap<AccessibleTable,AccessibleContext> hashtab = new ConcurrentHashMap<>();
+
+    /**
+     * returns the AccessibleTable for an AccessibleContext
+     */
+    private AccessibleTable getAccessibleTableFromContext(final AccessibleContext ac) {
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleTable>() {
+            @Override
+            public AccessibleTable call() throws Exception {
+                if (ac != null) {
+                    AccessibleTable at = ac.getAccessibleTable();
+                    if (at != null) {
+                        AccessBridge.this.hashtab.put(at, ac);
+                        return at;
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+
+    /*
+     * returns the AccessibleContext that contains an AccessibleTable
+     */
+    private AccessibleContext getContextFromAccessibleTable(AccessibleTable at) {
+        return hashtab.get(at);
+    }
+
+    /*
+     * returns the row count for an AccessibleTable
+     */
+    private int getAccessibleTableRowCount(final AccessibleContext ac) {
+        debugString("##### getAccessibleTableRowCount");
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                if (ac != null) {
+                    AccessibleTable at = ac.getAccessibleTable();
+                    if (at != null) {
+                        return at.getAccessibleRowCount();
+                    }
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /*
+     * returns the column count for an AccessibleTable
+     */
+    private int getAccessibleTableColumnCount(final AccessibleContext ac) {
+        debugString("##### getAccessibleTableColumnCount");
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                if (ac != null) {
+                    AccessibleTable at = ac.getAccessibleTable();
+                    if (at != null) {
+                        return at.getAccessibleColumnCount();
+                    }
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /*
+     * returns the AccessibleContext for an AccessibleTable cell
+     */
+    private AccessibleContext getAccessibleTableCellAccessibleContext(final AccessibleTable at,
+                                                                      final int row, final int column) {
+        debugString("getAccessibleTableCellAccessibleContext: at = "+at.getClass());
+        if (at == null) return null;
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                if (!(at instanceof AccessibleContext)) {
+                    Accessible a = at.getAccessibleAt(row, column);
+                    if (a != null) {
+                        return a.getAccessibleContext();
+                    }
+                } else {
+                    // work-around for AccessibleJTable.getCurrentAccessibleContext returning
+                    // wrong renderer component when cell contains more than one component
+                    AccessibleContext ac = (AccessibleContext) at;
+                    Accessible parent = ac.getAccessibleParent();
+                    if (parent != null) {
+                        int indexInParent = ac.getAccessibleIndexInParent();
+                        Accessible child =
+                                parent.getAccessibleContext().getAccessibleChild(indexInParent);
+                        if (child instanceof JTable) {
+                            JTable table = (JTable) child;
+
+                            TableCellRenderer renderer = table.getCellRenderer(row, column);
+                            if (renderer == null) {
+                                Class<?> columnClass = table.getColumnClass(column);
+                                renderer = table.getDefaultRenderer(columnClass);
+                            }
+                            Component component =
+                                    renderer.getTableCellRendererComponent(table, table.getValueAt(row, column),
+                                            false, false, row, column);
+                            if (component instanceof Accessible) {
+                                return component.getAccessibleContext();
+                            }
+                        }
+                    }
+                }
+                return null;
+            }
+        }, getContextFromAccessibleTable(at));
+    }
+
+    /*
+     * returns the index of a cell at a given row and column in an AccessibleTable
+     */
+    private int getAccessibleTableCellIndex(final AccessibleTable at, int row, int column) {
+        debugString("##### getAccessibleTableCellIndex: at="+at);
+        if (at != null) {
+            int cellIndex = row *
+                InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                    @Override
+                    public Integer call() throws Exception {
+                        return at.getAccessibleColumnCount();
+                    }
+                }, getContextFromAccessibleTable(at)) +
+                column;
+            debugString("   ##### getAccessibleTableCellIndex="+cellIndex);
+            return cellIndex;
+        }
+        debugString(" ##### getAccessibleTableCellIndex FAILED");
+        return -1;
+    }
+
+    /*
+     * returns the row extent of a cell at a given row and column in an AccessibleTable
+     */
+    private int getAccessibleTableCellRowExtent(final AccessibleTable at, final int row, final int column) {
+        debugString("##### getAccessibleTableCellRowExtent");
+        if (at != null) {
+            int rowExtent = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                                                              @Override
+                                                              public Integer call() throws Exception {
+                                                                  return at.getAccessibleRowExtentAt(row, column);
+                                                              }
+                                                          },
+                    getContextFromAccessibleTable(at));
+            debugString("   ##### getAccessibleTableCellRowExtent="+rowExtent);
+            return rowExtent;
+        }
+        debugString(" ##### getAccessibleTableCellRowExtent FAILED");
+        return -1;
+    }
+
+    /*
+     * returns the column extent of a cell at a given row and column in an AccessibleTable
+     */
+    private int getAccessibleTableCellColumnExtent(final AccessibleTable at, final int row, final int column) {
+        debugString("##### getAccessibleTableCellColumnExtent");
+        if (at != null) {
+            int columnExtent = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                                                                 @Override
+                                                                 public Integer call() throws Exception {
+                                                                     return at.getAccessibleColumnExtentAt(row, column);
+                                                                 }
+                                                             },
+                    getContextFromAccessibleTable(at));
+            debugString("   ##### getAccessibleTableCellColumnExtent="+columnExtent);
+            return columnExtent;
+        }
+        debugString(" ##### getAccessibleTableCellColumnExtent FAILED");
+        return -1;
+    }
+
+    /*
+     * returns whether a cell is selected at a given row and column in an AccessibleTable
+     */
+    private boolean isAccessibleTableCellSelected(final AccessibleTable at, final int row,
+                         final int column) {
+        debugString("##### isAccessibleTableCellSelected: ["+row+"]["+column+"]");
+        if (at == null)
+            return false;
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                boolean isSelected = false;
+                Accessible a = at.getAccessibleAt(row, column);
+                if (a != null) {
+                    AccessibleContext ac = a.getAccessibleContext();
+                    if (ac == null)
+                        return false;
+                    AccessibleStateSet as = ac.getAccessibleStateSet();
+                    if (as != null) {
+                        isSelected = as.contains(AccessibleState.SELECTED);
+                    }
+                }
+                return isSelected;
+            }
+        }, getContextFromAccessibleTable(at));
+    }
+
+    /*
+     * returns an AccessibleTable that represents the row header in an
+     * AccessibleTable
+     */
+    private AccessibleTable getAccessibleTableRowHeader(final AccessibleContext ac) {
+        debugString(" #####  getAccessibleTableRowHeader called");
+        AccessibleTable at = InvocationUtils.invokeAndWait(new Callable<AccessibleTable>() {
+            @Override
+            public AccessibleTable call() throws Exception {
+                if (ac != null) {
+                    AccessibleTable at = ac.getAccessibleTable();
+                    if (at != null) {
+                        return at.getAccessibleRowHeader();
+                    }
+                }
+                return null;
+            }
+        }, ac);
+        if (at != null) {
+            hashtab.put(at, ac);
+        }
+        return at;
+    }
+
+    /*
+     * returns an AccessibleTable that represents the column header in an
+     * AccessibleTable
+     */
+    private AccessibleTable getAccessibleTableColumnHeader(final AccessibleContext ac) {
+    debugString("##### getAccessibleTableColumnHeader");
+        if (ac == null)
+            return null;
+        AccessibleTable at = InvocationUtils.invokeAndWait(new Callable<AccessibleTable>() {
+            @Override
+            public AccessibleTable call() throws Exception {
+                // workaround for getAccessibleColumnHeader NPE
+                // when the table header is null
+                Accessible parent = ac.getAccessibleParent();
+                if (parent != null) {
+                    int indexInParent = ac.getAccessibleIndexInParent();
+                    Accessible child =
+                            parent.getAccessibleContext().getAccessibleChild(indexInParent);
+                    if (child instanceof JTable) {
+                        JTable table = (JTable) child;
+                        if (table.getTableHeader() == null) {
+                            return null;
+                        }
+                    }
+                }
+                AccessibleTable at = ac.getAccessibleTable();
+                if (at != null) {
+                    return at.getAccessibleColumnHeader();
+                }
+                return null;
+            }
+        }, ac);
+        if (at != null) {
+            hashtab.put(at, ac);
+        }
+        return at;
+    }
+
+    /*
+     * returns the number of row headers in an AccessibleTable that represents
+     * the row header in an AccessibleTable
+     */
+    private int getAccessibleTableRowHeaderRowCount(AccessibleContext ac) {
+
+    debugString(" #####  getAccessibleTableRowHeaderRowCount called");
+        if (ac != null) {
+            final AccessibleTable atRowHeader = getAccessibleTableRowHeader(ac);
+            if (atRowHeader != null) {
+                return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                    @Override
+                    public Integer call() throws Exception {
+                        if (atRowHeader != null) {
+                            return atRowHeader.getAccessibleRowCount();
+                        }
+                        return -1;
+                    }
+                }, ac);
+            }
+        }
+        return -1;
+    }
+
+    /*
+     * returns the number of column headers in an AccessibleTable that represents
+     * the row header in an AccessibleTable
+     */
+    private int getAccessibleTableRowHeaderColumnCount(AccessibleContext ac) {
+        debugString(" #####  getAccessibleTableRowHeaderColumnCount called");
+        if (ac != null) {
+            final AccessibleTable atRowHeader = getAccessibleTableRowHeader(ac);
+            if (atRowHeader != null) {
+                return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                    @Override
+                    public Integer call() throws Exception {
+                        if (atRowHeader != null) {
+                            return atRowHeader.getAccessibleColumnCount();
+                        }
+                        return -1;
+                    }
+                }, ac);
+            }
+        }
+        debugString(" ##### getAccessibleTableRowHeaderColumnCount FAILED");
+        return -1;
+    }
+
+    /*
+     * returns the number of row headers in an AccessibleTable that represents
+     * the column header in an AccessibleTable
+     */
+    private int getAccessibleTableColumnHeaderRowCount(AccessibleContext ac) {
+
+    debugString("##### getAccessibleTableColumnHeaderRowCount");
+        if (ac != null) {
+            final AccessibleTable atColumnHeader = getAccessibleTableColumnHeader(ac);
+            if (atColumnHeader != null) {
+                return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                    @Override
+                    public Integer call() throws Exception {
+                        if (atColumnHeader != null) {
+                            return atColumnHeader.getAccessibleRowCount();
+                        }
+                        return -1;
+                    }
+                }, ac);
+            }
+        }
+        debugString(" ##### getAccessibleTableColumnHeaderRowCount FAILED");
+        return -1;
+    }
+
+    /*
+     * returns the number of column headers in an AccessibleTable that represents
+     * the column header in an AccessibleTable
+     */
+    private int getAccessibleTableColumnHeaderColumnCount(AccessibleContext ac) {
+
+    debugString("#####  getAccessibleTableColumnHeaderColumnCount");
+        if (ac != null) {
+            final AccessibleTable atColumnHeader = getAccessibleTableColumnHeader(ac);
+            if (atColumnHeader != null) {
+                return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                    @Override
+                    public Integer call() throws Exception {
+                        if (atColumnHeader != null) {
+                            return atColumnHeader.getAccessibleColumnCount();
+                        }
+                        return -1;
+                    }
+                }, ac);
+            }
+        }
+        debugString(" ##### getAccessibleTableColumnHeaderColumnCount FAILED");
+        return -1;
+    }
+
+    /*
+     * returns the description of a row header in an AccessibleTable
+     */
+    private AccessibleContext getAccessibleTableRowDescription(final AccessibleTable table,
+                                                              final int row) {
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                if (table != null) {
+                    Accessible a = table.getAccessibleRowDescription(row);
+                    if (a != null) {
+                        return a.getAccessibleContext();
+                    }
+                }
+                return null;
+            }
+        }, getContextFromAccessibleTable(table));
+    }
+
+    /*
+     * returns the description of a column header in an AccessibleTable
+     */
+    private AccessibleContext getAccessibleTableColumnDescription(final AccessibleTable at,
+                                                                 final int column) {
+        if (at == null)
+            return null;
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                Accessible a = at.getAccessibleColumnDescription(column);
+                if (a != null) {
+                    return a.getAccessibleContext();
+                }
+                return null;
+            }
+        }, getContextFromAccessibleTable(at));
+    }
+
+    /*
+     * returns the number of rows selected in an AccessibleTable
+     */
+    private int getAccessibleTableRowSelectionCount(final AccessibleTable at) {
+        if (at != null) {
+            return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                @Override
+                public Integer call() throws Exception {
+                    int[] selections = at.getSelectedAccessibleRows();
+                    if (selections != null)
+                        return selections.length;
+                    else
+                        return -1;
+                }
+            }, getContextFromAccessibleTable(at));
+        }
+        return -1;
+    }
+
+    /*
+     * returns the row number of the i-th selected row in an AccessibleTable
+     */
+    private int getAccessibleTableRowSelections(final AccessibleTable at, final int i) {
+        if (at != null) {
+            return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                @Override
+                public Integer call() throws Exception {
+                    int[] selections = at.getSelectedAccessibleRows();
+                    if (selections.length > i) {
+                        return selections[i];
+                    }
+                    return -1;
+                }
+            }, getContextFromAccessibleTable(at));
+        }
+        return -1;
+    }
+
+    /*
+     * returns whether a row is selected in an AccessibleTable
+     */
+    private boolean isAccessibleTableRowSelected(final AccessibleTable at,
+                                                 final int row) {
+        if (at == null)
+            return false;
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return at.isAccessibleRowSelected(row);
+            }
+         }, getContextFromAccessibleTable(at));
+    }
+
+    /*
+     * returns whether a column is selected in an AccessibleTable
+     */
+    private boolean isAccessibleTableColumnSelected(final AccessibleTable at,
+                                                   final int column) {
+        if (at == null)
+            return false;
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return at.isAccessibleColumnSelected(column);
+            }
+         }, getContextFromAccessibleTable(at));
+    }
+
+    /*
+     * returns the number of columns selected in an AccessibleTable
+     */
+    private int getAccessibleTableColumnSelectionCount(final AccessibleTable at) {
+        if (at == null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                int[] selections = at.getSelectedAccessibleColumns();
+                if (selections != null)
+                    return selections.length;
+                else
+                    return -1;
+            }
+        }, getContextFromAccessibleTable(at));
+    }
+
+    /*
+     * returns the row number of the i-th selected row in an AccessibleTable
+     */
+    private int getAccessibleTableColumnSelections(final AccessibleTable at, final int i) {
+        if (at == null)
+            return -1;
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                int[] selections = at.getSelectedAccessibleColumns();
+                if (selections != null && selections.length > i) {
+                    return selections[i];
+                }
+                return -1;
+            }
+        }, getContextFromAccessibleTable(at));
+    }
+
+    /* ===== AccessibleExtendedTable (since 1.4) ===== */
+
+    /*
+     * returns the row number for a cell at a given index in an AccessibleTable
+     */
+    private int getAccessibleTableRow(final AccessibleTable at, int index) {
+        if (at == null)
+            return -1;
+        int colCount=InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return at.getAccessibleColumnCount();
+            }
+        }, getContextFromAccessibleTable(at));
+        return index / colCount;
+    }
+
+    /*
+     * returns the column number for a cell at a given index in an AccessibleTable
+     */
+    private int getAccessibleTableColumn(final AccessibleTable at, int index) {
+        if (at == null)
+            return -1;
+        int colCount=InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return at.getAccessibleColumnCount();
+            }
+        }, getContextFromAccessibleTable(at));
+        return index % colCount;
+    }
+
+    /*
+     * returns the index for a cell at a given row and column in an
+     * AccessibleTable
+     */
+    private int getAccessibleTableIndex(final AccessibleTable at, int row, int column) {
+        if (at == null)
+            return -1;
+        int colCount = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return at.getAccessibleColumnCount();
+            }
+         }, getContextFromAccessibleTable(at));
+        return row * colCount + column;
+    }
+
+    // ===== AccessibleRelationSet =====
+
+    /*
+     * returns the number of relations in the AccessibleContext's
+     * AccessibleRelationSet
+     */
+    private int getAccessibleRelationCount(final AccessibleContext ac) {
+        {
+            if (ac != null) {
+                AccessibleRelationSet ars = InvocationUtils.invokeAndWait(new Callable<AccessibleRelationSet>() {
+                    @Override
+                    public AccessibleRelationSet call() throws Exception {
+                        return ac.getAccessibleRelationSet();
+                    }
+                }, ac);
+                if (ars != null)
+                    return ars.size();
+            }
+        }
+        return 0;
+    }
+
+    /*
+     * returns the ith relation key in the AccessibleContext's
+     * AccessibleRelationSet
+     */
+    private String getAccessibleRelationKey(final AccessibleContext ac, final int i) {
+        return InvocationUtils.invokeAndWait(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                if (ac != null) {
+                    AccessibleRelationSet ars = ac.getAccessibleRelationSet();
+                    if (ars != null) {
+                        AccessibleRelation[] relations = ars.toArray();
+                        if (relations != null && i >= 0 && i < relations.length) {
+                            return relations[i].getKey();
+                        }
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /*
+     * returns the number of targets in a relation in the AccessibleContext's
+     * AccessibleRelationSet
+     */
+    private int getAccessibleRelationTargetCount(final AccessibleContext ac, final int i) {
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                if (ac != null) {
+                    AccessibleRelationSet ars = ac.getAccessibleRelationSet();
+                    if (ars != null) {
+                        AccessibleRelation[] relations = ars.toArray();
+                        if (relations != null && i >= 0 && i < relations.length) {
+                            Object[] targets = relations[i].getTarget();
+                            return targets.length;
+                        }
+                    }
+                }
+                return -1;
+            }
+        }, ac);
+    }
+
+    /*
+     * returns the jth target in the ith relation in the AccessibleContext's
+     * AccessibleRelationSet
+     */
+    private AccessibleContext getAccessibleRelationTarget(final AccessibleContext ac,
+                                                         final int i, final int j) {
+        debugString("***** getAccessibleRelationTarget");
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                if (ac != null) {
+                    AccessibleRelationSet ars = ac.getAccessibleRelationSet();
+                    if (ars != null) {
+                        AccessibleRelation[] relations = ars.toArray();
+                        if (relations != null && i >= 0 && i < relations.length) {
+                            Object[] targets = relations[i].getTarget();
+                            if (targets != null && j >= 0 & j < targets.length) {
+                                Object o = targets[j];
+                                if (o instanceof Accessible) {
+                                    return ((Accessible) o).getAccessibleContext();
+                                }
+                            }
+                        }
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    // ========= AccessibleHypertext =========
+
+    private Map<AccessibleHypertext, AccessibleContext> hyperTextContextMap = new WeakHashMap<>();
+    private Map<AccessibleHyperlink, AccessibleContext> hyperLinkContextMap = new WeakHashMap<>();
+
+    /*
+     * Returns the AccessibleHypertext
+     */
+    private AccessibleHypertext getAccessibleHypertext(final AccessibleContext ac) {
+        debugString("getAccessibleHyperlink");
+        if (ac==null)
+            return null;
+        AccessibleHypertext hypertext = InvocationUtils.invokeAndWait(new Callable<AccessibleHypertext>() {
+            @Override
+            public AccessibleHypertext call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (!(at instanceof AccessibleHypertext)) {
+                    return null;
+                }
+                return ((AccessibleHypertext) at);
+            }
+        }, ac);
+        hyperTextContextMap.put(hypertext, ac);
+        return hypertext;
+    }
+
+    /*
+     * Returns the number of AccessibleHyperlinks
+     */
+    private int getAccessibleHyperlinkCount(AccessibleContext ac) {
+        debugString("getAccessibleHyperlinkCount");
+        if (ac == null) {
+            return 0;
+        }
+        final AccessibleHypertext hypertext = getAccessibleHypertext(ac);
+        if (hypertext == null) {
+            return 0;
+        }
+        //return hypertext.getLinkCount();
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return hypertext.getLinkCount();
+            }
+        }, ac);
+    }
+
+    /*
+     * Returns the hyperlink at the specified index
+     */
+    private AccessibleHyperlink getAccessibleHyperlink(final AccessibleHypertext hypertext, final int i) {
+        debugString("getAccessibleHyperlink");
+        if (hypertext == null) {
+            return null;
+        }
+        AccessibleContext ac = hyperTextContextMap.get(hypertext);
+        if ( i < 0 || i >=
+             InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                 @Override
+                 public Integer call() throws Exception {
+                     return hypertext.getLinkCount();
+                 }
+             }, ac) ) {
+            return null;
+        }
+        AccessibleHyperlink acLink = InvocationUtils.invokeAndWait(new Callable<AccessibleHyperlink>() {
+            @Override
+            public AccessibleHyperlink call() throws Exception {
+                AccessibleHyperlink link = hypertext.getLink(i);
+                if (link == null || (!link.isValid())) {
+                    return null;
+                }
+                return link;
+            }
+        }, ac);
+        hyperLinkContextMap.put(acLink, ac);
+        return acLink;
+    }
+
+    /*
+     * Returns the hyperlink object description
+     */
+    private String getAccessibleHyperlinkText(final AccessibleHyperlink link) {
+        debugString("getAccessibleHyperlinkText");
+        if (link == null) {
+            return null;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                Object o = link.getAccessibleActionDescription(0);
+                if (o != null) {
+                    return o.toString();
+                }
+                return null;
+            }
+        }, hyperLinkContextMap.get(link));
+    }
+
+    /*
+     * Returns the hyperlink URL
+     */
+    private String getAccessibleHyperlinkURL(final AccessibleHyperlink link) {
+        debugString("getAccessibleHyperlinkURL");
+        if (link == null) {
+            return null;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                Object o = link.getAccessibleActionObject(0);
+                if (o != null) {
+                    return o.toString();
+                } else {
+                    return null;
+                }
+            }
+        }, hyperLinkContextMap.get(link));
+    }
+
+    /*
+     * Returns the start index of the hyperlink text
+     */
+    private int getAccessibleHyperlinkStartIndex(final AccessibleHyperlink link) {
+        debugString("getAccessibleHyperlinkStartIndex");
+        if (link == null) {
+            return -1;
+        }
+        return  InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return link.getStartIndex();
+            }
+        }, hyperLinkContextMap.get(link));
+    }
+
+    /*
+     * Returns the end index of the hyperlink text
+     */
+    private int getAccessibleHyperlinkEndIndex(final AccessibleHyperlink link) {
+        debugString("getAccessibleHyperlinkEndIndex");
+        if (link == null) {
+            return -1;
+        }
+        return  InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return link.getEndIndex();
+            }
+        }, hyperLinkContextMap.get(link));
+    }
+
+    /*
+     * Returns the index into an array of hyperlinks that
+     * is associated with this character index, or -1 if there
+     * is no hyperlink associated with this index.
+     */
+    private int getAccessibleHypertextLinkIndex(final AccessibleHypertext hypertext, final int charIndex) {
+        debugString("getAccessibleHypertextLinkIndex: charIndex = "+charIndex);
+        if (hypertext == null) {
+            return -1;
+        }
+        int linkIndex = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return hypertext.getLinkIndex(charIndex);
+            }
+        }, hyperTextContextMap.get(hypertext));
+        debugString("getAccessibleHypertextLinkIndex returning "+linkIndex);
+        return linkIndex;
+    }
+
+    /*
+     * Actives the hyperlink
+     */
+    private boolean activateAccessibleHyperlink(final AccessibleContext ac,
+                                                final AccessibleHyperlink link) {
+        //debugString("activateAccessibleHyperlink: link = "+link.getClass());
+        if (link == null) {
+            return false;
+        }
+        boolean retval = InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return link.doAccessibleAction(0);
+            }
+        }, ac);
+        debugString("activateAccessibleHyperlink: returning = "+retval);
+        return retval;
+    }
+
+
+    // ============ AccessibleKeyBinding =============
+
+    /*
+     * returns the component mnemonic
+     */
+    private KeyStroke getMnemonic(final AccessibleContext ac) {
+        if (ac == null)
+            return null;
+        return InvocationUtils.invokeAndWait(new Callable<KeyStroke>() {
+            @Override
+            public KeyStroke call() throws Exception {
+                AccessibleComponent comp = ac.getAccessibleComponent();
+                if (!(comp instanceof AccessibleExtendedComponent)) {
+                    return null;
+                }
+                AccessibleExtendedComponent aec = (AccessibleExtendedComponent) comp;
+                if (aec != null) {
+                    AccessibleKeyBinding akb = aec.getAccessibleKeyBinding();
+                    if (akb != null) {
+                        Object o = akb.getAccessibleKeyBinding(0);
+                        if (o instanceof KeyStroke) {
+                            return (KeyStroke) o;
+                        }
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /*
+     * returns the JMenuItem accelerator
+     */
+    private KeyStroke getAccelerator(final AccessibleContext ac) {
+        // workaround for getAccessibleKeyBinding not returning the
+        // JMenuItem accelerator
+        if (ac == null)
+            return null;
+        return InvocationUtils.invokeAndWait(new Callable<KeyStroke>() {
+            @Override
+            public KeyStroke call() throws Exception {
+                Accessible parent = ac.getAccessibleParent();
+                if (parent instanceof Accessible) {
+                    int indexInParent = ac.getAccessibleIndexInParent();
+                    Accessible child =
+                            parent.getAccessibleContext().getAccessibleChild(indexInParent);
+                    if (child instanceof JMenuItem) {
+                        JMenuItem menuItem = (JMenuItem) child;
+                        if (menuItem == null)
+                            return null;
+                        KeyStroke keyStroke = menuItem.getAccelerator();
+                        return keyStroke;
+                    }
+                }
+                return null;
+            }
+        }, ac);
+    }
+
+    /*
+     * returns 1-24 to indicate which F key is being used for a shortcut or 0 otherwise
+     */
+    private int fKeyNumber(KeyStroke keyStroke) {
+        if (keyStroke == null)
+            return 0;
+        int fKey = 0;
+        String keyText = KeyEvent.getKeyText(keyStroke.getKeyCode());
+        if (keyText != null && (keyText.length() == 2 || keyText.length() == 3)) {
+            String prefix = keyText.substring(0, 1);
+            if (prefix.equals("F")) {
+                try {
+                    int suffix = Integer.parseInt(keyText.substring(1));
+                    if (suffix >= 1 && suffix <= 24) {
+                        fKey = suffix;
+                    }
+                } catch (Exception e) { // ignore NumberFormatException
+                }
+            }
+        }
+        return fKey;
+    }
+
+    /*
+     * returns one of several important control characters or 0 otherwise
+     */
+    private int controlCode(KeyStroke keyStroke) {
+        if (keyStroke == null)
+            return 0;
+        int code = keyStroke.getKeyCode();
+        switch (code) {
+            case KeyEvent.VK_BACK_SPACE:
+            case KeyEvent.VK_DELETE:
+            case KeyEvent.VK_DOWN:
+            case KeyEvent.VK_END:
+            case KeyEvent.VK_HOME:
+            case KeyEvent.VK_INSERT:
+            case KeyEvent.VK_KP_DOWN:
+            case KeyEvent.VK_KP_LEFT:
+            case KeyEvent.VK_KP_RIGHT:
+            case KeyEvent.VK_KP_UP:
+            case KeyEvent.VK_LEFT:
+            case KeyEvent.VK_PAGE_DOWN:
+            case KeyEvent.VK_PAGE_UP:
+            case KeyEvent.VK_RIGHT:
+            case KeyEvent.VK_UP:
+                break;
+            default:
+                code = 0;
+                break;
+        }
+        return code;
+    }
+
+    /*
+     * returns the KeyStoke character
+     */
+    private char getKeyChar(KeyStroke keyStroke) {
+        // If the shortcut is an FKey return 1-24
+        if (keyStroke == null)
+            return 0;
+        int fKey = fKeyNumber(keyStroke);
+        if (fKey != 0) {
+            // return 0x00000001 through 0x00000018
+            debugString("   Shortcut is: F" + fKey);
+            return (char)fKey;
+        }
+        // If the accelerator is a control character, return it
+        int keyCode = controlCode(keyStroke);
+        if (keyCode != 0) {
+            debugString("   Shortcut is control character: " + Integer.toHexString(keyCode));
+            return (char)keyCode;
+        }
+        String keyText = KeyEvent.getKeyText(keyStroke.getKeyCode());
+        debugString("   Shortcut is: " + keyText);
+        if (keyText != null || keyText.length() > 0) {
+            CharSequence seq = keyText.subSequence(0, 1);
+            if (seq != null || seq.length() > 0) {
+                return seq.charAt(0);
+            }
+        }
+        return 0;
+    }
+
+    /*
+     * returns the KeyStroke modifiers as an int
+     */
+    private int getModifiers(KeyStroke keyStroke) {
+        if (keyStroke == null)
+            return 0;
+        debugString("In AccessBridge.getModifiers");
+        // modifiers is a bit strip where bits 0-7 indicate a traditional modifier
+        // such as Ctrl/Alt/Shift, bit 8 indicates an F key shortcut, and bit 9 indicates
+        // a control code shortcut such as the delete key.
+
+        int modifiers = 0;
+        // Is the shortcut an FKey?
+        if (fKeyNumber(keyStroke) != 0) {
+            modifiers |= 1 << 8;
+        }
+        // Is the shortcut a control code?
+        if (controlCode(keyStroke) != 0) {
+            modifiers |= 1 << 9;
+        }
+        // The following is needed in order to handle translated modifiers.
+        // getKeyModifiersText doesn't work because for example in German Strg is
+        // returned for Ctrl.
+
+        // There can be more than one modifier, e.g. if the modifier is ctrl + shift + B
+        // the toString text is "shift ctrl pressed B". Need to parse through that.
+        StringTokenizer st = new StringTokenizer(keyStroke.toString());
+        while (st.hasMoreTokens()) {
+            String text = st.nextToken();
+            // Meta+Ctrl+Alt+Shift
+            // 0-3 are shift, ctrl, meta, alt
+            // 4-7 are for Solaris workstations (though not being used)
+            if (text.startsWith("met")) {
+                debugString("   found meta");
+                modifiers |= ActionEvent.META_MASK;
+            }
+            if (text.startsWith("ctr")) {
+                debugString("   found ctrl");
+                modifiers |= ActionEvent.CTRL_MASK;
+            }
+            if (text.startsWith("alt")) {
+                debugString("   found alt");
+                modifiers |= ActionEvent.ALT_MASK;
+            }
+            if (text.startsWith("shi")) {
+                debugString("   found shift");
+                modifiers |= ActionEvent.SHIFT_MASK;
+            }
+        }
+        debugString("   returning modifiers: 0x" + Integer.toHexString(modifiers));
+        return modifiers;
+    }
+
+    /*
+     * returns the number of key bindings associated with this context
+     */
+    private int getAccessibleKeyBindingsCount(AccessibleContext ac) {
+        if (ac == null)
+            return 0;
+        int count = 0;
+
+        if (getMnemonic(ac) != null) {
+            count++;
+        }
+        if (getAccelerator(ac) != null) {
+            count++;
+        }
+        return count;
+    }
+
+    /*
+     * returns the key binding character at the specified index
+     */
+    private char getAccessibleKeyBindingChar(AccessibleContext ac, int index) {
+        if (ac == null)
+            return 0;
+        if((index == 0) && getMnemonic(ac)==null) {// special case when there is no mnemonic
+            KeyStroke keyStroke = getAccelerator(ac);
+            if (keyStroke != null) {
+                return getKeyChar(keyStroke);
+            }
+        }
+        if (index == 0) {   // mnemonic
+            KeyStroke keyStroke = getMnemonic(ac);
+            if (keyStroke != null) {
+                return getKeyChar(keyStroke);
+            }
+        } else if (index == 1) { // accelerator
+            KeyStroke keyStroke = getAccelerator(ac);
+            if (keyStroke != null) {
+                return getKeyChar(keyStroke);
+            }
+        }
+        return 0;
+    }
+
+    /*
+     * returns the key binding modifiers at the specified index
+     */
+    private int getAccessibleKeyBindingModifiers(AccessibleContext ac, int index) {
+        if (ac == null)
+            return 0;
+        if((index == 0) && getMnemonic(ac)==null) {// special case when there is no mnemonic
+            KeyStroke keyStroke = getAccelerator(ac);
+            if (keyStroke != null) {
+                return getModifiers(keyStroke);
+            }
+        }
+        if (index == 0) {   // mnemonic
+            KeyStroke keyStroke = getMnemonic(ac);
+            if (keyStroke != null) {
+                return getModifiers(keyStroke);
+            }
+        } else if (index == 1) { // accelerator
+            KeyStroke keyStroke = getAccelerator(ac);
+            if (keyStroke != null) {
+                return getModifiers(keyStroke);
+            }
+        }
+        return 0;
+    }
+
+    // ========== AccessibleIcon ============
+
+    /*
+     * return the number of icons associated with this context
+     */
+    private int getAccessibleIconsCount(final AccessibleContext ac) {
+        debugString("getAccessibleIconsCount");
+        if (ac == null) {
+            return 0;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleIcon[] ai = ac.getAccessibleIcon();
+                if (ai == null) {
+                    return 0;
+                }
+                return ai.length;
+            }
+        }, ac);
+    }
+
+    /*
+     * return icon description at the specified index
+     */
+    private String getAccessibleIconDescription(final AccessibleContext ac, final int index) {
+        debugString("getAccessibleIconDescription: index = "+index);
+        if (ac == null) {
+            return null;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                AccessibleIcon[] ai = ac.getAccessibleIcon();
+                if (ai == null || index < 0 || index >= ai.length) {
+                    return null;
+                }
+                return ai[index].getAccessibleIconDescription();
+            }
+        }, ac);
+    }
+
+    /*
+     * return icon height at the specified index
+     */
+    private int getAccessibleIconHeight(final AccessibleContext ac, final int index) {
+        debugString("getAccessibleIconHeight: index = "+index);
+        if (ac == null) {
+            return 0;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleIcon[] ai = ac.getAccessibleIcon();
+                if (ai == null || index < 0 || index >= ai.length) {
+                    return 0;
+                }
+                return ai[index].getAccessibleIconHeight();
+            }
+        }, ac);
+    }
+
+    /*
+     * return icon width at the specified index
+     */
+    private int getAccessibleIconWidth(final AccessibleContext ac, final int index) {
+        debugString("getAccessibleIconWidth: index = "+index);
+        if (ac == null) {
+            return 0;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleIcon[] ai = ac.getAccessibleIcon();
+                if (ai == null || index < 0 || index >= ai.length) {
+                    return 0;
+                }
+                return ai[index].getAccessibleIconWidth();
+            }
+        }, ac);
+    }
+
+    // ========= AccessibleAction ===========
+
+    /*
+     * return the number of icons associated with this context
+     */
+    private int getAccessibleActionsCount(final AccessibleContext ac) {
+        debugString("getAccessibleActionsCount");
+        if (ac == null) {
+            return 0;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                AccessibleAction aa = ac.getAccessibleAction();
+                if (aa == null)
+                    return 0;
+                return aa.getAccessibleActionCount();
+            }
+        }, ac);
+    }
+
+    /*
+     * return icon description at the specified index
+     */
+    private String getAccessibleActionName(final AccessibleContext ac, final int index) {
+        debugString("getAccessibleActionName: index = "+index);
+        if (ac == null) {
+            return null;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                AccessibleAction aa = ac.getAccessibleAction();
+                if (aa == null) {
+                    return null;
+                }
+                return aa.getAccessibleActionDescription(index);
+            }
+        }, ac);
+    }
+    /*
+     * return icon description at the specified index
+     */
+    private boolean doAccessibleActions(final AccessibleContext ac, final String name) {
+        debugString("doAccessibleActions: action name = "+name);
+        if (ac == null || name == null) {
+            return false;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                AccessibleAction aa = ac.getAccessibleAction();
+                if (aa == null) {
+                    return false;
+                }
+                int index = -1;
+                int numActions = aa.getAccessibleActionCount();
+                for (int i = 0; i < numActions; i++) {
+                    String actionName = aa.getAccessibleActionDescription(i);
+                    if (name.equals(actionName)) {
+                        index = i;
+                        break;
+                    }
+                }
+                if (index == -1) {
+                    return false;
+                }
+                boolean retval = aa.doAccessibleAction(index);
+                return retval;
+            }
+        }, ac);
+    }
+
+    /* ===== AT utility methods ===== */
+
+    /**
+     * Sets the contents of an AccessibleContext that
+     * implements AccessibleEditableText with the
+     * specified text string.
+     * Returns whether successful.
+     */
+    private boolean setTextContents(final AccessibleContext ac, final String text) {
+        debugString("setTextContents: ac = "+ac+"; text = "+text);
+
+        if (! (ac instanceof AccessibleEditableText)) {
+            debugString("   ac not instanceof AccessibleEditableText: "+ac);
+            return false;
+        }
+        if (text == null) {
+            debugString("   text is null");
+            return false;
+        }
+
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                // check whether the text field is editable
+                AccessibleStateSet ass = ac.getAccessibleStateSet();
+                if (!ass.contains(AccessibleState.ENABLED)) {
+                    return false;
+                }
+                ((AccessibleEditableText) ac).setTextContents(text);
+                return true;
+            }
+        }, ac);
+    }
+
+    /**
+     * Returns the Accessible Context of an Internal Frame object that is
+     * the ancestor of a given object.  If the object is an Internal Frame
+     * object or an Internal Frame ancestor object was found, returns the
+     * object's AccessibleContext.
+     * If there is no ancestor object that has an Accessible Role of
+     * Internal Frame, returns (AccessibleContext)0.
+     */
+    private AccessibleContext getInternalFrame (AccessibleContext ac) {
+        return getParentWithRole(ac, AccessibleRole.INTERNAL_FRAME.toString());
+    }
+
+    /**
+     * Returns the Accessible Context for the top level object in
+     * a Java Window.  This is same Accessible Context that is obtained
+     * from GetAccessibleContextFromHWND for that window.  Returns
+     * (AccessibleContext)0 on error.
+     */
+    private AccessibleContext getTopLevelObject (final AccessibleContext ac) {
+        debugString("getTopLevelObject; ac = "+ac);
+        if (ac == null) {
+            return null;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                if (ac.getAccessibleRole() == AccessibleRole.DIALOG) {
+                    // return the dialog, not the parent window
+                    return ac;
+                }
+
+                Accessible parent = ac.getAccessibleParent();
+                if (parent == null) {
+                    return ac;
+                }
+                Accessible tmp = parent;
+                while (tmp != null && tmp.getAccessibleContext() != null) {
+                    AccessibleContext ac2 = tmp.getAccessibleContext();
+                    if (ac2 != null && ac2.getAccessibleRole() == AccessibleRole.DIALOG) {
+                        // return the dialog, not the parent window
+                        return ac2;
+                    }
+                    parent = tmp;
+                    tmp = parent.getAccessibleContext().getAccessibleParent();
+                }
+                return parent.getAccessibleContext();
+            }
+        }, ac);
+    }
+
+    /**
+     * Returns the parent AccessibleContext that has the specified AccessibleRole.
+     * Returns null on error or if the AccessibleContext does not exist.
+     */
+    private AccessibleContext getParentWithRole (final AccessibleContext ac,
+                                                 final String roleName) {
+        debugString("getParentWithRole; ac = "+ac);
+        debugString("role = "+roleName);
+        if (ac == null || roleName == null) {
+            return null;
+        }
+
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                AccessibleRole role = AccessBridge.this.accessibleRoleMap.get(roleName);
+                if (role == null) {
+                    return ac;
+                }
+
+                Accessible parent = ac.getAccessibleParent();
+                if (parent == null && ac.getAccessibleRole() == role) {
+                    return ac;
+                }
+
+                Accessible tmp = parent;
+                AccessibleContext tmp_ac = null;
+
+                while (tmp != null && (tmp_ac = tmp.getAccessibleContext()) != null) {
+                    AccessibleRole ar = tmp_ac.getAccessibleRole();
+                    if (ar == role) {
+                        // found
+                        return tmp_ac;
+                    }
+                    parent = tmp;
+                    tmp = parent.getAccessibleContext().getAccessibleParent();
+                }
+                // not found
+                return null;
+            }
+        }, ac);
+    }
+
+    /**
+     * Returns the parent AccessibleContext that has the specified AccessibleRole.
+     * Otherwise, returns the top level object for the Java Window.
+     * Returns (AccessibleContext)0 on error.
+     */
+    private AccessibleContext getParentWithRoleElseRoot (AccessibleContext ac,
+                                                         String roleName) {
+        AccessibleContext retval = getParentWithRole(ac, roleName);
+        if (retval == null) {
+            retval = getTopLevelObject(ac);
+        }
+        return retval;
+    }
+
+    /**
+     * Returns how deep in the object hierarchy a given object is.
+     * The top most object in the object hierarchy has an object depth of 0.
+     * Returns -1 on error.
+     */
+    private int getObjectDepth(final AccessibleContext ac) {
+        debugString("getObjectDepth: ac = "+ac);
+
+        if (ac == null) {
+            return -1;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                int count = 0;
+                Accessible parent = ac.getAccessibleParent();
+                if (parent == null) {
+                    return count;
+                }
+                Accessible tmp = parent;
+                while (tmp != null && tmp.getAccessibleContext() != null) {
+                    parent = tmp;
+                    tmp = parent.getAccessibleContext().getAccessibleParent();
+                    count++;
+                }
+                return count;
+            }
+        }, ac);
+    }
+
+    /**
+     * Returns the Accessible Context of the current ActiveDescendent of an object.
+     * Returns (AccessibleContext)0 on error.
+     */
+    private AccessibleContext getActiveDescendent (final AccessibleContext ac) {
+        debugString("getActiveDescendent: ac = "+ac);
+        if (ac == null) {
+            return null;
+        }
+        // workaround for JTree bug where the only possible active
+        // descendent is the JTree root
+        final Accessible parent = InvocationUtils.invokeAndWait(new Callable<Accessible>() {
+            @Override
+            public Accessible call() throws Exception {
+                return ac.getAccessibleParent();
+            }
+        }, ac);
+
+        if (parent != null) {
+            Accessible child = InvocationUtils.invokeAndWait(new Callable<Accessible>() {
+                @Override
+                public Accessible call() throws Exception {
+                    int indexInParent = ac.getAccessibleIndexInParent();
+                    return parent.getAccessibleContext().getAccessibleChild(indexInParent);
+                }
+            }, ac);
+
+            if (child instanceof JTree) {
+                // return the selected node
+                final JTree tree = (JTree)child;
+                return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                    @Override
+                    public AccessibleContext call() throws Exception {
+                        return new AccessibleJTreeNode(tree,
+                                tree.getSelectionPath(),
+                                null);
+                    }
+                }, child);
+            }
+        }
+
+        return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+            @Override
+            public AccessibleContext call() throws Exception {
+                AccessibleSelection as = ac.getAccessibleSelection();
+                if (as == null) {
+                    return null;
+                }
+                // assume single selection
+                if (as.getAccessibleSelectionCount() != 1) {
+                    return null;
+                }
+                Accessible a = as.getAccessibleSelection(0);
+                if (a == null) {
+                    return null;
+                }
+                return a.getAccessibleContext();
+            }
+        }, ac);
+    }
+
+
+    /**
+     * Additional methods for Teton
+     */
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm.
+     * Returns whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    private String getJAWSAccessibleName(final AccessibleContext ac) {
+        debugString("getJAWSAccessibleName");
+        if (ac == null) {
+            return null;
+        }
+        // placeholder
+        return InvocationUtils.invokeAndWait(new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                return ac.getAccessibleName();
+            }
+        }, ac);
+    }
+
+    /**
+     * Request focus for a component. Returns whether successful;
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    private boolean requestFocus(final AccessibleContext ac) {
+        debugString("requestFocus");
+        if (ac == null) {
+            return false;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                AccessibleComponent acomp = ac.getAccessibleComponent();
+                if (acomp == null) {
+                    return false;
+                }
+                acomp.requestFocus();
+                return ac.getAccessibleStateSet().contains(AccessibleState.FOCUSED);
+            }
+        }, ac);
+    }
+
+    /**
+     * Selects text between two indices.  Selection includes the
+     * text at the start index and the text at the end index. Returns
+     * whether successful;
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    private boolean selectTextRange(final AccessibleContext ac, final int startIndex, final int endIndex) {
+        debugString("selectTextRange: start = "+startIndex+"; end = "+endIndex);
+        if (ac == null) {
+            return false;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (!(at instanceof AccessibleEditableText)) {
+                    return false;
+                }
+                ((AccessibleEditableText) at).selectText(startIndex, endIndex);
+
+                boolean result = at.getSelectionStart() == startIndex &&
+                        at.getSelectionEnd() == endIndex;
+                return result;
+            }
+        }, ac);
+    }
+
+    /**
+     * Set the caret to a text position. Returns whether successful;
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    private boolean setCaretPosition(final AccessibleContext ac, final int position) {
+        debugString("setCaretPosition: position = "+position);
+        if (ac == null) {
+            return false;
+        }
+        return InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                AccessibleText at = ac.getAccessibleText();
+                if (!(at instanceof AccessibleEditableText)) {
+                    return false;
+                }
+                ((AccessibleEditableText) at).selectText(position, position);
+                return at.getCaretPosition() == position;
+            }
+        }, ac);
+    }
+
+    /**
+     * Gets the number of visible children of an AccessibleContext.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    private int _visibleChildrenCount;
+    private AccessibleContext _visibleChild;
+    private int _currentVisibleIndex;
+    private boolean _foundVisibleChild;
+
+    private int getVisibleChildrenCount(AccessibleContext ac) {
+        debugString("getVisibleChildrenCount");
+        if (ac == null) {
+            return -1;
+        }
+        _visibleChildrenCount = 0;
+        _getVisibleChildrenCount(ac);
+        debugString("  _visibleChildrenCount = "+_visibleChildrenCount);
+        return _visibleChildrenCount;
+    }
+
+    /*
+     * Recursively descends AccessibleContext and gets the number
+     * of visible children
+     */
+    private void _getVisibleChildrenCount(final AccessibleContext ac) {
+        if (ac == null)
+            return;
+        int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return ac.getAccessibleChildrenCount();
+            }
+        }, ac);
+        for (int i = 0; i < numChildren; i++) {
+            final int idx = i;
+            final AccessibleContext ac2 = InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                @Override
+                public AccessibleContext call() throws Exception {
+                    Accessible a = ac.getAccessibleChild(idx);
+                    if (a != null)
+                        return a.getAccessibleContext();
+                    else
+                        return null;
+                }
+            }, ac);
+            if ( ac2 == null ||
+                 (!InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+                     @Override
+                     public Boolean call() throws Exception {
+                         return ac2.getAccessibleStateSet().contains(AccessibleState.SHOWING);
+                     }
+                 }, ac))
+               ) {
+                continue;
+            }
+            _visibleChildrenCount++;
+
+            if (InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                @Override
+                public Integer call() throws Exception {
+                    return ac2.getAccessibleChildrenCount();
+                }
+            }, ac) > 0 ) {
+                _getVisibleChildrenCount(ac2);
+            }
+        }
+    }
+
+    /**
+     * Gets the visible child of an AccessibleContext at the
+     * specified index
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    private AccessibleContext getVisibleChild(AccessibleContext ac, int index) {
+        debugString("getVisibleChild: index = "+index);
+        if (ac == null) {
+            return null;
+        }
+        _visibleChild = null;
+        _currentVisibleIndex = 0;
+        _foundVisibleChild = false;
+        _getVisibleChild(ac, index);
+
+        if (_visibleChild != null) {
+            debugString( "    getVisibleChild: found child = " +
+                         InvocationUtils.invokeAndWait(new Callable<String>() {
+                             @Override
+                             public String call() throws Exception {
+                                 return AccessBridge.this._visibleChild.getAccessibleName();
+                             }
+                         }, ac) );
+        }
+        return _visibleChild;
+    }
+
+    /*
+     * Recursively searchs AccessibleContext and finds the visible component
+     * at the specified index
+     */
+    private void _getVisibleChild(final AccessibleContext ac, final int index) {
+        if (_visibleChild != null) {
+            return;
+        }
+
+        int numChildren = InvocationUtils.invokeAndWait(new Callable<Integer>() {
+            @Override
+            public Integer call() throws Exception {
+                return ac.getAccessibleChildrenCount();
+            }
+        }, ac);
+        for (int i = 0; i < numChildren; i++) {
+            final int idx=i;
+            final AccessibleContext ac2=InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
+                @Override
+                public AccessibleContext call() throws Exception {
+                    Accessible a = ac.getAccessibleChild(idx);
+                    if (a == null)
+                        return null;
+                    else
+                        return a.getAccessibleContext();
+                }
+            }, ac);
+            if (ac2 == null ||
+            (!InvocationUtils.invokeAndWait(new Callable<Boolean>() {
+                @Override
+                public Boolean call() throws Exception {
+                    return ac2.getAccessibleStateSet().contains(AccessibleState.SHOWING);
+                }
+            }, ac))) {
+                continue;
+            }
+            if (!_foundVisibleChild && _currentVisibleIndex == index) {
+            _visibleChild = ac2;
+            _foundVisibleChild = true;
+            return;
+            }
+            _currentVisibleIndex++;
+
+            if ( InvocationUtils.invokeAndWait(new Callable<Integer>() {
+                @Override
+                public Integer call() throws Exception {
+                    return ac2.getAccessibleChildrenCount();
+                }
+            }, ac) > 0 ) {
+                _getVisibleChild(ac2, index);
+            }
+        }
+    }
+
+
+    /* ===== Java object memory management code ===== */
+
+    /**
+     * Class to track object references to ensure the
+     * Java VM doesn't garbage collect them
+     */
+    private class ObjectReferences {
+
+        private class Reference {
+            private int value;
+
+            Reference(int i) {
+                value = i;
+            }
+
+            public String toString() {
+                return ("refCount: " + value);
+            }
+        }
+
+        /**
+        * table object references, to keep 'em from being garbage collected
+        */
+        private ConcurrentHashMap<Object,Reference> refs;
+
+        /**
+        * Constructor
+        */
+        ObjectReferences() {
+            refs = new ConcurrentHashMap<>(4);
+        }
+
+        /**
+        * Debugging: dump the contents of ObjectReferences' refs Hashtable
+        */
+        String dump() {
+            return refs.toString();
+        }
+
+        /**
+        * Increment ref count; set to 1 if we have no references for it
+        */
+        void increment(Object o) {
+            if (o == null){
+                debugString("ObjectReferences::increment - Passed in object is null");
+                return;
+            }
+
+            if (refs.containsKey(o)) {
+                (refs.get(o)).value++;
+            } else {
+                refs.put(o, new Reference(1));
+            }
+        }
+
+        /**
+        * Decrement ref count; remove if count drops to 0
+        */
+        void decrement(Object o) {
+            Reference aRef = refs.get(o);
+            if (aRef != null) {
+                aRef.value--;
+                if (aRef.value == 0) {
+                    refs.remove(o);
+                } else if (aRef.value < 0) {
+                    debugString("ERROR: decrementing reference count below 0");
+                }
+            } else {
+                debugString("ERROR: object to decrement not in ObjectReferences table");
+            }
+        }
+
+    }
+
+    /* ===== event handling code ===== */
+
+   /**
+     * native method for handling property change events
+     */
+    private native void propertyCaretChange(PropertyChangeEvent e,
+                        AccessibleContext src,
+                        int oldValue, int newValue);
+    private native void propertyDescriptionChange(PropertyChangeEvent e,
+                        AccessibleContext src,
+                        String oldValue, String newValue);
+    private native void propertyNameChange(PropertyChangeEvent e,
+                        AccessibleContext src,
+                        String oldValue, String newValue);
+    private native void propertySelectionChange(PropertyChangeEvent e,
+                        AccessibleContext src);
+    private native void propertyStateChange(PropertyChangeEvent e,
+                        AccessibleContext src,
+                        String oldValue, String newValue);
+    private native void propertyTextChange(PropertyChangeEvent e,
+                        AccessibleContext src);
+    private native void propertyValueChange(PropertyChangeEvent e,
+                        AccessibleContext src,
+                        String oldValue, String newValue);
+    private native void propertyVisibleDataChange(PropertyChangeEvent e,
+                        AccessibleContext src);
+    private native void propertyChildChange(PropertyChangeEvent e,
+                        AccessibleContext src,
+                        AccessibleContext oldValue,
+                        AccessibleContext newValue);
+    private native void propertyActiveDescendentChange(PropertyChangeEvent e,
+                        AccessibleContext src,
+                        AccessibleContext oldValue,
+                        AccessibleContext newValue);
+
+    private native void javaShutdown();
+
+    /**
+     * native methods for handling focus events
+     */
+    private native void focusGained(FocusEvent e, AccessibleContext src);
+    private native void focusLost(FocusEvent e, AccessibleContext src);
+
+    /**
+     * native method for handling caret events
+     */
+    private native void caretUpdate(CaretEvent e, AccessibleContext src);
+
+    /**
+     * native methods for handling mouse events
+     */
+    private native void mouseClicked(MouseEvent e, AccessibleContext src);
+    private native void mouseEntered(MouseEvent e, AccessibleContext src);
+    private native void mouseExited(MouseEvent e, AccessibleContext src);
+    private native void mousePressed(MouseEvent e, AccessibleContext src);
+    private native void mouseReleased(MouseEvent e, AccessibleContext src);
+
+    /**
+     * native methods for handling menu & popupMenu events
+     */
+    private native void menuCanceled(MenuEvent e, AccessibleContext src);
+    private native void menuDeselected(MenuEvent e, AccessibleContext src);
+    private native void menuSelected(MenuEvent e, AccessibleContext src);
+    private native void popupMenuCanceled(PopupMenuEvent e, AccessibleContext src);
+    private native void popupMenuWillBecomeInvisible(PopupMenuEvent e,
+                                                     AccessibleContext src);
+    private native void popupMenuWillBecomeVisible(PopupMenuEvent e,
+                                                   AccessibleContext src);
+
+    /* ===== event definitions ===== */
+
+    private static final long PROPERTY_CHANGE_EVENTS = 1;
+    private static final long FOCUS_GAINED_EVENTS = 2;
+    private static final long FOCUS_LOST_EVENTS = 4;
+    private static final long FOCUS_EVENTS = (FOCUS_GAINED_EVENTS | FOCUS_LOST_EVENTS);
+
+    private static final long CARET_UPATE_EVENTS = 8;
+    private static final long CARET_EVENTS = CARET_UPATE_EVENTS;
+
+    private static final long MOUSE_CLICKED_EVENTS = 16;
+    private static final long MOUSE_ENTERED_EVENTS = 32;
+    private static final long MOUSE_EXITED_EVENTS = 64;
+    private static final long MOUSE_PRESSED_EVENTS = 128;
+    private static final long MOUSE_RELEASED_EVENTS = 256;
+    private static final long MOUSE_EVENTS = (MOUSE_CLICKED_EVENTS | MOUSE_ENTERED_EVENTS |
+                                             MOUSE_EXITED_EVENTS | MOUSE_PRESSED_EVENTS |
+                                             MOUSE_RELEASED_EVENTS);
+
+    private static final long MENU_CANCELED_EVENTS = 512;
+    private static final long MENU_DESELECTED_EVENTS = 1024;
+    private static final long MENU_SELECTED_EVENTS = 2048;
+    private static final long MENU_EVENTS = (MENU_CANCELED_EVENTS | MENU_DESELECTED_EVENTS |
+                                            MENU_SELECTED_EVENTS);
+
+    private static final long POPUPMENU_CANCELED_EVENTS = 4096;
+    private static final long POPUPMENU_WILL_BECOME_INVISIBLE_EVENTS = 8192;
+    private static final long POPUPMENU_WILL_BECOME_VISIBLE_EVENTS = 16384;
+    private static final long POPUPMENU_EVENTS = (POPUPMENU_CANCELED_EVENTS |
+                                                 POPUPMENU_WILL_BECOME_INVISIBLE_EVENTS |
+                                                 POPUPMENU_WILL_BECOME_VISIBLE_EVENTS);
+
+    /* These use their own numbering scheme, to ensure sufficient expansion room */
+    private static final long PROPERTY_NAME_CHANGE_EVENTS = 1;
+    private static final long PROPERTY_DESCRIPTION_CHANGE_EVENTS = 2;
+    private static final long PROPERTY_STATE_CHANGE_EVENTS = 4;
+    private static final long PROPERTY_VALUE_CHANGE_EVENTS = 8;
+    private static final long PROPERTY_SELECTION_CHANGE_EVENTS = 16;
+    private static final long PROPERTY_TEXT_CHANGE_EVENTS = 32;
+    private static final long PROPERTY_CARET_CHANGE_EVENTS = 64;
+    private static final long PROPERTY_VISIBLEDATA_CHANGE_EVENTS = 128;
+    private static final long PROPERTY_CHILD_CHANGE_EVENTS = 256;
+    private static final long PROPERTY_ACTIVEDESCENDENT_CHANGE_EVENTS = 512;
+
+
+    private static final long PROPERTY_EVENTS = (PROPERTY_NAME_CHANGE_EVENTS |
+                                                PROPERTY_DESCRIPTION_CHANGE_EVENTS |
+                                                PROPERTY_STATE_CHANGE_EVENTS |
+                                                PROPERTY_VALUE_CHANGE_EVENTS |
+                                                PROPERTY_SELECTION_CHANGE_EVENTS |
+                                                PROPERTY_TEXT_CHANGE_EVENTS |
+                                                PROPERTY_CARET_CHANGE_EVENTS |
+                                                PROPERTY_VISIBLEDATA_CHANGE_EVENTS |
+                                                PROPERTY_CHILD_CHANGE_EVENTS |
+                                                PROPERTY_ACTIVEDESCENDENT_CHANGE_EVENTS);
+
+    /**
+     * The EventHandler class listens for Java events and
+     * forwards them to the AT
+     */
+    private class EventHandler implements PropertyChangeListener,
+                                          FocusListener, CaretListener,
+                                          MenuListener, PopupMenuListener,
+                                          MouseListener, WindowListener,
+                                          ChangeListener {
+
+        private AccessBridge accessBridge;
+        private long javaEventMask = 0;
+        private long accessibilityEventMask = 0;
+
+        EventHandler(AccessBridge bridge) {
+            accessBridge = bridge;
+
+            // Register to receive WINDOW_OPENED and WINDOW_CLOSED
+            // events.  Add the event source as a native window
+            // handler is it implements NativeWindowHandler.
+            // SwingEventMonitor.addWindowListener(this);
+        }
+
+        // --------- Event Notification Registration methods
+
+        /**
+         * Invoked the first time a window is made visible.
+         */
+        public void windowOpened(WindowEvent e) {
+            // If the window is a NativeWindowHandler, add it.
+            Object o = null;
+            if (e != null)
+                o = e.getSource();
+            if (o instanceof NativeWindowHandler) {
+                addNativeWindowHandler((NativeWindowHandler)o);
+            }
+        }
+
+        /**
+         * Invoked when the user attempts to close the window
+         * from the window's system menu.  If the program does not
+         * explicitly hide or dispose the window while processing
+         * this event, the window close operation will be canceled.
+         */
+        public void windowClosing(WindowEvent e) {}
+
+        /**
+         * Invoked when a window has been closed as the result
+         * of calling dispose on the window.
+         */
+        public void windowClosed(WindowEvent e) {
+            // If the window is a NativeWindowHandler, remove it.
+            Object o = null;
+            if (e != null)
+                o = e.getSource();
+            if (o instanceof NativeWindowHandler) {
+                removeNativeWindowHandler((NativeWindowHandler)o);
+            }
+        }
+
+        /**
+         * Invoked when a window is changed from a normal to a
+         * minimized state. For many platforms, a minimized window
+         * is displayed as the icon specified in the window's
+         * iconImage property.
+         * @see java.awt.Frame#setIconImage
+         */
+        public void windowIconified(WindowEvent e) {}
+
+        /**
+         * Invoked when a window is changed from a minimized
+         * to a normal state.
+         */
+        public void windowDeiconified(WindowEvent e) {}
+
+        /**
+         * Invoked when the Window is set to be the active Window. Only a Frame or
+         * a Dialog can be the active Window. The native windowing system may
+         * denote the active Window or its children with special decorations, such
+         * as a highlighted title bar. The active Window is always either the
+         * focused Window, or the first Frame or Dialog that is an owner of the
+         * focused Window.
+         */
+        public void windowActivated(WindowEvent e) {}
+
+        /**
+         * Invoked when a Window is no longer the active Window. Only a Frame or a
+         * Dialog can be the active Window. The native windowing system may denote
+         * the active Window or its children with special decorations, such as a
+         * highlighted title bar. The active Window is always either the focused
+         * Window, or the first Frame or Dialog that is an owner of the focused
+         * Window.
+         */
+        public void windowDeactivated(WindowEvent e) {}
+
+        /**
+         * Turn on event monitoring for the event type passed in
+         * If necessary, add the appropriate event listener (if
+         * no other event of that type is being listened for)
+         */
+        void addJavaEventNotification(long type) {
+            long newEventMask = javaEventMask | type;
+            /*
+            if ( ((javaEventMask & PROPERTY_EVENTS) == 0) &&
+                 ((newEventMask & PROPERTY_EVENTS) != 0) ) {
+                AccessibilityEventMonitor.addPropertyChangeListener(this);
+            }
+            */
+            if ( ((javaEventMask & FOCUS_EVENTS) == 0) &&
+                ((newEventMask & FOCUS_EVENTS) != 0) ) {
+                SwingEventMonitor.addFocusListener(this);
+            }
+            if ( ((javaEventMask & CARET_EVENTS) == 0) &&
+                ((newEventMask & CARET_EVENTS) != 0) ) {
+                SwingEventMonitor.addCaretListener(this);
+            }
+            if ( ((javaEventMask & MOUSE_EVENTS) == 0) &&
+                ((newEventMask & MOUSE_EVENTS) != 0) ) {
+                SwingEventMonitor.addMouseListener(this);
+            }
+            if ( ((javaEventMask & MENU_EVENTS) == 0) &&
+                ((newEventMask & MENU_EVENTS) != 0) ) {
+                SwingEventMonitor.addMenuListener(this);
+                SwingEventMonitor.addPopupMenuListener(this);
+            }
+            if ( ((javaEventMask & POPUPMENU_EVENTS) == 0) &&
+                ((newEventMask & POPUPMENU_EVENTS) != 0) ) {
+                SwingEventMonitor.addPopupMenuListener(this);
+            }
+
+            javaEventMask = newEventMask;
+        }
+
+        /**
+         * Turn off event monitoring for the event type passed in
+         * If necessary, remove the appropriate event listener (if
+         * no other event of that type is being listened for)
+         */
+        void removeJavaEventNotification(long type) {
+            long newEventMask = javaEventMask & (~type);
+            /*
+            if ( ((javaEventMask & PROPERTY_EVENTS) != 0) &&
+                 ((newEventMask & PROPERTY_EVENTS) == 0) ) {
+                AccessibilityEventMonitor.removePropertyChangeListener(this);
+            }
+            */
+            if (((javaEventMask & FOCUS_EVENTS) != 0) &&
+                ((newEventMask & FOCUS_EVENTS) == 0)) {
+                SwingEventMonitor.removeFocusListener(this);
+            }
+            if (((javaEventMask & CARET_EVENTS) != 0) &&
+                ((newEventMask & CARET_EVENTS) == 0)) {
+                SwingEventMonitor.removeCaretListener(this);
+            }
+            if (((javaEventMask & MOUSE_EVENTS) == 0) &&
+                ((newEventMask & MOUSE_EVENTS) != 0)) {
+                SwingEventMonitor.removeMouseListener(this);
+            }
+            if (((javaEventMask & MENU_EVENTS) == 0) &&
+                ((newEventMask & MENU_EVENTS) != 0)) {
+                SwingEventMonitor.removeMenuListener(this);
+            }
+            if (((javaEventMask & POPUPMENU_EVENTS) == 0) &&
+                ((newEventMask & POPUPMENU_EVENTS) != 0)) {
+                SwingEventMonitor.removePopupMenuListener(this);
+            }
+
+            javaEventMask = newEventMask;
+        }
+
+        /**
+         * Turn on event monitoring for the event type passed in
+         * If necessary, add the appropriate event listener (if
+         * no other event of that type is being listened for)
+         */
+        void addAccessibilityEventNotification(long type) {
+            long newEventMask = accessibilityEventMask | type;
+            if ( ((accessibilityEventMask & PROPERTY_EVENTS) == 0) &&
+                 ((newEventMask & PROPERTY_EVENTS) != 0) ) {
+                AccessibilityEventMonitor.addPropertyChangeListener(this);
+            }
+            accessibilityEventMask = newEventMask;
+        }
+
+        /**
+         * Turn off event monitoring for the event type passed in
+         * If necessary, remove the appropriate event listener (if
+         * no other event of that type is being listened for)
+         */
+        void removeAccessibilityEventNotification(long type) {
+            long newEventMask = accessibilityEventMask & (~type);
+            if ( ((accessibilityEventMask & PROPERTY_EVENTS) != 0) &&
+                 ((newEventMask & PROPERTY_EVENTS) == 0) ) {
+                AccessibilityEventMonitor.removePropertyChangeListener(this);
+            }
+            accessibilityEventMask = newEventMask;
+        }
+
+        /**
+         *  ------- property change event glue
+         */
+        // This is invoked on the EDT , as
+        public void propertyChange(PropertyChangeEvent e) {
+
+            accessBridge.debugString("propertyChange(" + e.toString() + ") called");
+
+            if (e != null && (accessibilityEventMask & PROPERTY_EVENTS) != 0) {
+                Object o = e.getSource();
+                AccessibleContext ac;
+
+                if (o instanceof AccessibleContext) {
+                    ac = (AccessibleContext) o;
+                } else {
+                    Accessible a = Translator.getAccessible(e.getSource());
+                    if (a == null)
+                        return;
+                    else
+                        ac = a.getAccessibleContext();
+                }
+                if (ac != null) {
+                    InvocationUtils.registerAccessibleContext(ac, AppContext.getAppContext());
+
+                    accessBridge.debugString("AccessibleContext: " + ac);
+                    String propertyName = e.getPropertyName();
+
+                    if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_CARET_PROPERTY) == 0) {
+                        int oldValue = 0;
+                        int newValue = 0;
+
+                        if (e.getOldValue() instanceof Integer) {
+                            oldValue = ((Integer) e.getOldValue()).intValue();
+                        }
+                        if (e.getNewValue() instanceof Integer) {
+                            newValue = ((Integer) e.getNewValue()).intValue();
+                        }
+                        accessBridge.debugString(" - about to call propertyCaretChange()");
+                        accessBridge.debugString("   old value: " + oldValue + "new value: " + newValue);
+                        accessBridge.propertyCaretChange(e, ac, oldValue, newValue);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_DESCRIPTION_PROPERTY) == 0) {
+                        String oldValue = null;
+                        String newValue = null;
+
+                        if (e.getOldValue() != null) {
+                            oldValue = e.getOldValue().toString();
+                        }
+                        if (e.getNewValue() != null) {
+                            newValue = e.getNewValue().toString();
+                        }
+                        accessBridge.debugString(" - about to call propertyDescriptionChange()");
+                        accessBridge.debugString("   old value: " + oldValue + "new value: " + newValue);
+                        accessBridge.propertyDescriptionChange(e, ac, oldValue, newValue);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_NAME_PROPERTY) == 0) {
+                        String oldValue = null;
+                        String newValue = null;
+
+                        if (e.getOldValue() != null) {
+                            oldValue = e.getOldValue().toString();
+                        }
+                        if (e.getNewValue() != null) {
+                            newValue = e.getNewValue().toString();
+                        }
+                        accessBridge.debugString(" - about to call propertyNameChange()");
+                        accessBridge.debugString("   old value: " + oldValue + " new value: " + newValue);
+                        accessBridge.propertyNameChange(e, ac, oldValue, newValue);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY) == 0) {
+                        accessBridge.debugString(" - about to call propertySelectionChange() " + ac +  "   " + Thread.currentThread() + "   " + e.getSource());
+
+                        accessBridge.propertySelectionChange(e, ac);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_STATE_PROPERTY) == 0) {
+                        String oldValue = null;
+                        String newValue = null;
+
+                        // Localization fix requested by Oliver for EA-1
+                        if (e.getOldValue() != null) {
+                            AccessibleState oldState = (AccessibleState) e.getOldValue();
+                            oldValue = oldState.toDisplayString(Locale.US);
+                        }
+                        if (e.getNewValue() != null) {
+                            AccessibleState newState = (AccessibleState) e.getNewValue();
+                            newValue = newState.toDisplayString(Locale.US);
+                        }
+
+                        accessBridge.debugString(" - about to call propertyStateChange()");
+                        accessBridge.propertyStateChange(e, ac, oldValue, newValue);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_TEXT_PROPERTY) == 0) {
+                        accessBridge.debugString(" - about to call propertyTextChange()");
+                        accessBridge.propertyTextChange(e, ac);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_VALUE_PROPERTY) == 0) {  // strings 'cause of floating point, etc.
+                        String oldValue = null;
+                        String newValue = null;
+
+                        if (e.getOldValue() != null) {
+                            oldValue = e.getOldValue().toString();
+                        }
+                        if (e.getNewValue() != null) {
+                            newValue = e.getNewValue().toString();
+                        }
+                        accessBridge.debugString(" - about to call propertyDescriptionChange()");
+                        accessBridge.propertyValueChange(e, ac, oldValue, newValue);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY) == 0) {
+                        accessBridge.propertyVisibleDataChange(e, ac);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY) == 0) {
+                        AccessibleContext oldAC = null;
+                        AccessibleContext newAC = null;
+                        Accessible a;
+
+                        if (e.getOldValue() instanceof AccessibleContext) {
+                            oldAC = (AccessibleContext) e.getOldValue();
+                            InvocationUtils.registerAccessibleContext(oldAC, AppContext.getAppContext());
+                        }
+                        if (e.getNewValue() instanceof AccessibleContext) {
+                            newAC = (AccessibleContext) e.getNewValue();
+                            InvocationUtils.registerAccessibleContext(newAC, AppContext.getAppContext());
+                        }
+                        accessBridge.debugString(" - about to call propertyChildChange()");
+                        accessBridge.debugString("   old AC: " + oldAC + "new AC: " + newAC);
+                        accessBridge.propertyChildChange(e, ac, oldAC, newAC);
+
+                    } else if (propertyName.compareTo(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY) == 0) {
+                        handleActiveDescendentEvent(e, ac);
+                    }
+                }
+            }
+        }
+
+        /*
+        * Handle an ActiveDescendent PropertyChangeEvent.  This
+        * method works around a JTree bug where ActiveDescendent
+        * PropertyChangeEvents have the wrong parent.
+        */
+        private AccessibleContext prevAC = null; // previous AccessibleContext
+
+        private void handleActiveDescendentEvent(PropertyChangeEvent e,
+                                                 AccessibleContext ac) {
+            if (e == null || ac == null)
+                return;
+            AccessibleContext oldAC = null;
+            AccessibleContext newAC = null;
+            Accessible a;
+
+            // get the old active descendent
+            if (e.getOldValue() instanceof Accessible) {
+                oldAC = ((Accessible) e.getOldValue()).getAccessibleContext();
+            } else if (e.getOldValue() instanceof Component) {
+                a = Translator.getAccessible(e.getOldValue());
+                if (a != null) {
+                    oldAC = a.getAccessibleContext();
+                }
+            }
+            if (oldAC != null) {
+                Accessible parent = oldAC.getAccessibleParent();
+                if (parent instanceof JTree) {
+                    // use the previous AccessibleJTreeNode
+                    oldAC = prevAC;
+                }
+            }
+
+            // get the new active descendent
+            if (e.getNewValue() instanceof Accessible) {
+                newAC = ((Accessible) e.getNewValue()).getAccessibleContext();
+            } else if (e.getNewValue() instanceof Component) {
+                a = Translator.getAccessible(e.getNewValue());
+                if (a != null) {
+                    newAC = a.getAccessibleContext();
+                }
+            }
+            if (newAC != null) {
+                Accessible parent = newAC.getAccessibleParent();
+                if (parent instanceof JTree) {
+                    // use a new AccessibleJTreeNode with the right parent
+                    JTree tree = (JTree)parent;
+                    newAC = new AccessibleJTreeNode(tree,
+                                                    tree.getSelectionPath(),
+                                                    null);
+                }
+            }
+            prevAC = newAC;
+
+            accessBridge.debugString("  - about to call propertyActiveDescendentChange()");
+            accessBridge.debugString("   AC: " + ac);
+            accessBridge.debugString("   old AC: " + oldAC + "new AC: " + newAC);
+
+            InvocationUtils.registerAccessibleContext(oldAC, AppContext.getAppContext());
+            InvocationUtils.registerAccessibleContext(newAC, AppContext.getAppContext());
+            accessBridge.propertyActiveDescendentChange(e, ac, oldAC, newAC);
+        }
+
+        /**
+        *  ------- focus event glue
+        */
+        private boolean stateChangeListenerAdded = false;
+
+        public void focusGained(FocusEvent e) {
+            processFocusGained();
+        }
+
+        public void stateChanged(ChangeEvent e) {
+            processFocusGained();
+        }
+
+        private void processFocusGained() {
+            Component focusOwner = KeyboardFocusManager.
+            getCurrentKeyboardFocusManager().getFocusOwner();
+            if (focusOwner == null) {
+                return;
+            }
+
+            // Only menus and popup selections are handled by the JRootPane.
+            if (focusOwner instanceof JRootPane) {
+                MenuElement [] path =
+                MenuSelectionManager.defaultManager().getSelectedPath();
+                if (path.length > 1) {
+                    Component penult = path[path.length-2].getComponent();
+                    Component last = path[path.length-1].getComponent();
+
+                    if (last instanceof JPopupMenu) {
+                        // This is a popup with nothing in the popup
+                        // selected. The menu itself is selected.
+                        FocusEvent e = new FocusEvent(penult, FocusEvent.FOCUS_GAINED);
+                        AccessibleContext context = penult.getAccessibleContext();
+                        InvocationUtils.registerAccessibleContext(context, SunToolkit.targetToAppContext(penult));
+                        accessBridge.focusGained(e, context);
+                    } else if (penult instanceof JPopupMenu) {
+                        // This is a popup with an item selected
+                        FocusEvent e =
+                        new FocusEvent(last, FocusEvent.FOCUS_GAINED);
+                        accessBridge.debugString(" - about to call focusGained()");
+                        AccessibleContext focusedAC = last.getAccessibleContext();
+                        InvocationUtils.registerAccessibleContext(focusedAC, SunToolkit.targetToAppContext(last));
+                        accessBridge.debugString("   AC: " + focusedAC);
+                        accessBridge.focusGained(e, focusedAC);
+                    }
+                }
+            } else {
+                // The focus owner has the selection.
+                if (focusOwner instanceof Accessible) {
+                    FocusEvent e = new FocusEvent(focusOwner,
+                                                  FocusEvent.FOCUS_GAINED);
+                    accessBridge.debugString(" - about to call focusGained()");
+                    AccessibleContext focusedAC = focusOwner.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(focusedAC, SunToolkit.targetToAppContext(focusOwner));
+                    accessBridge.debugString("   AC: " + focusedAC);
+                    accessBridge.focusGained(e, focusedAC);
+                }
+            }
+        }
+
+        public void focusLost(FocusEvent e) {
+            if (e != null && (javaEventMask & FOCUS_LOST_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    accessBridge.debugString(" - about to call focusLost()");
+                    accessBridge.debugString("   AC: " + a.getAccessibleContext());
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.focusLost(e, context);
+                }
+            }
+        }
+
+        /**
+         *  ------- caret event glue
+         */
+        public void caretUpdate(CaretEvent e) {
+            if (e != null && (javaEventMask & CARET_UPATE_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.caretUpdate(e, context);
+                }
+            }
+        }
+
+    /**
+     *  ------- mouse event glue
+     */
+
+        public void mouseClicked(MouseEvent e) {
+            if (e != null && (javaEventMask & MOUSE_CLICKED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.mouseClicked(e, context);
+                }
+            }
+        }
+
+        public void mouseEntered(MouseEvent e) {
+            if (e != null && (javaEventMask & MOUSE_ENTERED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.mouseEntered(e, context);
+                }
+            }
+        }
+
+        public void mouseExited(MouseEvent e) {
+            if (e != null && (javaEventMask & MOUSE_EXITED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.mouseExited(e, context);
+                }
+            }
+        }
+
+        public void mousePressed(MouseEvent e) {
+            if (e != null && (javaEventMask & MOUSE_PRESSED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.mousePressed(e, context);
+                }
+            }
+        }
+
+        public void mouseReleased(MouseEvent e) {
+            if (e != null && (javaEventMask & MOUSE_RELEASED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.mouseReleased(e, context);
+                }
+            }
+        }
+
+        /**
+         *  ------- menu event glue
+         */
+        public void menuCanceled(MenuEvent e) {
+            if (e != null && (javaEventMask & MENU_CANCELED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.menuCanceled(e, context);
+                }
+            }
+        }
+
+        public void menuDeselected(MenuEvent e) {
+            if (e != null && (javaEventMask & MENU_DESELECTED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.menuDeselected(e, context);
+                }
+            }
+        }
+
+        public void menuSelected(MenuEvent e) {
+            if (e != null && (javaEventMask & MENU_SELECTED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.menuSelected(e, context);
+                }
+            }
+        }
+
+        public void popupMenuCanceled(PopupMenuEvent e) {
+            if (e != null && (javaEventMask & POPUPMENU_CANCELED_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.popupMenuCanceled(e, context);
+                }
+            }
+        }
+
+        public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+            if (e != null && (javaEventMask & POPUPMENU_WILL_BECOME_INVISIBLE_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.popupMenuWillBecomeInvisible(e, context);
+                }
+            }
+        }
+
+        public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+            if (e != null && (javaEventMask & POPUPMENU_WILL_BECOME_VISIBLE_EVENTS) != 0) {
+                Accessible a = Translator.getAccessible(e.getSource());
+                if (a != null) {
+                    AccessibleContext context = a.getAccessibleContext();
+                    InvocationUtils.registerAccessibleContext(context, AppContext.getAppContext());
+                    accessBridge.popupMenuWillBecomeVisible(e, context);
+                }
+            }
+        }
+
+    } // End of EventHandler Class
+
+    // --------- Event Notification Registration methods
+
+    /**
+     *  Wrapper method around eventHandler.addJavaEventNotification()
+     */
+    private void addJavaEventNotification(final long type) {
+        EventQueue.invokeLater(new Runnable() {
+            public void run(){
+                eventHandler.addJavaEventNotification(type);
+            }
+        });
+    }
+
+    /**
+     *  Wrapper method around eventHandler.removeJavaEventNotification()
+     */
+    private void removeJavaEventNotification(final long type) {
+        EventQueue.invokeLater(new Runnable() {
+            public void run(){
+                eventHandler.removeJavaEventNotification(type);
+            }
+        });
+    }
+
+
+    /**
+     *  Wrapper method around eventHandler.addAccessibilityEventNotification()
+     */
+    private void addAccessibilityEventNotification(final long type) {
+        EventQueue.invokeLater(new Runnable() {
+            public void run(){
+                eventHandler.addAccessibilityEventNotification(type);
+            }
+        });
+    }
+
+    /**
+     *  Wrapper method around eventHandler.removeAccessibilityEventNotification()
+     */
+    private void removeAccessibilityEventNotification(final long type) {
+        EventQueue.invokeLater(new Runnable() {
+            public void run(){
+                eventHandler.removeAccessibilityEventNotification(type);
+            }
+        });
+    }
+
+    /**
+     ******************************************************
+     * All AccessibleRoles
+     *
+     * We shouldn't have to do this since it requires us
+     * to synchronize the allAccessibleRoles array when
+     * the AccessibleRoles class interface changes. However,
+     * there is no Accessibility API method to get all
+     * AccessibleRoles
+     ******************************************************
+     */
+    private AccessibleRole [] allAccessibleRoles = {
+    /**
+     * Object is used to alert the user about something.
+     */
+    AccessibleRole.ALERT,
+
+    /**
+     * The header for a column of data.
+     */
+    AccessibleRole.COLUMN_HEADER,
+
+    /**
+     * Object that can be drawn into and is used to trap
+     * events.
+     * @see #FRAME
+     * @see #GLASS_PANE
+     * @see #LAYERED_PANE
+     */
+    AccessibleRole.CANVAS,
+
+    /**
+     * A list of choices the user can select from.  Also optionally
+     * allows the user to enter a choice of their own.
+     */
+    AccessibleRole.COMBO_BOX,
+
+    /**
+     * An iconified internal frame in a DESKTOP_PANE.
+     * @see #DESKTOP_PANE
+     * @see #INTERNAL_FRAME
+     */
+    AccessibleRole.DESKTOP_ICON,
+
+    /**
+     * A frame-like object that is clipped by a desktop pane.  The
+     * desktop pane, internal frame, and desktop icon objects are
+     * often used to create multiple document interfaces within an
+     * application.
+     * @see #DESKTOP_ICON
+     * @see #DESKTOP_PANE
+     * @see #FRAME
+     */
+    AccessibleRole.INTERNAL_FRAME,
+
+    /**
+     * A pane that supports internal frames and
+     * iconified versions of those internal frames.
+     * @see #DESKTOP_ICON
+     * @see #INTERNAL_FRAME
+     */
+    AccessibleRole.DESKTOP_PANE,
+
+    /**
+     * A specialized pane whose primary use is inside a DIALOG
+     * @see #DIALOG
+     */
+    AccessibleRole.OPTION_PANE,
+
+    /**
+     * A top level window with no title or border.
+     * @see #FRAME
+     * @see #DIALOG
+     */
+    AccessibleRole.WINDOW,
+
+    /**
+     * A top level window with a title bar, border, menu bar, etc.  It is
+     * often used as the primary window for an application.
+     * @see #DIALOG
+     * @see #CANVAS
+     * @see #WINDOW
+     */
+    AccessibleRole.FRAME,
+
+    /**
+     * A top level window with title bar and a border.  A dialog is similar
+     * to a frame, but it has fewer properties and is often used as a
+     * secondary window for an application.
+     * @see #FRAME
+     * @see #WINDOW
+     */
+    AccessibleRole.DIALOG,
+
+    /**
+     * A specialized dialog that lets the user choose a color.
+     */
+    AccessibleRole.COLOR_CHOOSER,
+
+
+    /**
+     * A pane that allows the user to navigate through
+     * and select the contents of a directory.  May be used
+     * by a file chooser.
+     * @see #FILE_CHOOSER
+     */
+    AccessibleRole.DIRECTORY_PANE,
+
+    /**
+     * A specialized dialog that displays the files in the directory
+     * and lets the user select a file, browse a different directory,
+     * or specify a filename.  May use the directory pane to show the
+     * contents of a directory.
+     * @see #DIRECTORY_PANE
+     */
+    AccessibleRole.FILE_CHOOSER,
+
+    /**
+     * An object that fills up space in a user interface.  It is often
+     * used in interfaces to tweak the spacing between components,
+     * but serves no other purpose.
+     */
+    AccessibleRole.FILLER,
+
+    /**
+     * A hypertext anchor
+     */
+    // AccessibleRole.HYPERLINK,
+
+    /**
+     * A small fixed size picture, typically used to decorate components.
+     */
+    AccessibleRole.ICON,
+
+    /**
+     * An object used to present an icon or short string in an interface.
+     */
+    AccessibleRole.LABEL,
+
+    /**
+     * A specialized pane that has a glass pane and a layered pane as its
+     * children.
+     * @see #GLASS_PANE
+     * @see #LAYERED_PANE
+     */
+    AccessibleRole.ROOT_PANE,
+
+    /**
+     * A pane that is guaranteed to be painted on top
+     * of all panes beneath it.
+     * @see #ROOT_PANE
+     * @see #CANVAS
+     */
+    AccessibleRole.GLASS_PANE,
+
+    /**
+     * A specialized pane that allows its children to be drawn in layers,
+     * providing a form of stacking order.  This is usually the pane that
+     * holds the menu bar as well as the pane that contains most of the
+     * visual components in a window.
+     * @see #GLASS_PANE
+     * @see #ROOT_PANE
+     */
+    AccessibleRole.LAYERED_PANE,
+
+    /**
+     * An object that presents a list of objects to the user and allows the
+     * user to select one or more of them.  A list is usually contained
+     * within a scroll pane.
+     * @see #SCROLL_PANE
+     * @see #LIST_ITEM
+     */
+    AccessibleRole.LIST,
+
+    /**
+     * An object that presents an element in a list.  A list is usually
+     * contained within a scroll pane.
+     * @see #SCROLL_PANE
+     * @see #LIST
+     */
+    AccessibleRole.LIST_ITEM,
+
+    /**
+     * An object usually drawn at the top of the primary dialog box of
+     * an application that contains a list of menus the user can choose
+     * from.  For example, a menu bar might contain menus for "File,"
+     * "Edit," and "Help."
+     * @see #MENU
+     * @see #POPUP_MENU
+     * @see #LAYERED_PANE
+     */
+    AccessibleRole.MENU_BAR,
+
+    /**
+     * A temporary window that is usually used to offer the user a
+     * list of choices, and then hides when the user selects one of
+     * those choices.
+     * @see #MENU
+     * @see #MENU_ITEM
+     */
+    AccessibleRole.POPUP_MENU,
+
+    /**
+     * An object usually found inside a menu bar that contains a list
+     * of actions the user can choose from.  A menu can have any object
+     * as its children, but most often they are menu items, other menus,
+     * or rudimentary objects such as radio buttons, check boxes, or
+     * separators.  For example, an application may have an "Edit" menu
+     * that contains menu items for "Cut" and "Paste."
+     * @see #MENU_BAR
+     * @see #MENU_ITEM
+     * @see #SEPARATOR
+     * @see #RADIO_BUTTON
+     * @see #CHECK_BOX
+     * @see #POPUP_MENU
+     */
+    AccessibleRole.MENU,
+
+    /**
+     * An object usually contained in a menu that presents an action
+     * the user can choose.  For example, the "Cut" menu item in an
+     * "Edit" menu would be an action the user can select to cut the
+     * selected area of text in a document.
+     * @see #MENU_BAR
+     * @see #SEPARATOR
+     * @see #POPUP_MENU
+     */
+    AccessibleRole.MENU_ITEM,
+
+    /**
+     * An object usually contained in a menu to provide a visual
+     * and logical separation of the contents in a menu.  For example,
+     * the "File" menu of an application might contain menu items for
+     * "Open," "Close," and "Exit," and will place a separator between
+     * "Close" and "Exit" menu items.
+     * @see #MENU
+     * @see #MENU_ITEM
+     */
+    AccessibleRole.SEPARATOR,
+
+    /**
+     * An object that presents a series of panels (or page tabs), one at a
+     * time, through some mechanism provided by the object.  The most common
+     * mechanism is a list of tabs at the top of the panel.  The children of
+     * a page tab list are all page tabs.
+     * @see #PAGE_TAB
+     */
+    AccessibleRole.PAGE_TAB_LIST,
+
+    /**
+     * An object that is a child of a page tab list.  Its sole child is
+     * the panel that is to be presented to the user when the user
+     * selects the page tab from the list of tabs in the page tab list.
+     * @see #PAGE_TAB_LIST
+     */
+    AccessibleRole.PAGE_TAB,
+
+    /**
+     * A generic container that is often used to group objects.
+     */
+    AccessibleRole.PANEL,
+
+    /**
+     * An object used to indicate how much of a task has been completed.
+     */
+    AccessibleRole.PROGRESS_BAR,
+
+    /**
+     * A text object used for passwords, or other places where the
+     * text contents is not shown visibly to the user
+     */
+    AccessibleRole.PASSWORD_TEXT,
+
+    /**
+     * An object the user can manipulate to tell the application to do
+     * something.
+     * @see #CHECK_BOX
+     * @see #TOGGLE_BUTTON
+     * @see #RADIO_BUTTON
+     */
+    AccessibleRole.PUSH_BUTTON,
+
+    /**
+     * A specialized push button that can be checked or unchecked, but
+     * does not provide a separate indicator for the current state.
+     * @see #PUSH_BUTTON
+     * @see #CHECK_BOX
+     * @see #RADIO_BUTTON
+     */
+    AccessibleRole.TOGGLE_BUTTON,
+
+    /**
+     * A choice that can be checked or unchecked and provides a
+     * separate indicator for the current state.
+     * @see #PUSH_BUTTON
+     * @see #TOGGLE_BUTTON
+     * @see #RADIO_BUTTON
+     */
+    AccessibleRole.CHECK_BOX,
+
+    /**
+     * A specialized check box that will cause other radio buttons in the
+     * same group to become unchecked when this one is checked.
+     * @see #PUSH_BUTTON
+     * @see #TOGGLE_BUTTON
+     * @see #CHECK_BOX
+     */
+    AccessibleRole.RADIO_BUTTON,
+
+    /**
+     * The header for a row of data.
+     */
+    AccessibleRole.ROW_HEADER,
+
+    /**
+     * An object that allows a user to incrementally view a large amount
+     * of information.  Its children can include scroll bars and a viewport.
+     * @see #SCROLL_BAR
+     * @see #VIEWPORT
+     */
+    AccessibleRole.SCROLL_PANE,
+
+    /**
+     * An object usually used to allow a user to incrementally view a
+     * large amount of data.  Usually used only by a scroll pane.
+     * @see #SCROLL_PANE
+     */
+    AccessibleRole.SCROLL_BAR,
+
+    /**
+     * An object usually used in a scroll pane.  It represents the portion
+     * of the entire data that the user can see.  As the user manipulates
+     * the scroll bars, the contents of the viewport can change.
+     * @see #SCROLL_PANE
+     */
+    AccessibleRole.VIEWPORT,
+
+    /**
+     * An object that allows the user to select from a bounded range.  For
+     * example, a slider might be used to select a number between 0 and 100.
+     */
+    AccessibleRole.SLIDER,
+
+    /**
+     * A specialized panel that presents two other panels at the same time.
+     * Between the two panels is a divider the user can manipulate to make
+     * one panel larger and the other panel smaller.
+     */
+    AccessibleRole.SPLIT_PANE,
+
+    /**
+     * An object used to present information in terms of rows and columns.
+     * An example might include a spreadsheet application.
+     */
+    AccessibleRole.TABLE,
+
+    /**
+     * An object that presents text to the user.  The text is usually
+     * editable by the user as opposed to a label.
+     * @see #LABEL
+     */
+    AccessibleRole.TEXT,
+
+    /**
+     * An object used to present hierarchical information to the user.
+     * The individual nodes in the tree can be collapsed and expanded
+     * to provide selective disclosure of the tree's contents.
+     */
+    AccessibleRole.TREE,
+
+    /**
+     * A bar or palette usually composed of push buttons or toggle buttons.
+     * It is often used to provide the most frequently used functions for an
+     * application.
+     */
+    AccessibleRole.TOOL_BAR,
+
+    /**
+     * An object that provides information about another object.  The
+     * accessibleDescription property of the tool tip is often displayed
+     * to the user in a small "help bubble" when the user causes the
+     * mouse to hover over the object associated with the tool tip.
+     */
+    AccessibleRole.TOOL_TIP,
+
+    /**
+     * An AWT component, but nothing else is known about it.
+     * @see #SWING_COMPONENT
+     * @see #UNKNOWN
+     */
+    AccessibleRole.AWT_COMPONENT,
+
+    /**
+     * A Swing component, but nothing else is known about it.
+     * @see #AWT_COMPONENT
+     * @see #UNKNOWN
+     */
+    AccessibleRole.SWING_COMPONENT,
+
+    /**
+     * The object contains some Accessible information, but its role is
+     * not known.
+     * @see #AWT_COMPONENT
+     * @see #SWING_COMPONENT
+     */
+    AccessibleRole.UNKNOWN,
+
+    // These roles are only available in JDK 1.4
+
+    /**
+     * A STATUS_BAR is an simple component that can contain
+     * multiple labels of status information to the user.
+     AccessibleRole.STATUS_BAR,
+
+     /**
+     * A DATE_EDITOR is a component that allows users to edit
+     * java.util.Date and java.util.Time objects
+     AccessibleRole.DATE_EDITOR,
+
+     /**
+     * A SPIN_BOX is a simple spinner component and its main use
+     * is for simple numbers.
+     AccessibleRole.SPIN_BOX,
+
+     /**
+     * A FONT_CHOOSER is a component that lets the user pick various
+     * attributes for fonts.
+     AccessibleRole.FONT_CHOOSER,
+
+     /**
+     * A GROUP_BOX is a simple container that contains a border
+     * around it and contains components inside it.
+     AccessibleRole.GROUP_BOX
+
+     /**
+     * Since JDK 1.5
+     *
+     * A text header
+
+     AccessibleRole.HEADER,
+
+     /**
+     * A text footer
+
+     AccessibleRole.FOOTER,
+
+     /**
+     * A text paragraph
+
+     AccessibleRole.PARAGRAPH,
+
+     /**
+     * A ruler is an object used to measure distance
+
+     AccessibleRole.RULER,
+
+     /**
+     * A role indicating the object acts as a formula for
+     * calculating a value.  An example is a formula in
+     * a spreadsheet cell.
+     AccessibleRole.EDITBAR
+    */
+    };
+
+    /**
+     * This class implements accessibility support for the
+     * <code>JTree</code> child.  It provides an implementation of the
+     * Java Accessibility API appropriate to tree nodes.
+     *
+     * Copied from JTree.java to work around a JTree bug where
+     * ActiveDescendent PropertyChangeEvents contain the wrong
+     * parent.
+     */
+    /**
+     * This class in invoked on the EDT as its part of ActiveDescendant,
+     * hence the calls do not need to be specifically made on the EDT
+     */
+    private class AccessibleJTreeNode extends AccessibleContext
+        implements Accessible, AccessibleComponent, AccessibleSelection,
+                   AccessibleAction {
+
+        private JTree tree = null;
+        private TreeModel treeModel = null;
+        private Object obj = null;
+        private TreePath path = null;
+        private Accessible accessibleParent = null;
+        private int index = 0;
+        private boolean isLeaf = false;
+
+        /**
+         *  Constructs an AccessibleJTreeNode
+         */
+        AccessibleJTreeNode(JTree t, TreePath p, Accessible ap) {
+            tree = t;
+            path = p;
+            accessibleParent = ap;
+            if (t != null)
+                treeModel = t.getModel();
+            if (p != null) {
+                obj = p.getLastPathComponent();
+                if (treeModel != null && obj != null) {
+                    isLeaf = treeModel.isLeaf(obj);
+                }
+            }
+            debugString("AccessibleJTreeNode: name = "+getAccessibleName()+"; TreePath = "+p+"; parent = "+ap);
+        }
+
+        private TreePath getChildTreePath(int i) {
+            // Tree nodes can't be so complex that they have
+            // two sets of children -> we're ignoring that case
+            if (i < 0 || i >= getAccessibleChildrenCount() || path == null || treeModel == null) {
+                return null;
+            } else {
+                Object childObj = treeModel.getChild(obj, i);
+                Object[] objPath = path.getPath();
+                Object[] objChildPath = new Object[objPath.length+1];
+                java.lang.System.arraycopy(objPath, 0, objChildPath, 0, objPath.length);
+                objChildPath[objChildPath.length-1] = childObj;
+                return new TreePath(objChildPath);
+            }
+        }
+
+        /**
+         * Get the AccessibleContext associated with this tree node.
+         * In the implementation of the Java Accessibility API for
+         * this class, return this object, which is its own
+         * AccessibleContext.
+         *
+         * @return this object
+        */
+        public AccessibleContext getAccessibleContext() {
+            return this;
+        }
+
+        private AccessibleContext getCurrentAccessibleContext() {
+            Component c = getCurrentComponent();
+            if (c instanceof Accessible) {
+               return (c.getAccessibleContext());
+            } else {
+                return null;
+            }
+        }
+
+        private Component getCurrentComponent() {
+            debugString("AccessibleJTreeNode: getCurrentComponent");
+            // is the object visible?
+            // if so, get row, selected, focus & leaf state,
+            // and then get the renderer component and return it
+            if (tree != null && tree.isVisible(path)) {
+                TreeCellRenderer r = tree.getCellRenderer();
+                if (r == null) {
+                    debugString("  returning null 1");
+                    return null;
+                }
+                TreeUI ui = tree.getUI();
+                if (ui != null) {
+                    int row = ui.getRowForPath(tree, path);
+                    boolean selected = tree.isPathSelected(path);
+                    boolean expanded = tree.isExpanded(path);
+                    boolean hasFocus = false; // how to tell?? -PK
+                    Component retval = r.getTreeCellRendererComponent(tree, obj,
+                                                                      selected, expanded,
+                                                                      isLeaf, row, hasFocus);
+                    debugString("  returning = "+retval.getClass());
+                    return retval;
+                }
+            }
+            debugString("  returning null 2");
+            return null;
+        }
+
+        // AccessibleContext methods
+
+        /**
+         * Get the accessible name of this object.
+         *
+         * @return the localized name of the object; null if this
+         * object does not have a name
+         */
+        public String getAccessibleName() {
+            debugString("AccessibleJTreeNode: getAccessibleName");
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                String name = ac.getAccessibleName();
+                if ((name != null) && (!name.isEmpty())) {
+                    String retval = ac.getAccessibleName();
+                    debugString("    returning "+retval);
+                    return retval;
+                } else {
+                    return null;
+                }
+            }
+            if ((accessibleName != null) && (accessibleName.isEmpty())) {
+                return accessibleName;
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Set the localized accessible name of this object.
+         *
+         * @param s the new localized name of the object.
+         */
+        public void setAccessibleName(String s) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                ac.setAccessibleName(s);
+            } else {
+                super.setAccessibleName(s);
+            }
+        }
+
+        //
+        // *** should check tooltip text for desc. (needs MouseEvent)
+        //
+        /**
+         * Get the accessible description of this object.
+         *
+         * @return the localized description of the object; null if
+         * this object does not have a description
+         */
+        public String getAccessibleDescription() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                return ac.getAccessibleDescription();
+            } else {
+                return super.getAccessibleDescription();
+            }
+        }
+
+        /**
+         * Set the accessible description of this object.
+         *
+         * @param s the new localized description of the object
+         */
+        public void setAccessibleDescription(String s) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                ac.setAccessibleDescription(s);
+            } else {
+                super.setAccessibleDescription(s);
+            }
+        }
+
+        /**
+         * Get the role of this object.
+         *
+         * @return an instance of AccessibleRole describing the role of the object
+         * @see AccessibleRole
+         */
+        public AccessibleRole getAccessibleRole() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                return ac.getAccessibleRole();
+            } else {
+                return AccessibleRole.UNKNOWN;
+            }
+        }
+
+        /**
+         * Get the state set of this object.
+         *
+         * @return an instance of AccessibleStateSet containing the
+         * current state set of the object
+         * @see AccessibleState
+         */
+        public AccessibleStateSet getAccessibleStateSet() {
+            if (tree == null)
+                return null;
+            AccessibleContext ac = getCurrentAccessibleContext();
+            AccessibleStateSet states;
+            int row = tree.getUI().getRowForPath(tree,path);
+            int lsr = tree.getLeadSelectionRow();
+            if (ac != null) {
+                states = ac.getAccessibleStateSet();
+            } else {
+                states = new AccessibleStateSet();
+            }
+            // need to test here, 'cause the underlying component
+            // is a cellRenderer, which is never showing...
+            if (isShowing()) {
+                states.add(AccessibleState.SHOWING);
+            } else if (states.contains(AccessibleState.SHOWING)) {
+                states.remove(AccessibleState.SHOWING);
+            }
+            if (isVisible()) {
+                states.add(AccessibleState.VISIBLE);
+            } else if (states.contains(AccessibleState.VISIBLE)) {
+                states.remove(AccessibleState.VISIBLE);
+            }
+            if (tree.isPathSelected(path)){
+                states.add(AccessibleState.SELECTED);
+            }
+            if (lsr == row) {
+                states.add(AccessibleState.ACTIVE);
+            }
+            if (!isLeaf) {
+                states.add(AccessibleState.EXPANDABLE);
+            }
+            if (tree.isExpanded(path)) {
+                states.add(AccessibleState.EXPANDED);
+            } else {
+                states.add(AccessibleState.COLLAPSED);
+            }
+            if (tree.isEditable()) {
+                states.add(AccessibleState.EDITABLE);
+            }
+            return states;
+        }
+
+        /**
+         * Get the Accessible parent of this object.
+         *
+         * @return the Accessible parent of this object; null if this
+         * object does not have an Accessible parent
+         */
+        public Accessible getAccessibleParent() {
+            // someone wants to know, so we need to create our parent
+            // if we don't have one (hey, we're a talented kid!)
+            if (accessibleParent == null && path != null) {
+                Object[] objPath = path.getPath();
+                if (objPath.length > 1) {
+                    Object objParent = objPath[objPath.length-2];
+                    if (treeModel != null) {
+                        index = treeModel.getIndexOfChild(objParent, obj);
+                    }
+                    Object[] objParentPath = new Object[objPath.length-1];
+                    java.lang.System.arraycopy(objPath, 0, objParentPath,
+                                               0, objPath.length-1);
+                    TreePath parentPath = new TreePath(objParentPath);
+                    accessibleParent = new AccessibleJTreeNode(tree,
+                                                               parentPath,
+                                                               null);
+                    this.setAccessibleParent(accessibleParent);
+                } else if (treeModel != null) {
+                    accessibleParent = tree; // we're the top!
+                    index = 0; // we're an only child!
+                    this.setAccessibleParent(accessibleParent);
+                }
+            }
+            return accessibleParent;
+        }
+
+        /**
+         * Get the index of this object in its accessible parent.
+         *
+         * @return the index of this object in its parent; -1 if this
+         * object does not have an accessible parent.
+         * @see #getAccessibleParent
+         */
+        public int getAccessibleIndexInParent() {
+            // index is invalid 'till we have an accessibleParent...
+            if (accessibleParent == null) {
+                getAccessibleParent();
+            }
+            if (path != null) {
+                Object[] objPath = path.getPath();
+                if (objPath.length > 1) {
+                    Object objParent = objPath[objPath.length-2];
+                    if (treeModel != null) {
+                        index = treeModel.getIndexOfChild(objParent, obj);
+                    }
+                }
+            }
+            return index;
+        }
+
+        /**
+         * Returns the number of accessible children in the object.
+         *
+         * @return the number of accessible children in the object.
+         */
+        public int getAccessibleChildrenCount() {
+            // Tree nodes can't be so complex that they have
+            // two sets of children -> we're ignoring that case
+            if (obj != null && treeModel != null) {
+                return treeModel.getChildCount(obj);
+            }
+            return 0;
+        }
+
+        /**
+         * Return the specified Accessible child of the object.
+         *
+         * @param i zero-based index of child
+         * @return the Accessible child of the object
+         */
+        public Accessible getAccessibleChild(int i) {
+            // Tree nodes can't be so complex that they have
+            // two sets of children -> we're ignoring that case
+            if (i < 0 || i >= getAccessibleChildrenCount() || path == null || treeModel == null) {
+                return null;
+            } else {
+                Object childObj = treeModel.getChild(obj, i);
+                Object[] objPath = path.getPath();
+                Object[] objChildPath = new Object[objPath.length+1];
+                java.lang.System.arraycopy(objPath, 0, objChildPath, 0, objPath.length);
+                objChildPath[objChildPath.length-1] = childObj;
+                TreePath childPath = new TreePath(objChildPath);
+                return new AccessibleJTreeNode(tree, childPath, this);
+            }
+        }
+
+        /**
+         * Gets the locale of the component. If the component does not have
+         * a locale, then the locale of its parent is returned.
+         *
+         * @return This component's locale. If this component does not have
+         * a locale, the locale of its parent is returned.
+         * @exception IllegalComponentStateException
+         * If the Component does not have its own locale and has not yet
+         * been added to a containment hierarchy such that the locale can be
+         * determined from the containing parent.
+         * @see #setLocale
+         */
+        public Locale getLocale() {
+            if (tree == null)
+                return null;
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                return ac.getLocale();
+            } else {
+                return tree.getLocale();
+            }
+        }
+
+        /**
+         * Add a PropertyChangeListener to the listener list.
+         * The listener is registered for all properties.
+         *
+         * @param l  The PropertyChangeListener to be added
+         */
+        public void addPropertyChangeListener(PropertyChangeListener l) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                ac.addPropertyChangeListener(l);
+            } else {
+                super.addPropertyChangeListener(l);
+            }
+        }
+
+        /**
+         * Remove a PropertyChangeListener from the listener list.
+         * This removes a PropertyChangeListener that was registered
+         * for all properties.
+         *
+         * @param l  The PropertyChangeListener to be removed
+         */
+        public void removePropertyChangeListener(PropertyChangeListener l) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                ac.removePropertyChangeListener(l);
+            } else {
+                super.removePropertyChangeListener(l);
+            }
+        }
+
+        /**
+         * Get the AccessibleAction associated with this object.  In the
+         * implementation of the Java Accessibility API for this class,
+         * return this object, which is responsible for implementing the
+         * AccessibleAction interface on behalf of itself.
+         *
+         * @return this object
+         */
+        public AccessibleAction getAccessibleAction() {
+            return this;
+        }
+
+        /**
+         * Get the AccessibleComponent associated with this object.  In the
+         * implementation of the Java Accessibility API for this class,
+         * return this object, which is responsible for implementing the
+         * AccessibleComponent interface on behalf of itself.
+         *
+         * @return this object
+         */
+        public AccessibleComponent getAccessibleComponent() {
+            return this; // to override getBounds()
+        }
+
+        /**
+         * Get the AccessibleSelection associated with this object if one
+         * exists.  Otherwise return null.
+         *
+         * @return the AccessibleSelection, or null
+         */
+        public AccessibleSelection getAccessibleSelection() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null && isLeaf) {
+                return getCurrentAccessibleContext().getAccessibleSelection();
+            } else {
+                return this;
+            }
+        }
+
+        /**
+         * Get the AccessibleText associated with this object if one
+         * exists.  Otherwise return null.
+         *
+         * @return the AccessibleText, or null
+         */
+        public AccessibleText getAccessibleText() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                return getCurrentAccessibleContext().getAccessibleText();
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Get the AccessibleValue associated with this object if one
+         * exists.  Otherwise return null.
+         *
+         * @return the AccessibleValue, or null
+         */
+        public AccessibleValue getAccessibleValue() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                return getCurrentAccessibleContext().getAccessibleValue();
+            } else {
+                return null;
+            }
+        }
+
+
+            // AccessibleComponent methods
+
+        /**
+         * Get the background color of this object.
+         *
+         * @return the background color, if supported, of the object;
+         * otherwise, null
+         */
+        public Color getBackground() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).getBackground();
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    return c.getBackground();
+                } else {
+                    return null;
+                }
+            }
+        }
+
+        /**
+         * Set the background color of this object.
+         *
+         * @param c the new Color for the background
+         */
+        public void setBackground(Color c) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).setBackground(c);
+            } else {
+                Component cp = getCurrentComponent();
+                if (    cp != null) {
+                    cp.setBackground(c);
+                }
+            }
+        }
+
+
+        /**
+         * Get the foreground color of this object.
+         *
+         * @return the foreground color, if supported, of the object;
+         * otherwise, null
+         */
+        public Color getForeground() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).getForeground();
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    return c.getForeground();
+                } else {
+                    return null;
+                }
+            }
+        }
+
+        public void setForeground(Color c) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).setForeground(c);
+            } else {
+                Component cp = getCurrentComponent();
+                if (cp != null) {
+                    cp.setForeground(c);
+                }
+            }
+        }
+
+        public Cursor getCursor() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).getCursor();
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    return c.getCursor();
+                } else {
+                    Accessible ap = getAccessibleParent();
+                    if (ap instanceof AccessibleComponent) {
+                        return ((AccessibleComponent) ap).getCursor();
+                    } else {
+                        return null;
+                    }
+                }
+            }
+        }
+
+        public void setCursor(Cursor c) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).setCursor(c);
+            } else {
+                Component cp = getCurrentComponent();
+                if (cp != null) {
+                    cp.setCursor(c);
+                }
+            }
+        }
+
+        public Font getFont() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).getFont();
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    return c.getFont();
+                } else {
+                    return null;
+                }
+            }
+        }
+
+        public void setFont(Font f) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).setFont(f);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    c.setFont(f);
+                }
+            }
+        }
+
+        public FontMetrics getFontMetrics(Font f) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).getFontMetrics(f);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    return c.getFontMetrics(f);
+                } else {
+                    return null;
+                }
+            }
+        }
+
+        public boolean isEnabled() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).isEnabled();
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    return c.isEnabled();
+                } else {
+                    return false;
+                }
+            }
+        }
+
+        public void setEnabled(boolean b) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).setEnabled(b);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    c.setEnabled(b);
+                }
+            }
+        }
+
+        public boolean isVisible() {
+            if (tree == null)
+                return false;
+            Rectangle pathBounds = tree.getPathBounds(path);
+            Rectangle parentBounds = tree.getVisibleRect();
+            if ( pathBounds != null && parentBounds != null &&
+                 parentBounds.intersects(pathBounds) ) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        public void setVisible(boolean b) {
+        }
+
+        public boolean isShowing() {
+            return (tree.isShowing() && isVisible());
+        }
+
+        public boolean contains(Point p) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                Rectangle r = ((AccessibleComponent) ac).getBounds();
+                return r.contains(p);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    Rectangle r = c.getBounds();
+                    return r.contains(p);
+                } else {
+                    return getBounds().contains(p);
+                }
+            }
+        }
+
+        public Point getLocationOnScreen() {
+            if (tree != null) {
+                Point treeLocation = tree.getLocationOnScreen();
+                Rectangle pathBounds = tree.getPathBounds(path);
+                if (treeLocation != null && pathBounds != null) {
+                    Point nodeLocation = new Point(pathBounds.x,
+                                                   pathBounds.y);
+                    nodeLocation.translate(treeLocation.x, treeLocation.y);
+                    return nodeLocation;
+                } else {
+                    return null;
+                }
+            } else {
+                return null;
+            }
+        }
+
+        private Point getLocationInJTree() {
+            Rectangle r = tree.getPathBounds(path);
+            if (r != null) {
+                return r.getLocation();
+            } else {
+                return null;
+            }
+        }
+
+        public Point getLocation() {
+            Rectangle r = getBounds();
+            if (r != null) {
+                return r.getLocation();
+            } else {
+                return null;
+            }
+        }
+
+        public void setLocation(Point p) {
+        }
+
+        public Rectangle getBounds() {
+            if (tree == null)
+                return null;
+            Rectangle r = tree.getPathBounds(path);
+            Accessible parent = getAccessibleParent();
+            if (parent instanceof AccessibleJTreeNode) {
+                Point parentLoc = ((AccessibleJTreeNode) parent).getLocationInJTree();
+                if (parentLoc != null && r != null) {
+                    r.translate(-parentLoc.x, -parentLoc.y);
+                } else {
+                    return null;        // not visible!
+                }
+            }
+            return r;
+        }
+
+        public void setBounds(Rectangle r) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).setBounds(r);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    c.setBounds(r);
+                }
+            }
+        }
+
+        public Dimension getSize() {
+            return getBounds().getSize();
+        }
+
+        public void setSize (Dimension d) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).setSize(d);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    c.setSize(d);
+                }
+            }
+        }
+
+        /**
+        * Returns the <code>Accessible</code> child, if one exists,
+        * contained at the local coordinate <code>Point</code>.
+        * Otherwise returns <code>null</code>.
+        *
+        * @param p point in local coordinates of this
+        *    <code>Accessible</code>
+        * @return the <code>Accessible</code>, if it exists,
+        *    at the specified location; else <code>null</code>
+        */
+        public Accessible getAccessibleAt(Point p) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).getAccessibleAt(p);
+            } else {
+                return null;
+            }
+        }
+
+        public boolean isFocusTraversable() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                return ((AccessibleComponent) ac).isFocusTraversable();
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    return c.isFocusable();
+                } else {
+                    return false;
+                }
+            }
+        }
+
+        public void requestFocus() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).requestFocus();
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    c.requestFocus();
+                }
+            }
+        }
+
+        public void addFocusListener(FocusListener l) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).addFocusListener(l);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    c.addFocusListener(l);
+                }
+            }
+        }
+
+        public void removeFocusListener(FocusListener l) {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac instanceof AccessibleComponent) {
+                ((AccessibleComponent) ac).removeFocusListener(l);
+            } else {
+                Component c = getCurrentComponent();
+                if (c != null) {
+                    c.removeFocusListener(l);
+                }
+            }
+        }
+
+            // AccessibleSelection methods
+
+        /**
+         * Returns the number of items currently selected.
+         * If no items are selected, the return value will be 0.
+         *
+         * @return the number of items currently selected.
+         */
+        public int getAccessibleSelectionCount() {
+            int count = 0;
+            int childCount = getAccessibleChildrenCount();
+            for (int i = 0; i < childCount; i++) {
+                TreePath childPath = getChildTreePath(i);
+                if (tree.isPathSelected(childPath)) {
+                    count++;
+                }
+            }
+            return count;
+        }
+
+        /**
+         * Returns an Accessible representing the specified selected item
+         * in the object.  If there isn't a selection, or there are
+         * fewer items selected than the integer passed in, the return
+         * value will be null.
+         *
+         * @param i the zero-based index of selected items
+         * @return an Accessible containing the selected item
+         */
+        public Accessible getAccessibleSelection(int i) {
+            int childCount = getAccessibleChildrenCount();
+            if (i < 0 || i >= childCount) {
+                return null;        // out of range
+            }
+            int count = 0;
+            for (int j = 0; j < childCount && i >= count; j++) {
+                TreePath childPath = getChildTreePath(j);
+                if (tree.isPathSelected(childPath)) {
+                    if (count == i) {
+                        return new AccessibleJTreeNode(tree, childPath, this);
+                    } else {
+                        count++;
+                    }
+                }
+            }
+            return null;
+        }
+
+        /**
+         * Returns true if the current child of this object is selected.
+         *
+         * @param i the zero-based index of the child in this Accessible
+         * object.
+         * @see AccessibleContext#getAccessibleChild
+         */
+        public boolean isAccessibleChildSelected(int i) {
+            int childCount = getAccessibleChildrenCount();
+            if (i < 0 || i >= childCount) {
+                return false;       // out of range
+            } else {
+                TreePath childPath = getChildTreePath(i);
+                return tree.isPathSelected(childPath);
+            }
+        }
+
+         /**
+         * Adds the specified selected item in the object to the object's
+         * selection.  If the object supports multiple selections,
+         * the specified item is added to any existing selection, otherwise
+         * it replaces any existing selection in the object.  If the
+         * specified item is already selected, this method has no effect.
+         *
+         * @param i the zero-based index of selectable items
+         */
+        public void addAccessibleSelection(int i) {
+            if (tree == null)
+                return;
+            TreeModel model = tree.getModel();
+            if (model != null) {
+                if (i >= 0 && i < getAccessibleChildrenCount()) {
+                    TreePath path = getChildTreePath(i);
+                    tree.addSelectionPath(path);
+                }
+            }
+        }
+
+        /**
+         * Removes the specified selected item in the object from the
+         * object's
+         * selection.  If the specified item isn't currently selected, this
+         * method has no effect.
+         *
+         * @param i the zero-based index of selectable items
+         */
+        public void removeAccessibleSelection(int i) {
+            if (tree == null)
+                return;
+            TreeModel model = tree.getModel();
+            if (model != null) {
+                if (i >= 0 && i < getAccessibleChildrenCount()) {
+                    TreePath path = getChildTreePath(i);
+                    tree.removeSelectionPath(path);
+                }
+            }
+        }
+
+        /**
+         * Clears the selection in the object, so that nothing in the
+         * object is selected.
+         */
+        public void clearAccessibleSelection() {
+            int childCount = getAccessibleChildrenCount();
+            for (int i = 0; i < childCount; i++) {
+                removeAccessibleSelection(i);
+            }
+        }
+
+        /**
+         * Causes every selected item in the object to be selected
+         * if the object supports multiple selections.
+         */
+        public void selectAllAccessibleSelection() {
+            if (tree == null)
+                return;
+            TreeModel model = tree.getModel();
+            if (model != null) {
+                int childCount = getAccessibleChildrenCount();
+                TreePath path;
+                for (int i = 0; i < childCount; i++) {
+                    path = getChildTreePath(i);
+                    tree.addSelectionPath(path);
+                }
+            }
+        }
+
+            // AccessibleAction methods
+
+        /**
+         * Returns the number of accessible actions available in this
+         * tree node.  If this node is not a leaf, there is at least
+         * one action (toggle expand), in addition to any available
+         * on the object behind the TreeCellRenderer.
+         *
+         * @return the number of Actions in this object
+         */
+        public int getAccessibleActionCount() {
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (ac != null) {
+                AccessibleAction aa = ac.getAccessibleAction();
+                if (aa != null) {
+                    return (aa.getAccessibleActionCount() + (isLeaf ? 0 : 1));
+                }
+            }
+            return isLeaf ? 0 : 1;
+        }
+
+        /**
+         * Return a description of the specified action of the tree node.
+         * If this node is not a leaf, there is at least one action
+         * description (toggle expand), in addition to any available
+         * on the object behind the TreeCellRenderer.
+         *
+         * @param i zero-based index of the actions
+         * @return a description of the action
+         */
+        public String getAccessibleActionDescription(int i) {
+            if (i < 0 || i >= getAccessibleActionCount()) {
+                return null;
+            }
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (i == 0) {
+                // TIGER - 4766636
+                // return AccessibleAction.TOGGLE_EXPAND;
+                return "toggle expand";
+            } else if (ac != null) {
+                AccessibleAction aa = ac.getAccessibleAction();
+                if (aa != null) {
+                    return aa.getAccessibleActionDescription(i - 1);
+                }
+            }
+            return null;
+        }
+
+        /**
+         * Perform the specified Action on the tree node.  If this node
+         * is not a leaf, there is at least one action which can be
+         * done (toggle expand), in addition to any available on the
+         * object behind the TreeCellRenderer.
+         *
+         * @param i zero-based index of actions
+         * @return true if the the action was performed; else false.
+         */
+        public boolean doAccessibleAction(int i) {
+            if (i < 0 || i >= getAccessibleActionCount()) {
+                return false;
+            }
+            AccessibleContext ac = getCurrentAccessibleContext();
+            if (i == 0) {
+                if (tree.isExpanded(path)) {
+                    tree.collapsePath(path);
+                } else {
+                    tree.expandPath(path);
+                }
+                return true;
+            } else if (ac != null) {
+                AccessibleAction aa = ac.getAccessibleAction();
+                if (aa != null) {
+                    return aa.doAccessibleAction(i - 1);
+                }
+            }
+            return false;
+        }
+
+    } // inner class AccessibleJTreeNode
+
+    /**
+     * A helper class to perform {@code Callable} objects on the event dispatch thread appropriate
+     * for the provided {@code AccessibleContext}.
+     */
+    private static class InvocationUtils {
+
+        /**
+         * Invokes a {@code Callable} in the {@code AppContext} of the given {@code Accessible}
+         * and waits for it to finish blocking the caller thread.
+         *
+         * @param callable   the {@code Callable} to invoke
+         * @param accessible the {@code Accessible} which would be used to find the right context
+         *                   for the task execution
+         * @param <T> type parameter for the result value
+         *
+         * @return the result of the {@code Callable} execution
+         */
+        public static <T> T invokeAndWait(final Callable<T> callable,
+                                          final Accessible accessible) {
+            if (accessible instanceof Component) {
+                return invokeAndWait(callable, (Component)accessible);
+            }
+            if (accessible instanceof AccessibleContext) {
+                // This case also covers the Translator
+                return invokeAndWait(callable, (AccessibleContext)accessible);
+            }
+            throw new RuntimeException("Unmapped Accessible used to dispatch event: " + accessible);
+        }
+
+        /**
+         * Invokes a {@code Callable} in the {@code AppContext} of the given {@code Component}
+         * and waits for it to finish blocking the caller thread.
+         *
+         * @param callable  the {@code Callable} to invoke
+         * @param component the {@code Component} which would be used to find the right context
+         *                  for the task execution
+         * @param <T> type parameter for the result value
+         *
+         * @return the result of the {@code Callable} execution
+         */
+        public static <T> T invokeAndWait(final Callable<T> callable,
+                                          final Component component) {
+            return invokeAndWait(callable, SunToolkit.targetToAppContext(component));
+        }
+
+        /**
+         * Invokes a {@code Callable} in the {@code AppContext} mapped to the given {@code AccessibleContext}
+         * and waits for it to finish blocking the caller thread.
+         *
+         * @param callable the {@code Callable} to invoke
+         * @param accessibleContext the {@code AccessibleContext} which would be used to determine the right
+         *                          context for the task execution.
+         * @param <T> type parameter for the result value
+         *
+         * @return the result of the {@code Callable} execution
+         */
+        public static <T> T invokeAndWait(final Callable<T> callable,
+                                          final AccessibleContext accessibleContext) {
+            AppContext targetContext = AWTAccessor.getAccessibleContextAccessor()
+                    .getAppContext(accessibleContext);
+            if (targetContext != null) {
+                return invokeAndWait(callable, targetContext);
+            } else {
+                // Normally this should not happen, unmapped context provided and
+                // the target AppContext is unknown.
+
+                // Try to recover in case the context is a translator.
+                if (accessibleContext instanceof Translator) {
+                    Object source = ((Translator)accessibleContext).getSource();
+                    if (source instanceof Component) {
+                        return invokeAndWait(callable, (Component)source);
+                    }
+                }
+            }
+            throw new RuntimeException("Unmapped AccessibleContext used to dispatch event: " + accessibleContext);
+        }
+
+        private static <T> T invokeAndWait(final Callable<T> callable,
+                                           final AppContext targetAppContext) {
+            final CallableWrapper<T> wrapper = new CallableWrapper<T>(callable);
+            try {
+                invokeAndWait(wrapper, targetAppContext);
+                T result = wrapper.getResult();
+                updateAppContextMap(result, targetAppContext);
+                return result;
+            } catch (final Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        private static void invokeAndWait(final Runnable runnable,
+                                        final AppContext appContext)
+                throws InterruptedException, InvocationTargetException {
+
+            EventQueue eq = SunToolkit.getSystemEventQueueImplPP(appContext);
+            Object lock = new Object();
+            Toolkit source = Toolkit.getDefaultToolkit();
+            InvocationEvent event =
+                    new InvocationEvent(source, runnable, lock, true);
+            synchronized (lock) {
+                eq.postEvent(event);
+                lock.wait();
+            }
+
+            Throwable eventThrowable = event.getThrowable();
+            if (eventThrowable != null) {
+                throw new InvocationTargetException(eventThrowable);
+            }
+        }
+
+        /**
+         * Maps the {@code AccessibleContext} to the {@code AppContext} which should be used
+         * to dispatch events related to the {@code AccessibleContext}
+         * @param accessibleContext the {@code AccessibleContext} for the mapping
+         * @param targetContext the {@code AppContext} for the mapping
+         */
+        public static void registerAccessibleContext(final AccessibleContext accessibleContext,
+                                                     final AppContext targetContext) {
+            if (accessibleContext != null) {
+                AWTAccessor.getAccessibleContextAccessor().setAppContext(accessibleContext, targetContext);
+            }
+        }
+
+        private static <T> void updateAppContextMap(final T accessibleContext,
+                                                    final AppContext targetContext) {
+            if (accessibleContext instanceof AccessibleContext) {
+                registerAccessibleContext((AccessibleContext)accessibleContext, targetContext);
+            }
+        }
+
+        private static class CallableWrapper<T> implements Runnable {
+            private final Callable<T> callable;
+            private volatile T object;
+            private Exception e;
+
+            CallableWrapper(final Callable<T> callable) {
+                this.callable = callable;
+            }
+
+            public void run() {
+                try {
+                    if (callable != null) {
+                        object = callable.call();
+                    }
+                } catch (final Exception e) {
+                    this.e = e;
+                }
+            }
+
+            T getResult() throws Exception {
+                if (e != null)
+                    throw e;
+                return object;
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/conf/accessibility.properties	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,6 @@
+#
+# Load the Java Access Bridge class into the JVM
+#
+#assistive_technologies=com.sun.java.accessibility.AccessBridge
+#screen_magnifier_present=true
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/common/AccessBridgeDebug.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage AccessBridge debugging
+ */
+
+#include "AccessBridgeDebug.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * print a GetLastError message
+ */
+char *printError(char *msg) {
+    LPVOID lpMsgBuf = NULL;
+    static char retbuf[256];
+
+    if (msg != NULL) {
+        strncpy((char *)retbuf, msg, sizeof(retbuf));
+    }
+    if (!FormatMessage(
+                       FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                       FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS,
+                       NULL,
+                       GetLastError(),
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+                       (LPTSTR) &lpMsgBuf,
+                       0,
+                       NULL ))
+        {
+            PrintDebugString("  %s: FormatMessage failed", msg);
+        } else {
+            PrintDebugString("  %s: %s", msg, (char *)lpMsgBuf);
+        }
+    if (lpMsgBuf != NULL) {
+        strncat((char *)retbuf, ": ", sizeof(retbuf) - strlen(retbuf) - 1);
+        strncat((char *)retbuf, (char *)lpMsgBuf, sizeof(retbuf) - strlen(retbuf) - 1);
+    }
+    return (char *)retbuf;
+}
+
+
+    /**
+     * Send debugging info to the appropriate place
+     */
+    void PrintDebugString(char *msg, ...) {
+#ifdef DEBUGGING_ON
+        char buf[1024];
+        va_list argprt;
+
+        va_start(argprt, msg);     // set up argptr
+        vsprintf(buf, msg, argprt);
+#ifdef SEND_TO_OUTPUT_DEBUG_STRING
+        OutputDebugString(buf);
+#endif
+#ifdef SEND_TO_CONSOLE
+        printf(buf);
+        printf("\r\n");
+#endif
+#endif
+    }
+
+    /**
+     * Send Java debugging info to the appropriate place
+     */
+    void PrintJavaDebugString2(char *msg, ...) {
+#ifdef JAVA_DEBUGGING_ON
+        char buf[1024];
+        va_list argprt;
+
+        va_start(argprt, msg);     // set up argptr
+        vsprintf(buf, msg, argprt);
+#ifdef SEND_TO_OUTPUT_DEBUG_STRING
+        OutputDebugString(buf);
+#endif
+#ifdef SEND_TO_CONSOLE
+        printf(buf);
+        printf("\r\n");
+#endif
+#endif
+    }
+    /**
+     * Wide version of the method to send debugging info to the appropriate place
+     */
+    void wPrintDebugString(wchar_t *msg, ...) {
+#ifdef DEBUGGING_ON
+        char buf[1024];
+        char charmsg[256];
+        va_list argprt;
+
+        va_start(argprt, msg);          // set up argptr
+        sprintf(charmsg, "%ls", msg);  // convert format string to multi-byte
+        vsprintf(buf, charmsg, argprt);
+#ifdef SEND_TO_OUTPUT_DEBUG_STRING
+        OutputDebugString(buf);
+#endif
+#ifdef SEND_TO_CONSOLE
+        printf(buf);
+        printf("\r\n");
+#endif
+#endif
+    }
+
+    /**
+     * Wide version of the method to send Java debugging info to the appropriate place
+     */
+    void wPrintJavaDebugString(wchar_t *msg, ...) {
+#ifdef JAVA_DEBUGGING_ON
+        char buf[1024];
+        char charmsg[256];
+        va_list argprt;
+
+        va_start(argprt, msg);          // set up argptr
+        sprintf(charmsg, "%ls", msg);  // convert format string to multi-byte
+        vsprintf(buf, charmsg, argprt);
+#ifdef SEND_TO_OUTPUT_DEBUG_STRING
+        OutputDebugString(buf);
+#endif
+#ifdef SEND_TO_CONSOLE
+        printf(buf);
+        printf("\r\n");
+#endif
+#endif
+    }
+#ifdef __cplusplus
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/common/AccessBridgeDebug.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage AccessBridge debugging
+ */
+
+#ifndef __AccessBridgeDebug_H__
+#define __AccessBridgeDebug_H__
+
+#include <crtdbg.h>
+#include <windows.h>
+
+#ifdef DEBUG
+#define DEBUGGING_ON
+#define SEND_TO_OUTPUT_DEBUG_STRING
+//#define JAVA_DEBUGGING_ON
+#endif
+
+#ifdef DEBUGGING_ON
+#define DEBUG_CODE(x) x
+#else
+#define DEBUG_CODE(x) /* */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    char *printError(char *msg);
+    void PrintDebugString(char *msg, ...);
+    void PrintJavaDebugString(char *msg, ...);
+    void wPrintJavaDebugString(wchar_t *msg, ...);
+    void wPrintDebugString(wchar_t *msg, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/common/AccessBridgeMessages.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Common AccessBridge IPC message definitions
+ */
+
+#include "AccessBridgeMessages.h"
+
+
+// unique broadcast msg. IDs gotten dymanically
+
+// wParam == sourceHwnc; lParam = *vmID
+UINT theFromJavaHelloMsgID;
+// wParam == sourceHwnc; lParam unused
+UINT theFromWindowsHelloMsgID;
+
+
+BOOL initBroadcastMessageIDs() {
+        theFromJavaHelloMsgID = RegisterWindowMessage("AccessBridge-FromJava-Hello");
+        theFromWindowsHelloMsgID = RegisterWindowMessage("AccessBridge-FromWindows-Hello");
+
+        if (theFromJavaHelloMsgID == 0 || theFromWindowsHelloMsgID) {
+                return FALSE;
+        }
+        return TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/common/AccessBridgeMessages.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Common AccessBridge IPC message definitions
+ */
+
+#include <windows.h>
+#include <winuser.h>
+
+#ifndef __AccessBridgeMessages_H__
+#define __AccessBridgeMessages_H__
+
+
+// used for messages between AccessBridge dlls to manage IPC
+// In the SendMessage call, the third param (WPARAM) is
+// the source HWND (ourAccessBridgeWindow in this case),
+// and the fourth param (LPARAM) is the size in bytes of
+// the package put into shared memory.
+#define AB_MEMORY_MAPPED_FILE_SETUP (WM_USER+0x1000)
+
+// used for messages between AccessBridge dlls to manage IPC
+// In the SendMessage call, the third param (WPARAM) is
+// the source HWND (ourAccessBridgeWindow in this case),
+// and the fourth param (LPARAM) is the size in bytes of
+// the package put into shared memory.
+#define AB_MESSAGE_WAITING (WM_USER+0x1001)
+
+// used for messages from JavaDLL to itself (or perhaps later also
+// for messages from WindowsDLL to itself).  Used with PostMessage,
+// it is called for deferred processing of messages to send across
+// to another DLL (or DLLs)
+#define AB_MESSAGE_QUEUED (WM_USER+0x1002)
+
+// used to let other AccessBridge DLLs know that one of the DLLs
+// they are communicating with is going away (not reversable)
+#define AB_DLL_GOING_AWAY (WM_USER+0x1003)
+
+
+// used as part of the Memory-Mapped file IPC setup.  The first
+// constant is the query, the second the response, that are put
+// into the memory mapped file for reading by the opposite DLL
+// to verify that communication is working
+#define AB_MEMORY_MAPPED_FILE_OK_QUERY "OK?"
+#define AB_MEMORY_MAPPED_FILE_OK_ANSWER "OK!"
+
+
+BOOL initBroadcastMessageIDs();
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/common/AccessBridgeStatusWindow.RC	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,175 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+#include "accessBridgeResource.h"
+
+#define XSTR(x) STR(x)
+#define STR(x)  #x
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+ACCESSBRIDGESTATUSWINDOW DIALOGEX 160, 78, 209, 163
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CLIENTEDGE
+CAPTION "Access Bridge status"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+    EDITTEXT        cVMID,67,23,121,13,ES_READONLY
+    EDITTEXT        cStatusText,40,147,162,13,ES_READONLY
+    LTEXT           "Java VM ID:",IDC_STATIC,23,25,40,8
+    LTEXT           "Status:",IDC_STATIC,11,149,23,8
+    EDITTEXT        cWindowsID,67,39,121,13,ES_READONLY
+    LTEXT           "Windows ID:",IDC_STATIC,21,41,42,8
+    EDITTEXT        cCallInfo,12,65,184,75,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL
+    GROUPBOX        "Call info",IDC_STATIC,4,55,197,90
+    EDITTEXT        cInvokedByText,67,1,121,13,ES_READONLY
+    LTEXT           "Invoked by:",IDC_STATIC,25,3,38,8
+END
+
+IDD_DIALOG1 DIALOG DISCARDABLE  0, 0, 186, 95
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Dialog"
+FONT 8, "MS Sans Serif"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,129,7,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,129,24,50,14
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+    "#include ""windows.h""\r\n"
+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    "ACCESSBRIDGESTATUSWINDOW", DIALOG
+    BEGIN
+        LEFTMARGIN, 4
+        RIGHTMARGIN, 202
+        BOTTOMMARGIN, 160
+    END
+
+    "IDD_DIALOG1", DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 179
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 88
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION    JDK_FVER
+ PRODUCTVERSION JDK_FVER
+ FILEFLAGSMASK 0x3fL
+#ifdef DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE JDK_FTYPE
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "Comments", "Java Access Bridge\0"
+            VALUE "CompanyName", XSTR(JDK_COMPANY) "\0"
+            VALUE "FileDescription", XSTR(JDK_COMPONENT) "\0"
+            VALUE "FileVersion", XSTR(JDK_VER) "\0"
+            VALUE "Full Version", XSTR(JDK_BUILD_ID) "\0"
+            VALUE "InternalName", XSTR(JDK_INTERNAL_NAME) "\0"
+            VALUE "LegalCopyright", XSTR(JDK_COPYRIGHT) "\0"
+            VALUE "OriginalFilename", XSTR(JDK_FNAME) "\0"
+            VALUE "ProductName",  XSTR(JDK_NAME) "\0"
+            VALUE "ProductVersion", XSTR(JDK_VER) "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // !_MAC
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/common/accessBridgeResource.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#define cVMID                           1001
+#define cWindowsID                      1002
+#define cStatusText                     1003
+#define cCallInfo                       1004
+#define cInvokedByText                  1005
+#define IDC_STATIC                      -1
+
+#define cInstallAccessBridge            2001
+#define cRemindThereIsNewJVM            2005
+#define cDoNotRemindThereIsNewJVM       2005
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NO_MFC                     1
+#define _APS_NEXT_RESOURCE_VALUE        102
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1032
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/common/resource.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by AccessBridgeStatusWindow.RC
+//
+//#define IDB_BITMAP1                     102
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NO_MFC                     1
+#define _APS_NEXT_RESOURCE_VALUE        103
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1032
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/include/bridge/AccessBridgeCallbacks.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * AccessBridgeCallbacks.h      1.17 05/03/21
+ */
+
+/*
+ * Header file defining callback typedefs for Windows routines
+ * which are called from Java (responding to events, etc.).
+ */
+
+#ifndef __AccessBridgeCallbacks_H__
+#define __AccessBridgeCallbacks_H__
+
+#include <jni.h>
+#include "AccessBridgePackages.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*AccessBridge_PropertyChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+                                               wchar_t *property, wchar_t *oldValue, wchar_t *newValue);
+
+typedef void (*AccessBridge_JavaShutdownFP) (long vmID);
+typedef void (*AccessBridge_JavaShutdownFP) (long vmID);
+
+typedef void (*AccessBridge_FocusGainedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_FocusLostFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_CaretUpdateFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_MouseClickedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MouseEnteredFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MouseExitedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MousePressedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MouseReleasedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_MenuCanceledFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MenuDeselectedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MenuSelectedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PopupMenuCanceledFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PopupMenuWillBecomeInvisibleFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PopupMenuWillBecomeVisibleFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_PropertyNameChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                                                               wchar_t *oldName, wchar_t *newName);
+typedef void (*AccessBridge_PropertyDescriptionChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                                                                      wchar_t *oldDescription, wchar_t *newDescription);
+typedef void (*AccessBridge_PropertyStateChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                                                                wchar_t *oldState, wchar_t *newState);
+typedef void (*AccessBridge_PropertyValueChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                                                                wchar_t *oldValue, wchar_t *newValue);
+typedef void (*AccessBridge_PropertySelectionChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PropertyTextChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PropertyCaretChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                                                                int oldPosition, int newPosition);
+typedef void (*AccessBridge_PropertyVisibleDataChangeFP)  (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PropertyChildChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                                                                JOBJECT64 oldChild, JOBJECT64 newChild);
+typedef void (*AccessBridge_PropertyActiveDescendentChangeFP) (long vmID, JOBJECT64 event,
+                                                               JOBJECT64 source,
+                                                               JOBJECT64 oldActiveDescendent,
+                                                               JOBJECT64 newActiveDescendent);
+
+typedef void (*AccessBridge_PropertyTableModelChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 src,
+                                                                                                             wchar_t *oldValue, wchar_t *newValue);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/include/bridge/AccessBridgeCalls.c	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,1131 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @(#)AccessBridgeCalls.c      1.25 05/08/22
+ */
+
+/*
+ * Wrapper functions around calls to the AccessBridge DLL
+ */
+
+
+#include <windows.h>
+#include <jni.h>
+
+
+//#define ACCESSBRIDGE_32
+//#define ACCESSBRIDGE_64
+
+#include "AccessBridgeCalls.h"
+#include "AccessBridgeDebug.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    HINSTANCE theAccessBridgeInstance;
+    AccessBridgeFPs theAccessBridge;
+
+    BOOL theAccessBridgeInitializedFlag = FALSE;
+
+#define LOAD_FP(result, type, name) \
+    PrintDebugString("LOAD_FP loading: %s ...", name); \
+    if ((theAccessBridge.result = \
+        (type) GetProcAddress(theAccessBridgeInstance, name)) == (type) 0) { \
+        PrintDebugString("LOAD_FP failed: %s", name); \
+        return FALSE; \
+    }
+
+    BOOL initializeAccessBridge() {
+
+#ifdef ACCESSBRIDGE_ARCH_32 // For 32bit AT new bridge
+        theAccessBridgeInstance = LoadLibrary("WINDOWSACCESSBRIDGE-32");
+#else
+#ifdef ACCESSBRIDGE_ARCH_64 // For 64bit AT new bridge
+                theAccessBridgeInstance = LoadLibrary("WINDOWSACCESSBRIDGE-64");
+#else // legacy
+        theAccessBridgeInstance = LoadLibrary("WINDOWSACCESSBRIDGE");
+#endif
+#endif
+        if (theAccessBridgeInstance != 0) {
+            LOAD_FP(Windows_run, Windows_runFP, "Windows_run");
+
+            LOAD_FP(SetJavaShutdown, SetJavaShutdownFP, "setJavaShutdownFP");
+            LOAD_FP(SetFocusGained, SetFocusGainedFP, "setFocusGainedFP");
+            LOAD_FP(SetFocusLost, SetFocusLostFP, "setFocusLostFP");
+
+            LOAD_FP(SetCaretUpdate, SetCaretUpdateFP, "setCaretUpdateFP");
+
+            LOAD_FP(SetMouseClicked, SetMouseClickedFP, "setMouseClickedFP");
+            LOAD_FP(SetMouseEntered, SetMouseEnteredFP, "setMouseEnteredFP");
+            LOAD_FP(SetMouseExited, SetMouseExitedFP, "setMouseExitedFP");
+            LOAD_FP(SetMousePressed, SetMousePressedFP, "setMousePressedFP");
+            LOAD_FP(SetMouseReleased, SetMouseReleasedFP, "setMouseReleasedFP");
+
+            LOAD_FP(SetMenuCanceled, SetMenuCanceledFP, "setMenuCanceledFP");
+            LOAD_FP(SetMenuDeselected, SetMenuDeselectedFP, "setMenuDeselectedFP");
+            LOAD_FP(SetMenuSelected, SetMenuSelectedFP, "setMenuSelectedFP");
+            LOAD_FP(SetPopupMenuCanceled, SetPopupMenuCanceledFP, "setPopupMenuCanceledFP");
+            LOAD_FP(SetPopupMenuWillBecomeInvisible, SetPopupMenuWillBecomeInvisibleFP, "setPopupMenuWillBecomeInvisibleFP");
+            LOAD_FP(SetPopupMenuWillBecomeVisible, SetPopupMenuWillBecomeVisibleFP, "setPopupMenuWillBecomeVisibleFP");
+
+            LOAD_FP(SetPropertyNameChange, SetPropertyNameChangeFP, "setPropertyNameChangeFP");
+            LOAD_FP(SetPropertyDescriptionChange, SetPropertyDescriptionChangeFP, "setPropertyDescriptionChangeFP");
+            LOAD_FP(SetPropertyStateChange, SetPropertyStateChangeFP, "setPropertyStateChangeFP");
+            LOAD_FP(SetPropertyValueChange, SetPropertyValueChangeFP, "setPropertyValueChangeFP");
+            LOAD_FP(SetPropertySelectionChange, SetPropertySelectionChangeFP, "setPropertySelectionChangeFP");
+            LOAD_FP(SetPropertyTextChange, SetPropertyTextChangeFP, "setPropertyTextChangeFP");
+            LOAD_FP(SetPropertyCaretChange, SetPropertyCaretChangeFP, "setPropertyCaretChangeFP");
+            LOAD_FP(SetPropertyVisibleDataChange, SetPropertyVisibleDataChangeFP, "setPropertyVisibleDataChangeFP");
+            LOAD_FP(SetPropertyChildChange, SetPropertyChildChangeFP, "setPropertyChildChangeFP");
+            LOAD_FP(SetPropertyActiveDescendentChange, SetPropertyActiveDescendentChangeFP, "setPropertyActiveDescendentChangeFP");
+
+            LOAD_FP(SetPropertyTableModelChange, SetPropertyTableModelChangeFP, "setPropertyTableModelChangeFP");
+
+            LOAD_FP(ReleaseJavaObject, ReleaseJavaObjectFP, "releaseJavaObject");
+            LOAD_FP(GetVersionInfo, GetVersionInfoFP, "getVersionInfo");
+
+            LOAD_FP(IsJavaWindow, IsJavaWindowFP, "isJavaWindow");
+            LOAD_FP(IsSameObject, IsSameObjectFP, "isSameObject");
+            LOAD_FP(GetAccessibleContextFromHWND, GetAccessibleContextFromHWNDFP, "getAccessibleContextFromHWND");
+            LOAD_FP(getHWNDFromAccessibleContext, getHWNDFromAccessibleContextFP, "getHWNDFromAccessibleContext");
+
+            LOAD_FP(GetAccessibleContextAt, GetAccessibleContextAtFP, "getAccessibleContextAt");
+            LOAD_FP(GetAccessibleContextWithFocus, GetAccessibleContextWithFocusFP, "getAccessibleContextWithFocus");
+            LOAD_FP(GetAccessibleContextInfo, GetAccessibleContextInfoFP, "getAccessibleContextInfo");
+            LOAD_FP(GetAccessibleChildFromContext, GetAccessibleChildFromContextFP, "getAccessibleChildFromContext");
+            LOAD_FP(GetAccessibleParentFromContext, GetAccessibleParentFromContextFP, "getAccessibleParentFromContext");
+
+            /* begin AccessibleTable */
+            LOAD_FP(getAccessibleTableInfo, getAccessibleTableInfoFP, "getAccessibleTableInfo");
+            LOAD_FP(getAccessibleTableCellInfo, getAccessibleTableCellInfoFP, "getAccessibleTableCellInfo");
+
+            LOAD_FP(getAccessibleTableRowHeader, getAccessibleTableRowHeaderFP, "getAccessibleTableRowHeader");
+            LOAD_FP(getAccessibleTableColumnHeader, getAccessibleTableColumnHeaderFP, "getAccessibleTableColumnHeader");
+
+            LOAD_FP(getAccessibleTableRowDescription, getAccessibleTableRowDescriptionFP, "getAccessibleTableRowDescription");
+            LOAD_FP(getAccessibleTableColumnDescription, getAccessibleTableColumnDescriptionFP, "getAccessibleTableColumnDescription");
+
+            LOAD_FP(getAccessibleTableRowSelectionCount, getAccessibleTableRowSelectionCountFP,
+                    "getAccessibleTableRowSelectionCount");
+            LOAD_FP(isAccessibleTableRowSelected, isAccessibleTableRowSelectedFP,
+                    "isAccessibleTableRowSelected");
+            LOAD_FP(getAccessibleTableRowSelections, getAccessibleTableRowSelectionsFP,
+                    "getAccessibleTableRowSelections");
+
+            LOAD_FP(getAccessibleTableColumnSelectionCount, getAccessibleTableColumnSelectionCountFP,
+                    "getAccessibleTableColumnSelectionCount");
+            LOAD_FP(isAccessibleTableColumnSelected, isAccessibleTableColumnSelectedFP,
+                    "isAccessibleTableColumnSelected");
+            LOAD_FP(getAccessibleTableColumnSelections, getAccessibleTableColumnSelectionsFP,
+                    "getAccessibleTableColumnSelections");
+
+            LOAD_FP(getAccessibleTableRow, getAccessibleTableRowFP,
+                    "getAccessibleTableRow");
+            LOAD_FP(getAccessibleTableColumn, getAccessibleTableColumnFP,
+                    "getAccessibleTableColumn");
+            LOAD_FP(getAccessibleTableIndex, getAccessibleTableIndexFP,
+                    "getAccessibleTableIndex");
+
+            /* end AccessibleTable */
+
+            /* AccessibleRelationSet */
+            LOAD_FP(getAccessibleRelationSet, getAccessibleRelationSetFP, "getAccessibleRelationSet");
+
+            /* AccessibleHypertext */
+            LOAD_FP(getAccessibleHypertext, getAccessibleHypertextFP, "getAccessibleHypertext");
+            LOAD_FP(activateAccessibleHyperlink, activateAccessibleHyperlinkFP, "activateAccessibleHyperlink");
+            LOAD_FP(getAccessibleHyperlinkCount, getAccessibleHyperlinkCountFP, "getAccessibleHyperlinkCount");
+            LOAD_FP(getAccessibleHypertextExt, getAccessibleHypertextExtFP, "getAccessibleHypertextExt");
+            LOAD_FP(getAccessibleHypertextLinkIndex, getAccessibleHypertextLinkIndexFP, "getAccessibleHypertextLinkIndex");
+            LOAD_FP(getAccessibleHyperlink, getAccessibleHyperlinkFP, "getAccessibleHyperlink");
+
+            /* Accessible KeyBinding, Icon and Action */
+            LOAD_FP(getAccessibleKeyBindings, getAccessibleKeyBindingsFP, "getAccessibleKeyBindings");
+            LOAD_FP(getAccessibleIcons, getAccessibleIconsFP, "getAccessibleIcons");
+            LOAD_FP(getAccessibleActions, getAccessibleActionsFP, "getAccessibleActions");
+            LOAD_FP(doAccessibleActions, doAccessibleActionsFP, "doAccessibleActions");
+
+            /* AccessibleText */
+            LOAD_FP(GetAccessibleTextInfo, GetAccessibleTextInfoFP, "getAccessibleTextInfo");
+            LOAD_FP(GetAccessibleTextItems, GetAccessibleTextItemsFP, "getAccessibleTextItems");
+            LOAD_FP(GetAccessibleTextSelectionInfo, GetAccessibleTextSelectionInfoFP, "getAccessibleTextSelectionInfo");
+            LOAD_FP(GetAccessibleTextAttributes, GetAccessibleTextAttributesFP, "getAccessibleTextAttributes");
+            LOAD_FP(GetAccessibleTextRect, GetAccessibleTextRectFP, "getAccessibleTextRect");
+            LOAD_FP(GetAccessibleTextLineBounds, GetAccessibleTextLineBoundsFP, "getAccessibleTextLineBounds");
+            LOAD_FP(GetAccessibleTextRange, GetAccessibleTextRangeFP, "getAccessibleTextRange");
+
+            LOAD_FP(GetCurrentAccessibleValueFromContext, GetCurrentAccessibleValueFromContextFP, "getCurrentAccessibleValueFromContext");
+            LOAD_FP(GetMaximumAccessibleValueFromContext, GetMaximumAccessibleValueFromContextFP, "getMaximumAccessibleValueFromContext");
+            LOAD_FP(GetMinimumAccessibleValueFromContext, GetMinimumAccessibleValueFromContextFP, "getMinimumAccessibleValueFromContext");
+
+            LOAD_FP(AddAccessibleSelectionFromContext, AddAccessibleSelectionFromContextFP, "addAccessibleSelectionFromContext");
+            LOAD_FP(ClearAccessibleSelectionFromContext, ClearAccessibleSelectionFromContextFP, "clearAccessibleSelectionFromContext");
+            LOAD_FP(GetAccessibleSelectionFromContext, GetAccessibleSelectionFromContextFP, "getAccessibleSelectionFromContext");
+            LOAD_FP(GetAccessibleSelectionCountFromContext, GetAccessibleSelectionCountFromContextFP, "getAccessibleSelectionCountFromContext");
+            LOAD_FP(IsAccessibleChildSelectedFromContext, IsAccessibleChildSelectedFromContextFP, "isAccessibleChildSelectedFromContext");
+            LOAD_FP(RemoveAccessibleSelectionFromContext, RemoveAccessibleSelectionFromContextFP, "removeAccessibleSelectionFromContext");
+            LOAD_FP(SelectAllAccessibleSelectionFromContext, SelectAllAccessibleSelectionFromContextFP, "selectAllAccessibleSelectionFromContext");
+
+            LOAD_FP(setTextContents, setTextContentsFP, "setTextContents");
+            LOAD_FP(getParentWithRole, getParentWithRoleFP, "getParentWithRole");
+            LOAD_FP(getTopLevelObject, getTopLevelObjectFP, "getTopLevelObject");
+            LOAD_FP(getParentWithRoleElseRoot, getParentWithRoleElseRootFP, "getParentWithRoleElseRoot");
+            LOAD_FP(getObjectDepth, getObjectDepthFP, "getObjectDepth");
+            LOAD_FP(getActiveDescendent, getActiveDescendentFP, "getActiveDescendent");
+
+            // additional methods for Teton
+            LOAD_FP(getVirtualAccessibleName, getVirtualAccessibleNameFP, "getVirtualAccessibleName");
+            LOAD_FP(requestFocus, requestFocusFP, "requestFocus");
+            LOAD_FP(selectTextRange, selectTextRangeFP, "selectTextRange");
+            LOAD_FP(getTextAttributesInRange, getTextAttributesInRangeFP, "getTextAttributesInRange");
+            LOAD_FP(getVisibleChildrenCount, getVisibleChildrenCountFP, "getVisibleChildrenCount");
+            LOAD_FP(getVisibleChildren, getVisibleChildrenFP, "getVisibleChildren");
+            LOAD_FP(setCaretPosition, setCaretPositionFP, "setCaretPosition");
+            LOAD_FP(getCaretLocation, getCaretLocationFP, "getCaretLocation");
+
+            LOAD_FP(getEventsWaiting, getEventsWaitingFP, "getEventsWaiting");
+
+            theAccessBridge.Windows_run();
+
+            theAccessBridgeInitializedFlag = TRUE;
+            PrintDebugString("theAccessBridgeInitializedFlag = TRUE");
+            return TRUE;
+        } else {
+            return FALSE;
+        }
+    }
+
+
+    BOOL shutdownAccessBridge() {
+        BOOL result;
+        DWORD error;
+        theAccessBridgeInitializedFlag = FALSE;
+        if (theAccessBridgeInstance != (HANDLE) 0) {
+            result = FreeLibrary(theAccessBridgeInstance);
+            if (result != TRUE) {
+                error = GetLastError();
+            }
+            return TRUE;
+        }
+        return FALSE;
+    }
+
+
+    void SetJavaShutdown(AccessBridge_JavaShutdownFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetJavaShutdown(fp);
+        }
+    }
+
+    void SetFocusGained(AccessBridge_FocusGainedFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetFocusGained(fp);
+        }
+    }
+
+    void SetFocusLost(AccessBridge_FocusLostFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetFocusLost(fp);
+        }
+    }
+
+
+    void SetCaretUpdate(AccessBridge_CaretUpdateFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetCaretUpdate(fp);
+        }
+    }
+
+
+    void SetMouseClicked(AccessBridge_MouseClickedFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMouseClicked(fp);
+        }
+    }
+
+    void SetMouseEntered(AccessBridge_MouseEnteredFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMouseEntered(fp);
+        }
+    }
+
+    void SetMouseExited(AccessBridge_MouseExitedFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMouseExited(fp);
+        }
+    }
+
+    void SetMousePressed(AccessBridge_MousePressedFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMousePressed(fp);
+        }
+    }
+
+    void SetMouseReleased(AccessBridge_MouseReleasedFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMouseReleased(fp);
+        }
+    }
+
+
+    void SetMenuCanceled(AccessBridge_MenuCanceledFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMenuCanceled(fp);
+        }
+    }
+
+    void SetMenuDeselected(AccessBridge_MenuDeselectedFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMenuDeselected(fp);
+        }
+    }
+
+    void SetMenuSelected(AccessBridge_MenuSelectedFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetMenuSelected(fp);
+        }
+    }
+
+    void SetPopupMenuCanceled(AccessBridge_PopupMenuCanceledFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPopupMenuCanceled(fp);
+        }
+    }
+
+    void SetPopupMenuWillBecomeInvisible(AccessBridge_PopupMenuWillBecomeInvisibleFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPopupMenuWillBecomeInvisible(fp);
+        }
+    }
+
+    void SetPopupMenuWillBecomeVisible(AccessBridge_PopupMenuWillBecomeVisibleFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPopupMenuWillBecomeVisible(fp);
+        }
+    }
+
+
+    void SetPropertyNameChange(AccessBridge_PropertyNameChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyNameChange(fp);
+        }
+    }
+
+    void SetPropertyDescriptionChange(AccessBridge_PropertyDescriptionChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyDescriptionChange(fp);
+        }
+    }
+
+    void SetPropertyStateChange(AccessBridge_PropertyStateChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyStateChange(fp);
+        }
+    }
+
+    void SetPropertyValueChange(AccessBridge_PropertyValueChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyValueChange(fp);
+        }
+    }
+
+    void SetPropertySelectionChange(AccessBridge_PropertySelectionChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertySelectionChange(fp);
+        }
+    }
+
+    void SetPropertyTextChange(AccessBridge_PropertyTextChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyTextChange(fp);
+        }
+    }
+
+    void SetPropertyCaretChange(AccessBridge_PropertyCaretChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyCaretChange(fp);
+        }
+    }
+
+    void SetPropertyVisibleDataChange(AccessBridge_PropertyVisibleDataChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyVisibleDataChange(fp);
+        }
+    }
+
+    void SetPropertyChildChange(AccessBridge_PropertyChildChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyChildChange(fp);
+        }
+    }
+
+    void SetPropertyActiveDescendentChange(AccessBridge_PropertyActiveDescendentChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyActiveDescendentChange(fp);
+        }
+    }
+
+    void SetPropertyTableModelChange(AccessBridge_PropertyTableModelChangeFP fp) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SetPropertyTableModelChange(fp);
+        }
+    }
+
+    /**
+     * General routines
+     */
+    void ReleaseJavaObject(long vmID, Java_Object object) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.ReleaseJavaObject(vmID, object);
+        }
+    }
+
+    BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetVersionInfo(vmID, info);
+        }
+        return FALSE;
+    }
+
+
+    /**
+     * Window routines
+     */
+    BOOL IsJavaWindow(HWND window) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+                        BOOL ret ;
+                        ret = theAccessBridge.IsJavaWindow(window);
+            return ret ;
+
+        }
+        return FALSE;
+    }
+
+
+    /**
+     * Returns the virtual machine ID and AccessibleContext for a top-level window
+     */
+    BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleContextFromHWND(target, vmID, ac);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Returns the HWND from the AccessibleContext of a top-level window.  Returns 0
+     *   on error or if the AccessibleContext does not refer to a top-level window.
+     */
+    HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accesibleContext) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getHWNDFromAccessibleContext(vmID, accesibleContext);
+        }
+        return (HWND)0;
+    }
+
+    /**
+     * returns whether two objects are the same
+     */
+    BOOL IsSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.IsSameObject(vmID, obj1, obj2);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Sets editable text contents.  The AccessibleContext must implement AccessibleEditableText and
+     *   be editable.  The maximum text length is MAX_STRING_SIZE - 1.
+     * Returns whether successful
+     */
+    BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.setTextContents(vmID, accessibleContext, text);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Returns the Accessible Context with the specified role that is the
+     * ancestor of a given object. The role is one of the role strings
+     * defined in AccessBridgePackages.h
+     * If there is no ancestor object that has the specified role,
+     * returns (AccessibleContext)0.
+     */
+    AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext,
+                                         const wchar_t *role) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getParentWithRole(vmID, accessibleContext, role);
+        }
+        return (AccessibleContext)0;
+    }
+
+    /**
+     * Returns the Accessible Context with the specified role that is the
+     * ancestor of a given object. The role is one of the role strings
+     * defined in AccessBridgePackages.h.  If an object with the specified
+     * role does not exist, returns the top level object for the Java Window.
+     * Returns (AccessibleContext)0 on error.
+     */
+    AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext,
+                                                 const wchar_t *role) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getParentWithRoleElseRoot(vmID, accessibleContext, role);
+        }
+        return (AccessibleContext)0;
+    }
+
+    /**
+     * Returns the Accessible Context for the top level object in
+     * a Java Window.  This is same Accessible Context that is obtained
+     * from GetAccessibleContextFromHWND for that window.  Returns
+     * (AccessibleContext)0 on error.
+     */
+    AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getTopLevelObject(vmID, accessibleContext);
+        }
+        return (AccessibleContext)0;
+    }
+
+    /**
+     * Returns how deep in the object hierarchy a given object is.
+     * The top most object in the object hierarchy has an object depth of 0.
+     * Returns -1 on error.
+     */
+    int getObjectDepth (const long vmID, const AccessibleContext accessibleContext) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getObjectDepth(vmID, accessibleContext);
+        }
+        return -1;
+    }
+
+    /**
+     * Returns the Accessible Context of the current ActiveDescendent of an object.
+     * This method assumes the ActiveDescendent is the component that is currently
+     * selected in a container object.
+     * Returns (AccessibleContext)0 on error or if there is no selection.
+     */
+    AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getActiveDescendent(vmID, accessibleContext);
+        }
+        return (AccessibleContext)0;
+    }
+
+
+    /**
+     * Accessible Context routines
+     */
+    BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent,
+                                jint x, jint y, AccessibleContext *ac) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleContextAt(vmID, acParent, x, y, ac);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleContextWithFocus(window, vmID, ac);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleContextInfo(vmID, ac, info);
+        }
+        return FALSE;
+    }
+
+    AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleChildFromContext(vmID, ac, index);
+        }
+        return (AccessibleContext) 0;
+    }
+
+    AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleParentFromContext(vmID, ac);
+        }
+        return (AccessibleContext) 0;
+    }
+
+    /* begin AccessibleTable routines */
+
+    /*
+     * get information about an AccessibleTable
+     */
+    BOOL getAccessibleTableInfo(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableInfo(vmID, acParent, tableInfo);
+        }
+        return FALSE;
+    }
+
+    /*
+     * get information about an AccessibleTable cell
+     */
+    BOOL getAccessibleTableCellInfo(long vmID, AccessibleTable accessibleTable,
+                                    jint row, jint column, AccessibleTableCellInfo *tableCellInfo) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableCellInfo(vmID, accessibleTable, row, column, tableCellInfo);
+        }
+        return FALSE;
+    }
+
+    /*
+     * get information about an AccessibleTable row header
+     */
+    BOOL getAccessibleTableRowHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableRowHeader(vmID, acParent, tableInfo);
+        }
+        return FALSE;
+    }
+
+    /*
+     * get information about an AccessibleTable column header
+     */
+    BOOL getAccessibleTableColumnHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableColumnHeader(vmID, acParent, tableInfo);
+        }
+        return FALSE;
+    }
+
+    /*
+     * return a description of an AccessibleTable row header
+     */
+    AccessibleContext getAccessibleTableRowDescription(long vmID, AccessibleContext acParent, jint row) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableRowDescription(vmID, acParent, row);
+        }
+        return (AccessibleContext)0;
+    }
+
+    /*
+     * return a description of an AccessibleTable column header
+     */
+    AccessibleContext getAccessibleTableColumnDescription(long vmID, AccessibleContext acParent, jint column) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableColumnDescription(vmID, acParent, column);
+        }
+        return (AccessibleContext)0;
+    }
+
+    /*
+     * return the number of rows selected in an AccessibleTable
+     */
+    jint getAccessibleTableRowSelectionCount(long vmID, AccessibleTable table) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableRowSelectionCount(vmID, table);
+        }
+        return -1;
+    }
+
+    /*
+     * return whether a row is selected in an AccessibleTable
+     */
+    BOOL isAccessibleTableRowSelected(long vmID, AccessibleTable table, jint row) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.isAccessibleTableRowSelected(vmID, table, row);
+        }
+        return FALSE;
+    }
+
+    /*
+     * get an array of selected rows in an AccessibleTable
+     */
+    BOOL getAccessibleTableRowSelections(long vmID, AccessibleTable table, jint count, jint *selections) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableRowSelections(vmID, table, count, selections);
+        }
+        return FALSE;
+    }
+
+    /*
+     * return the number of columns selected in an AccessibleTable
+     */
+    jint getAccessibleTableColumnSelectionCount(long vmID, AccessibleTable table) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableColumnSelectionCount(vmID, table);
+        }
+        return -1;
+    }
+
+    /*
+     * return whether a column is selected in an AccessibleTable
+     */
+    BOOL isAccessibleTableColumnSelected(long vmID, AccessibleTable table, jint column) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.isAccessibleTableColumnSelected(vmID, table, column);
+        }
+        return FALSE;
+    }
+
+    /*
+     * get an array of columns selected in an AccessibleTable
+     */
+    BOOL getAccessibleTableColumnSelections(long vmID, AccessibleTable table, jint count, jint *selections) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableColumnSelections(vmID, table, count, selections);
+        }
+        return FALSE;
+    }
+
+    /*
+     * return the row number for a cell at a given index
+     */
+    jint
+    getAccessibleTableRow(long vmID, AccessibleTable table, jint index) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableRow(vmID, table, index);
+        }
+        return -1;
+    }
+
+    /*
+     * return the column number for a cell at a given index
+     */
+    jint
+    getAccessibleTableColumn(long vmID, AccessibleTable table, jint index) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableColumn(vmID, table, index);
+        }
+        return -1;
+    }
+
+    /*
+     * return the index of a cell at a given row and column
+     */
+    jint
+    getAccessibleTableIndex(long vmID, AccessibleTable table, jint row, jint column) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleTableIndex(vmID, table, row, column);
+        }
+        return -1;
+    }
+
+    /* end AccessibleTable routines */
+
+
+    /**
+     * Accessible Text routines
+     */
+    BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleTextInfo(vmID, at, textInfo, x, y);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleTextItems(vmID, at, textItems, index);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleTextSelectionInfo(vmID, at, textSelection);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleTextAttributes(long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleTextAttributes(vmID, at, index, attributes);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleTextRect(vmID, at, rectInfo, index);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleTextLineBounds(vmID, at, index, startIndex, endIndex);
+        }
+        return FALSE;
+    }
+
+    BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleTextRange(vmID, at, start, end, text, len);
+        }
+        return FALSE;
+    }
+
+    /**
+     * AccessibleRelationSet routines
+     */
+    BOOL getAccessibleRelationSet(long vmID, AccessibleContext accessibleContext,
+                                  AccessibleRelationSetInfo *relationSetInfo) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleRelationSet(vmID, accessibleContext, relationSetInfo);
+        }
+        return FALSE;
+    }
+
+    /**
+     * AccessibleHypertext routines
+     */
+
+    // Gets AccessibleHypertext for an AccessibleContext
+    BOOL getAccessibleHypertext(long vmID, AccessibleContext accessibleContext,
+                                AccessibleHypertextInfo *hypertextInfo) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleHypertext(vmID, accessibleContext, hypertextInfo);
+        }
+        return FALSE;
+    }
+
+    // Activates an AccessibleHyperlink for an AccessibleContext
+    BOOL activateAccessibleHyperlink(long vmID, AccessibleContext accessibleContext,
+                                     AccessibleHyperlink accessibleHyperlink) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.activateAccessibleHyperlink(vmID, accessibleContext, accessibleHyperlink);
+        }
+        return FALSE;
+    }
+
+    /*
+     * Returns the number of hyperlinks in a component
+     * Maps to AccessibleHypertext.getLinkCount.
+     * Returns -1 on error.
+     */
+    jint getAccessibleHyperlinkCount(const long vmID,
+                                     const AccessibleContext accessibleContext) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleHyperlinkCount(vmID, accessibleContext);
+        }
+        return -1;
+    }
+
+    /*
+     * This method is used to iterate through the hyperlinks in a component.  It
+     * returns hypertext information for a component starting at hyperlink index
+     * nStartIndex.  No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
+     * be returned for each call to this method.
+     * returns FALSE on error.
+     */
+    BOOL getAccessibleHypertextExt(const long vmID,
+                                   const AccessibleContext accessibleContext,
+                                   const jint nStartIndex,
+                                   /* OUT */ AccessibleHypertextInfo *hypertextInfo) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleHypertextExt(vmID,
+                                                             accessibleContext,
+                                                             nStartIndex,
+                                                             hypertextInfo);
+        }
+        return FALSE;
+    }
+
+    /*
+     * Returns the index into an array of hyperlinks that is associated with
+     * a character index in document;
+     * Maps to AccessibleHypertext.getLinkIndex.
+     * Returns -1 on error.
+     */
+    jint getAccessibleHypertextLinkIndex(const long vmID,
+                                         const AccessibleHypertext hypertext,
+                                         const jint nIndex) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleHypertextLinkIndex(vmID,
+                                                                   hypertext,
+                                                                   nIndex);
+        }
+        return -1;
+    }
+
+    /*
+     * Returns the nth hyperlink in a document.
+     * Maps to AccessibleHypertext.getLink.
+     * Returns -1 on error
+     */
+    BOOL getAccessibleHyperlink(const long vmID,
+                                const AccessibleHypertext hypertext,
+                                const jint nIndex,
+                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo) {
+
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleHyperlink(vmID,
+                                                          hypertext,
+                                                          nIndex,
+                                                          hyperlinkInfo);
+        }
+        return FALSE;
+    }
+
+
+    /* Accessible KeyBindings, Icons and Actions */
+    BOOL getAccessibleKeyBindings(long vmID, AccessibleContext accessibleContext,
+                                  AccessibleKeyBindings *keyBindings) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleKeyBindings(vmID, accessibleContext, keyBindings);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleIcons(long vmID, AccessibleContext accessibleContext,
+                            AccessibleIcons *icons) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleIcons(vmID, accessibleContext, icons);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleActions(long vmID, AccessibleContext accessibleContext,
+                              AccessibleActions *actions) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getAccessibleActions(vmID, accessibleContext, actions);
+        }
+        return FALSE;
+    }
+
+    BOOL doAccessibleActions(long vmID, AccessibleContext accessibleContext,
+                             AccessibleActionsToDo *actionsToDo, jint *failure) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.doAccessibleActions(vmID, accessibleContext, actionsToDo, failure);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Accessible Value routines
+     */
+    BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetCurrentAccessibleValueFromContext(vmID, av, value, len);
+        }
+        return FALSE;
+    }
+
+    BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetMaximumAccessibleValueFromContext(vmID, av, value, len);
+        }
+        return FALSE;
+    }
+
+    BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetMinimumAccessibleValueFromContext(vmID, av, value, len);
+        }
+        return FALSE;
+    }
+
+
+    /**
+     * Accessible Selection routines
+     */
+    void addAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.AddAccessibleSelectionFromContext(vmID, as, i);
+        }
+    }
+
+    void clearAccessibleSelectionFromContext(long vmID, AccessibleSelection as) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.ClearAccessibleSelectionFromContext(vmID, as);
+        }
+    }
+
+    JOBJECT64 GetAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleSelectionFromContext(vmID, as, i);
+        }
+        return (JOBJECT64) 0;
+    }
+
+    int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection as) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.GetAccessibleSelectionCountFromContext(vmID, as);
+        }
+        return -1;
+    }
+
+    BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection as, int i) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.IsAccessibleChildSelectedFromContext(vmID, as, i);
+        }
+        return FALSE;
+    }
+
+    void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.RemoveAccessibleSelectionFromContext(vmID, as, i);
+        }
+    }
+
+    void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection as) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            theAccessBridge.SelectAllAccessibleSelectionFromContext(vmID, as);
+        }
+    }
+
+    /**
+     * Additional methods for Teton
+     */
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+     * whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    BOOL getVirtualAccessibleName(const long vmID, const AccessibleContext accessibleContext,
+                                  wchar_t *name, int len) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getVirtualAccessibleName(vmID, accessibleContext, name, len);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Request focus for a component. Returns whether successful;
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    BOOL requestFocus(const long vmID, const AccessibleContext accessibleContext) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.requestFocus(vmID, accessibleContext);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Selects text between two indices.  Selection includes the text at the start index
+     * and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    BOOL selectTextRange(const long vmID, const AccessibleContext accessibleContext,
+                         const int startIndex, const int endIndex) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.selectTextRange(vmID, accessibleContext, startIndex, endIndex);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Get text attributes between two indices.  The attribute list includes the text at the
+     * start index and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944761 - getTextAttributes between two indices method needed
+     */
+    BOOL getTextAttributesInRange(const long vmID, const AccessibleContext accessibleContext,
+                                  const int startIndex, const int endIndex,
+                                  AccessibleTextAttributesInfo *attributes, short *len) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getTextAttributesInRange(vmID, accessibleContext, startIndex,
+                                                            endIndex, attributes, len);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Returns the number of visible children of a component. Returns -1 on error.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    int getVisibleChildrenCount(const long vmID, const AccessibleContext accessibleContext) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getVisibleChildrenCount(vmID, accessibleContext);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Gets the visible children of an AccessibleContext. Returns whether successful;
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    BOOL getVisibleChildren(const long vmID, const AccessibleContext accessibleContext,
+                            const int startIndex, VisibleChildrenInfo *visibleChildrenInfo) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getVisibleChildren(vmID, accessibleContext, startIndex,
+                                                      visibleChildrenInfo);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Set the caret to a text position. Returns whether successful;
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext,
+                          const int position) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.setCaretPosition(vmID, accessibleContext, position);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Gets the text caret location
+     */
+    BOOL getCaretLocation(long vmID, AccessibleContext ac, AccessibleTextRectInfo *rectInfo, jint index) {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getCaretLocation(vmID, ac, rectInfo, index);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Gets the number of events waiting to fire
+     */
+    int getEventsWaiting() {
+        if (theAccessBridgeInitializedFlag == TRUE) {
+            return theAccessBridge.getEventsWaiting();
+        }
+        return FALSE;
+    }
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/include/bridge/AccessBridgeCalls.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,706 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Wrapper functions around calls to the AccessBridge DLL
+ */
+
+#include <windows.h>
+#include <jni.h>
+#include "AccessBridgeCallbacks.h"
+#include "AccessBridgePackages.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define null NULL
+
+    typedef JOBJECT64 AccessibleContext;
+    typedef JOBJECT64 AccessibleText;
+    typedef JOBJECT64 AccessibleValue;
+    typedef JOBJECT64 AccessibleSelection;
+    typedef JOBJECT64 Java_Object;
+    typedef JOBJECT64 PropertyChangeEvent;
+    typedef JOBJECT64 FocusEvent;
+    typedef JOBJECT64 CaretEvent;
+    typedef JOBJECT64 MouseEvent;
+    typedef JOBJECT64 MenuEvent;
+    typedef JOBJECT64 AccessibleTable;
+    typedef JOBJECT64 AccessibleHyperlink;
+    typedef JOBJECT64 AccessibleHypertext;
+
+
+    typedef void (*Windows_runFP) ();
+
+    typedef void (*SetPropertyChangeFP) (AccessBridge_PropertyChangeFP fp);
+
+    typedef void (*SetJavaShutdownFP) (AccessBridge_JavaShutdownFP fp);
+    typedef void (*SetFocusGainedFP) (AccessBridge_FocusGainedFP fp);
+    typedef void (*SetFocusLostFP) (AccessBridge_FocusLostFP fp);
+
+    typedef void (*SetCaretUpdateFP) (AccessBridge_CaretUpdateFP fp);
+
+    typedef void (*SetMouseClickedFP) (AccessBridge_MouseClickedFP fp);
+    typedef void (*SetMouseEnteredFP) (AccessBridge_MouseEnteredFP fp);
+    typedef void (*SetMouseExitedFP) (AccessBridge_MouseExitedFP fp);
+    typedef void (*SetMousePressedFP) (AccessBridge_MousePressedFP fp);
+    typedef void (*SetMouseReleasedFP) (AccessBridge_MouseReleasedFP fp);
+
+    typedef void (*SetMenuCanceledFP) (AccessBridge_MenuCanceledFP fp);
+    typedef void (*SetMenuDeselectedFP) (AccessBridge_MenuDeselectedFP fp);
+    typedef void (*SetMenuSelectedFP) (AccessBridge_MenuSelectedFP fp);
+    typedef void (*SetPopupMenuCanceledFP) (AccessBridge_PopupMenuCanceledFP fp);
+    typedef void (*SetPopupMenuWillBecomeInvisibleFP) (AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
+    typedef void (*SetPopupMenuWillBecomeVisibleFP) (AccessBridge_PopupMenuWillBecomeVisibleFP fp);
+
+    typedef void (*SetPropertyNameChangeFP) (AccessBridge_PropertyNameChangeFP fp);
+    typedef void (*SetPropertyDescriptionChangeFP) (AccessBridge_PropertyDescriptionChangeFP fp);
+    typedef void (*SetPropertyStateChangeFP) (AccessBridge_PropertyStateChangeFP fp);
+    typedef void (*SetPropertyValueChangeFP) (AccessBridge_PropertyValueChangeFP fp);
+    typedef void (*SetPropertySelectionChangeFP) (AccessBridge_PropertySelectionChangeFP fp);
+    typedef void (*SetPropertyTextChangeFP) (AccessBridge_PropertyTextChangeFP fp);
+    typedef void (*SetPropertyCaretChangeFP) (AccessBridge_PropertyCaretChangeFP fp);
+    typedef void (*SetPropertyVisibleDataChangeFP) (AccessBridge_PropertyVisibleDataChangeFP fp);
+    typedef void (*SetPropertyChildChangeFP) (AccessBridge_PropertyChildChangeFP fp);
+    typedef void (*SetPropertyActiveDescendentChangeFP) (AccessBridge_PropertyActiveDescendentChangeFP fp);
+
+    typedef void (*SetPropertyTableModelChangeFP) (AccessBridge_PropertyTableModelChangeFP fp);
+
+    typedef void (*ReleaseJavaObjectFP) (long vmID, Java_Object object);
+
+    typedef BOOL (*GetVersionInfoFP) (long vmID, AccessBridgeVersionInfo *info);
+
+    typedef BOOL (*IsJavaWindowFP) (HWND window);
+    typedef BOOL (*IsSameObjectFP) (long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
+    typedef BOOL (*GetAccessibleContextFromHWNDFP) (HWND window, long *vmID, AccessibleContext *ac);
+    typedef HWND (*getHWNDFromAccessibleContextFP) (long vmID, AccessibleContext ac);
+
+    typedef BOOL (*GetAccessibleContextAtFP) (long vmID, AccessibleContext acParent,
+                                              jint x, jint y, AccessibleContext *ac);
+    typedef BOOL (*GetAccessibleContextWithFocusFP) (HWND window, long *vmID, AccessibleContext *ac);
+    typedef BOOL (*GetAccessibleContextInfoFP) (long vmID, AccessibleContext ac, AccessibleContextInfo *info);
+    typedef AccessibleContext (*GetAccessibleChildFromContextFP) (long vmID, AccessibleContext ac, jint i);
+    typedef AccessibleContext (*GetAccessibleParentFromContextFP) (long vmID, AccessibleContext ac);
+
+    /* begin AccessibleTable */
+    typedef BOOL (*getAccessibleTableInfoFP) (long vmID, AccessibleContext ac, AccessibleTableInfo *tableInfo);
+    typedef BOOL (*getAccessibleTableCellInfoFP) (long vmID, AccessibleTable accessibleTable,
+                                                  jint row, jint column, AccessibleTableCellInfo *tableCellInfo);
+
+    typedef BOOL (*getAccessibleTableRowHeaderFP) (long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+    typedef BOOL (*getAccessibleTableColumnHeaderFP) (long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+
+    typedef AccessibleContext (*getAccessibleTableRowDescriptionFP) (long vmID, AccessibleContext acParent, jint row);
+    typedef AccessibleContext (*getAccessibleTableColumnDescriptionFP) (long vmID, AccessibleContext acParent, jint column);
+
+    typedef jint (*getAccessibleTableRowSelectionCountFP) (long vmID, AccessibleTable table);
+    typedef BOOL (*isAccessibleTableRowSelectedFP) (long vmID, AccessibleTable table, jint row);
+    typedef BOOL (*getAccessibleTableRowSelectionsFP) (long vmID, AccessibleTable table, jint count,
+                                                       jint *selections);
+
+    typedef jint (*getAccessibleTableColumnSelectionCountFP) (long vmID, AccessibleTable table);
+    typedef BOOL (*isAccessibleTableColumnSelectedFP) (long vmID, AccessibleTable table, jint column);
+    typedef BOOL (*getAccessibleTableColumnSelectionsFP) (long vmID, AccessibleTable table, jint count,
+                                                          jint *selections);
+
+    typedef jint (*getAccessibleTableRowFP) (long vmID, AccessibleTable table, jint index);
+    typedef jint (*getAccessibleTableColumnFP) (long vmID, AccessibleTable table, jint index);
+    typedef jint (*getAccessibleTableIndexFP) (long vmID, AccessibleTable table, jint row, jint column);
+    /* end AccessibleTable */
+
+    /* AccessibleRelationSet */
+    typedef BOOL (*getAccessibleRelationSetFP) (long vmID, AccessibleContext accessibleContext,
+                                                AccessibleRelationSetInfo *relationSetInfo);
+
+    /* AccessibleHypertext */
+    typedef BOOL (*getAccessibleHypertextFP)(long vmID, AccessibleContext accessibleContext,
+                                             AccessibleHypertextInfo *hypertextInfo);
+
+    typedef BOOL (*activateAccessibleHyperlinkFP)(long vmID, AccessibleContext accessibleContext,
+                                                  AccessibleHyperlink accessibleHyperlink);
+
+    typedef jint (*getAccessibleHyperlinkCountFP)(const long vmID,
+                                                      const AccessibleContext accessibleContext);
+
+    typedef BOOL (*getAccessibleHypertextExtFP) (const long vmID,
+                                                 const AccessibleContext accessibleContext,
+                                                 const jint nStartIndex,
+                                                 AccessibleHypertextInfo *hypertextInfo);
+
+    typedef jint (*getAccessibleHypertextLinkIndexFP)(const long vmID,
+                                                      const AccessibleHypertext hypertext,
+                                                      const jint nIndex);
+
+    typedef BOOL (*getAccessibleHyperlinkFP)(const long vmID,
+                                             const AccessibleHypertext hypertext,
+                                             const jint nIndex,
+                                             AccessibleHyperlinkInfo *hyperlinkInfo);
+
+
+    /* Accessible KeyBindings, Icons and Actions */
+    typedef BOOL (*getAccessibleKeyBindingsFP)(long vmID, AccessibleContext accessibleContext,
+                                               AccessibleKeyBindings *keyBindings);
+
+    typedef BOOL (*getAccessibleIconsFP)(long vmID, AccessibleContext accessibleContext,
+                                         AccessibleIcons *icons);
+
+    typedef BOOL (*getAccessibleActionsFP)(long vmID, AccessibleContext accessibleContext,
+                                           AccessibleActions *actions);
+
+    typedef BOOL (*doAccessibleActionsFP)(long vmID, AccessibleContext accessibleContext,
+                                          AccessibleActionsToDo *actionsToDo, jint *failure);
+
+
+    /* AccessibleText */
+
+    typedef BOOL (*GetAccessibleTextInfoFP) (long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
+    typedef BOOL (*GetAccessibleTextItemsFP) (long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
+    typedef BOOL (*GetAccessibleTextSelectionInfoFP) (long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
+    typedef BOOL (*GetAccessibleTextAttributesFP) (long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
+    typedef BOOL (*GetAccessibleTextRectFP) (long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
+    typedef BOOL (*GetAccessibleTextLineBoundsFP) (long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);
+    typedef BOOL (*GetAccessibleTextRangeFP) (long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
+
+    typedef BOOL (*GetCurrentAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
+    typedef BOOL (*GetMaximumAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
+    typedef BOOL (*GetMinimumAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
+
+    typedef void (*AddAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
+    typedef void (*ClearAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as);
+    typedef JOBJECT64 (*GetAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
+    typedef int (*GetAccessibleSelectionCountFromContextFP) (long vmID, AccessibleSelection as);
+    typedef BOOL (*IsAccessibleChildSelectedFromContextFP) (long vmID, AccessibleSelection as, int i);
+    typedef void (*RemoveAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
+    typedef void (*SelectAllAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as);
+
+    /* Utility methods */
+
+    typedef BOOL (*setTextContentsFP) (const long vmID, const AccessibleContext ac, const wchar_t *text);
+    typedef AccessibleContext (*getParentWithRoleFP) (const long vmID, const AccessibleContext ac, const wchar_t *role);
+    typedef AccessibleContext (*getParentWithRoleElseRootFP) (const long vmID, const AccessibleContext ac, const wchar_t *role);
+    typedef AccessibleContext (*getTopLevelObjectFP) (const long vmID, const AccessibleContext ac);
+    typedef int (*getObjectDepthFP) (const long vmID, const AccessibleContext ac);
+    typedef AccessibleContext (*getActiveDescendentFP) (const long vmID, const AccessibleContext ac);
+
+
+    typedef BOOL (*getVirtualAccessibleNameFP) (const long vmID, const AccessibleContext accessibleContext,
+                                             wchar_t *name, int len);
+
+    typedef BOOL (*requestFocusFP) (const long vmID, const AccessibleContext accessibleContext);
+
+    typedef BOOL (*selectTextRangeFP) (const long vmID, const AccessibleContext accessibleContext,
+                                       const int startIndex, const int endIndex);
+
+    typedef BOOL (*getTextAttributesInRangeFP) (const long vmID, const AccessibleContext accessibleContext,
+                                                const int startIndex, const int endIndex,
+                                                AccessibleTextAttributesInfo *attributes, short *len);
+
+    typedef int (*getVisibleChildrenCountFP) (const long vmID, const AccessibleContext accessibleContext);
+
+    typedef BOOL (*getVisibleChildrenFP) (const long vmID, const AccessibleContext accessibleContext,
+                                          const int startIndex, VisibleChildrenInfo *children);
+
+    typedef BOOL (*setCaretPositionFP) (const long vmID, const AccessibleContext accessibleContext, const int position);
+
+    typedef BOOL (*getCaretLocationFP) (long vmID, AccessibleContext ac, AccessibleTextRectInfo *rectInfo, jint index);
+
+    typedef int (*getEventsWaitingFP) ();
+
+    typedef struct AccessBridgeFPsTag {
+        Windows_runFP Windows_run;
+
+        SetPropertyChangeFP SetPropertyChange;
+
+        SetJavaShutdownFP SetJavaShutdown;
+        SetFocusGainedFP SetFocusGained;
+        SetFocusLostFP SetFocusLost;
+
+        SetCaretUpdateFP SetCaretUpdate;
+
+        SetMouseClickedFP SetMouseClicked;
+        SetMouseEnteredFP SetMouseEntered;
+        SetMouseExitedFP SetMouseExited;
+        SetMousePressedFP SetMousePressed;
+        SetMouseReleasedFP SetMouseReleased;
+
+        SetMenuCanceledFP SetMenuCanceled;
+        SetMenuDeselectedFP SetMenuDeselected;
+        SetMenuSelectedFP SetMenuSelected;
+        SetPopupMenuCanceledFP SetPopupMenuCanceled;
+        SetPopupMenuWillBecomeInvisibleFP SetPopupMenuWillBecomeInvisible;
+        SetPopupMenuWillBecomeVisibleFP SetPopupMenuWillBecomeVisible;
+
+        SetPropertyNameChangeFP SetPropertyNameChange;
+        SetPropertyDescriptionChangeFP SetPropertyDescriptionChange;
+        SetPropertyStateChangeFP SetPropertyStateChange;
+        SetPropertyValueChangeFP SetPropertyValueChange;
+        SetPropertySelectionChangeFP SetPropertySelectionChange;
+        SetPropertyTextChangeFP SetPropertyTextChange;
+        SetPropertyCaretChangeFP SetPropertyCaretChange;
+        SetPropertyVisibleDataChangeFP SetPropertyVisibleDataChange;
+        SetPropertyChildChangeFP SetPropertyChildChange;
+        SetPropertyActiveDescendentChangeFP SetPropertyActiveDescendentChange;
+
+        SetPropertyTableModelChangeFP SetPropertyTableModelChange;
+
+        ReleaseJavaObjectFP ReleaseJavaObject;
+        GetVersionInfoFP GetVersionInfo;
+
+        IsJavaWindowFP IsJavaWindow;
+        IsSameObjectFP IsSameObject;
+        GetAccessibleContextFromHWNDFP GetAccessibleContextFromHWND;
+        getHWNDFromAccessibleContextFP getHWNDFromAccessibleContext;
+
+        GetAccessibleContextAtFP GetAccessibleContextAt;
+        GetAccessibleContextWithFocusFP GetAccessibleContextWithFocus;
+        GetAccessibleContextInfoFP GetAccessibleContextInfo;
+        GetAccessibleChildFromContextFP GetAccessibleChildFromContext;
+        GetAccessibleParentFromContextFP GetAccessibleParentFromContext;
+
+        getAccessibleTableInfoFP getAccessibleTableInfo;
+        getAccessibleTableCellInfoFP getAccessibleTableCellInfo;
+
+        getAccessibleTableRowHeaderFP getAccessibleTableRowHeader;
+        getAccessibleTableColumnHeaderFP getAccessibleTableColumnHeader;
+
+        getAccessibleTableRowDescriptionFP getAccessibleTableRowDescription;
+        getAccessibleTableColumnDescriptionFP getAccessibleTableColumnDescription;
+
+        getAccessibleTableRowSelectionCountFP getAccessibleTableRowSelectionCount;
+        isAccessibleTableRowSelectedFP isAccessibleTableRowSelected;
+        getAccessibleTableRowSelectionsFP getAccessibleTableRowSelections;
+
+        getAccessibleTableColumnSelectionCountFP getAccessibleTableColumnSelectionCount;
+        isAccessibleTableColumnSelectedFP isAccessibleTableColumnSelected;
+        getAccessibleTableColumnSelectionsFP getAccessibleTableColumnSelections;
+
+        getAccessibleTableRowFP getAccessibleTableRow;
+        getAccessibleTableColumnFP getAccessibleTableColumn;
+        getAccessibleTableIndexFP getAccessibleTableIndex;
+
+        getAccessibleRelationSetFP getAccessibleRelationSet;
+
+        getAccessibleHypertextFP getAccessibleHypertext;
+        activateAccessibleHyperlinkFP activateAccessibleHyperlink;
+        getAccessibleHyperlinkCountFP getAccessibleHyperlinkCount;
+        getAccessibleHypertextExtFP getAccessibleHypertextExt;
+        getAccessibleHypertextLinkIndexFP getAccessibleHypertextLinkIndex;
+        getAccessibleHyperlinkFP getAccessibleHyperlink;
+
+        getAccessibleKeyBindingsFP getAccessibleKeyBindings;
+        getAccessibleIconsFP getAccessibleIcons;
+        getAccessibleActionsFP getAccessibleActions;
+        doAccessibleActionsFP doAccessibleActions;
+
+        GetAccessibleTextInfoFP GetAccessibleTextInfo;
+        GetAccessibleTextItemsFP GetAccessibleTextItems;
+        GetAccessibleTextSelectionInfoFP GetAccessibleTextSelectionInfo;
+        GetAccessibleTextAttributesFP GetAccessibleTextAttributes;
+        GetAccessibleTextRectFP GetAccessibleTextRect;
+        GetAccessibleTextLineBoundsFP GetAccessibleTextLineBounds;
+        GetAccessibleTextRangeFP GetAccessibleTextRange;
+
+        GetCurrentAccessibleValueFromContextFP GetCurrentAccessibleValueFromContext;
+        GetMaximumAccessibleValueFromContextFP GetMaximumAccessibleValueFromContext;
+        GetMinimumAccessibleValueFromContextFP GetMinimumAccessibleValueFromContext;
+
+        AddAccessibleSelectionFromContextFP AddAccessibleSelectionFromContext;
+        ClearAccessibleSelectionFromContextFP ClearAccessibleSelectionFromContext;
+        GetAccessibleSelectionFromContextFP GetAccessibleSelectionFromContext;
+        GetAccessibleSelectionCountFromContextFP GetAccessibleSelectionCountFromContext;
+        IsAccessibleChildSelectedFromContextFP IsAccessibleChildSelectedFromContext;
+        RemoveAccessibleSelectionFromContextFP RemoveAccessibleSelectionFromContext;
+        SelectAllAccessibleSelectionFromContextFP SelectAllAccessibleSelectionFromContext;
+
+        setTextContentsFP setTextContents;
+        getParentWithRoleFP getParentWithRole;
+        getTopLevelObjectFP getTopLevelObject;
+        getParentWithRoleElseRootFP getParentWithRoleElseRoot;
+        getObjectDepthFP getObjectDepth;
+        getActiveDescendentFP getActiveDescendent;
+
+        getVirtualAccessibleNameFP getVirtualAccessibleName;
+        requestFocusFP requestFocus;
+        selectTextRangeFP selectTextRange;
+        getTextAttributesInRangeFP getTextAttributesInRange;
+        getVisibleChildrenCountFP getVisibleChildrenCount;
+        getVisibleChildrenFP getVisibleChildren;
+        setCaretPositionFP setCaretPosition;
+        getCaretLocationFP getCaretLocation;
+
+        getEventsWaitingFP getEventsWaiting;
+
+    } AccessBridgeFPs;
+
+
+    /**
+     * Initialize the world
+     */
+    BOOL initializeAccessBridge();
+    BOOL shutdownAccessBridge();
+
+    /**
+     * Window routines
+     */
+    BOOL IsJavaWindow(HWND window);
+
+    // Returns the virtual machine ID and AccessibleContext for a top-level window
+    BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac);
+
+    // Returns the HWND from the AccessibleContext of a top-level window
+    HWND getHWNDFromAccessibleContext(long vmID, AccessibleContext ac);
+
+
+    /**
+     * Event handling routines
+     */
+    void SetJavaShutdown(AccessBridge_JavaShutdownFP fp);
+    void SetFocusGained(AccessBridge_FocusGainedFP fp);
+    void SetFocusLost(AccessBridge_FocusLostFP fp);
+
+    void SetCaretUpdate(AccessBridge_CaretUpdateFP fp);
+
+    void SetMouseClicked(AccessBridge_MouseClickedFP fp);
+    void SetMouseEntered(AccessBridge_MouseEnteredFP fp);
+    void SetMouseExited(AccessBridge_MouseExitedFP fp);
+    void SetMousePressed(AccessBridge_MousePressedFP fp);
+    void SetMouseReleased(AccessBridge_MouseReleasedFP fp);
+
+    void SetMenuCanceled(AccessBridge_MenuCanceledFP fp);
+    void SetMenuDeselected(AccessBridge_MenuDeselectedFP fp);
+    void SetMenuSelected(AccessBridge_MenuSelectedFP fp);
+    void SetPopupMenuCanceled(AccessBridge_PopupMenuCanceledFP fp);
+    void SetPopupMenuWillBecomeInvisible(AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
+    void SetPopupMenuWillBecomeVisible(AccessBridge_PopupMenuWillBecomeVisibleFP fp);
+
+    void SetPropertyNameChange(AccessBridge_PropertyNameChangeFP fp);
+    void SetPropertyDescriptionChange(AccessBridge_PropertyDescriptionChangeFP fp);
+    void SetPropertyStateChange(AccessBridge_PropertyStateChangeFP fp);
+    void SetPropertyValueChange(AccessBridge_PropertyValueChangeFP fp);
+    void SetPropertySelectionChange(AccessBridge_PropertySelectionChangeFP fp);
+    void SetPropertyTextChange(AccessBridge_PropertyTextChangeFP fp);
+    void SetPropertyCaretChange(AccessBridge_PropertyCaretChangeFP fp);
+    void SetPropertyVisibleDataChange(AccessBridge_PropertyVisibleDataChangeFP fp);
+    void SetPropertyChildChange(AccessBridge_PropertyChildChangeFP fp);
+    void SetPropertyActiveDescendentChange(AccessBridge_PropertyActiveDescendentChangeFP fp);
+
+    void SetPropertyTableModelChange(AccessBridge_PropertyTableModelChangeFP fp);
+
+
+    /**
+     * General routines
+     */
+    void ReleaseJavaObject(long vmID, Java_Object object);
+    BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info);
+    HWND GetHWNDFromAccessibleContext(long vmID, JOBJECT64 accesibleContext);
+
+    /**
+     * Accessible Context routines
+     */
+    BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent,
+                                jint x, jint y, AccessibleContext *ac);
+    BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac);
+    BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info);
+    AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index);
+    AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac);
+
+    /**
+     * Accessible Text routines
+     */
+    BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
+    BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
+    BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
+    BOOL GetAccessibleTextAttributes(long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
+    BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
+    BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);
+    BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
+
+    /* begin AccessibleTable routines */
+    BOOL getAccessibleTableInfo(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+
+    BOOL getAccessibleTableCellInfo(long vmID, AccessibleTable accessibleTable, jint row, jint column,
+                                    AccessibleTableCellInfo *tableCellInfo);
+
+    BOOL getAccessibleTableRowHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+    BOOL getAccessibleTableColumnHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+
+    AccessibleContext getAccessibleTableRowDescription(long vmID, AccessibleContext acParent, jint row);
+    AccessibleContext getAccessibleTableColumnDescription(long vmID, AccessibleContext acParent, jint column);
+
+    jint getAccessibleTableRowSelectionCount(long vmID, AccessibleTable table);
+    BOOL isAccessibleTableRowSelected(long vmID, AccessibleTable table, jint row);
+    BOOL getAccessibleTableRowSelections(long vmID, AccessibleTable table, jint count, jint *selections);
+
+    jint getAccessibleTableColumnSelectionCount(long vmID, AccessibleTable table);
+    BOOL isAccessibleTableColumnSelected(long vmID, AccessibleTable table, jint column);
+    BOOL getAccessibleTableColumnSelections(long vmID, AccessibleTable table, jint count, jint *selections);
+
+    jint getAccessibleTableRow(long vmID, AccessibleTable table, jint index);
+    jint getAccessibleTableColumn(long vmID, AccessibleTable table, jint index);
+    jint getAccessibleTableIndex(long vmID, AccessibleTable table, jint row, jint column);
+    /* end AccessibleTable */
+
+    /* ----- AccessibleRelationSet routines */
+    BOOL getAccessibleRelationSet(long vmID, AccessibleContext accessibleContext,
+                                  AccessibleRelationSetInfo *relationSetInfo);
+
+    /* ----- AccessibleHypertext routines */
+
+     /*
+     * Returns hypertext information associated with a component.
+     */
+    BOOL getAccessibleHypertext(long vmID, AccessibleContext accessibleContext,
+                                AccessibleHypertextInfo *hypertextInfo);
+
+    /*
+     * Requests that a hyperlink be activated.
+     */
+    BOOL activateAccessibleHyperlink(long vmID, AccessibleContext accessibleContext,
+                                     AccessibleHyperlink accessibleHyperlink);
+
+    /*
+     * Returns the number of hyperlinks in a component
+     * Maps to AccessibleHypertext.getLinkCount.
+     * Returns -1 on error.
+     */
+    jint getAccessibleHyperlinkCount(const long vmID,
+                                         const AccessibleHypertext hypertext);
+
+    /*
+     * This method is used to iterate through the hyperlinks in a component.  It
+     * returns hypertext information for a component starting at hyperlink index
+     * nStartIndex.  No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
+     * be returned for each call to this method.
+     * Returns FALSE on error.
+     */
+    BOOL getAccessibleHypertextExt(const long vmID,
+                                   const AccessibleContext accessibleContext,
+                                   const jint nStartIndex,
+                                   /* OUT */ AccessibleHypertextInfo *hypertextInfo);
+
+    /*
+     * Returns the index into an array of hyperlinks that is associated with
+     * a character index in document; maps to AccessibleHypertext.getLinkIndex
+     * Returns -1 on error.
+     */
+    jint getAccessibleHypertextLinkIndex(const long vmID,
+                                         const AccessibleHypertext hypertext,
+                                         const jint nIndex);
+
+    /*
+     * Returns the nth hyperlink in a document
+     * Maps to AccessibleHypertext.getLink.
+     * Returns FALSE on error
+     */
+    BOOL getAccessibleHyperlink(const long vmID,
+                                const AccessibleHypertext hypertext,
+                                const jint nIndex,
+                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
+
+    /* Accessible KeyBindings, Icons and Actions */
+
+    /*
+     * Returns a list of key bindings associated with a component.
+     */
+    BOOL getAccessibleKeyBindings(long vmID, AccessibleContext accessibleContext,
+                                  AccessibleKeyBindings *keyBindings);
+
+    /*
+     * Returns a list of icons associate with a component.
+     */
+    BOOL getAccessibleIcons(long vmID, AccessibleContext accessibleContext,
+                            AccessibleIcons *icons);
+
+    /*
+     * Returns a list of actions that a component can perform.
+     */
+    BOOL getAccessibleActions(long vmID, AccessibleContext accessibleContext,
+                              AccessibleActions *actions);
+
+    /*
+     * Request that a list of AccessibleActions be performed by a component.
+     * Returns TRUE if all actions are performed.  Returns FALSE
+     * when the first requested action fails in which case "failure"
+     * contains the index of the action that failed.
+     */
+    BOOL doAccessibleActions(long vmID, AccessibleContext accessibleContext,
+                             AccessibleActionsToDo *actionsToDo, jint *failure);
+
+
+
+    /* Additional utility methods */
+
+    /*
+     * Returns whether two object references refer to the same object.
+     */
+    BOOL IsSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
+
+    /**
+     * Sets editable text contents.  The AccessibleContext must implement AccessibleEditableText and
+     *   be editable.  The maximum text length that can be set is MAX_STRING_SIZE - 1.
+     * Returns whether successful
+     */
+    BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text);
+
+    /**
+     * Returns the Accessible Context with the specified role that is the
+     * ancestor of a given object. The role is one of the role strings
+     * defined in AccessBridgePackages.h
+     * If there is no ancestor object that has the specified role,
+     * returns (AccessibleContext)0.
+     */
+    AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext,
+                                         const wchar_t *role);
+
+    /**
+     * Returns the Accessible Context with the specified role that is the
+     * ancestor of a given object. The role is one of the role strings
+     * defined in AccessBridgePackages.h.  If an object with the specified
+     * role does not exist, returns the top level object for the Java Window.
+     * Returns (AccessibleContext)0 on error.
+     */
+    AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext,
+                                                 const wchar_t *role);
+
+    /**
+     * Returns the Accessible Context for the top level object in
+     * a Java Window.  This is same Accessible Context that is obtained
+     * from GetAccessibleContextFromHWND for that window.  Returns
+     * (AccessibleContext)0 on error.
+     */
+    AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext);
+
+    /**
+     * Returns how deep in the object hierarchy a given object is.
+     * The top most object in the object hierarchy has an object depth of 0.
+     * Returns -1 on error.
+     */
+    int getObjectDepth (const long vmID, const AccessibleContext accessibleContext);
+
+    /**
+     * Returns the Accessible Context of the current ActiveDescendent of an object.
+     * This method assumes the ActiveDescendent is the component that is currently
+     * selected in a container object.
+     * Returns (AccessibleContext)0 on error or if there is no selection.
+     */
+    AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext);
+
+    /**
+       /**
+       * Accessible Value routines
+       */
+    BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
+    BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
+    BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
+
+    /**
+     * Accessible Selection routines
+     */
+    void AddAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
+    void ClearAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
+    JOBJECT64 GetAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
+    int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection as);
+    BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection as, int i);
+    void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
+    void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
+
+    /**
+     * Additional methods for Teton
+     */
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+     * whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    BOOL getVirtualAccessibleName(const long vmID, const AccessibleContext accessibleContext,
+                               wchar_t *name, int len);
+
+    /**
+     * Request focus for a component. Returns whether successful.
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    BOOL requestFocus(const long vmID, const AccessibleContext accessibleContext);
+
+    /**
+     * Selects text between two indices.  Selection includes the text at the start index
+     * and the text at the end index. Returns whether successful.
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    BOOL selectTextRange(const long vmID, const AccessibleContext accessibleContext, const int startIndex,
+                         const int endIndex);
+
+    /**
+     * Get text attributes between two indices.  The attribute list includes the text at the
+     * start index and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944761 - getTextAttributes between two indices method needed
+     */
+    BOOL getTextAttributesInRange(const long vmID, const AccessibleContext accessibleContext,
+                                  const int startIndex, const int endIndex,
+                                  AccessibleTextAttributesInfo *attributes, short *len);
+
+    /**
+     * Returns the number of visible children of a component. Returns -1 on error.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    int getVisibleChildrenCount(const long vmID, const AccessibleContext accessibleContext);
+
+    /**
+     * Gets the visible children of an AccessibleContext. Returns whether successful.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    BOOL getVisibleChildren(const long vmID, const AccessibleContext accessibleContext,
+                            const int startIndex,
+                            VisibleChildrenInfo *visibleChildrenInfo);
+
+    /**
+     * Set the caret to a text position. Returns whether successful.
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext,
+                          const int position);
+
+    /**
+     * Gets the text caret location
+     */
+    BOOL getCaretLocation(long vmID, AccessibleContext ac,
+                          AccessibleTextRectInfo *rectInfo, jint index);
+
+    /**
+     * Gets the number of events waiting to fire
+     */
+    int getEventsWaiting();
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/include/bridge/AccessBridgePackages.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,2215 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Header file for packages of paramaters passed between Java Accessibility
+ * and native Assistive Technologies
+ */
+
+#ifndef __AccessBridgePackages_H__
+#define __AccessBridgePackages_H__
+
+#include <jni.h>
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY
+typedef jobject JOBJECT64;
+typedef HWND ABHWND64;
+#define ABHandleToLong
+#define ABLongToHandle
+#else
+typedef jlong JOBJECT64;
+typedef long ABHWND64;
+#define ABHandleToLong HandleToLong
+#define ABLongToHandle LongToHandle
+#endif
+
+#define MAX_BUFFER_SIZE   10240
+#define MAX_STRING_SIZE   1024
+#define SHORT_STRING_SIZE   256
+
+    // object types
+    typedef JOBJECT64 AccessibleContext;
+    typedef JOBJECT64 AccessibleText;
+    typedef JOBJECT64 AccessibleValue;
+    typedef JOBJECT64 AccessibleSelection;
+    typedef JOBJECT64 Java_Object;
+    typedef JOBJECT64 PropertyChangeEvent;
+    typedef JOBJECT64 FocusEvent;
+    typedef JOBJECT64 CaretEvent;
+    typedef JOBJECT64 MouseEvent;
+    typedef JOBJECT64 MenuEvent;
+    typedef JOBJECT64 AccessibleTable;
+    typedef JOBJECT64 AccessibleHyperlink;
+    typedef JOBJECT64 AccessibleHypertext;
+
+    /**
+     ******************************************************
+     *  Java event types
+     ******************************************************
+     */
+
+#define cPropertyChangeEvent (jlong) 1          // 1
+#define cFocusGainedEvent (jlong) 2             // 2
+#define cFocusLostEvent (jlong) 4               // 4
+#define cCaretUpdateEvent (jlong) 8             // 8
+#define cMouseClickedEvent (jlong) 16           // 10
+#define cMouseEnteredEvent (jlong) 32           // 20
+#define cMouseExitedEvent (jlong) 64            // 40
+#define cMousePressedEvent (jlong) 128          // 80
+#define cMouseReleasedEvent (jlong) 256         // 100
+#define cMenuCanceledEvent (jlong) 512          // 200
+#define cMenuDeselectedEvent (jlong) 1024       // 400
+#define cMenuSelectedEvent (jlong) 2048         // 800
+#define cPopupMenuCanceledEvent (jlong) 4096    // 1000
+#define cPopupMenuWillBecomeInvisibleEvent (jlong) 8192         // 2000
+#define cPopupMenuWillBecomeVisibleEvent (jlong) 16384          // 4000
+#define cJavaShutdownEvent (jlong) 32768        // 8000
+
+    /**
+     ******************************************************
+     *  Accessible Roles
+     *      Defines all AccessibleRoles in Local.US
+     ******************************************************
+     */
+
+    /**
+     * Object is used to alert the user about something.
+     */
+#define ACCESSIBLE_ALERT L"alert"
+
+    /**
+     * The header for a column of data.
+     */
+#define ACCESSIBLE_COLUMN_HEADER L"column header"
+
+    /**
+     * Object that can be drawn into and is used to trap
+     * events.
+     * see ACCESSIBLE_FRAME
+     * see ACCESSIBLE_GLASS_PANE
+     * see ACCESSIBLE_LAYERED_PANE
+     */
+#define ACCESSIBLE_CANVAS L"canvas"
+
+    /**
+     * A list of choices the user can select from.  Also optionally
+     * allows the user to enter a choice of their own.
+     */
+#define ACCESSIBLE_COMBO_BOX L"combo box"
+
+    /**
+     * An iconified internal frame in a DESKTOP_PANE.
+     * see ACCESSIBLE_DESKTOP_PANE
+     * see ACCESSIBLE_INTERNAL_FRAME
+     */
+#define ACCESSIBLE_DESKTOP_ICON L"desktop icon"
+
+    /**
+     * A frame-like object that is clipped by a desktop pane.  The
+     * desktop pane, internal frame, and desktop icon objects are
+     * often used to create multiple document interfaces within an
+     * application.
+     * see ACCESSIBLE_DESKTOP_ICON
+     * see ACCESSIBLE_DESKTOP_PANE
+     * see ACCESSIBLE_FRAME
+     */
+#define ACCESSIBLE_INTERNAL_FRAME L"internal frame"
+
+    /**
+     * A pane that supports internal frames and
+     * iconified versions of those internal frames.
+     * see ACCESSIBLE_DESKTOP_ICON
+     * see ACCESSIBLE_INTERNAL_FRAME
+     */
+#define ACCESSIBLE_DESKTOP_PANE L"desktop pane"
+
+    /**
+     * A specialized pane whose primary use is inside a DIALOG
+     * see ACCESSIBLE_DIALOG
+     */
+#define ACCESSIBLE_OPTION_PANE L"option pane"
+
+    /**
+     * A top level window with no title or border.
+     * see ACCESSIBLE_FRAME
+     * see ACCESSIBLE_DIALOG
+     */
+#define ACCESSIBLE_WINDOW L"window"
+
+    /**
+     * A top level window with a title bar, border, menu bar, etc.  It is
+     * often used as the primary window for an application.
+     * see ACCESSIBLE_DIALOG
+     * see ACCESSIBLE_CANVAS
+     * see ACCESSIBLE_WINDOW
+     */
+#define ACCESSIBLE_FRAME L"frame"
+
+    /**
+     * A top level window with title bar and a border.  A dialog is similar
+     * to a frame, but it has fewer properties and is often used as a
+     * secondary window for an application.
+     * see ACCESSIBLE_FRAME
+     * see ACCESSIBLE_WINDOW
+     */
+#define ACCESSIBLE_DIALOG L"dialog"
+
+    /**
+     * A specialized dialog that lets the user choose a color.
+     */
+#define ACCESSIBLE_COLOR_CHOOSER L"color chooser"
+
+
+    /**
+     * A pane that allows the user to navigate through
+     * and select the contents of a directory.  May be used
+     * by a file chooser.
+     * see ACCESSIBLE_FILE_CHOOSER
+     */
+#define ACCESSIBLE_DIRECTORY_PANE L"directory pane"
+
+    /**
+     * A specialized dialog that displays the files in the directory
+     * and lets the user select a file, browse a different directory,
+     * or specify a filename.  May use the directory pane to show the
+     * contents of a directory.
+     * see ACCESSIBLE_DIRECTORY_PANE
+     */
+#define ACCESSIBLE_FILE_CHOOSER L"file chooser"
+
+    /**
+     * An object that fills up space in a user interface.  It is often
+     * used in interfaces to tweak the spacing between components,
+     * but serves no other purpose.
+     */
+#define ACCESSIBLE_FILLER L"filler"
+
+    /**
+     * A hypertext anchor
+     */
+#define ACCESSIBLE_HYPERLINK L"hyperlink"
+
+    /**
+     * A small fixed size picture, typically used to decorate components.
+     */
+#define ACCESSIBLE_ICON L"icon"
+
+    /**
+     * An object used to present an icon or short string in an interface.
+     */
+#define ACCESSIBLE_LABEL L"label"
+
+    /**
+     * A specialized pane that has a glass pane and a layered pane as its
+     * children.
+     * see ACCESSIBLE_GLASS_PANE
+     * see ACCESSIBLE_LAYERED_PANE
+     */
+#define ACCESSIBLE_ROOT_PANE L"root pane"
+
+    /**
+     * A pane that is guaranteed to be painted on top
+     * of all panes beneath it.
+     * see ACCESSIBLE_ROOT_PANE
+     * see ACCESSIBLE_CANVAS
+     */
+#define ACCESSIBLE_GLASS_PANE L"glass pane"
+
+    /**
+     * A specialized pane that allows its children to be drawn in layers,
+     * providing a form of stacking order.  This is usually the pane that
+     * holds the menu bar as well as the pane that contains most of the
+     * visual components in a window.
+     * see ACCESSIBLE_GLASS_PANE
+     * see ACCESSIBLE_ROOT_PANE
+     */
+#define ACCESSIBLE_LAYERED_PANE L"layered pane"
+
+    /**
+     * An object that presents a list of objects to the user and allows the
+     * user to select one or more of them.  A list is usually contained
+     * within a scroll pane.
+     * see ACCESSIBLE_SCROLL_PANE
+     * see ACCESSIBLE_LIST_ITEM
+     */
+#define ACCESSIBLE_LIST L"list"
+
+    /**
+     * An object that presents an element in a list.  A list is usually
+     * contained within a scroll pane.
+     * see ACCESSIBLE_SCROLL_PANE
+     * see ACCESSIBLE_LIST
+     */
+#define ACCESSIBLE_LIST_ITEM L"list item"
+
+    /**
+     * An object usually drawn at the top of the primary dialog box of
+     * an application that contains a list of menus the user can choose
+     * from.  For example, a menu bar might contain menus for "File,"
+     * "Edit," and "Help."
+     * see ACCESSIBLE_MENU
+     * see ACCESSIBLE_POPUP_MENU
+     * see ACCESSIBLE_LAYERED_PANE
+     */
+#define ACCESSIBLE_MENU_BAR L"menu bar"
+
+    /**
+     * A temporary window that is usually used to offer the user a
+     * list of choices, and then hides when the user selects one of
+     * those choices.
+     * see ACCESSIBLE_MENU
+     * see ACCESSIBLE_MENU_ITEM
+     */
+#define ACCESSIBLE_POPUP_MENU L"popup menu"
+
+    /**
+     * An object usually found inside a menu bar that contains a list
+     * of actions the user can choose from.  A menu can have any object
+     * as its children, but most often they are menu items, other menus,
+     * or rudimentary objects such as radio buttons, check boxes, or
+     * separators.  For example, an application may have an "Edit" menu
+     * that contains menu items for "Cut" and "Paste."
+     * see ACCESSIBLE_MENU_BAR
+     * see ACCESSIBLE_MENU_ITEM
+     * see ACCESSIBLE_SEPARATOR
+     * see ACCESSIBLE_RADIO_BUTTON
+     * see ACCESSIBLE_CHECK_BOX
+     * see ACCESSIBLE_POPUP_MENU
+     */
+#define ACCESSIBLE_MENU L"menu"
+
+    /**
+     * An object usually contained in a menu that presents an action
+     * the user can choose.  For example, the "Cut" menu item in an
+     * "Edit" menu would be an action the user can select to cut the
+     * selected area of text in a document.
+     * see ACCESSIBLE_MENU_BAR
+     * see ACCESSIBLE_SEPARATOR
+     * see ACCESSIBLE_POPUP_MENU
+     */
+#define ACCESSIBLE_MENU_ITEM L"menu item"
+
+    /**
+     * An object usually contained in a menu to provide a visual
+     * and logical separation of the contents in a menu.  For example,
+     * the "File" menu of an application might contain menu items for
+     * "Open," "Close," and "Exit," and will place a separator between
+     * "Close" and "Exit" menu items.
+     * see ACCESSIBLE_MENU
+     * see ACCESSIBLE_MENU_ITEM
+     */
+#define ACCESSIBLE_SEPARATOR L"separator"
+
+    /**
+     * An object that presents a series of panels (or page tabs), one at a
+     * time, through some mechanism provided by the object.  The most common
+     * mechanism is a list of tabs at the top of the panel.  The children of
+     * a page tab list are all page tabs.
+     * see ACCESSIBLE_PAGE_TAB
+     */
+#define ACCESSIBLE_PAGE_TAB_LIST L"page tab list"
+
+    /**
+     * An object that is a child of a page tab list.  Its sole child is
+     * the panel that is to be presented to the user when the user
+     * selects the page tab from the list of tabs in the page tab list.
+     * see ACCESSIBLE_PAGE_TAB_LIST
+     */
+#define ACCESSIBLE_PAGE_TAB L"page tab"
+
+    /**
+     * A generic container that is often used to group objects.
+     */
+#define ACCESSIBLE_PANEL L"panel"
+
+    /**
+     * An object used to indicate how much of a task has been completed.
+     */
+#define ACCESSIBLE_PROGRESS_BAR L"progress bar"
+
+    /**
+     * A text object used for passwords, or other places where the
+     * text contents is not shown visibly to the user
+     */
+#define ACCESSIBLE_PASSWORD_TEXT L"password text"
+
+    /**
+     * An object the user can manipulate to tell the application to do
+     * something.
+     * see ACCESSIBLE_CHECK_BOX
+     * see ACCESSIBLE_TOGGLE_BUTTON
+     * see ACCESSIBLE_RADIO_BUTTON
+     */
+#define ACCESSIBLE_PUSH_BUTTON L"push button"
+
+    /**
+     * A specialized push button that can be checked or unchecked, but
+     * does not provide a separate indicator for the current state.
+     * see ACCESSIBLE_PUSH_BUTTON
+     * see ACCESSIBLE_CHECK_BOX
+     * see ACCESSIBLE_RADIO_BUTTON
+     */
+#define ACCESSIBLE_TOGGLE_BUTTON L"toggle button"
+
+    /**
+     * A choice that can be checked or unchecked and provides a
+     * separate indicator for the current state.
+     * see ACCESSIBLE_PUSH_BUTTON
+     * see ACCESSIBLE_TOGGLE_BUTTON
+     * see ACCESSIBLE_RADIO_BUTTON
+     */
+#define ACCESSIBLE_CHECK_BOX L"check box"
+
+    /**
+     * A specialized check box that will cause other radio buttons in the
+     * same group to become unchecked when this one is checked.
+     * see ACCESSIBLE_PUSH_BUTTON
+     * see ACCESSIBLE_TOGGLE_BUTTON
+     * see ACCESSIBLE_CHECK_BOX
+     */
+#define ACCESSIBLE_RADIO_BUTTON L"radio button"
+
+    /**
+     * The header for a row of data.
+     */
+#define ACCESSIBLE_ROW_HEADER L"row header"
+
+    /**
+     * An object that allows a user to incrementally view a large amount
+     * of information.  Its children can include scroll bars and a viewport.
+     * see ACCESSIBLE_SCROLL_BAR
+     * see ACCESSIBLE_VIEWPORT
+     */
+#define ACCESSIBLE_SCROLL_PANE L"scroll pane"
+
+    /**
+     * An object usually used to allow a user to incrementally view a
+     * large amount of data.  Usually used only by a scroll pane.
+     * see ACCESSIBLE_SCROLL_PANE
+     */
+#define ACCESSIBLE_SCROLL_BAR L"scroll bar"
+
+    /**
+     * An object usually used in a scroll pane.  It represents the portion
+     * of the entire data that the user can see.  As the user manipulates
+     * the scroll bars, the contents of the viewport can change.
+     * see ACCESSIBLE_SCROLL_PANE
+     */
+#define ACCESSIBLE_VIEWPORT L"viewport"
+
+    /**
+     * An object that allows the user to select from a bounded range.  For
+     * example, a slider might be used to select a number between 0 and 100.
+     */
+#define ACCESSIBLE_SLIDER L"slider"
+
+    /**
+     * A specialized panel that presents two other panels at the same time.
+     * Between the two panels is a divider the user can manipulate to make
+     * one panel larger and the other panel smaller.
+     */
+#define ACCESSIBLE_SPLIT_PANE L"split pane"
+
+    /**
+     * An object used to present information in terms of rows and columns.
+     * An example might include a spreadsheet application.
+     */
+#define ACCESSIBLE_TABLE L"table"
+
+    /**
+     * An object that presents text to the user.  The text is usually
+     * editable by the user as opposed to a label.
+     * see ACCESSIBLE_LABEL
+     */
+#define ACCESSIBLE_TEXT L"text"
+
+    /**
+     * An object used to present hierarchical information to the user.
+     * The individual nodes in the tree can be collapsed and expanded
+     * to provide selective disclosure of the tree's contents.
+     */
+#define ACCESSIBLE_TREE L"tree"
+
+    /**
+     * A bar or palette usually composed of push buttons or toggle buttons.
+     * It is often used to provide the most frequently used functions for an
+     * application.
+     */
+#define ACCESSIBLE_TOOL_BAR L"tool bar"
+
+    /**
+     * An object that provides information about another object.  The
+     * accessibleDescription property of the tool tip is often displayed
+     * to the user in a small L"help bubble" when the user causes the
+     * mouse to hover over the object associated with the tool tip.
+     */
+#define ACCESSIBLE_TOOL_TIP L"tool tip"
+
+    /**
+     * An AWT component, but nothing else is known about it.
+     * see ACCESSIBLE_SWING_COMPONENT
+     * see ACCESSIBLE_UNKNOWN
+     */
+#define ACCESSIBLE_AWT_COMPONENT L"awt component"
+
+    /**
+     * A Swing component, but nothing else is known about it.
+     * see ACCESSIBLE_AWT_COMPONENT
+     * see ACCESSIBLE_UNKNOWN
+     */
+#define ACCESSIBLE_SWING_COMPONENT L"swing component"
+
+    /**
+     * The object contains some Accessible information, but its role is
+     * not known.
+     * see ACCESSIBLE_AWT_COMPONENT
+     * see ACCESSIBLE_SWING_COMPONENT
+     */
+#define ACCESSIBLE_UNKNOWN L"unknown"
+
+    /**
+     * A STATUS_BAR is an simple component that can contain
+     * multiple labels of status information to the user.
+     */
+#define ACCESSIBLE_STATUS_BAR L"status bar"
+
+    /**
+     * A DATE_EDITOR is a component that allows users to edit
+     * java.util.Date and java.util.Time objects
+     */
+#define ACCESSIBLE_DATE_EDITOR L"date editor"
+
+    /**
+     * A SPIN_BOX is a simple spinner component and its main use
+     * is for simple numbers.
+     */
+#define ACCESSIBLE_SPIN_BOX L"spin box"
+
+    /**
+     * A FONT_CHOOSER is a component that lets the user pick various
+     * attributes for fonts.
+     */
+#define ACCESSIBLE_FONT_CHOOSER L"font chooser"
+
+    /**
+     * A GROUP_BOX is a simple container that contains a border
+     * around it and contains components inside it.
+     */
+#define ACCESSIBLE_GROUP_BOX L"group box"
+
+    /**
+     * A text header
+     */
+#define ACCESSIBLE_HEADER L"header"
+
+    /**
+     * A text footer
+     */
+#define ACCESSIBLE_FOOTER L"footer"
+
+    /**
+     * A text paragraph
+     */
+#define ACCESSIBLE_PARAGRAPH L"paragraph"
+
+    /**
+     * A ruler is an object used to measure distance
+     */
+#define ACCESSIBLE_RULER L"ruler"
+
+    /**
+     * A role indicating the object acts as a formula for
+     * calculating a value.  An example is a formula in
+     * a spreadsheet cell.
+     */
+#define ACCESSIBLE_EDITBAR L"editbar"
+
+    /**
+     * A role indicating the object monitors the progress
+     * of some operation.
+     */
+#define PROGRESS_MONITOR L"progress monitor"
+
+
+    /**
+     ******************************************************
+     *  Accessibility event types
+     ******************************************************
+     */
+
+#define cPropertyNameChangeEvent (jlong) 1              // 1
+#define cPropertyDescriptionChangeEvent (jlong) 2       // 2
+#define cPropertyStateChangeEvent (jlong) 4             // 4
+#define cPropertyValueChangeEvent (jlong) 8             // 8
+#define cPropertySelectionChangeEvent (jlong) 16        // 10
+#define cPropertyTextChangeEvent (jlong) 32             // 20
+#define cPropertyCaretChangeEvent (jlong) 64            // 40
+#define cPropertyVisibleDataChangeEvent (jlong) 128     // 80
+#define cPropertyChildChangeEvent (jlong) 256           // 100
+#define cPropertyActiveDescendentChangeEvent (jlong) 512 // 200
+#define cPropertyTableModelChangeEvent (jlong) 1024     // 400
+
+    /**
+     ******************************************************
+     *  optional AccessibleContext interfaces
+     *
+     * This version of the bridge reuses the accessibleValue
+     * field in the AccessibleContextInfo struct to represent
+     * additional optional interfaces that are supported by
+     * the Java AccessibleContext.  This is backwardly compatable
+     * because the old accessibleValue was set to the BOOL
+     * value TRUE (i.e., 1) if the AccessibleValue interface is
+     * supported.
+     ******************************************************
+     */
+
+#define cAccessibleValueInterface (jlong) 1             // 1 << 1 (TRUE)
+#define cAccessibleActionInterface (jlong) 2            // 1 << 2
+#define cAccessibleComponentInterface (jlong) 4         // 1 << 3
+#define cAccessibleSelectionInterface (jlong) 8         // 1 << 4
+#define cAccessibleTableInterface (jlong) 16            // 1 << 5
+#define cAccessibleTextInterface (jlong) 32             // 1 << 6
+#define cAccessibleHypertextInterface (jlong) 64        // 1 << 7
+
+
+    /**
+     ******************************************************
+     *  Accessibility information bundles
+     ******************************************************
+     */
+
+    typedef struct AccessBridgeVersionInfoTag {
+        wchar_t VMversion[SHORT_STRING_SIZE];               // output of "java -version"
+        wchar_t bridgeJavaClassVersion[SHORT_STRING_SIZE];  // version of the AccessBridge.class
+        wchar_t bridgeJavaDLLVersion[SHORT_STRING_SIZE];    // version of JavaAccessBridge.dll
+        wchar_t bridgeWinDLLVersion[SHORT_STRING_SIZE];     // version of WindowsAccessBridge.dll
+    } AccessBridgeVersionInfo;
+
+
+    typedef struct AccessibleContextInfoTag {
+        wchar_t name[MAX_STRING_SIZE];          // the AccessibleName of the object
+        wchar_t description[MAX_STRING_SIZE];   // the AccessibleDescription of the object
+
+        wchar_t role[SHORT_STRING_SIZE];        // localized AccesibleRole string
+        wchar_t role_en_US[SHORT_STRING_SIZE];  // AccesibleRole string in the en_US locale
+        wchar_t states[SHORT_STRING_SIZE];      // localized AccesibleStateSet string (comma separated)
+        wchar_t states_en_US[SHORT_STRING_SIZE]; // AccesibleStateSet string in the en_US locale (comma separated)
+
+        jint indexInParent;                     // index of object in parent
+        jint childrenCount;                     // # of children, if any
+
+        jint x;                                 // screen coords in pixels
+        jint y;                                 // "
+        jint width;                             // pixel width of object
+        jint height;                            // pixel height of object
+
+        BOOL accessibleComponent;               // flags for various additional
+        BOOL accessibleAction;                  //  Java Accessibility interfaces
+        BOOL accessibleSelection;               //  FALSE if this object doesn't
+        BOOL accessibleText;                    //  implement the additional interface
+                                                //  in question
+
+        // BOOL accessibleValue;                // old BOOL indicating whether AccessibleValue is supported
+        BOOL accessibleInterfaces;              // new bitfield containing additional interface flags
+
+    } AccessibleContextInfo;
+
+
+
+    // AccessibleText packages
+    typedef struct AccessibleTextInfoTag {
+        jint charCount;                 // # of characters in this text object
+        jint caretIndex;                // index of caret
+        jint indexAtPoint;              // index at the passsed in point
+    } AccessibleTextInfo;
+
+    typedef struct AccessibleTextItemsInfoTag {
+        wchar_t letter;
+        wchar_t word[SHORT_STRING_SIZE];
+        wchar_t sentence[MAX_STRING_SIZE];
+    } AccessibleTextItemsInfo;
+
+    typedef struct AccessibleTextSelectionInfoTag {
+        jint selectionStartIndex;
+        jint selectionEndIndex;
+        wchar_t selectedText[MAX_STRING_SIZE];
+    } AccessibleTextSelectionInfo;
+
+    typedef struct AccessibleTextRectInfoTag {
+        jint x;                     // bounding rect of char at index
+        jint y;                     // "
+        jint width;                 // "
+        jint height;                // "
+    } AccessibleTextRectInfo;
+
+    // standard attributes for text; note: tabstops are not supported
+    typedef struct AccessibleTextAttributesInfoTag {
+        BOOL bold;
+        BOOL italic;
+        BOOL underline;
+        BOOL strikethrough;
+        BOOL superscript;
+        BOOL subscript;
+
+        wchar_t backgroundColor[SHORT_STRING_SIZE];
+        wchar_t foregroundColor[SHORT_STRING_SIZE];
+        wchar_t fontFamily[SHORT_STRING_SIZE];
+        jint fontSize;
+
+        jint alignment;
+        jint bidiLevel;
+
+        jfloat firstLineIndent;
+        jfloat leftIndent;
+        jfloat rightIndent;
+        jfloat lineSpacing;
+        jfloat spaceAbove;
+        jfloat spaceBelow;
+
+        wchar_t fullAttributesString[MAX_STRING_SIZE];
+    } AccessibleTextAttributesInfo;
+
+    /**
+     ******************************************************
+     *  IPC management typedefs
+     ******************************************************
+     */
+
+#define cMemoryMappedNameSize   255
+
+    /**
+     * sent by the WindowsDLL -> the memory-mapped file is setup
+     *
+     */
+    typedef struct MemoryMappedFileCreatedPackageTag {
+//      HWND bridgeWindow;              // redundant, but easier to get to here...
+        ABHWND64 bridgeWindow;          // redundant, but easier to get to here...
+        char filename[cMemoryMappedNameSize];
+    } MemoryMappedFileCreatedPackage;
+
+
+
+
+    /**
+     * sent when a new JavaVM attaches to the Bridge
+     *
+     */
+    typedef struct JavaVMCreatedPackageTag {
+        ABHWND64 bridgeWindow;
+        long vmID;
+    } JavaVMCreatedPackage;
+
+    /**
+     * sent when a JavaVM detatches from the Bridge
+     *
+     */
+    typedef struct JavaVMDestroyedPackageTag {
+        ABHWND64 bridgeWindow;
+    } JavaVMDestroyedPackage;
+
+    /**
+     * sent when a new AT attaches to the Bridge
+     *
+     */
+    typedef struct WindowsATCreatedPackageTag {
+        ABHWND64 bridgeWindow;
+    } WindowsATCreatedPackage;
+
+    /**
+     * sent when an AT detatches from the Bridge
+     *
+     */
+    typedef struct WindowsATDestroyedPackageTag {
+        ABHWND64 bridgeWindow;
+    } WindowsATDestroyedPackage;
+
+
+    /**
+     * sent by JVM Bridges in response to a WindowsATCreate
+     * message; saying "howdy, welcome to the neighborhood"
+     *
+     */
+    typedef struct JavaVMPresentNotificationPackageTag {
+        ABHWND64 bridgeWindow;
+        long vmID;
+    } JavaVMPresentNotificationPackage;
+
+    /**
+     * sent by AT Bridges in response to a JavaVMCreate
+     * message; saying "howdy, welcome to the neighborhood"
+     *
+     */
+    typedef struct WindowsATPresentNotificationPackageTag {
+        ABHWND64 bridgeWindow;
+    } WindowsATPresentNotificationPackage;
+
+
+    /**
+     ******************************************************
+     *  Core packages
+     ******************************************************
+     */
+
+    typedef struct ReleaseJavaObjectPackageTag {
+        long vmID;
+        JOBJECT64 object;
+    } ReleaseJavaObjectPackage;
+
+    typedef struct GetAccessBridgeVersionPackageTag {
+        long vmID;                    // can't get VM info w/out a VM!
+        AccessBridgeVersionInfo rVersionInfo;
+    } GetAccessBridgeVersionPackage;
+
+    typedef struct IsSameObjectPackageTag {
+        long vmID;
+        JOBJECT64 obj1;
+        JOBJECT64 obj2;
+        jboolean rResult;
+    } IsSameObjectPackage;
+
+    /**
+     ******************************************************
+     *  Windows packages
+     ******************************************************
+     */
+
+    typedef struct IsJavaWindowPackageTag {
+        jint window;
+        jboolean rResult;
+    } IsJavaWindowPackage;
+
+    typedef struct GetAccessibleContextFromHWNDPackageTag {
+        jint window;
+        long rVMID;
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleContextFromHWNDPackage;
+
+    typedef struct GetHWNDFromAccessibleContextPackageTag {
+        JOBJECT64 accessibleContext;
+        ABHWND64 rHWND;
+    } GetHWNDFromAccessibleContextPackage;
+
+    /**
+******************************************************
+*  AccessibleContext packages
+******************************************************
+*/
+
+    typedef struct GetAccessibleContextAtPackageTag {
+        jint x;
+        jint y;
+        long vmID;
+        JOBJECT64 AccessibleContext;            // look within this AC
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleContextAtPackage;
+
+    typedef struct GetAccessibleContextWithFocusPackageTag {
+        long rVMID;
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleContextWithFocusPackage;
+
+    typedef struct GetAccessibleContextInfoPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        AccessibleContextInfo rAccessibleContextInfo;
+    } GetAccessibleContextInfoPackage;
+
+    typedef struct GetAccessibleChildFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint childIndex;
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleChildFromContextPackage;
+
+    typedef struct GetAccessibleParentFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleParentFromContextPackage;
+
+    /**
+******************************************************
+*  AccessibleTable packages
+******************************************************
+*/
+
+#define MAX_TABLE_SELECTIONS 64
+
+    // table information
+    typedef struct AccessibleTableInfoTag {
+        JOBJECT64 caption;  // AccesibleContext
+        JOBJECT64 summary;  // AccessibleContext
+        jint rowCount;
+        jint columnCount;
+        JOBJECT64 accessibleContext;
+        JOBJECT64 accessibleTable;
+    } AccessibleTableInfo;
+
+    typedef struct GetAccessibleTableInfoPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        AccessibleTableInfo rTableInfo;
+    } GetAccessibleTableInfoPackage;
+
+    // table cell information
+    typedef struct AccessibleTableCellInfoTag {
+        JOBJECT64  accessibleContext;
+        jint     index;
+        jint     row;
+        jint     column;
+        jint     rowExtent;
+        jint     columnExtent;
+        jboolean isSelected;
+    } AccessibleTableCellInfo;
+
+    typedef struct GetAccessibleTableCellInfoPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint row;
+        jint column;
+        AccessibleTableCellInfo rTableCellInfo;
+    } GetAccessibleTableCellInfoPackage;
+
+    typedef struct GetAccessibleTableRowHeaderPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        AccessibleTableInfo rTableInfo;
+    } GetAccessibleTableRowHeaderPackage;
+
+    typedef struct GetAccessibleTableColumnHeaderPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        AccessibleTableInfo rTableInfo;
+    } GetAccessibleTableColumnHeaderPackage;
+
+    typedef struct GetAccessibleTableRowDescriptionPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        jint row;
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleTableRowDescriptionPackage;
+
+    typedef struct GetAccessibleTableColumnDescriptionPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        jint column;
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleTableColumnDescriptionPackage;
+
+    typedef struct GetAccessibleTableRowSelectionCountPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint rCount;
+    } GetAccessibleTableRowSelectionCountPackage;
+
+    typedef struct IsAccessibleTableRowSelectedPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint row;
+        jboolean rResult;
+    } IsAccessibleTableRowSelectedPackage;
+
+    typedef struct GetAccessibleTableRowSelectionsPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint count;
+        jint rSelections[MAX_TABLE_SELECTIONS];
+    } GetAccessibleTableRowSelectionsPackage;
+
+    typedef struct GetAccessibleTableColumnSelectionCountPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint rCount;
+    } GetAccessibleTableColumnSelectionCountPackage;
+
+    typedef struct IsAccessibleTableColumnSelectedPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint column;
+        jboolean rResult;
+    } IsAccessibleTableColumnSelectedPackage;
+
+    typedef struct GetAccessibleTableColumnSelectionsPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint count;
+        jint rSelections[MAX_TABLE_SELECTIONS];
+    } GetAccessibleTableColumnSelectionsPackage;
+
+
+    typedef struct GetAccessibleTableRowPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint index;
+        jint rRow;
+    } GetAccessibleTableRowPackage;
+
+    typedef struct GetAccessibleTableColumnPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint index;
+        jint rColumn;
+    } GetAccessibleTableColumnPackage;
+
+    typedef struct GetAccessibleTableIndexPackageTag {
+        long vmID;
+        JOBJECT64 accessibleTable;
+        jint row;
+        jint column;
+        jint rIndex;
+    } GetAccessibleTableIndexPackage;
+
+
+    /**
+     ******************************************************
+     *  AccessibleRelationSet packages
+     ******************************************************
+     */
+
+#define MAX_RELATION_TARGETS 25
+#define MAX_RELATIONS 5
+
+    typedef struct AccessibleRelationInfoTag {
+        wchar_t key[SHORT_STRING_SIZE];
+        jint targetCount;
+        JOBJECT64 targets[MAX_RELATION_TARGETS];  // AccessibleContexts
+    } AccessibleRelationInfo;
+
+    typedef struct AccessibleRelationSetInfoTag {
+        jint relationCount;
+        AccessibleRelationInfo relations[MAX_RELATIONS];
+    } AccessibleRelationSetInfo;
+
+    typedef struct GetAccessibleRelationSetPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        AccessibleRelationSetInfo rAccessibleRelationSetInfo;
+    } GetAccessibleRelationSetPackage;
+
+    /**
+     ******************************************************
+     *  AccessibleHypertext packagess
+     ******************************************************
+     */
+
+#define MAX_HYPERLINKS          64      // maximum number of hyperlinks returned
+
+    // hyperlink information
+    typedef struct AccessibleHyperlinkInfoTag {
+        wchar_t text[SHORT_STRING_SIZE]; // the hyperlink text
+        jint startIndex;        //index in the hypertext document where the link begins
+        jint endIndex;          //index in the hypertext document where the link ends
+        JOBJECT64 accessibleHyperlink; // AccessibleHyperlink object
+    } AccessibleHyperlinkInfo;
+
+    // hypertext information
+    typedef struct AccessibleHypertextInfoTag {
+        jint linkCount;         // number of hyperlinks
+        AccessibleHyperlinkInfo links[MAX_HYPERLINKS];  // the hyperlinks
+        JOBJECT64 accessibleHypertext; // AccessibleHypertext object
+    } AccessibleHypertextInfo;
+
+    // struct for sending a message to get the hypertext for an AccessibleContext
+    typedef struct GetAccessibleHypertextPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 accessibleContext; // AccessibleContext with hypertext
+        AccessibleHypertextInfo rAccessibleHypertextInfo; // returned hypertext
+    } GetAccessibleHypertextPackage;
+
+    // struct for sending an message to activate a hyperlink
+    typedef struct ActivateAccessibleHyperlinkPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 accessibleContext; // AccessibleContext containing the link
+        JOBJECT64 accessibleHyperlink; // the link to activate
+        BOOL rResult;           // hyperlink activation return value
+    } ActivateAccessibleHyperlinkPackage;
+
+    // struct for sending a message to get the number of hyperlinks in a component
+    typedef struct GetAccessibleHyperlinkCountPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 accessibleContext;    // AccessibleContext containing AccessibleHypertext
+        jint rLinkCount;        // link count return value
+    } GetAccessibleHyperlinkCountPackage;
+
+    // struct for sending a message to get the hypertext for an AccessibleContext
+    // starting at a specified index in the document
+    typedef struct GetAccessibleHypertextExtPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 accessibleContext; // AccessibleContext with hypertext
+        jint startIndex;        // start index in document
+        AccessibleHypertextInfo rAccessibleHypertextInfo; // returned hypertext
+        BOOL rSuccess;          // whether call succeeded
+    } GetAccessibleHypertextExtPackage;
+
+    // struct for sending a message to get the nth hyperlink in a document;
+    // maps to AccessibleHypertext.getLink
+    typedef struct GetAccessibleHyperlinkPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 hypertext;    // AccessibleHypertext
+        jint linkIndex;         // hyperlink index
+        AccessibleHyperlinkInfo rAccessibleHyperlinkInfo; // returned hyperlink
+    } GetAccessibleHyperlinkPackage;
+
+    // struct for sending a message to get the index into an array
+    // of hyperlinks that is associated with a character index in a
+    // document; maps to AccessibleHypertext.getLinkIndex
+    typedef struct GetAccessibleHypertextLinkIndexPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 hypertext;    // AccessibleHypertext
+        jint charIndex;         // character index in document
+        jint rLinkIndex;        // returned hyperlink index
+    } GetAccessibleHypertextLinkIndexPackage;
+
+    /**
+     ******************************************************
+     *  Accessible Key Bindings packages
+     ******************************************************
+     */
+
+#define MAX_KEY_BINDINGS        10
+
+    // keyboard character modifiers
+#define ACCESSIBLE_SHIFT_KEYSTROKE              1
+#define ACCESSIBLE_CONTROL_KEYSTROKE            2
+#define ACCESSIBLE_META_KEYSTROKE               4
+#define ACCESSIBLE_ALT_KEYSTROKE                8
+#define ACCESSIBLE_ALT_GRAPH_KEYSTROKE          16
+#define ACCESSIBLE_BUTTON1_KEYSTROKE            32
+#define ACCESSIBLE_BUTTON2_KEYSTROKE            64
+#define ACCESSIBLE_BUTTON3_KEYSTROKE            128
+#define ACCESSIBLE_FKEY_KEYSTROKE               256  // F key pressed, character contains 1-24
+#define ACCESSIBLE_CONTROLCODE_KEYSTROKE        512  // Control code key pressed, character contains control code.
+
+// The supported control code keys are:
+#define ACCESSIBLE_VK_BACK_SPACE    8
+#define ACCESSIBLE_VK_DELETE        127
+#define ACCESSIBLE_VK_DOWN          40
+#define ACCESSIBLE_VK_END           35
+#define ACCESSIBLE_VK_HOME          36
+#define ACCESSIBLE_VK_INSERT        155
+#define ACCESSIBLE_VK_KP_DOWN       225
+#define ACCESSIBLE_VK_KP_LEFT       226
+#define ACCESSIBLE_VK_KP_RIGHT      227
+#define ACCESSIBLE_VK_KP_UP         224
+#define ACCESSIBLE_VK_LEFT          37
+#define ACCESSIBLE_VK_PAGE_DOWN     34
+#define ACCESSIBLE_VK_PAGE_UP       33
+#define ACCESSIBLE_VK_RIGHT         39
+#define ACCESSIBLE_VK_UP            38
+
+    // a key binding associates with a component
+    typedef struct AccessibleKeyBindingInfoTag {
+        jchar character;                // the key character
+        jint modifiers;                 // the key modifiers
+    } AccessibleKeyBindingInfo;
+
+    // all of the key bindings associated with a component
+    typedef struct AccessibleKeyBindingsTag {
+        int keyBindingsCount;   // number of key bindings
+        AccessibleKeyBindingInfo keyBindingInfo[MAX_KEY_BINDINGS];
+    } AccessibleKeyBindings;
+
+    // struct to get the key bindings associated with a component
+    typedef struct GetAccessibleKeyBindingsPackageTag {
+        long vmID;                                      // the virtual machine id
+        JOBJECT64 accessibleContext;                    // the component
+        AccessibleKeyBindings rAccessibleKeyBindings;   // the key bindings
+    } GetAccessibleKeyBindingsPackage;
+
+    /**
+******************************************************
+*  AccessibleIcon packages
+******************************************************
+*/
+#define MAX_ICON_INFO 8
+
+    // an icon assocated with a component
+    typedef struct AccessibleIconInfoTag {
+        wchar_t description[SHORT_STRING_SIZE]; // icon description
+        jint height;                            // icon height
+        jint width;                             // icon width
+    } AccessibleIconInfo;
+
+    // all of the icons associated with a component
+    typedef struct AccessibleIconsTag {
+        jint iconsCount;                // number of icons
+        AccessibleIconInfo iconInfo[MAX_ICON_INFO];     // the icons
+    } AccessibleIcons;
+
+    // struct to get the icons associated with a component
+    typedef struct GetAccessibleIconsPackageTag {
+        long vmID;                              // the virtual machine id
+        JOBJECT64 accessibleContext;            // the component
+        AccessibleIcons rAccessibleIcons;       // the icons
+    } GetAccessibleIconsPackage;
+
+
+    /**
+******************************************************
+*  AccessibleAction packages
+******************************************************
+*/
+#define MAX_ACTION_INFO 256
+#define MAX_ACTIONS_TO_DO 32
+
+    // an action assocated with a component
+    typedef struct AccessibleActionInfoTag {
+        wchar_t name[SHORT_STRING_SIZE];        // action name
+    } AccessibleActionInfo;
+
+    // all of the actions associated with a component
+    typedef struct AccessibleActionsTag {
+        jint actionsCount;              // number of actions
+        AccessibleActionInfo actionInfo[MAX_ACTION_INFO];       // the action information
+    } AccessibleActions;
+
+    // struct for requesting the actions associated with a component
+    typedef struct GetAccessibleActionsPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;                                    // the component
+        AccessibleActions rAccessibleActions;           // the actions
+    } GetAccessibleActionsPackage;
+
+    // list of AccessibleActions to do
+    typedef struct AccessibleActionsToDoTag {
+        jint actionsCount;                              // number of actions to do
+        AccessibleActionInfo actions[MAX_ACTIONS_TO_DO];// the accessible actions to do
+    } AccessibleActionsToDo;
+
+    // struct for sending an message to do one or more actions
+    typedef struct DoAccessibleActionsPackageTag {
+        long vmID;                         // the virtual machine ID
+        JOBJECT64 accessibleContext;       // component to do the action
+        AccessibleActionsToDo actionsToDo; // the accessible actions to do
+        BOOL rResult;                      // action return value
+        jint failure;                      // index of action that failed if rResult is FALSE
+    } DoAccessibleActionsPackage;
+
+    /**
+******************************************************
+*  AccessibleText packages
+******************************************************
+*/
+
+    typedef struct GetAccessibleTextInfoPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint x;
+        jint y;
+        AccessibleTextInfo rTextInfo;
+    } GetAccessibleTextInfoPackage;
+
+    typedef struct GetAccessibleTextItemsPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+        AccessibleTextItemsInfo rTextItemsInfo;
+    } GetAccessibleTextItemsPackage;
+
+    typedef struct GetAccessibleTextSelectionInfoPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        AccessibleTextSelectionInfo rTextSelectionItemsInfo;
+    } GetAccessibleTextSelectionInfoPackage;
+
+    typedef struct GetAccessibleTextAttributeInfoPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+        AccessibleTextAttributesInfo rAttributeInfo;
+    } GetAccessibleTextAttributeInfoPackage;
+
+    typedef struct GetAccessibleTextRectInfoPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+        AccessibleTextRectInfo rTextRectInfo;
+    } GetAccessibleTextRectInfoPackage;
+
+    typedef struct GetCaretLocationPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+        AccessibleTextRectInfo rTextRectInfo;
+    } GetCaretLocationPackage;
+
+    typedef struct GetAccessibleTextLineBoundsPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+        jint rLineStart;
+        jint rLineEnd;
+    } GetAccessibleTextLineBoundsPackage;
+
+    typedef struct GetAccessibleTextRangePackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint start;
+        jint end;
+        wchar_t rText[MAX_BUFFER_SIZE];
+    } GetAccessibleTextRangePackage;
+
+    /**
+******************************************************
+*
+* Utility method packages
+******************************************************
+*/
+
+    typedef struct SetTextContentsPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;    // the text field
+        wchar_t text[MAX_STRING_SIZE];  // the text
+        BOOL rResult;
+    } SetTextContentsPackage;
+
+    typedef struct GetParentWithRolePackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        wchar_t role[SHORT_STRING_SIZE];  // one of Accessible Roles above
+        JOBJECT64 rAccessibleContext;
+    } GetParentWithRolePackage;
+
+    typedef struct GetTopLevelObjectPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        JOBJECT64 rAccessibleContext;
+    } GetTopLevelObjectPackage;
+
+    typedef struct GetParentWithRoleElseRootPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        wchar_t role[SHORT_STRING_SIZE];  // one of Accessible Roles above
+        JOBJECT64 rAccessibleContext;
+    } GetParentWithRoleElseRootPackage;
+
+    typedef struct GetObjectDepthPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        jint rResult;
+    } GetObjectDepthPackage;
+
+    typedef struct GetActiveDescendentPackageTag {
+        long vmID;
+        JOBJECT64 accessibleContext;
+        JOBJECT64 rAccessibleContext;
+    } GetActiveDescendentPackage;
+
+    /**
+******************************************************
+*  AccessibleValue packages
+******************************************************
+*/
+
+    typedef struct GetCurrentAccessibleValueFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        wchar_t rValue[SHORT_STRING_SIZE];
+    } GetCurrentAccessibleValueFromContextPackage;
+
+    typedef struct GetMaximumAccessibleValueFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        wchar_t rValue[SHORT_STRING_SIZE];
+    } GetMaximumAccessibleValueFromContextPackage;
+
+    typedef struct GetMinimumAccessibleValueFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        wchar_t rValue[SHORT_STRING_SIZE];
+    } GetMinimumAccessibleValueFromContextPackage;
+
+
+    /**
+******************************************************
+*  AccessibleSelection packages
+******************************************************
+*/
+
+    typedef struct AddAccessibleSelectionFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+    } AddAccessibleSelectionFromContextPackage;
+
+    typedef struct ClearAccessibleSelectionFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+    } ClearAccessibleSelectionFromContextPackage;
+
+    typedef struct GetAccessibleSelectionFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+        JOBJECT64 rAccessibleContext;
+    } GetAccessibleSelectionFromContextPackage;
+
+    typedef struct GetAccessibleSelectionCountFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint rCount;
+    } GetAccessibleSelectionCountFromContextPackage;
+
+    typedef struct IsAccessibleChildSelectedFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+        jboolean rResult;
+    } IsAccessibleChildSelectedFromContextPackage;
+
+    typedef struct RemoveAccessibleSelectionFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+        jint index;
+    } RemoveAccessibleSelectionFromContextPackage;
+
+    typedef struct SelectAllAccessibleSelectionFromContextPackageTag {
+        long vmID;
+        JOBJECT64 AccessibleContext;
+    } SelectAllAccessibleSelectionFromContextPackage;
+
+
+    /**
+******************************************************
+*  Java Event Notification Registration packages
+******************************************************
+*/
+
+    typedef struct AddJavaEventNotificationPackageTag {
+        jlong type;
+        //HWND DLLwindow;
+        ABHWND64 DLLwindow;
+    } AddJavaEventNotificationPackage;
+
+    typedef struct RemoveJavaEventNotificationPackageTag {
+        jlong type;
+        //HWND DLLwindow;
+        ABHWND64 DLLwindow;
+    } RemoveJavaEventNotificationPackage;
+
+
+    /**
+******************************************************
+*  Accessibility Event Notification Registration packages
+******************************************************
+*/
+
+    typedef struct AddAccessibilityEventNotificationPackageTag {
+        jlong type;
+        //HWND DLLwindow;
+        ABHWND64 DLLwindow;
+    } AddAccessibilityEventNotificationPackage;
+
+    typedef struct RemoveAccessibilityEventNotificationPackageTag {
+        jlong type;
+        //HWND DLLwindow;
+        ABHWND64 DLLwindow;
+    } RemoveAccessibilityEventNotificationPackage;
+
+
+    /**
+******************************************************
+*  Accessibility Property Change Event packages
+******************************************************
+*/
+
+    typedef struct PropertyCaretChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        jint oldPosition;
+        jint newPosition;
+    } PropertyCaretChangePackage;
+
+    typedef struct PropertyDescriptionChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        wchar_t oldDescription[SHORT_STRING_SIZE];
+        wchar_t newDescription[SHORT_STRING_SIZE];
+    } PropertyDescriptionChangePackage;
+
+    typedef struct PropertyNameChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        wchar_t oldName[SHORT_STRING_SIZE];
+        wchar_t newName[SHORT_STRING_SIZE];
+    } PropertyNameChangePackage;
+
+    typedef struct PropertySelectionChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } PropertySelectionChangePackage;
+
+    typedef struct PropertyStateChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        wchar_t oldState[SHORT_STRING_SIZE];
+        wchar_t newState[SHORT_STRING_SIZE];
+    } PropertyStateChangePackage;
+
+    typedef struct PropertyTextChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } PropertyTextChangePackage;
+
+    typedef struct PropertyValueChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        wchar_t oldValue[SHORT_STRING_SIZE];
+        wchar_t newValue[SHORT_STRING_SIZE];
+    } PropertyValueChangePackage;
+
+    typedef struct PropertyVisibleDataChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } PropertyVisibleDataChangePackage;
+
+    typedef struct PropertyChildChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        JOBJECT64 oldChildAccessibleContext;
+        JOBJECT64 newChildAccessibleContext;
+    } PropertyChildChangePackage;
+
+    typedef struct PropertyActiveDescendentChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        JOBJECT64 oldActiveDescendentAccessibleContext;
+        JOBJECT64 newActiveDescendentAccessibleContext;
+    } PropertyActiveDescendentChangePackage;
+
+
+    // String format for newValue is:
+    //  "type" one of "INSERT", "UPDATE" or "DELETE"
+    //  "firstRow"
+    //  "lastRow"
+    //  "firstColumn"
+    //  "lastColumn"
+    //
+    // oldValue is currently unused
+    //
+    typedef struct PropertyTableModelChangePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+        wchar_t oldValue[SHORT_STRING_SIZE];
+        wchar_t newValue[SHORT_STRING_SIZE];
+    } PropertyTableModelChangePackage;
+
+
+    /**
+******************************************************
+*  Property Change Event packages
+******************************************************
+*/
+
+    /*
+      typedef struct PropertyChangePackageTag {
+      long vmID;
+      jobject Event;
+      jobject AccessibleContextSource;
+      char propertyName[SHORT_STRING_SIZE];
+      char oldValue[SHORT_STRING_SIZE]; // PropertyChangeEvent().getOldValue().toString()
+      char newValue[SHORT_STRING_SIZE]; // PropertyChangeEvent().getNewValue().toString()
+      } PropertyChangePackage;
+    */
+
+    /*
+     * Java shutdown event package
+     */
+    typedef struct JavaShutdownPackageTag {
+        long vmID;
+    } JavaShutdownPackage;
+
+
+    /**
+******************************************************
+*  Focus Event packages
+******************************************************
+*/
+
+    typedef struct FocusGainedPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } FocusGainedPackage;
+
+    typedef struct FocusLostPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } FocusLostPackage;
+
+
+    /**
+******************************************************
+*  Caret Event packages
+******************************************************
+*/
+
+    typedef struct CaretUpdatePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } CaretUpdatePackage;
+
+
+    /**
+******************************************************
+*  Mouse Event packages
+******************************************************
+*/
+
+    typedef struct MouseClickedPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MouseClickedPackage;
+
+    typedef struct MouseEnteredPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MouseEnteredPackage;
+
+    typedef struct MouseExitedPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MouseExitedPackage;
+
+    typedef struct MousePressedPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MousePressedPackage;
+
+    typedef struct MouseReleasedPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MouseReleasedPackage;
+
+
+    /**
+******************************************************
+*  Menu/PopupMenu Event packages
+******************************************************
+*/
+
+    typedef struct MenuCanceledPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MenuCanceledPackage;
+
+    typedef struct MenuDeselectedPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MenuDeselectedPackage;
+
+    typedef struct MenuSelectedPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } MenuSelectedPackage;
+
+
+    typedef struct PopupMenuCanceledPackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } PopupMenuCanceledPackage;
+
+    typedef struct PopupMenuWillBecomeInvisiblePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } PopupMenuWillBecomeInvisiblePackage;
+
+    typedef struct PopupMenuWillBecomeVisiblePackageTag {
+        long vmID;
+        JOBJECT64 Event;
+        JOBJECT64 AccessibleContextSource;
+    } PopupMenuWillBecomeVisiblePackage;
+
+    /**
+******************************************************
+*  Additional methods for Teton
+******************************************************
+*/
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+     * whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    typedef struct GetVirtualAccessibleNamePackageTag {
+        long vmID;
+        AccessibleContext accessibleContext;
+        wchar_t rName[MAX_STRING_SIZE];
+        int len;
+    } GetVirtualAccessibleNamePackage;
+
+    /**
+     * Request focus for a component. Returns whether successful;
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    typedef struct RequestFocusPackageTag {
+        long vmID;
+        AccessibleContext accessibleContext;
+    } RequestFocusPackage;
+
+    /**
+     * Selects text between two indices.  Selection includes the text at the start index
+     * and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    typedef struct SelectTextRangePackageTag {
+        long vmID;
+        AccessibleContext accessibleContext;
+        jint startIndex;
+        jint endIndex;
+    } SelectTextRangePackage;
+
+    /**
+     * Gets the number of contiguous characters with the same attributes.
+     *
+     * Bug ID 4944761 - getTextAttributes between two indices method needed
+     */
+    typedef struct GetTextAttributesInRangePackageTag {
+        long vmID;
+        AccessibleContext accessibleContext;
+        jint startIndex;        // start index (inclusive)
+        jint endIndex;          // end index (inclusive)
+        AccessibleTextAttributesInfo attributes; // character attributes to match
+        short rLength;          // number of contiguous characters with matching attributes
+    } GetTextAttributesInRangePackage;
+
+#define MAX_VISIBLE_CHILDREN 256
+
+    // visible children information
+    typedef struct VisibleChildenInfoTag {
+        int returnedChildrenCount; // number of children returned
+        AccessibleContext children[MAX_VISIBLE_CHILDREN]; // the visible children
+    } VisibleChildrenInfo;
+
+    // struct for sending a message to get the number of visible children
+    typedef struct GetVisibleChildrenCountPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 accessibleContext; // AccessibleContext of parent component
+        jint rChildrenCount;    // visible children count return value
+    } GetVisibleChildrenCountPackage;
+
+    // struct for sending a message to get the hypertext for an AccessibleContext
+    // starting at a specified index in the document
+    typedef struct GetVisibleChildrenPackageTag {
+        long vmID;              // the virtual machine ID
+        JOBJECT64 accessibleContext; // AccessibleContext of parent component
+        jint startIndex;        // start index for retrieving children
+        VisibleChildrenInfo rVisibleChildrenInfo; // returned info
+        BOOL rSuccess;          // whether call succeeded
+    } GetVisibleChildrenPackage;
+
+    /**
+     * Set the caret to a text position. Returns whether successful;
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    typedef struct SetCaretPositionPackageTag {
+        long vmID;
+        AccessibleContext accessibleContext;
+        jint position;
+    } SetCaretPositionPackage;
+
+
+    /**
+     ******************************************************
+     *  Wrapping up all of the packages
+     ******************************************************
+     */
+
+    /**
+     *  What is the type of this package
+     */
+    typedef enum PackageType {
+
+        cMemoryMappedFileCreatedPackage = 0x11000,
+
+        // many of these will go away...
+        cJavaVMCreatedPackage = 0x10000,
+        cJavaVMDestroyedPackage,
+        cWindowsATCreatedPackage,
+        cWindowsATDestroyedPackage,
+        cJavaVMPresentNotificationPackage,
+        cWindowsATPresentNotificationPackage,
+
+        cReleaseJavaObjectPackage = 1,
+        cGetAccessBridgeVersionPackage = 2,
+
+        cGetAccessibleContextFromHWNDPackage = 0x10,
+        cIsJavaWindowPackage,
+        cGetHWNDFromAccessibleContextPackage,
+
+        cGetAccessibleContextAtPackage = 0x100,
+        cGetAccessibleContextWithFocusPackage,
+        cGetAccessibleContextInfoPackage,
+        cGetAccessibleChildFromContextPackage,
+        cGetAccessibleParentFromContextPackage,
+        cIsSameObjectPackage,
+
+        cGetAccessibleTextInfoPackage = 0x200,
+        cGetAccessibleTextItemsPackage,
+        cGetAccessibleTextSelectionInfoPackage,
+        cGetAccessibleTextAttributeInfoPackage,
+        cGetAccessibleTextRectInfoPackage,
+        cGetAccessibleTextLineBoundsPackage,
+        cGetAccessibleTextRangePackage,
+
+        cGetCurrentAccessibleValueFromContextPackage = 0x300,
+        cGetMaximumAccessibleValueFromContextPackage,
+        cGetMinimumAccessibleValueFromContextPackage,
+
+        cAddAccessibleSelectionFromContextPackage = 0x400,
+        cClearAccessibleSelectionFromContextPackage,
+        cGetAccessibleSelectionFromContextPackage,
+        cGetAccessibleSelectionCountFromContextPackage,
+        cIsAccessibleChildSelectedFromContextPackage,
+        cRemoveAccessibleSelectionFromContextPackage,
+        cSelectAllAccessibleSelectionFromContextPackage,
+
+        cAddJavaEventNotificationPackage = 0x900,
+        cRemoveJavaEventNotificationPackage,
+        cAddAccessibilityEventNotificationPackage,
+        cRemoveAccessibilityEventNotificationPackage,
+
+        cPropertyChangePackage = 0x1000,
+
+        cJavaShutdownPackage = 0x1010,
+        cFocusGainedPackage,
+        cFocusLostPackage,
+
+        cCaretUpdatePackage = 0x1020,
+
+        cMouseClickedPackage = 0x1030,
+        cMouseEnteredPackage,
+        cMouseExitedPackage,
+        cMousePressedPackage,
+        cMouseReleasedPackage,
+
+        cMenuCanceledPackage = 0x1040,
+        cMenuDeselectedPackage,
+        cMenuSelectedPackage,
+        cPopupMenuCanceledPackage,
+        cPopupMenuWillBecomeInvisiblePackage,
+        cPopupMenuWillBecomeVisiblePackage,
+
+        cPropertyCaretChangePackage = 0x1100,
+        cPropertyDescriptionChangePackage,
+        cPropertyNameChangePackage,
+        cPropertySelectionChangePackage,
+        cPropertyStateChangePackage,
+        cPropertyTextChangePackage,
+        cPropertyValueChangePackage,
+        cPropertyVisibleDataChangePackage,
+        cPropertyChildChangePackage,
+        cPropertyActiveDescendentChangePackage,
+
+
+        // AccessibleTable
+        cGetAccessibleTableInfoPackage = 0x1200,
+        cGetAccessibleTableCellInfoPackage,
+
+        cGetAccessibleTableRowHeaderPackage,
+        cGetAccessibleTableColumnHeaderPackage,
+
+        cGetAccessibleTableRowDescriptionPackage,
+        cGetAccessibleTableColumnDescriptionPackage,
+
+        cGetAccessibleTableRowSelectionCountPackage,
+        cIsAccessibleTableRowSelectedPackage,
+        cGetAccessibleTableRowSelectionsPackage,
+
+        cGetAccessibleTableColumnSelectionCountPackage,
+        cIsAccessibleTableColumnSelectedPackage,
+        cGetAccessibleTableColumnSelectionsPackage,
+
+        cGetAccessibleTableRowPackage,
+        cGetAccessibleTableColumnPackage,
+        cGetAccessibleTableIndexPackage,
+
+        cPropertyTableModelChangePackage,
+
+
+        // AccessibleRelationSet
+        cGetAccessibleRelationSetPackage = 0x1300,
+
+        // AccessibleHypertext
+        cGetAccessibleHypertextPackage = 0x1400,
+        cActivateAccessibleHyperlinkPackage,
+        cGetAccessibleHyperlinkCountPackage,
+        cGetAccessibleHypertextExtPackage,
+        cGetAccessibleHypertextLinkIndexPackage,
+        cGetAccessibleHyperlinkPackage,
+
+        // Accessible KeyBinding, Icon and Action
+        cGetAccessibleKeyBindingsPackage = 0x1500,
+        cGetAccessibleIconsPackage,
+        cGetAccessibleActionsPackage,
+        cDoAccessibleActionsPackage,
+
+        // Utility methods
+        cSetTextContentsPackage = 0x1600,
+        cGetParentWithRolePackage,
+        cGetTopLevelObjectPackage,
+        cGetParentWithRoleElseRootPackage,
+        cGetObjectDepthPackage,
+        cGetActiveDescendentPackage,
+
+        // Additional methods for Teton
+        cGetVirtualAccessibleNamePackage = 0x1700,
+        cRequestFocusPackage,
+        cSelectTextRangePackage,
+        cGetTextAttributesInRangePackage,
+        cGetSameTextAttributesInRangePackage,
+        cGetVisibleChildrenCountPackage,
+        cGetVisibleChildrenPackage,
+        cSetCaretPositionPackage,
+        cGetCaretLocationPackage
+
+
+    } PackageType;
+
+
+    /**
+     *  Union of all package contents
+     */
+    typedef union AllPackagesTag {
+
+        // Initial Rendezvous packages
+        MemoryMappedFileCreatedPackage memoryMappedFileCreatedPackage;
+
+        JavaVMCreatedPackage javaVMCreatedPackage;
+        JavaVMDestroyedPackage javaVMDestroyedPackage;
+        WindowsATCreatedPackage windowsATCreatedPackage;
+        WindowsATDestroyedPackage windowsATDestroyedPackage;
+        JavaVMPresentNotificationPackage javaVMPresentNotificationPackage;
+        WindowsATPresentNotificationPackage windowsATPresentNotificationPackage;
+
+        // Core packages
+        ReleaseJavaObjectPackage releaseJavaObject;
+        GetAccessBridgeVersionPackage getAccessBridgeVersion;
+
+        // Window packages
+        GetAccessibleContextFromHWNDPackage getAccessibleContextFromHWND;
+        GetHWNDFromAccessibleContextPackage getHWNDFromAccessibleContext;
+
+        // AccessibleContext packages
+        GetAccessibleContextAtPackage getAccessibleContextAt;
+        GetAccessibleContextWithFocusPackage getAccessibleContextWithFocus;
+        GetAccessibleContextInfoPackage getAccessibleContextInfo;
+        GetAccessibleChildFromContextPackage getAccessibleChildFromContext;
+        GetAccessibleParentFromContextPackage getAccessibleParentFromContext;
+
+        // AccessibleText packages
+        GetAccessibleTextInfoPackage getAccessibleTextInfo;
+        GetAccessibleTextItemsPackage getAccessibleTextItems;
+        GetAccessibleTextSelectionInfoPackage getAccessibleTextSelectionInfo;
+        GetAccessibleTextAttributeInfoPackage getAccessibleTextAttributeInfo;
+        GetAccessibleTextRectInfoPackage getAccessibleTextRectInfo;
+        GetAccessibleTextLineBoundsPackage getAccessibleTextLineBounds;
+        GetAccessibleTextRangePackage getAccessibleTextRange;
+
+        // AccessibleValue packages
+        GetCurrentAccessibleValueFromContextPackage getCurrentAccessibleValueFromContext;
+        GetMaximumAccessibleValueFromContextPackage getMaximumAccessibleValueFromContext;
+        GetMinimumAccessibleValueFromContextPackage getMinimumAccessibleValueFromContext;
+
+        // AccessibleSelection packages
+        AddAccessibleSelectionFromContextPackage addAccessibleSelectionFromContext;
+        ClearAccessibleSelectionFromContextPackage clearAccessibleSelectionFromContext;
+        GetAccessibleSelectionFromContextPackage getAccessibleSelectionFromContext;
+        GetAccessibleSelectionCountFromContextPackage getAccessibleSelectionCountFromContext;
+        IsAccessibleChildSelectedFromContextPackage isAccessibleChildSelectedFromContext;
+        RemoveAccessibleSelectionFromContextPackage removeAccessibleSelectionFromContext;
+        SelectAllAccessibleSelectionFromContextPackage selectAllAccessibleSelectionFromContext;
+
+        // Event Notification Registration packages
+        AddJavaEventNotificationPackage addJavaEventNotification;
+        RemoveJavaEventNotificationPackage removeJavaEventNotification;
+        AddAccessibilityEventNotificationPackage addAccessibilityEventNotification;
+        RemoveAccessibilityEventNotificationPackage removeAccessibilityEventNotification;
+
+        // Event contents packages
+        //      PropertyChangePackage propertyChange;
+        PropertyCaretChangePackage propertyCaretChangePackage;
+        PropertyDescriptionChangePackage propertyDescriptionChangePackage;
+        PropertyNameChangePackage propertyNameChangePackage;
+        PropertySelectionChangePackage propertySelectionChangePackage;
+        PropertyStateChangePackage propertyStateChangePackage;
+        PropertyTextChangePackage propertyTextChangePackage;
+        PropertyValueChangePackage propertyValueChangePackage;
+        PropertyVisibleDataChangePackage propertyVisibleDataChangePackage;
+        PropertyChildChangePackage propertyChildChangePackage;
+        PropertyActiveDescendentChangePackage propertyActiveDescendentChangePackage;
+
+        PropertyTableModelChangePackage propertyTableModelChangePackage;
+
+        JavaShutdownPackage JavaShutdown;
+        FocusGainedPackage focusGained;
+        FocusLostPackage focusLost;
+
+        CaretUpdatePackage caretUpdate;
+
+        MouseClickedPackage mouseClicked;
+        MouseEnteredPackage mouseEntered;
+        MouseExitedPackage mouseExited;
+        MousePressedPackage mousePressed;
+        MouseReleasedPackage mouseReleased;
+
+        MenuCanceledPackage menuCanceled;
+        MenuDeselectedPackage menuDeselected;
+        MenuSelectedPackage menuSelected;
+        PopupMenuCanceledPackage popupMenuCanceled;
+        PopupMenuWillBecomeInvisiblePackage popupMenuWillBecomeInvisible;
+        PopupMenuWillBecomeVisiblePackage popupMenuWillBecomeVisible;
+
+        // AccessibleRelationSet
+        GetAccessibleRelationSetPackage getAccessibleRelationSet;
+
+        // AccessibleHypertext
+        GetAccessibleHypertextPackage _getAccessibleHypertext;
+        ActivateAccessibleHyperlinkPackage _activateAccessibleHyperlink;
+        GetAccessibleHyperlinkCountPackage _getAccessibleHyperlinkCount;
+        GetAccessibleHypertextExtPackage _getAccessibleHypertextExt;
+        GetAccessibleHypertextLinkIndexPackage _getAccessibleHypertextLinkIndex;
+        GetAccessibleHyperlinkPackage _getAccessibleHyperlink;
+
+        // Accessible KeyBinding, Icon and Action
+        GetAccessibleKeyBindingsPackage getAccessibleKeyBindings;
+        GetAccessibleIconsPackage getAccessibleIcons;
+        GetAccessibleActionsPackage getAccessibleActions;
+        DoAccessibleActionsPackage doAccessibleActions;
+
+        // utility methods
+        SetTextContentsPackage _setTextContents;
+        GetParentWithRolePackage _getParentWithRole;
+        GetTopLevelObjectPackage _getTopLevelObject;
+        GetParentWithRoleElseRootPackage _getParentWithRoleElseRoot;
+        GetObjectDepthPackage _getObjectDepth;
+        GetActiveDescendentPackage _getActiveDescendent;
+
+        // Additional methods for Teton
+        GetVirtualAccessibleNamePackage _getVirtualAccessibleName;
+        RequestFocusPackage _requestFocus;
+        SelectTextRangePackage _selectTextRange;
+        GetTextAttributesInRangePackage _getTextAttributesInRange;
+        GetVisibleChildrenCountPackage _getVisibleChildrenCount;
+        GetVisibleChildrenPackage _getVisibleChildren;
+        SetCaretPositionPackage _setCaretPosition;
+
+    } AllPackages;
+
+
+    /**
+     *  Union of all Java-initiated package contents
+     */
+    typedef union JavaInitiatedPackagesTag {
+
+        // Initial Rendezvous packages
+        JavaVMCreatedPackage javaVMCreatedPackage;
+        JavaVMDestroyedPackage javaVMDestroyedPackage;
+        JavaVMPresentNotificationPackage javaVMPresentNotificationPackage;
+
+        // Event contents packages
+        PropertyCaretChangePackage propertyCaretChangePackage;
+        PropertyDescriptionChangePackage propertyDescriptionChangePackage;
+        PropertyNameChangePackage propertyNameChangePackage;
+        PropertySelectionChangePackage propertySelectionChangePackage;
+        PropertyStateChangePackage propertyStateChangePackage;
+        PropertyTextChangePackage propertyTextChangePackage;
+        PropertyValueChangePackage propertyValueChangePackage;
+        PropertyVisibleDataChangePackage propertyVisibleDataChangePackage;
+        PropertyChildChangePackage propertyChildChangePackage;
+        PropertyActiveDescendentChangePackage propertyActiveDescendentChangePackage;
+
+        PropertyTableModelChangePackage propertyTableModelChangePackage;
+
+        JavaShutdownPackage JavaShutdown;
+        FocusGainedPackage focusGained;
+        FocusLostPackage focusLost;
+
+        CaretUpdatePackage caretUpdate;
+
+        MouseClickedPackage mouseClicked;
+        MouseEnteredPackage mouseEntered;
+        MouseExitedPackage mouseExited;
+        MousePressedPackage mousePressed;
+        MouseReleasedPackage mouseReleased;
+
+        MenuCanceledPackage menuCanceled;
+        MenuDeselectedPackage menuDeselected;
+        MenuSelectedPackage menuSelected;
+        PopupMenuCanceledPackage popupMenuCanceled;
+        PopupMenuWillBecomeInvisiblePackage popupMenuWillBecomeInvisible;
+        PopupMenuWillBecomeVisiblePackage popupMenuWillBecomeVisible;
+
+    } JavaInitiatedPackages;
+
+
+    /**
+     *  Union of all Windows-initiated package contents
+     */
+    typedef union WindowsInitiatedPackagesTag {
+
+        // Initial Rendezvous packages
+        MemoryMappedFileCreatedPackage memoryMappedFileCreatedPackage;
+
+        WindowsATCreatedPackage windowsATCreatedPackage;
+        WindowsATDestroyedPackage windowsATDestroyedPackage;
+        WindowsATPresentNotificationPackage windowsATPresentNotificationPackage;
+
+        // Core packages
+        ReleaseJavaObjectPackage releaseJavaObject;
+        GetAccessBridgeVersionPackage getAccessBridgeVersion;
+
+        // Window packages
+        GetAccessibleContextFromHWNDPackage getAccessibleContextFromHWND;
+        GetHWNDFromAccessibleContextPackage getHWNDFromAccessibleContext;
+
+        // AccessibleContext packages
+        GetAccessibleContextAtPackage getAccessibleContextAt;
+        GetAccessibleContextWithFocusPackage getAccessibleContextWithFocus;
+        GetAccessibleContextInfoPackage getAccessibleContextInfo;
+        GetAccessibleChildFromContextPackage getAccessibleChildFromContext;
+        GetAccessibleParentFromContextPackage getAccessibleParentFromContext;
+
+        // AccessibleText packages
+        GetAccessibleTextInfoPackage getAccessibleTextInfo;
+        GetAccessibleTextItemsPackage getAccessibleTextItems;
+        GetAccessibleTextSelectionInfoPackage getAccessibleTextSelectionInfo;
+        GetAccessibleTextAttributeInfoPackage getAccessibleTextAttributeInfo;
+        GetAccessibleTextRectInfoPackage getAccessibleTextRectInfo;
+        GetAccessibleTextLineBoundsPackage getAccessibleTextLineBounds;
+        GetAccessibleTextRangePackage getAccessibleTextRange;
+
+        // AccessibleValue packages
+        GetCurrentAccessibleValueFromContextPackage getCurrentAccessibleValueFromContext;
+        GetMaximumAccessibleValueFromContextPackage getMaximumAccessibleValueFromContext;
+        GetMinimumAccessibleValueFromContextPackage getMinimumAccessibleValueFromContext;
+
+        // AccessibleSelection packages
+        AddAccessibleSelectionFromContextPackage addAccessibleSelectionFromContext;
+        ClearAccessibleSelectionFromContextPackage clearAccessibleSelectionFromContext;
+        GetAccessibleSelectionFromContextPackage getAccessibleSelectionFromContext;
+        GetAccessibleSelectionCountFromContextPackage getAccessibleSelectionCountFromContext;
+        IsAccessibleChildSelectedFromContextPackage isAccessibleChildSelectedFromContext;
+        RemoveAccessibleSelectionFromContextPackage removeAccessibleSelectionFromContext;
+        SelectAllAccessibleSelectionFromContextPackage selectAllAccessibleSelectionFromContext;
+
+        // Event Notification Registration packages
+        AddJavaEventNotificationPackage addJavaEventNotification;
+        RemoveJavaEventNotificationPackage removeJavaEventNotification;
+        AddAccessibilityEventNotificationPackage addAccessibilityEventNotification;
+        RemoveAccessibilityEventNotificationPackage removeAccessibilityEventNotification;
+
+        // AccessibleTable
+        GetAccessibleTableInfoPackage _getAccessibleTableInfo;
+        GetAccessibleTableCellInfoPackage _getAccessibleTableCellInfo;
+
+        GetAccessibleTableRowHeaderPackage _getAccessibleTableRowHeader;
+        GetAccessibleTableColumnHeaderPackage _getAccessibleTableColumnHeader;
+
+        GetAccessibleTableRowDescriptionPackage _getAccessibleTableRowDescription;
+        GetAccessibleTableColumnDescriptionPackage _getAccessibleTableColumnDescription;
+
+        GetAccessibleTableRowSelectionCountPackage _getAccessibleTableRowSelectionCount;
+        IsAccessibleTableRowSelectedPackage _isAccessibleTableRowSelected;
+        GetAccessibleTableRowSelectionsPackage _getAccessibleTableRowSelections;
+
+        GetAccessibleTableColumnSelectionCountPackage _getAccessibleTableColumnSelectionCount;
+        IsAccessibleTableColumnSelectedPackage _isAccessibleTableColumnSelected;
+        GetAccessibleTableColumnSelectionsPackage _getAccessibleTableColumnSelections;
+
+        GetAccessibleTableRowPackage _getAccessibleTableRow;
+        GetAccessibleTableColumnPackage _getAccessibleTableColumn;
+        GetAccessibleTableIndexPackage _getAccessibleTableIndex;
+
+        // AccessibleRelationSet
+        GetAccessibleRelationSetPackage _getAccessibleRelationSet;
+
+        // Accessible KeyBindings, Icons and Actions
+        GetAccessibleKeyBindingsPackage _getAccessibleKeyBindings;
+        GetAccessibleIconsPackage _getAccessibleIcons;
+        GetAccessibleActionsPackage _getAccessibleActions;
+        DoAccessibleActionsPackage _doAccessibleActions;
+
+
+        IsSameObjectPackage _isSameObject;
+
+        // utility methods
+        SetTextContentsPackage _setTextContents;
+        GetParentWithRolePackage _getParentWithRole;
+        GetTopLevelObjectPackage _getTopLevelObject;
+        GetParentWithRoleElseRootPackage _getParentWithRoleElseRoot;
+        GetObjectDepthPackage _getObjectDepth;
+        GetActiveDescendentPackage _getActiveDescendent;
+
+        // Additional methods for Teton
+        GetVirtualAccessibleNamePackage _getVirtualAccessibleName;
+        RequestFocusPackage _requestFocus;
+        SelectTextRangePackage _selectTextRange;
+        GetTextAttributesInRangePackage _getTextAttributesInRange;
+        GetVisibleChildrenCountPackage _getVisibleChildrenCount;
+        GetVisibleChildrenPackage _getVisibleChildren;
+        SetCaretPositionPackage _setCaretPosition;
+
+
+    } WindowsInitiatedPackages;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/jabswitch/jabswitch.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,475 @@
+/*
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <Windows.h>
+#include <tchar.h>
+
+// This is the default buffer size used for RegQueryValue values.
+#define DEFAULT_ALLOC MAX_PATH
+// only allocate a buffer as big as MAX_ALLOC for RegQueryValue values.
+#define MAX_ALLOC 262144
+
+static LPCTSTR ACCESSIBILITY_USER_KEY =
+    _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Accessibility");
+static LPCTSTR ACCESSIBILITY_SYSTEM_KEY =
+    _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Accessibility\\Session");
+static LPCTSTR ACCESSIBILITY_CONFIG =
+    _T("Configuration");
+static LPCTSTR STR_ACCESSBRIDGE =
+    _T("oracle_javaaccessbridge");
+
+// Note: There are senarios where more than one extension can be specified on the
+// asssistive_technologies=
+// line but this code only deals with the case of
+// assistive_technologies=com.sun.java.accessibility.AccessBridge
+// assuming that if additional extensions are desired the user knows how edit the file.
+
+FILE* origFile;
+FILE* tempFile;
+
+bool isXP()
+{
+    static bool isXPFlag = false;
+    OSVERSIONINFO  osvi;
+
+    // Initialize the OSVERSIONINFO structure.
+    ZeroMemory( &osvi, sizeof( osvi ) );
+    osvi.dwOSVersionInfoSize = sizeof( osvi );
+
+    GetVersionEx( &osvi );
+
+    if ( osvi.dwMajorVersion == 5 ) // For Windows XP and Windows 2000
+        isXPFlag = true;
+
+    return isXPFlag ;
+}
+
+void enableJAB() {
+    // Copy lines from orig to temp modifying the line containing
+    // assistive_technologies=
+    // There are various scenarios:
+    // 1) If the line exists exactly as
+    //    #assistive_technologies=com.sun.java.accessibility.AccessBridge
+    //    replace it with
+    //    assistive_technologies=com.sun.java.accessibility.AccessBridge
+    // 2) else if the line exists exactly as
+    //    assistive_technologies=com.sun.java.accessibility.AccessBridge
+    //    use it as is
+    // 3) else if a line containing "assistive_technologies" exits
+    //    a) if it's already commented out, us it as is (jab will be enabled in step 4)
+    //    b) else if it's not commented out, comment it out and add a new line with
+    //       assistive_technologies=com.sun.java.accessibility.AccessBridge
+    // 4) If the line doesn't exist (or case 3a), add
+    //    assistive_technologies=com.sun.java.accessibility.AccessBridge
+    // Do the same for screen_magnifier_present=
+    char line[512];
+    char commentLine[512] = "#";
+    char jabLine[] = "assistive_technologies=com.sun.java.accessibility.AccessBridge\n";
+    char magLine[] = "screen_magnifier_present=true\n";
+    bool foundJabLine = false;
+    bool foundMagLine = false;
+    while (!feof(origFile)) {
+        if (fgets(line, 512, origFile) != NULL) {
+            if (_stricmp(line, "#assistive_technologies=com.sun.java.accessibility.AccessBridge\n") == 0) {
+                fputs(jabLine, tempFile);
+                foundJabLine = true;
+            } else if (_stricmp(line, jabLine) == 0) {
+                fputs(line, tempFile);
+                foundJabLine = true;
+            } else if (strstr(line, "assistive_technologies") != NULL) {
+                char* context;
+                char* firstNonSpaceChar = strtok_s(line, " ", &context);
+                if (*firstNonSpaceChar == '#') {
+                    fputs(line, tempFile);
+                } else {
+                    strcat_s(commentLine, line);
+                    fputs(commentLine, tempFile);
+                    fputs(jabLine, tempFile);
+                    foundJabLine = true;
+                }
+            } else if (_stricmp(line, "#screen_magnifier_present=true\n") == 0) {
+                fputs(magLine, tempFile);
+                foundMagLine = true;
+            } else if (_stricmp(line, magLine) == 0) {
+                fputs(line, tempFile);
+                foundMagLine = true;
+            } else if (strstr(line, "screen_magnifier_present") != NULL) {
+                char* context;
+                char* firstNonSpaceChar = strtok_s(line, " ", &context);
+                if (*firstNonSpaceChar == '#') {
+                    fputs(line, tempFile);
+                } else {
+                    strcat_s(commentLine, line);
+                    fputs(commentLine, tempFile);
+                    fputs(magLine, tempFile);
+                    foundMagLine = true;
+                }
+            } else {
+                fputs(line, tempFile);
+            }
+        }
+    }
+    if (!foundJabLine) {
+        fputs(jabLine, tempFile);
+    }
+    if (!foundMagLine) {
+        fputs(magLine, tempFile);
+    }
+}
+
+void disableJAB() {
+    // Copy lines from orig to temp modifying the line containing
+    // assistive_technologies=
+    // There are various scenarios:
+    // 1) If the uncommented line exists, comment it out
+    // 2) If the line exists but is preceeded by a #, nothing to do
+    // 3) If the line doesn't exist, nothing to do
+    // Do the same for screen_magnifier_present=
+    char line[512];
+    char commentLine[512];
+    while (!feof(origFile)) {
+        if (fgets(line, 512, origFile) != NULL) {
+            if (strstr(line, "assistive_technologies") != NULL) {
+                char* context;
+                char* firstNonSpaceChar = strtok_s(line, " ", &context);
+                if (*firstNonSpaceChar != '#') {
+                    strcpy_s(commentLine, "#");
+                    strcat_s(commentLine, line);
+                    fputs(commentLine, tempFile);
+                } else {
+                    fputs(line, tempFile);
+                }
+            } else if (strstr(line, "screen_magnifier_present") != NULL) {
+                char* context;
+                char* firstNonSpaceChar = strtok_s(line, " ", &context);
+                if (*firstNonSpaceChar != '#') {
+                    strcpy_s(commentLine, "#");
+                    strcat_s(commentLine, line);
+                    fputs(commentLine, tempFile);
+                } else {
+                    fputs(line, tempFile);
+                }
+            } else {
+                fputs(line, tempFile);
+            }
+        }
+    }
+}
+
+int modify(bool enable) {
+    errno_t error = 0;
+    char path[512];
+    char tempPath[512];
+    // Get the path for %USERPROFILE%
+    char *profilePath;
+    size_t len;
+    error = _dupenv_s(&profilePath, &len, "USERPROFILE" );
+    if (error) {
+        printf("Error fetching USERPROFILE.\n");
+        perror("Error");
+        return error;
+    }
+    strcpy_s(path, profilePath);
+    strcat_s(path, "\\.accessibility.properties");
+    strcpy_s(tempPath, profilePath);
+    strcat_s(tempPath, "\\.acce$$ibility.properties");
+    free(profilePath);
+    // Open the original file.  If it doesn't exist and this is an enable request then create it.
+    error = fopen_s(&origFile, path, "r");
+    if (error) {
+        if (enable) {
+            error = fopen_s(&origFile, path, "w");
+            if (error) {
+                printf("Couldn't create file: %s\n", path);
+                perror("Error");
+            } else {
+                char str[100] = "assistive_technologies=com.sun.java.accessibility.AccessBridge\n";
+                strcat_s(str, "screen_magnifier_present=true\n");
+                fprintf(origFile, str);
+                fclose(origFile);
+            }
+        } else {
+            // It's OK if the file isn't there for a -disable
+            error = 0;
+        }
+    } else {
+        // open a temp file
+        error = fopen_s(&tempFile, tempPath, "w");
+        if (error) {
+            printf("Couldn't open temp file: %s\n", tempPath);
+            perror("Error");
+            return error;
+        }
+        if (enable) {
+            enableJAB();
+        } else {
+            disableJAB();
+        }
+        fclose(origFile);
+        fclose(tempFile);
+        // delete the orig file and rename the temp file
+        if (remove(path) != 0) {
+            printf("Couldn't remove file: %s\n", path);
+            perror("Error");
+            return errno;
+        }
+        if (rename(tempPath, path) != 0) {
+            printf("Couldn't rename %s to %s.\n", tempPath, path);
+            perror("Error");
+            return errno;
+        }
+    }
+    return error;
+}
+
+void printUsage() {
+    printf("\njabswitch [/enable | /disable | /version | /?]\n\n");
+    printf("Description:\n");
+    printf("  jabswitch enables or disables the Java Access Bridge.\n\n");
+    printf("Parameters:\n");
+    printf("  /enable   Enable the Java Accessibility Bridge.\n");
+    printf("  /disable  Disable the Java Accessibility Bridge.\n");
+    printf("  /version  Display the version.\n");
+    printf("  /?        Display this usage information.\n");
+    printf("\nNote:\n");
+    printf("  The Java Access Bridge can also be enabled with the\n");
+    printf("  Windows Ease of Access control panel (which can be\n");
+    printf("  activated by pressing Windows + U).  The Ease of Access\n");
+    printf("  control panel has a Java Access Bridge checkbox.  Please\n");
+    printf("  be aware that unchecking the checkbox has no effect and\n");
+    printf("  in order to disable the Java Access Bridge you must run\n");
+    printf("  jabswitch.exe from the command line.\n");
+}
+
+void printVersion() {
+    TCHAR executableFileName[_MAX_PATH];
+    if (!GetModuleFileName(0, executableFileName, _MAX_PATH)) {
+        printf("Unable to get executable file name.\n");
+        return;
+    }
+    DWORD nParam;
+    DWORD nVersionSize = GetFileVersionInfoSize(executableFileName, &nParam);
+    if (!nVersionSize) {
+        printf("Unable to get version info size.\n");
+        return;
+    }
+    char* pVersionData = new char[nVersionSize];
+    if (!GetFileVersionInfo(executableFileName, 0, nVersionSize, pVersionData)) {
+        printf("Unable to get version info.\n");
+        return;
+    }
+    LPVOID pVersionInfo;
+    UINT nSize;
+    if (!VerQueryValue(pVersionData, _T("\\"), &pVersionInfo, &nSize)) {
+        printf("Unable to query version value.\n");
+        return;
+    }
+    VS_FIXEDFILEINFO *pVSInfo = (VS_FIXEDFILEINFO *)pVersionInfo;
+    char versionString[100];
+    sprintf_s( versionString, "version %i.%i.%i.%i",
+               pVSInfo->dwProductVersionMS >> 16,
+               pVSInfo->dwProductVersionMS & 0xFFFF,
+               pVSInfo->dwProductVersionLS >> 16,
+               pVSInfo->dwProductVersionLS & 0xFFFF );
+    char outputString[100];
+    strcpy_s(outputString, "jabswitch ");
+    strcat_s(outputString, versionString);
+    strcat_s(outputString, "\njabswitch enables or disables the Java Access Bridge.\n");
+    printf(outputString);
+}
+
+int regEnable() {
+    HKEY hKey;
+    DWORD retval = -1;
+    LSTATUS err;
+    err = RegOpenKeyEx(HKEY_CURRENT_USER, ACCESSIBILITY_USER_KEY, NULL, KEY_READ|KEY_WRITE, &hKey);
+    if (err == ERROR_SUCCESS) {
+        DWORD dataType = REG_SZ;
+        DWORD dataLength = DEFAULT_ALLOC;
+        TCHAR dataBuffer[DEFAULT_ALLOC];
+        TCHAR *data = dataBuffer;
+        bool freeData = false;
+        err = RegQueryValueEx(hKey, ACCESSIBILITY_CONFIG, 0, &dataType, (BYTE *)data, &dataLength);
+        if (err == ERROR_MORE_DATA) {
+            if (dataLength > 0 && dataLength < MAX_ALLOC) {
+                data = new TCHAR[dataLength];
+                err = RegQueryValueEx(hKey, ACCESSIBILITY_CONFIG, 0, &dataType, (BYTE *)data, &dataLength);
+            }
+        }
+        if (err == ERROR_SUCCESS) {
+            err = _tcslwr_s(dataBuffer, DEFAULT_ALLOC);
+            if (err) {
+                return -1;
+            }
+            if (_tcsstr(dataBuffer, STR_ACCESSBRIDGE) != NULL) {
+                return 0;  // This is OK, e.g. ran enable twice and the value is there.
+            } else {
+                // add oracle_javaaccessbridge to Config key for HKCU
+                dataLength = dataLength + (_tcslen(STR_ACCESSBRIDGE) + 1) * sizeof(TCHAR);
+                TCHAR *newStr = new TCHAR[dataLength];
+                if (newStr != NULL) {
+                    wsprintf(newStr, L"%s,%s", dataBuffer, STR_ACCESSBRIDGE);
+                    RegSetValueEx(hKey, ACCESSIBILITY_CONFIG, 0, REG_SZ, (BYTE *)newStr, dataLength);
+                }
+            }
+        }
+        RegCloseKey(hKey);
+    }
+    return err;
+}
+
+int regDeleteValue(HKEY hFamilyKey, LPCWSTR lpSubKey)
+{
+    HKEY hKey;
+    DWORD retval = -1;
+    LSTATUS err;
+    err = RegOpenKeyEx(hFamilyKey, lpSubKey, NULL, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, &hKey);
+    if (err != ERROR_SUCCESS)
+        err = RegOpenKeyEx(hFamilyKey, lpSubKey, NULL, KEY_READ|KEY_WRITE, &hKey);
+
+    if (err == ERROR_SUCCESS) {
+        DWORD dataType = REG_SZ;
+        DWORD dataLength = DEFAULT_ALLOC;
+        TCHAR dataBuffer[DEFAULT_ALLOC];
+        TCHAR searchBuffer[DEFAULT_ALLOC];
+        TCHAR *data = dataBuffer;
+        bool freeData = false;
+        err = RegQueryValueEx(hKey, ACCESSIBILITY_CONFIG, 0, &dataType, (BYTE *)data, &dataLength);
+        if (err == ERROR_MORE_DATA) {
+            if (dataLength > 0 && dataLength < MAX_ALLOC) {
+                data = new TCHAR[dataLength];
+                err = RegQueryValueEx(hKey, ACCESSIBILITY_CONFIG, 0, &dataType, (BYTE *)data, &dataLength);
+            }
+        }
+        if (err == ERROR_SUCCESS) {
+            err = _tcslwr_s(dataBuffer, DEFAULT_ALLOC);
+            if (err) {
+                return -1;
+            }
+            if (_tcsstr(dataBuffer, STR_ACCESSBRIDGE) == NULL) {
+                return 0;  // This is OK, e.g. ran disable twice and the value is not there.
+            } else {
+                // remove oracle_javaaccessbridge from Config key
+                TCHAR *newStr = new TCHAR[dataLength];
+                TCHAR *nextToken;
+                LPTSTR tok, beg1 = dataBuffer;
+                bool first = true;
+                _tcscpy_s(newStr, dataLength, L"");
+                tok = _tcstok_s(beg1, L",", &nextToken);
+                while (tok != NULL) {
+                    _tcscpy_s(searchBuffer, DEFAULT_ALLOC, tok);
+                    err = _tcslwr_s(searchBuffer, DEFAULT_ALLOC);
+                    if (err) {
+                        return -1;
+                    }
+                    if (_tcsstr(searchBuffer, STR_ACCESSBRIDGE) == NULL) {
+                        if (!first) {
+                           _tcscat_s(newStr, dataLength, L",");
+                        }
+                        first = false;
+                        _tcscat_s(newStr, dataLength, tok);
+                    }
+                    tok = _tcstok_s(NULL, L",", &nextToken);
+                }
+                dataLength = (_tcslen(newStr) + 1) * sizeof(TCHAR);
+                RegSetValueEx(hKey, ACCESSIBILITY_CONFIG, 0, REG_SZ, (BYTE *)newStr, dataLength);
+            }
+        }
+        RegCloseKey(hKey);
+    }
+    return err;
+}
+
+int regDisable()
+{
+    LSTATUS err;
+    // Update value for HKCU
+    err=regDeleteValue(HKEY_CURRENT_USER, ACCESSIBILITY_USER_KEY);
+    // Update value for HKLM for Session
+    TCHAR dataBuffer[DEFAULT_ALLOC];
+    DWORD dwSessionId ;
+    ProcessIdToSessionId(GetCurrentProcessId(),&dwSessionId ) ;
+    if( dwSessionId >= 0 )
+    {
+        wsprintf(dataBuffer, L"%s%d", ACCESSIBILITY_SYSTEM_KEY, dwSessionId);
+        err=regDeleteValue(HKEY_LOCAL_MACHINE, dataBuffer);
+    }
+    return err;
+}
+
+void main(int argc, char* argv[]) {
+    bool enableWasRequested = false;
+    bool disableWasRequested = false;
+    bool badParams = true;
+    int error = 0;
+    if (argc == 2) {
+        if (_stricmp(argv[1], "-?") == 0 || _stricmp(argv[1], "/?") == 0) {
+            printUsage();
+            badParams = false;
+        } else if (_stricmp(argv[1], "-version") == 0 || _stricmp(argv[1], "/version") == 0) {
+            printVersion();
+            badParams = false;
+        } else {
+            if (_stricmp(argv[1], "-enable") == 0 || _stricmp(argv[1], "/enable") == 0) {
+                badParams = false;
+                enableWasRequested = true;
+                error = modify(true);
+                if (error == 0) {
+                   if( !isXP() )
+                      regEnable();
+                }
+            } else if (_stricmp(argv[1], "-disable") == 0 || _stricmp(argv[1], "/disable") == 0) {
+                badParams = false;
+                disableWasRequested = true;
+                error = modify(false);
+                if (error == 0) {
+                   if( !isXP() )
+                      regDisable();
+                }
+            }
+        }
+    }
+    if (badParams) {
+        printUsage();
+    } else if (enableWasRequested || disableWasRequested) {
+        if (error != 0) {
+            printf("There was an error.\n\n");
+        }
+        printf("The Java Access Bridge has ");
+        if (error != 0) {
+            printf("not ");
+        }
+        printf("been ");
+        if (enableWasRequested) {
+            printf("enabled.\n");
+        } else {
+            printf("disabled.\n");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/jabswitch/jabswitch.manifest	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+</assembly>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/jabswitch/jabswitch_manifest.rc	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,4 @@
+#define XSTR(x) STR(x)
+#define STR(x)  #x
+
+1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ XSTR(JAB_MANIFEST_EMBED)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libjabsysinfo/AccessBridgeSysInfo.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <exception>
+#include <stdexcept>
+#include <jni.h>
+#include <windows.h>
+#include <WinDef.h>
+
+extern "C" {
+
+BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) {
+    return TRUE;
+}
+
+// Determine bitness of Win OS
+JNIEXPORT jboolean JNICALL
+Java_com_sun_java_accessibility_AccessBridge_isSysWow(JNIEnv *env, jobject callingObj) {
+    BOOL bIsWow64 = FALSE;
+    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
+
+    LPFN_ISWOW64PROCESS fnIsWow64Process =
+        (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
+
+    if (fnIsWow64Process != NULL) {
+        if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) {
+            throw std::runtime_error("fnIsWow64Process() failed");
+        }
+    }
+
+    return bIsWow64 ? JNI_TRUE : JNI_FALSE;
+}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libjavaaccessbridge/AccessBridgeATInstance.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,271 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to track key AT instance info from the JavaAccessBridge
+ */
+
+#include "AccessBridgeDebug.h"
+#include "AccessBridgeATInstance.h"
+#include "AccessBridgeMessages.h"
+
+#include <windows.h>
+#include <winbase.h>
+
+
+/**
+ *  AccessBridgeATInstance constructor
+ */
+AccessBridgeATInstance::AccessBridgeATInstance(HWND ourABWindow, HWND winABWindow,
+                                               char *memoryFilename,
+                                               AccessBridgeATInstance *next) {
+    ourAccessBridgeWindow = ourABWindow;
+    winAccessBridgeWindow = winABWindow;
+    nextATInstance = next;
+    javaEventMask = 0;
+    accessibilityEventMask = 0;
+    strncpy(memoryMappedFileName, memoryFilename, cMemoryMappedNameSize);
+}
+
+/**
+ * AccessBridgeATInstance descructor
+ */
+AccessBridgeATInstance::~AccessBridgeATInstance() {
+    PrintDebugString("\r\nin AccessBridgeATInstance::~AccessBridgeATInstance");
+
+    // if IPC memory mapped file view is valid, unmap it
+    if (memoryMappedView != (char *) 0) {
+        PrintDebugString("  unmapping memoryMappedView; view = %p", memoryMappedView);
+        UnmapViewOfFile(memoryMappedView);
+        memoryMappedView = (char *) 0;
+    }
+    // if IPC memory mapped file handle map is open, close it
+    if (memoryMappedFileMapHandle != (HANDLE) 0) {
+        PrintDebugString("  closing memoryMappedFileMapHandle; handle = %p", memoryMappedFileMapHandle);
+        CloseHandle(memoryMappedFileMapHandle);
+        memoryMappedFileMapHandle = (HANDLE) 0;
+    }
+}
+
+/**
+ * Sets up the memory-mapped file to do IPC messaging
+ * 1 files is created: to handle requests for information
+ * initiated from Windows AT.  The package is placed into
+ * the memory-mapped file (char *memoryMappedView),
+ * and then a special SendMessage() is sent.  When the
+ * JavaDLL returns from SendMessage() processing, the
+ * data will be in memoryMappedView.  The SendMessage()
+ * return value tells us if all is right with the world.
+ *
+ * The set-up proces involves creating the memory-mapped
+ * file, and writing a special string to it so that the
+ * WindowsDLL so it knows about it as well.
+ */
+LRESULT
+AccessBridgeATInstance::initiateIPC() {
+    DWORD errorCode;
+
+    PrintDebugString("\r\nin AccessBridgeATInstance::initiateIPC()");
+
+    // open Windows-initiated IPC filemap & map it to a ptr
+
+    memoryMappedFileMapHandle = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,
+                                                FALSE, memoryMappedFileName);
+    if (memoryMappedFileMapHandle == NULL) {
+        errorCode = GetLastError();
+        PrintDebugString("  Failed to CreateFileMapping for %s, error: %X", memoryMappedFileName, errorCode);
+        return errorCode;
+    } else {
+        PrintDebugString("  CreateFileMapping worked - filename: %s", memoryMappedFileName);
+    }
+
+    memoryMappedView = (char *) MapViewOfFile(memoryMappedFileMapHandle,
+                                              FILE_MAP_READ | FILE_MAP_WRITE,
+                                              0, 0, 0);
+    if (memoryMappedView == NULL) {
+        errorCode = GetLastError();
+        PrintDebugString("  Failed to MapViewOfFile for %s, error: %X", memoryMappedFileName, errorCode);
+        return errorCode;
+    } else {
+        PrintDebugString("  MapViewOfFile worked - view: %p", memoryMappedView);
+    }
+
+
+    // look for the JavaDLL's answer to see if it could read the file
+    if (strcmp(memoryMappedView, AB_MEMORY_MAPPED_FILE_OK_QUERY) != 0) {
+        PrintDebugString("  JavaVM failed to write to memory mapped file %s",
+                         memoryMappedFileName);
+        return -1;
+    } else {
+        PrintDebugString("  JavaVM successfully wrote to file!");
+    }
+
+
+    // write some data to the memory mapped file for WindowsDLL to verify
+    strcpy(memoryMappedView, AB_MEMORY_MAPPED_FILE_OK_ANSWER);
+
+
+    return 0;
+}
+
+
+typedef struct EVENT_STRUCT
+{
+    char *buffer;
+    int bufsize;
+    ABHWND64 winAccessBridgeWindow;
+    ABHWND64 ourAccessBridgeWindow;
+}EVENT_STRUCT;
+
+
+#include <process.h>
+#define THREAD_PROC unsigned int __stdcall
+typedef unsigned int (__stdcall *THREAD_ROUTINE)(LPVOID lpThreadParameter);
+
+static HANDLE BeginThread(THREAD_ROUTINE thread_func,DWORD *id,DWORD param)
+{
+    HANDLE ret;
+    ret = (HANDLE) _beginthreadex(NULL,0,thread_func,(void *)param,0,(unsigned int *)id);
+    if(ret == INVALID_HANDLE_VALUE)
+        ret = NULL;
+    return(ret);
+}
+
+DWORD JavaBridgeThreadId = 0;
+
+static THREAD_PROC JavaBridgeThread(LPVOID param1)
+{
+    MSG msg;
+    DWORD rc = 0;
+    while (GetMessage(&msg,        // message structure
+                      NULL,                  // handle of window receiving the message
+                      0,                  // lowest message to examine
+                      0))                 // highest message to examine
+        {
+            if(msg.message == WM_USER)
+                {
+                    EVENT_STRUCT *event_struct = (EVENT_STRUCT *)msg.wParam;
+                    COPYDATASTRUCT toCopy;
+                    toCopy.dwData = 0;          // 32-bits we could use for something...
+                    toCopy.cbData = event_struct->bufsize;
+                    toCopy.lpData = event_struct->buffer;
+
+                    LRESULT ret = SendMessage((HWND)ABLongToHandle(event_struct->winAccessBridgeWindow), WM_COPYDATA,
+                                              (WPARAM)event_struct->ourAccessBridgeWindow, (LPARAM) &toCopy);
+                    delete event_struct->buffer;
+                    delete event_struct;
+                }
+            if(msg.message == (WM_USER+1))
+                PostQuitMessage(0);
+        }
+    JavaBridgeThreadId = 0;
+    return(0);
+}
+
+/*
+ * Handles one event
+ */
+static void do_event(char *buffer, int bufsize,HWND ourAccessBridgeWindow,HWND winAccessBridgeWindow)
+{
+    EVENT_STRUCT *event_struct = new EVENT_STRUCT;
+    event_struct->bufsize = bufsize;
+    event_struct->buffer = new char[bufsize];
+    memcpy(event_struct->buffer,buffer,bufsize);
+    event_struct->ourAccessBridgeWindow = ABHandleToLong(ourAccessBridgeWindow);
+    event_struct->winAccessBridgeWindow = ABHandleToLong(winAccessBridgeWindow);
+    if(!JavaBridgeThreadId)
+        {
+            HANDLE JavaBridgeThreadHandle = BeginThread(JavaBridgeThread,&JavaBridgeThreadId,(DWORD)event_struct);
+            CloseHandle(JavaBridgeThreadHandle);
+        }
+    PostThreadMessage(JavaBridgeThreadId,WM_USER,(WPARAM)event_struct,0);
+}
+
+
+/**
+ * sendJavaEventPackage - uses SendMessage(WM_COPYDATA) to do
+ *                        IPC messaging with the Java AccessBridge DLL
+ *                        to propogate events to those ATs that want 'em
+ *
+ */
+LRESULT
+AccessBridgeATInstance::sendJavaEventPackage(char *buffer, int bufsize, long eventID) {
+
+    PrintDebugString("AccessBridgeATInstance::sendJavaEventPackage() eventID = %X", eventID);
+    PrintDebugString("AccessBridgeATInstance::sendJavaEventPackage() (using PostMessage) eventID = %X", eventID);
+
+    if (eventID & javaEventMask) {
+        do_event(buffer,bufsize,ourAccessBridgeWindow,winAccessBridgeWindow);
+        return(0);
+    } else {
+        return -1;
+    }
+}
+
+
+/**
+ * uses SendMessage(WM_COPYDATA) to do
+ * IPC messaging with the Java AccessBridge DLL
+ * to propogate events to those ATs that want 'em
+ *
+ */
+LRESULT
+AccessBridgeATInstance::sendAccessibilityEventPackage(char *buffer, int bufsize, long eventID) {
+
+    PrintDebugString("AccessBridgeATInstance::sendAccessibilityEventPackage() eventID = %X", eventID);
+
+    if (eventID & accessibilityEventMask) {
+        do_event(buffer,bufsize,ourAccessBridgeWindow,winAccessBridgeWindow);
+        return(0);
+    } else {
+        return -1;
+    }
+}
+
+
+/**
+ * findABATInstanceFromATHWND - walk through linked list from
+ *                              where we are.  Return the
+ *                              AccessBridgeATInstance
+ *                              of the ABATInstance that
+ *                              matches the passed in vmID;
+ *                              no match: return 0
+ */
+AccessBridgeATInstance *
+AccessBridgeATInstance::findABATInstanceFromATHWND(HWND window) {
+    // no need to recurse really
+    if (winAccessBridgeWindow == window) {
+        return this;
+    } else {
+        AccessBridgeATInstance *current = nextATInstance;
+        while (current != (AccessBridgeATInstance *) 0) {
+            if (current->winAccessBridgeWindow == window) {
+                return current;
+            }
+            current = current->nextATInstance;
+        }
+    }
+    return (AccessBridgeATInstance *) 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libjavaaccessbridge/AccessBridgeATInstance.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to track key AT instance info from the JavaAccessBridge
+ */
+
+#include <windows.h>
+#include "AccessBridgePackages.h"
+
+#ifndef __AccessBridgeATInstance_H__
+#define __AccessBridgeATInstance_H__
+
+
+/**
+ * The AccessBridgeATInstance class.
+ */
+class AccessBridgeATInstance {
+        friend class JavaAccessBridge;
+
+        AccessBridgeATInstance *nextATInstance;
+        HWND ourAccessBridgeWindow;
+        HWND winAccessBridgeWindow;
+        long javaEventMask;
+        long accessibilityEventMask;
+
+        // IPC variables
+        HANDLE memoryMappedFileMapHandle;       // handle to file map
+        char *memoryMappedView;                         // ptr to shared memory
+        char memoryMappedFileName[cMemoryMappedNameSize];
+
+public:
+        AccessBridgeATInstance(HWND ourABWindow, HWND winABWindow,
+                                                   char *memoryFilename,
+                                                   AccessBridgeATInstance *next);
+        ~AccessBridgeATInstance();
+        LRESULT initiateIPC();
+        LRESULT sendJavaEventPackage(char *buffer, int bufsize, long eventID);
+        LRESULT sendAccessibilityEventPackage(char *buffer, int bufsize, long eventID);
+        AccessBridgeATInstance *findABATInstanceFromATHWND(HWND window);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libjavaaccessbridge/AccessBridgeJavaEntryPoints.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,4787 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage JNI calls into AccessBridge.java
+ */
+
+#include "AccessBridgeJavaEntryPoints.h"
+#include "AccessBridgeDebug.h"
+
+
+
+/**
+ * Initialize the AccessBridgeJavaEntryPoints class
+ *
+ */
+AccessBridgeJavaEntryPoints::AccessBridgeJavaEntryPoints(JNIEnv *jniEnvironment,
+                                                         jobject bridgeObject) {
+    jniEnv = jniEnvironment;
+    accessBridgeObject = (jobject)bridgeObject;
+    PrintDebugString("AccessBridgeJavaEntryPoints(%X, %X) called", jniEnv, accessBridgeObject);
+}
+
+
+/**
+ * Destructor
+ *
+ */
+AccessBridgeJavaEntryPoints::~AccessBridgeJavaEntryPoints() {
+}
+
+// -----------------------------------
+
+#define FIND_CLASS(classRef, className) \
+    localClassRef = jniEnv->FindClass(className); \
+    if (localClassRef == (jclass) 0) { \
+        PrintDebugString("  Error! FindClass(%s) failed!", className); \
+        PrintDebugString("    -> jniEnv = %p", jniEnv); \
+        return FALSE; \
+    } \
+    classRef = (jclass) jniEnv->NewGlobalRef(localClassRef); \
+    jniEnv->DeleteLocalRef(localClassRef); \
+    if (classRef == (jclass) 0) { \
+        PrintDebugString("  Error! FindClass(%s) failed!", className); \
+        PrintDebugString("    ->  (ran out of RAM)"); \
+        return FALSE; \
+    }
+
+
+#define FIND_METHOD(methodID, classRef, methodString, methodSignature); \
+    methodID = jniEnv->GetMethodID(classRef, methodString,  methodSignature); \
+    if (methodID == (jmethodID) 0) { \
+        PrintDebugString("  Error! GetMethodID(%s) failed!", methodString); \
+        PrintDebugString("    -> jniEnv = %p; classRef = %p", jniEnv, classRef); \
+        return FALSE; \
+    }
+
+#define EXCEPTION_CHECK(situationDescription, returnVal)                                        \
+    if (exception = jniEnv->ExceptionOccurred()) {                                              \
+        PrintDebugString("\r\n *** Exception occured while doing: %s; returning %d", situationDescription, returnVal);   \
+        jniEnv->ExceptionDescribe();                                                            \
+        jniEnv->ExceptionClear();                                                               \
+        return (returnVal);                                                                     \
+    }
+
+#define EXCEPTION_CHECK_VOID(situationDescription)                                              \
+    if (exception = jniEnv->ExceptionOccurred()) {                                              \
+        PrintDebugString("\r\n *** Exception occured while doing: %s", situationDescription);   \
+        jniEnv->ExceptionDescribe();                                                            \
+        jniEnv->ExceptionClear();                                                               \
+        return;                                                                                 \
+    }
+
+/**
+ * Make all of the getClass() & getMethod() calls
+ *
+ */
+BOOL
+AccessBridgeJavaEntryPoints::BuildJavaEntryPoints() {
+    jclass localClassRef;
+
+    PrintDebugString("Calling BuildJavaEntryPoints():");
+
+    FIND_CLASS(bridgeClass, "com/sun/java/accessibility/AccessBridge");
+
+    // ------- general methods
+
+    // GetMethodID(decrementReference)
+    FIND_METHOD(decrementReferenceMethod, bridgeClass,
+                "decrementReference",
+                "(Ljava/lang/Object;)V");
+
+    // GetMethodID(getJavaVersionPropertyMethod)
+    FIND_METHOD(getJavaVersionPropertyMethod, bridgeClass,
+                "getJavaVersionProperty",
+                "()Ljava/lang/String;");
+
+    // ------- Window methods
+
+    // GetMethodID(isJavaWindow)
+    FIND_METHOD(isJavaWindowMethod, bridgeClass,
+                "isJavaWindow",
+                "(I)Z");
+
+    // GetMethodID(getAccessibleContextFromHWND)
+    FIND_METHOD(getAccessibleContextFromHWNDMethod, bridgeClass,
+                "getContextFromNativeWindowHandle",
+                "(I)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getHWNDFromAccessibleContext)
+    FIND_METHOD(getHWNDFromAccessibleContextMethod, bridgeClass,
+                "getNativeWindowHandleFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleParentFromContext)
+    FIND_METHOD(getAccessibleParentFromContextMethod, bridgeClass,
+                "getAccessibleParentFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
+
+    // ===== utility methods ===== */
+
+    // GetMethodID(setTextContents)
+    FIND_METHOD(setTextContentsMethod, bridgeClass,
+                "setTextContents",
+                "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Z");
+
+    // GetMethodID(getParentWithRole)
+    FIND_METHOD(getParentWithRoleMethod, bridgeClass,
+                "getParentWithRole",
+                "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getTopLevelObject)
+    FIND_METHOD(getTopLevelObjectMethod, bridgeClass,
+                "getTopLevelObject",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getParentWithRoleElseRoot)
+    FIND_METHOD(getParentWithRoleElseRootMethod, bridgeClass,
+                "getParentWithRoleElseRoot",
+                "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getObjectDepth)
+    FIND_METHOD(getObjectDepthMethod, bridgeClass,
+                "getObjectDepth",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getActiveDescendent)
+    FIND_METHOD(getActiveDescendentMethod, bridgeClass,
+                "getActiveDescendent",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
+
+    // ------- AccessibleContext methods
+
+    // GetMethodID(getAccessibleContextAt)
+    FIND_METHOD(getAccessibleContextAtMethod, bridgeClass,
+                "getAccessibleContextAt",
+                "(IILjavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleContextWithFocus)
+    FIND_METHOD(getAccessibleContextWithFocusMethod, bridgeClass,
+                "getAccessibleContextWithFocus",
+                "()Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleNameFromContext)
+    FIND_METHOD(getAccessibleNameFromContextMethod, bridgeClass,
+                "getAccessibleNameFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleDescriptionFromContext)
+    FIND_METHOD(getAccessibleDescriptionFromContextMethod, bridgeClass,
+                "getAccessibleDescriptionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleRoleStringFromContext)
+    FIND_METHOD(getAccessibleRoleStringFromContextMethod, bridgeClass,
+                "getAccessibleRoleStringFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleRoleStringFromContext_en_US)
+    FIND_METHOD(getAccessibleRoleStringFromContext_en_USMethod, bridgeClass,
+                "getAccessibleRoleStringFromContext_en_US",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleStatesStringFromContext)
+    FIND_METHOD(getAccessibleStatesStringFromContextMethod, bridgeClass,
+                "getAccessibleStatesStringFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleStatesStringFromContext_en_US)
+    FIND_METHOD(getAccessibleStatesStringFromContext_en_USMethod, bridgeClass,
+                "getAccessibleStatesStringFromContext_en_US",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleParentFromContext)
+    FIND_METHOD(getAccessibleParentFromContextMethod, bridgeClass,
+                "getAccessibleParentFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleIndexInParentFromContext)
+    FIND_METHOD(getAccessibleIndexInParentFromContextMethod, bridgeClass,
+                "getAccessibleIndexInParentFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleChildrenCountFromContext)
+    FIND_METHOD(getAccessibleChildrenCountFromContextMethod, bridgeClass,
+                "getAccessibleChildrenCountFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleChildFromContext)
+    FIND_METHOD(getAccessibleChildFromContextMethod, bridgeClass,
+                "getAccessibleChildFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleBoundsOnScreenFromContext)
+    FIND_METHOD(getAccessibleBoundsOnScreenFromContextMethod, bridgeClass,
+                "getAccessibleBoundsOnScreenFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/awt/Rectangle;");
+
+    // GetMethodID(getAccessibleXcoordFromContext)
+    FIND_METHOD(getAccessibleXcoordFromContextMethod, bridgeClass,
+                "getAccessibleXcoordFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleYcoordFromContext)
+    FIND_METHOD(getAccessibleYcoordFromContextMethod, bridgeClass,
+                "getAccessibleYcoordFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleHeightFromContext)
+    FIND_METHOD(getAccessibleHeightFromContextMethod, bridgeClass,
+                "getAccessibleHeightFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleWidthFromContext)
+    FIND_METHOD(getAccessibleWidthFromContextMethod, bridgeClass,
+                "getAccessibleWidthFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleComponentFromContext)
+    FIND_METHOD(getAccessibleComponentFromContextMethod, bridgeClass,
+                "getAccessibleComponentFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleComponent;");
+
+    // GetMethodID(getAccessibleActionFromContext)
+    FIND_METHOD(getAccessibleActionFromContextMethod, bridgeClass,
+                "getAccessibleActionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleAction;");
+
+    // GetMethodID(getAccessibleSelectionFromContext)
+    FIND_METHOD(getAccessibleSelectionFromContextMethod, bridgeClass,
+                "getAccessibleSelectionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleSelection;");
+
+    // GetMethodID(getAccessibleTextFromContext)
+    FIND_METHOD(getAccessibleTextFromContextMethod, bridgeClass,
+                "getAccessibleTextFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleText;");
+
+    // GetMethodID(getAccessibleValueFromContext)
+    FIND_METHOD(getAccessibleValueFromContextMethod, bridgeClass,
+                "getAccessibleValueFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleValue;");
+
+
+    // ------- begin AccessibleTable methods
+
+    // GetMethodID(getAccessibleTableFromContext)
+    FIND_METHOD(getAccessibleTableFromContextMethod, bridgeClass,
+                "getAccessibleTableFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;");
+
+    // GetMethodID(getContextFromAccessibleTable)
+    FIND_METHOD(getContextFromAccessibleTableMethod, bridgeClass,
+                "getContextFromAccessibleTable",
+                "(Ljavax/accessibility/AccessibleTable;)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleTableRowHeader)
+    FIND_METHOD(getAccessibleTableRowHeaderMethod, bridgeClass,
+                "getAccessibleTableRowHeader",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;");
+
+
+    // GetMethodID(getAccessibleTableColumnHeader)
+    FIND_METHOD(getAccessibleTableColumnHeaderMethod, bridgeClass,
+                "getAccessibleTableColumnHeader",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleTable;");
+
+
+    // GetMethodID(getAccessibleTableRowCount)
+    FIND_METHOD(getAccessibleTableRowCountMethod, bridgeClass,
+                "getAccessibleTableRowCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTableColumnCount)
+    FIND_METHOD(getAccessibleTableColumnCountMethod, bridgeClass,
+                "getAccessibleTableColumnCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTableCellAccessibleContext)
+    FIND_METHOD(getAccessibleTableCellAccessibleContextMethod, bridgeClass,
+                "getAccessibleTableCellAccessibleContext",
+                "(Ljavax/accessibility/AccessibleTable;II)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleTableCellIndex)
+    FIND_METHOD(getAccessibleTableCellIndexMethod, bridgeClass,
+                "getAccessibleTableCellIndex",
+                "(Ljavax/accessibility/AccessibleTable;II)I");
+
+    // GetMethodID(getAccessibleTableCellRowExtent)
+    FIND_METHOD(getAccessibleTableCellRowExtentMethod, bridgeClass,
+                "getAccessibleTableCellRowExtent",
+                "(Ljavax/accessibility/AccessibleTable;II)I");
+
+    // GetMethodID(getAccessibleTableCellColumnExtent)
+    FIND_METHOD(getAccessibleTableCellColumnExtentMethod, bridgeClass,
+                "getAccessibleTableCellColumnExtent",
+                "(Ljavax/accessibility/AccessibleTable;II)I");
+
+    // GetMethodID(isAccessibleTableCellSelected)
+    FIND_METHOD(isAccessibleTableCellSelectedMethod, bridgeClass,
+                "isAccessibleTableCellSelected",
+                "(Ljavax/accessibility/AccessibleTable;II)Z");
+
+    // GetMethodID(getAccessibleTableRowHeaderRowCount)
+    FIND_METHOD(getAccessibleTableRowHeaderRowCountMethod, bridgeClass,
+                "getAccessibleTableRowHeaderRowCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTableColumnHeaderRowCount)
+    FIND_METHOD(getAccessibleTableColumnHeaderRowCountMethod, bridgeClass,
+                "getAccessibleTableColumnHeaderRowCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTableRowHeaderColumnCount)
+    FIND_METHOD(getAccessibleTableRowHeaderColumnCountMethod, bridgeClass,
+                "getAccessibleTableRowHeaderColumnCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTableColumnHeaderColumnCount)
+    FIND_METHOD(getAccessibleTableColumnHeaderColumnCountMethod, bridgeClass,
+                "getAccessibleTableColumnHeaderColumnCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTableRowDescription)
+    FIND_METHOD(getAccessibleTableRowDescriptionMethod, bridgeClass,
+                "getAccessibleTableRowDescription",
+                "(Ljavax/accessibility/AccessibleTable;I)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleTableColumnDescription)
+    FIND_METHOD(getAccessibleTableColumnDescriptionMethod, bridgeClass,
+                "getAccessibleTableColumnDescription",
+                "(Ljavax/accessibility/AccessibleTable;I)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleTableRowSelectionCount)
+    FIND_METHOD(getAccessibleTableRowSelectionCountMethod, bridgeClass,
+                "getAccessibleTableRowSelectionCount",
+                "(Ljavax/accessibility/AccessibleTable;)I");
+
+    // GetMethodID(isAccessibleTableRowSelected)
+    FIND_METHOD(isAccessibleTableRowSelectedMethod, bridgeClass,
+                "isAccessibleTableRowSelected",
+                "(Ljavax/accessibility/AccessibleTable;I)Z");
+
+    // GetMethodID(getAccessibleTableRowSelections)
+    FIND_METHOD(getAccessibleTableRowSelectionsMethod, bridgeClass,
+                "getAccessibleTableRowSelections",
+                "(Ljavax/accessibility/AccessibleTable;I)I");
+
+    // GetMethodID(getAccessibleTableColumnSelectionCount)
+    FIND_METHOD(getAccessibleTableColumnSelectionCountMethod, bridgeClass,
+                "getAccessibleTableColumnSelectionCount",
+                "(Ljavax/accessibility/AccessibleTable;)I");
+
+    // GetMethodID(isAccessibleTableColumnSelected)
+    FIND_METHOD(isAccessibleTableColumnSelectedMethod, bridgeClass,
+                "isAccessibleTableColumnSelected",
+                "(Ljavax/accessibility/AccessibleTable;I)Z");
+
+    // GetMethodID(getAccessibleTableColumnSelections)
+    FIND_METHOD(getAccessibleTableColumnSelectionsMethod, bridgeClass,
+                "getAccessibleTableColumnSelections",
+                "(Ljavax/accessibility/AccessibleTable;I)I");
+
+    // GetMethodID(getAccessibleTableRow)
+    FIND_METHOD(getAccessibleTableRowMethod, bridgeClass,
+                "getAccessibleTableRow",
+                "(Ljavax/accessibility/AccessibleTable;I)I");
+
+    // GetMethodID(getAccessibleTableColumn)
+    FIND_METHOD(getAccessibleTableColumnMethod, bridgeClass,
+                "getAccessibleTableColumn",
+                "(Ljavax/accessibility/AccessibleTable;I)I");
+
+    // GetMethodID(getAccessibleTableIndex)
+    FIND_METHOD(getAccessibleTableIndexMethod, bridgeClass,
+                "getAccessibleTableIndex",
+                "(Ljavax/accessibility/AccessibleTable;II)I");
+
+    /* ------- end AccessibleTable methods */
+
+    /* start AccessibleRelationSet methods ----- */
+
+    // GetMethodID(getAccessibleRelationCount)
+    FIND_METHOD(getAccessibleRelationCountMethod, bridgeClass,
+                "getAccessibleRelationCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleRelationKey)
+    FIND_METHOD(getAccessibleRelationKeyMethod, bridgeClass,
+                "getAccessibleRelationKey",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleRelationTargetCount)
+    FIND_METHOD(getAccessibleRelationTargetCountMethod, bridgeClass,
+                "getAccessibleRelationTargetCount",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleRelationTarget)
+    FIND_METHOD(getAccessibleRelationTargetMethod, bridgeClass,
+                "getAccessibleRelationTarget",
+                "(Ljavax/accessibility/AccessibleContext;II)Ljavax/accessibility/AccessibleContext;");
+
+
+    // ------- AccessibleHypertext methods
+
+    // GetMethodID(getAccessibleHypertext)
+    FIND_METHOD(getAccessibleHypertextMethod, bridgeClass,
+                "getAccessibleHypertext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljavax/accessibility/AccessibleHypertext;");
+
+    // GetMethodID(activateAccessibleHyperlink)
+    FIND_METHOD(activateAccessibleHyperlinkMethod, bridgeClass,
+                "activateAccessibleHyperlink",
+                "(Ljavax/accessibility/AccessibleContext;Ljavax/accessibility/AccessibleHyperlink;)Z");
+
+    // GetMethodID(getAccessibleHyperlinkCount)
+    FIND_METHOD(getAccessibleHyperlinkCountMethod, bridgeClass,
+                "getAccessibleHyperlinkCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleHyperlink)
+    FIND_METHOD(getAccessibleHyperlinkMethod, bridgeClass,
+                "getAccessibleHyperlink",
+                "(Ljavax/accessibility/AccessibleHypertext;I)Ljavax/accessibility/AccessibleHyperlink;");
+
+    // GetMethodID(getAccessibleHyperlinkText)
+    FIND_METHOD(getAccessibleHyperlinkTextMethod, bridgeClass,
+                "getAccessibleHyperlinkText",
+                "(Ljavax/accessibility/AccessibleHyperlink;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleHyperlinkURL)
+    FIND_METHOD(getAccessibleHyperlinkURLMethod, bridgeClass,
+                "getAccessibleHyperlinkURL",
+                "(Ljavax/accessibility/AccessibleHyperlink;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleHyperlinkStartIndex)
+    FIND_METHOD(getAccessibleHyperlinkStartIndexMethod, bridgeClass,
+                "getAccessibleHyperlinkStartIndex",
+                "(Ljavax/accessibility/AccessibleHyperlink;)I");
+
+    // GetMethodID(getAccessibleHyperlinkEndIndex)
+    FIND_METHOD(getAccessibleHyperlinkEndIndexMethod, bridgeClass,
+                "getAccessibleHyperlinkEndIndex",
+                "(Ljavax/accessibility/AccessibleHyperlink;)I");
+
+    // GetMethodID(getAccessibleHypertextLinkIndex)
+    FIND_METHOD(getAccessibleHypertextLinkIndexMethod, bridgeClass,
+                "getAccessibleHypertextLinkIndex",
+                "(Ljavax/accessibility/AccessibleHypertext;I)I");
+
+    // Accessible KeyBinding, Icon and Action ====================
+
+    // GetMethodID(getAccessibleKeyBindingsCount)
+    FIND_METHOD(getAccessibleKeyBindingsCountMethod, bridgeClass,
+                "getAccessibleKeyBindingsCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleKeyBindingChar)
+    FIND_METHOD(getAccessibleKeyBindingCharMethod, bridgeClass,
+                "getAccessibleKeyBindingChar",
+                "(Ljavax/accessibility/AccessibleContext;I)C");
+
+    // GetMethodID(getAccessibleKeyBindingModifiers)
+    FIND_METHOD(getAccessibleKeyBindingModifiersMethod, bridgeClass,
+                "getAccessibleKeyBindingModifiers",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleIconsCount)
+    FIND_METHOD(getAccessibleIconsCountMethod, bridgeClass,
+                "getAccessibleIconsCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleIconDescription)
+    FIND_METHOD(getAccessibleIconDescriptionMethod, bridgeClass,
+                "getAccessibleIconDescription",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleIconHeight)
+    FIND_METHOD(getAccessibleIconHeightMethod, bridgeClass,
+                "getAccessibleIconHeight",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleIconWidth)
+    FIND_METHOD(getAccessibleIconWidthMethod, bridgeClass,
+                "getAccessibleIconWidth",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleActionsCount)
+    FIND_METHOD(getAccessibleActionsCountMethod, bridgeClass,
+                "getAccessibleActionsCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleActionName)
+    FIND_METHOD(getAccessibleActionNameMethod, bridgeClass,
+                "getAccessibleActionName",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
+
+    // GetMethodID(doAccessibleActions)
+    FIND_METHOD(doAccessibleActionsMethod, bridgeClass,
+                "doAccessibleActions",
+                "(Ljavax/accessibility/AccessibleContext;Ljava/lang/String;)Z");
+
+    // ------- AccessibleText methods
+
+    // GetMethodID(getAccessibleCharCountFromContext)
+    FIND_METHOD(getAccessibleCharCountFromContextMethod, bridgeClass,
+                "getAccessibleCharCountFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleCaretPositionFromContext)
+    FIND_METHOD(getAccessibleCaretPositionFromContextMethod, bridgeClass,
+                "getAccessibleCaretPositionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleIndexAtPointFromContext)
+    FIND_METHOD(getAccessibleIndexAtPointFromContextMethod, bridgeClass,
+                "getAccessibleIndexAtPointFromContext",
+                "(Ljavax/accessibility/AccessibleContext;II)I");
+
+    // GetMethodID(getAccessibleLetterAtIndexFromContext)
+    FIND_METHOD(getAccessibleLetterAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleLetterAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleWordAtIndexFromContext)
+    FIND_METHOD(getAccessibleWordAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleWordAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleSentenceAtIndexFromContext)
+    FIND_METHOD(getAccessibleSentenceAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleSentenceAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleTextSelectionStartFromContext)
+    FIND_METHOD(getAccessibleTextSelectionStartFromContextMethod, bridgeClass,
+                "getAccessibleTextSelectionStartFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTextSelectionEndFromContext)
+    FIND_METHOD(getAccessibleTextSelectionEndFromContextMethod, bridgeClass,
+                "getAccessibleTextSelectionEndFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getAccessibleTextSelectedTextFromContext)
+    FIND_METHOD(getAccessibleTextSelectedTextFromContextMethod, bridgeClass,
+                "getAccessibleTextSelectedTextFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleAttributesAtIndexFromContext)
+    FIND_METHOD(getAccessibleAttributesAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleAttributesAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/lang/String;");
+
+    // GetMethodID(getAccessibleAttributeSetAtIndexFromContext)
+    FIND_METHOD(getAccessibleAttributeSetAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleAttributeSetAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljavax/swing/text/AttributeSet;");
+
+    // GetMethodID(getAccessibleTextRectAtIndexFromContext)
+    FIND_METHOD(getAccessibleTextRectAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleTextRectAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljava/awt/Rectangle;");
+
+    // GetMethodID(getAccessibleXcoordTextRectAtIndexFromContext)
+    FIND_METHOD(getAccessibleXcoordTextRectAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleXcoordTextRectAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleYcoordTextRectAtIndexFromContext)
+    FIND_METHOD(getAccessibleYcoordTextRectAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleYcoordTextRectAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleHeightTextRectAtIndexFromContext)
+    FIND_METHOD(getAccessibleHeightTextRectAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleHeightTextRectAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleWidthTextRectAtIndexFromContext)
+    FIND_METHOD(getAccessibleWidthTextRectAtIndexFromContextMethod, bridgeClass,
+                "getAccessibleWidthTextRectAtIndexFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getCaretLocationX)
+    FIND_METHOD(getCaretLocationXMethod, bridgeClass,
+                "getCaretLocationX",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getCaretLocationY)
+    FIND_METHOD(getCaretLocationYMethod, bridgeClass,
+                "getCaretLocationY",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getCaretLocationHeight)
+    FIND_METHOD(getCaretLocationHeightMethod, bridgeClass,
+                "getCaretLocationHeight",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getCaretLocationWidth)
+    FIND_METHOD(getCaretLocationWidthMethod, bridgeClass,
+                "getCaretLocationWidth",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+
+    // GetMethodID(getAccessibleTextLineLeftBoundsFromContextMethod)
+    FIND_METHOD(getAccessibleTextLineLeftBoundsFromContextMethod, bridgeClass,
+                "getAccessibleTextLineLeftBoundsFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleTextLineRightBoundsFromContextMethod)
+    FIND_METHOD(getAccessibleTextLineRightBoundsFromContextMethod, bridgeClass,
+                "getAccessibleTextLineRightBoundsFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)I");
+
+    // GetMethodID(getAccessibleTextRangeFromContextMethod)
+    FIND_METHOD(getAccessibleTextRangeFromContextMethod, bridgeClass,
+                "getAccessibleTextRangeFromContext",
+                "(Ljavax/accessibility/AccessibleContext;II)Ljava/lang/String;");
+
+
+    // ------- AccessibleValue methods
+
+    // GetMethodID(getCurrentAccessibleValueFromContext)
+    FIND_METHOD(getCurrentAccessibleValueFromContextMethod, bridgeClass,
+                "getCurrentAccessibleValueFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getMaximumAccessibleValueFromContext)
+    FIND_METHOD(getMaximumAccessibleValueFromContextMethod, bridgeClass,
+                "getMaximumAccessibleValueFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    // GetMethodID(getMinimumAccessibleValueFromContext)
+    FIND_METHOD(getMinimumAccessibleValueFromContextMethod, bridgeClass,
+                "getMinimumAccessibleValueFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+
+    // ------- AccessibleSelection methods
+
+    // GetMethodID(addAccessibleSelectionFromContext)
+    FIND_METHOD(addAccessibleSelectionFromContextMethod, bridgeClass,
+                "addAccessibleSelectionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)V");
+
+    // GetMethodID(clearAccessibleSelectionFromContext)
+    FIND_METHOD(clearAccessibleSelectionFromContextMethod, bridgeClass,
+                "clearAccessibleSelectionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)V");
+
+    // GetMethodID(getAccessibleSelectionFromContext)
+    FIND_METHOD(getAccessibleSelectionContextFromContextMethod, bridgeClass,
+                "getAccessibleSelectionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(getAccessibleSelectionCountFromContext)
+    FIND_METHOD(getAccessibleSelectionCountFromContextMethod, bridgeClass,
+                "getAccessibleSelectionCountFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(isAccessibleChildSelectedFromContext)
+    FIND_METHOD(isAccessibleChildSelectedFromContextMethod, bridgeClass,
+                "isAccessibleChildSelectedFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)Z");
+
+    // GetMethodID(removeAccessibleSelectionFromContext)
+    FIND_METHOD(removeAccessibleSelectionFromContextMethod, bridgeClass,
+                "removeAccessibleSelectionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;I)V");
+
+    // GetMethodID(selectAllAccessibleSelectionFromContext)
+    FIND_METHOD(selectAllAccessibleSelectionFromContextMethod, bridgeClass,
+                "selectAllAccessibleSelectionFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)V");
+
+
+    // ------- Event Notification methods
+
+    // GetMethodID(addJavaEventNotification)
+    FIND_METHOD(addJavaEventNotificationMethod, bridgeClass,
+                "addJavaEventNotification", "(J)V");
+
+    // GetMethodID(removeJavaEventNotification)
+    FIND_METHOD(removeJavaEventNotificationMethod, bridgeClass,
+                "removeJavaEventNotification", "(J)V");
+
+    // GetMethodID(addAccessibilityEventNotification)
+    FIND_METHOD(addAccessibilityEventNotificationMethod, bridgeClass,
+                "addAccessibilityEventNotification", "(J)V");
+
+    // GetMethodID(removeAccessibilityEventNotification)
+    FIND_METHOD(removeAccessibilityEventNotificationMethod, bridgeClass,
+                "removeAccessibilityEventNotification", "(J)V");
+
+
+    // ------- AttributeSet methods
+
+    // GetMethodID(getBoldFromAttributeSet)
+    FIND_METHOD(getBoldFromAttributeSetMethod, bridgeClass,
+                "getBoldFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
+
+    // GetMethodID(getItalicFromAttributeSet)
+    FIND_METHOD(getItalicFromAttributeSetMethod, bridgeClass,
+                "getItalicFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
+
+    // GetMethodID(getUnderlineFromAttributeSet)
+    FIND_METHOD(getUnderlineFromAttributeSetMethod, bridgeClass,
+                "getUnderlineFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
+
+    // GetMethodID(getStrikethroughFromAttributeSet)
+    FIND_METHOD(getStrikethroughFromAttributeSetMethod, bridgeClass,
+                "getStrikethroughFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
+
+    // GetMethodID(getSuperscriptFromAttributeSet)
+    FIND_METHOD(getSuperscriptFromAttributeSetMethod, bridgeClass,
+                "getSuperscriptFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
+
+    // GetMethodID(getSubscriptFromAttributeSet)
+    FIND_METHOD(getSubscriptFromAttributeSetMethod, bridgeClass,
+                "getSubscriptFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Z");
+
+    // GetMethodID(getBackgroundColorFromAttributeSet)
+    FIND_METHOD(getBackgroundColorFromAttributeSetMethod, bridgeClass,
+                "getBackgroundColorFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;");
+
+    // GetMethodID(getForegroundColorFromAttributeSet)
+    FIND_METHOD(getForegroundColorFromAttributeSetMethod, bridgeClass,
+                "getForegroundColorFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;");
+
+    // GetMethodID(getFontFamilyFromAttributeSet)
+    FIND_METHOD(getFontFamilyFromAttributeSetMethod, bridgeClass,
+                "getFontFamilyFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)Ljava/lang/String;");
+
+    // GetMethodID(getFontSizeFromAttributeSet)
+    FIND_METHOD(getFontSizeFromAttributeSetMethod, bridgeClass,
+                "getFontSizeFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I");
+
+    // GetMethodID(getAlignmentFromAttributeSet)
+    FIND_METHOD(getAlignmentFromAttributeSetMethod, bridgeClass,
+                "getAlignmentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I");
+
+    // GetMethodID(getBidiLevelFromAttributeSet)
+    FIND_METHOD(getBidiLevelFromAttributeSetMethod, bridgeClass,
+                "getBidiLevelFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)I");
+
+    // GetMethodID(getFirstLineIndentFromAttributeSet)
+    FIND_METHOD(getFirstLineIndentFromAttributeSetMethod, bridgeClass,
+                "getFirstLineIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
+
+    // GetMethodID(getLeftIndentFromAttributeSet)
+    FIND_METHOD(getLeftIndentFromAttributeSetMethod, bridgeClass,
+                "getLeftIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
+
+    // GetMethodID(getRightIndentFromAttributeSet)
+    FIND_METHOD(getRightIndentFromAttributeSetMethod, bridgeClass,
+                "getRightIndentFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
+
+    // GetMethodID(getLineSpacingFromAttributeSet)
+    FIND_METHOD(getLineSpacingFromAttributeSetMethod, bridgeClass,
+                "getLineSpacingFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
+
+    // GetMethodID(getSpaceAboveFromAttributeSet)
+    FIND_METHOD(getSpaceAboveFromAttributeSetMethod, bridgeClass,
+                "getSpaceAboveFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
+
+    // GetMethodID(getSpaceBelowFromAttributeSet)
+    FIND_METHOD(getSpaceBelowFromAttributeSetMethod, bridgeClass,
+                "getSpaceBelowFromAttributeSet", "(Ljavax/swing/text/AttributeSet;)F");
+
+
+    /**
+     * Additional methods for Teton
+     */
+
+    // GetMethodID(requestFocus)
+    FIND_METHOD(requestFocusMethod, bridgeClass,
+                "requestFocus",
+                "(Ljavax/accessibility/AccessibleContext;)Z");
+
+    // GetMethodID(selectTextRange)
+    FIND_METHOD(selectTextRangeMethod, bridgeClass,
+                "selectTextRange",
+                "(Ljavax/accessibility/AccessibleContext;II)Z");
+
+    // GetMethodID(getVisibleChildrenCount)
+    FIND_METHOD(getVisibleChildrenCountMethod, bridgeClass,
+                "getVisibleChildrenCount",
+                "(Ljavax/accessibility/AccessibleContext;)I");
+
+    // GetMethodID(getVisibleChild)
+    FIND_METHOD(getVisibleChildMethod, bridgeClass,
+                "getVisibleChild",
+                "(Ljavax/accessibility/AccessibleContext;I)Ljavax/accessibility/AccessibleContext;");
+
+    // GetMethodID(setCaretPosition)
+    FIND_METHOD(setCaretPositionMethod, bridgeClass,
+                "setCaretPosition",
+                "(Ljavax/accessibility/AccessibleContext;I)Z");
+
+    // GetMethodID(getVirtualAccessibleNameFromContextMethod) Ben Key
+    FIND_METHOD(getVirtualAccessibleNameFromContextMethod, bridgeClass,
+                "getVirtualAccessibleNameFromContext",
+                "(Ljavax/accessibility/AccessibleContext;)Ljava/lang/String;");
+
+    return TRUE;
+}
+
+// Note for the following code which makes JNI upcalls...
+//
+// Problem, bug DB 16818166, JBS DB JDK-8015400
+// AccessibleContext is a JOBJECT64 which is a jobject (32 bit pointer)
+// for a Legacy (XP) build and a jlong (64 bits) for a -32 or -64 build.
+// For the -32 build the lower 32 bits needs to be extracted into a jobject.
+// Otherwise, if AccessibleContext is used directly what happens is that
+// the JNI code consumes the lower 32 of its 64 bits and that is not a
+// problem, but then when the JNI code consumes the next 32 bits for the
+// reference to the role String it gets the higher 0x00000000 bits from
+// the 64 bit JOBJECT64 AccessibleContext variable and thus a null reference
+// is passed as the String reference.
+//
+// Solution:
+// Cast the JOBJECT64 to a jobject.  For a 64 bit compile this is basically
+// a noop, i.e. JOBJECT64 is a 64 bit jlong and a jobject is a 64 bit reference.
+// For a 32 bit compile the cast drops the high order 32 bits, i.e. JOBJECT64
+// is a 64 bit jlong and jobject is a 32 bit reference.  For a Legacy build
+// JOBJECT64 is a jobject so this is also basically a noop.  The casts are
+// done in the methods in JavaAccessBridge::processPackage.
+
+// -----------------------------------
+
+/**
+ * isJavaWindow - returns whether the HWND is a Java window or not
+ *
+ */
+BOOL
+AccessBridgeJavaEntryPoints::isJavaWindow(jint window) {
+    jthrowable exception;
+    BOOL returnVal;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::isJavaWindow(%X):", window);
+
+    if (isJavaWindowMethod != (jmethodID) 0) {
+        returnVal = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, isJavaWindowMethod, window);
+        EXCEPTION_CHECK("Getting isJavaWindow - call to CallBooleanMethod()", FALSE);
+        return returnVal;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or isJavaWindowMethod == 0");
+        return FALSE;
+    }
+}
+
+// -----------------------------------
+
+/**
+ * isSameObject - returns whether two object reference refer to the same object
+ *
+ */
+BOOL
+AccessBridgeJavaEntryPoints::isSameObject(jobject obj1, jobject obj2) {
+    jthrowable exception;
+    BOOL returnVal;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::isSameObject(%p %p):", obj1, obj2);
+
+    returnVal = (BOOL) jniEnv->IsSameObject((jobject)obj1, (jobject)obj2);
+    EXCEPTION_CHECK("Calling IsSameObject", FALSE);
+
+    PrintDebugString("\r\n  isSameObject returning %d", returnVal);
+    return returnVal;
+}
+
+// -----------------------------------
+
+/**
+ * getAccessibleContextFromHWND - returns the AccessibleContext, if any, for an HWND
+ *
+ */
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleContextFromHWND(jint window) {
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::getAccessibleContextFromHWND(%X):", window);
+
+    if (getAccessibleContextFromHWNDMethod != (jmethodID) 0) {
+        returnedAccessibleContext =
+            (jobject)jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleContextFromHWNDMethod,
+                                              window);
+        EXCEPTION_CHECK("Getting AccessibleContextFromHWND - call to CallObjectMethod()", (jobject) 0);
+        globalRef = (jobject)jniEnv->NewGlobalRef((jobject)returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleContextFromHWND - call to CallObjectMethod()", (jobject) 0);
+        return globalRef;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getAccessibleContextFromHWNDMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+// -----------------------------------
+
+/**
+ * getHWNDFromAccessibleContext - returns the HWND for an AccessibleContext, if any
+ *      returns (HWND)0 on error.
+ */
+HWND
+AccessBridgeJavaEntryPoints::getHWNDFromAccessibleContext(jobject accessibleContext) {
+    jthrowable exception;
+    HWND rHWND;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::getHWNDFromAccessibleContext(%X):",
+                     accessibleContext);
+
+    if (getHWNDFromAccessibleContextMethod != (jmethodID) 0) {
+        rHWND = (HWND)jniEnv->CallIntMethod(accessBridgeObject, getHWNDFromAccessibleContextMethod,
+                                            accessibleContext);
+        EXCEPTION_CHECK("Getting HWNDFromAccessibleContext - call to CallIntMethod()", (HWND)0);
+        PrintDebugString("\r\n    rHWND = %X", rHWND);
+        return rHWND;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getHWNDFromAccessibleContextMethod == 0");
+        return (HWND)0;
+    }
+}
+
+
+/* ====== Utility methods ===== */
+
+/**
+ * Sets a text field to the specified string.  Returns whether successful;
+ */
+BOOL
+AccessBridgeJavaEntryPoints::setTextContents(const jobject accessibleContext, const wchar_t *text) {
+    jthrowable exception;
+    BOOL result = FALSE;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::setTextContents(%p, %ls):",
+                     accessibleContext, text);
+
+    if (setTextContentsMethod != (jmethodID) 0) {
+
+        // create a Java String for the text
+        jstring textString = jniEnv->NewString(text, (jsize)wcslen(text));
+        if (textString == 0) {
+            PrintDebugString("\r    NewString failed");
+            return FALSE;
+        }
+
+        result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                 setTextContentsMethod,
+                                                 accessibleContext, textString);
+        EXCEPTION_CHECK("setTextContents - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("\r\n    result = %d", result);
+        return result;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or setTextContentsMethod == 0");
+        return result;
+    }
+}
+
+/**
+ * Returns the Accessible Context of a Page Tab object that is the
+ * ancestor of a given object.  If the object is a Page Tab object
+ * or a Page Tab ancestor object was found, returns the object
+ * AccessibleContext.
+ * If there is no ancestor object that has an Accessible Role of Page Tab,
+ * returns (AccessibleContext)0.
+ */
+jobject
+AccessBridgeJavaEntryPoints::getParentWithRole(const jobject accessibleContext, const wchar_t *role) {
+    jthrowable exception;
+    jobject rAccessibleContext;
+
+    PrintDebugString("In AccessBridgeJavaEntryPoints::getParentWithRole(%p):",
+                     accessibleContext);
+
+    if (getParentWithRoleMethod != (jmethodID) 0) {
+        // create a Java String for the role
+        jstring roleName = jniEnv->NewString(role, (jsize)wcslen(role));
+        if (roleName == 0) {
+            PrintDebugString("    NewString failed");
+            return FALSE;
+        }
+
+        rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                      getParentWithRoleMethod,
+                                                      accessibleContext, roleName);
+        EXCEPTION_CHECK("Getting ParentWithRole - call to CallObjectMethod()", (AccessibleContext)0);
+        PrintDebugString("    rAccessibleContext = %p", rAccessibleContext);
+        jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
+        EXCEPTION_CHECK("Getting ParentWithRole - call to NewGlobalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         rAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getParentWithRoleMethod == 0");
+        return 0;
+    }
+}
+
+/**
+ * Returns the Accessible Context for the top level object in
+ * a Java Window.  This is same Accessible Context that is obtained
+ * from GetAccessibleContextFromHWND for that window.  Returns
+ * (AccessibleContext)0 on error.
+ */
+jobject
+AccessBridgeJavaEntryPoints::getTopLevelObject(const jobject accessibleContext) {
+    jthrowable exception;
+    jobject rAccessibleContext;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::getTopLevelObject(%p):",
+                     accessibleContext);
+
+    if (getTopLevelObjectMethod != (jmethodID) 0) {
+        rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                      getTopLevelObjectMethod,
+                                                      accessibleContext);
+        EXCEPTION_CHECK("Getting TopLevelObject - call to CallObjectMethod()", FALSE);
+        PrintDebugString("\r\n    rAccessibleContext = %p", rAccessibleContext);
+        jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
+        EXCEPTION_CHECK("Getting TopLevelObject - call to NewGlobalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         rAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getTopLevelObjectMethod == 0");
+        return 0;
+    }
+}
+
+/**
+ * If there is an Ancestor object that has an Accessible Role of
+ * Internal Frame, returns the Accessible Context of the Internal
+ * Frame object.  Otherwise, returns the top level object for that
+ * Java Window.  Returns (AccessibleContext)0 on error.
+ */
+jobject
+AccessBridgeJavaEntryPoints::getParentWithRoleElseRoot(const jobject accessibleContext, const wchar_t *role) {
+    jthrowable exception;
+    jobject rAccessibleContext;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::getParentWithRoleElseRoot(%p):",
+                     accessibleContext);
+
+    if (getParentWithRoleElseRootMethod != (jmethodID) 0) {
+
+        // create a Java String for the role
+        jstring roleName = jniEnv->NewString(role, (jsize)wcslen(role));
+        if (roleName == 0) {
+            PrintDebugString("\r    NewString failed");
+            return FALSE;
+        }
+
+        rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                      getParentWithRoleElseRootMethod,
+                                                      accessibleContext, roleName);
+        EXCEPTION_CHECK("Getting ParentWithRoleElseRoot - call to CallObjectMethod()", (AccessibleContext)0);
+        PrintDebugString("    rAccessibleContext = %p", rAccessibleContext);
+        jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
+        EXCEPTION_CHECK("Getting ParentWithRoleElseRoot - call to NewGlobalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         rAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getParentWithRoleElseRootMethod == 0");
+        return 0;
+    }
+}
+
+/**
+ * Returns how deep in the object hierarchy a given object is.
+ * The top most object in the object hierarchy has an object depth of 0.
+ * Returns -1 on error.
+ */
+jint
+AccessBridgeJavaEntryPoints::getObjectDepth(const jobject accessibleContext) {
+    jthrowable exception;
+    jint rResult;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::getObjectDepth(%p):",
+                     accessibleContext);
+
+    if (getObjectDepthMethod != (jmethodID) 0) {
+        rResult = jniEnv->CallIntMethod(accessBridgeObject,
+                                        getObjectDepthMethod,
+                                        accessibleContext);
+        EXCEPTION_CHECK("Getting ObjectDepth - call to CallIntMethod()", -1);
+        PrintDebugString("\r\n    rResult = %d", rResult);
+        return rResult;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getObjectDepthMethod == 0");
+        return -1;
+    }
+}
+
+
+
+/**
+ * Returns the Accessible Context of the current ActiveDescendent of an object.
+ * Returns 0 on error.
+ */
+jobject
+AccessBridgeJavaEntryPoints::getActiveDescendent(const jobject accessibleContext) {
+    jthrowable exception;
+    jobject rAccessibleContext;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::getActiveDescendent(%p):",
+                     accessibleContext);
+
+    if (getActiveDescendentMethod != (jmethodID) 0) {
+        rAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                      getActiveDescendentMethod,
+                                                      accessibleContext);
+        EXCEPTION_CHECK("Getting ActiveDescendent - call to CallObjectMethod()", (AccessibleContext)0);
+        PrintDebugString("\r\n    rAccessibleContext = %p", rAccessibleContext);
+        jobject globalRef = jniEnv->NewGlobalRef(rAccessibleContext);
+        EXCEPTION_CHECK("Getting ActiveDescendant - call to NewGlobalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         rAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getActiveDescendentMethod == 0");
+        return (AccessibleContext)0;
+    }
+}
+
+/**
+ * Additional methods for Teton
+ */
+
+/**
+ * Returns an AccessibleName for a component using an algorithm optimized
+ * for the JAWS screen reader by Ben Key (Freedom Scientific).  This method
+ * is only intended for JAWS. All other uses are entirely optional.
+ *
+ * Bug ID 4916682 - Implement JAWS AccessibleName policy
+ */
+BOOL
+AccessBridgeJavaEntryPoints::getVirtualAccessibleName (
+    IN const jobject object,
+    OUT wchar_t * name,
+    IN const int nameSize)
+{
+    /*
+      +
+      Parameter validation
+      +
+    */
+    if ((name == 0) || (nameSize == 0))
+    {
+        return FALSE;
+    }
+    ::memset (name, 0, nameSize * sizeof (wchar_t));
+    if (0 == object)
+    {
+        return FALSE;
+    }
+
+    jstring js = NULL;
+    const wchar_t * stringBytes = NULL;
+    jthrowable exception = NULL;
+    jsize length = 0;
+    PrintDebugString("\r\n  getVirtualAccessibleName called.");
+    if (getVirtualAccessibleNameFromContextMethod != (jmethodID) 0)
+    {
+        js = (jstring) jniEnv->CallObjectMethod (
+            accessBridgeObject,
+            getVirtualAccessibleNameFromContextMethod,
+            object);
+        EXCEPTION_CHECK("Getting AccessibleName - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0)
+        {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars (js, 0);
+            EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE);
+            wcsncpy(name, stringBytes, nameSize - 1);
+            length = jniEnv->GetStringLength(js);
+            EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod (
+                accessBridgeObject,
+                decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Name = %ls", name);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE);
+        }
+        else
+        {
+            PrintDebugString("  Accessible Name is null.");
+        }
+    }
+    else
+    {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or getVirtualAccessibleNameFromContextMethod == 0");
+        return FALSE;
+    }
+    if ( 0 != name [0] )
+    {
+        return TRUE;
+    }
+    return FALSE;
+}
+
+
+/**
+ * Request focus for a component. Returns whether successful;
+ *
+ * Bug ID 4944757 - requestFocus method needed
+ */
+BOOL
+AccessBridgeJavaEntryPoints::requestFocus(const jobject accessibleContext) {
+
+    jthrowable exception;
+    BOOL result = FALSE;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::requestFocus(%p):",
+                     accessibleContext);
+
+    if (requestFocusMethod != (jmethodID) 0) {
+        result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                 requestFocusMethod,
+                                                 accessibleContext);
+        EXCEPTION_CHECK("requestFocus - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("\r\n    result = %d", result);
+        return result;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or requestFocusMethod == 0");
+        return result;
+    }
+}
+
+/**
+ * Selects text between two indices.  Selection includes the text at the start index
+ * and the text at the end index. Returns whether successful;
+ *
+ * Bug ID 4944758 - selectTextRange method needed
+ */
+BOOL
+AccessBridgeJavaEntryPoints::selectTextRange(const jobject accessibleContext, int startIndex, int endIndex) {
+
+    jthrowable exception;
+    BOOL result = FALSE;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::selectTextRange(%p start = %d end = %d):",
+                     accessibleContext, startIndex, endIndex);
+
+    if (selectTextRangeMethod != (jmethodID) 0) {
+        result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                 selectTextRangeMethod,
+                                                 accessibleContext,
+                                                 startIndex, endIndex);
+        EXCEPTION_CHECK("selectTextRange - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("\r\n    result = %d", result);
+        return result;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or selectTextRangeMethod == 0");
+        return result;
+    }
+}
+
+/*
+ * Returns whether two text attributes are the same.
+ */
+static BOOL CompareAccessibleTextAttributesInfo(AccessibleTextAttributesInfo *one,
+                                                AccessibleTextAttributesInfo *two) {
+    return(one->bold == two->bold
+           && one->italic == two->italic
+           && one->underline == two->underline
+           && one->strikethrough == two->strikethrough
+           && one->superscript == two->superscript
+           && one->subscript == two->subscript
+           && one->fontSize == two->fontSize
+           && one->alignment == two->alignment
+           && one->bidiLevel == two->bidiLevel
+           && one->firstLineIndent == two->firstLineIndent
+           && one->leftIndent == two->leftIndent
+           && one->rightIndent == two->rightIndent
+           && one->lineSpacing == two->lineSpacing
+           && one->spaceAbove == two->spaceAbove
+           && one->spaceBelow == two->spaceBelow
+           && !wcscmp(one->backgroundColor,two->backgroundColor)
+           && !wcscmp(one->foregroundColor,two->foregroundColor)
+           && !wcscmp(one->fullAttributesString,two->fullAttributesString));
+}
+
+/**
+ * Get text attributes between two indices.
+ *
+ * Only one AccessibleTextAttributesInfo structure is passed - which
+ * contains the attributes for the first character, the function then goes
+ * through the following characters in the range specified and stops when the
+ * attributes are different from the first, it then returns in the passed
+ * parameter len the number of characters with the attributes returned. In most
+ * situations this will be all the characters, and if not the calling program
+ * can easily get the attributes for the next characters with different
+ * attributes
+ *
+ * Bug ID 4944761 - getTextAttributes between two indices method needed
+ */
+
+/* NEW FASTER CODE!!*/
+BOOL
+AccessBridgeJavaEntryPoints::getTextAttributesInRange(const jobject accessibleContext,
+                                                      int startIndex, int endIndex,
+                                                      AccessibleTextAttributesInfo *attributes, short *len) {
+
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+    BOOL result = FALSE;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::getTextAttributesInRange(%p start = %d end = %d):",
+                     accessibleContext, startIndex, endIndex);
+
+    *len = 0;
+    result = getAccessibleTextAttributes((jobject)accessibleContext, startIndex, attributes);
+    if (result != TRUE) {
+        return FALSE;
+    }
+    (*len)++;
+
+    for (jint i = startIndex+1; i <= endIndex; i++) {
+
+        AccessibleTextAttributesInfo test_attributes = *attributes;
+        // Get the full test_attributes string at i
+        if (getAccessibleAttributesAtIndexFromContextMethod != (jmethodID) 0) {
+            PrintDebugString(" Getting full test_attributes string from Context...");
+            js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                    getAccessibleAttributesAtIndexFromContextMethod,
+                                                    accessibleContext, i);
+            EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallObjectMethod()", FALSE);
+            PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+            if (js != (jstring) 0) {
+                stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+                EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringChars()", FALSE);
+                wcsncpy(test_attributes.fullAttributesString, stringBytes, (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t)));
+                length = jniEnv->GetStringLength(js);
+                test_attributes.fullAttributesString[length < (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t)) ?
+                                                     length : (sizeof(test_attributes.fullAttributesString) / sizeof(wchar_t))-2] = (wchar_t) 0;
+                EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringLength()", FALSE);
+                jniEnv->ReleaseStringChars(js, stringBytes);
+                EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to ReleaseStringChars()", FALSE);
+                jniEnv->CallVoidMethod(accessBridgeObject,
+                                       decrementReferenceMethod, js);
+                EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallVoidMethod()", FALSE);
+                wPrintDebugString(L"  Accessible Text attributes = %ls", test_attributes.fullAttributesString);
+                jniEnv->DeleteLocalRef(js);
+                EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE);
+            } else {
+                PrintDebugString("  Accessible Text attributes is null.");
+                test_attributes.fullAttributesString[0] = (wchar_t) 0;
+                return FALSE;
+            }
+        } else {
+            PrintDebugString("  Error! either env == 0 or getAccessibleAttributesAtIndexFromContextMethod == 0");
+            return FALSE;
+        }
+
+        if(wcscmp(attributes->fullAttributesString,test_attributes.fullAttributesString))
+            break;
+        if (result != TRUE) {
+            return FALSE;
+        }
+        (*len)++;
+    }
+    return TRUE;
+}
+
+/*
+ * Returns the number of visible children of a component
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+int
+AccessBridgeJavaEntryPoints::getVisibleChildrenCount(const jobject accessibleContext) {
+
+    jthrowable exception;
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getVisibleChildrenCount(%p)",
+                     accessibleContext);
+
+    // get the visible children count
+    int numChildren = jniEnv->CallIntMethod(accessBridgeObject, getVisibleChildrenCountMethod,
+                                            accessibleContext);
+    EXCEPTION_CHECK("##### Getting visible children count - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### visible children count = %d", numChildren);
+
+    return numChildren;
+}
+
+
+/*
+ * This method is used to iterate through the visible children of a component.  It
+ * returns visible children information for a component starting at nStartIndex.
+ * No more than MAX_VISIBLE_CHILDREN VisibleChildrenInfo objects will
+ * be returned for each call to this method. Returns FALSE on error.
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+BOOL AccessBridgeJavaEntryPoints::getVisibleChildren(const jobject accessibleContext,
+                                                     const int nStartIndex,
+                                                     /* OUT */ VisibleChildrenInfo *visibleChildrenInfo) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getVisibleChildren(%p, startIndex = %d)",
+                     accessibleContext, nStartIndex);
+
+    // get the visible children count
+    int numChildren = jniEnv->CallIntMethod(accessBridgeObject, getVisibleChildrenCountMethod,
+                                            accessibleContext);
+    EXCEPTION_CHECK("##### Getting visible children count - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### visible children count = %d", numChildren);
+
+    if (nStartIndex >= numChildren) {
+        return FALSE;
+    }
+
+    // get the visible children
+    int bufIndex = 0;
+    for (int i = nStartIndex; (i < numChildren) && (i < nStartIndex + MAX_VISIBLE_CHILDREN); i++) {
+        PrintDebugString("  getting visible child %d ...", i);
+
+        // get the visible child at index i
+        jobject ac = jniEnv->CallObjectMethod(accessBridgeObject, getVisibleChildMethod,
+                                              accessibleContext, i);
+        EXCEPTION_CHECK("##### getVisibleChildMethod - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(ac);
+        EXCEPTION_CHECK("##### getVisibleChildMethod - call to NewGlobalRef()", FALSE);
+        visibleChildrenInfo->children[bufIndex] = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### visible child = %p", globalRef);
+
+        bufIndex++;
+    }
+    visibleChildrenInfo->returnedChildrenCount = bufIndex;
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getVisibleChildren succeeded");
+    return TRUE;
+}
+
+/**
+ * Set the caret to a text position. Returns whether successful;
+ *
+ * Bug ID 4944770 - setCaretPosition method needed
+ */
+BOOL
+AccessBridgeJavaEntryPoints::setCaretPosition(const jobject accessibleContext, int position) {
+
+    jthrowable exception;
+    BOOL result = FALSE;
+
+    PrintDebugString("\r\nIn AccessBridgeJavaEntryPoints::setCaretPostion(%p position = %d):",
+                     accessibleContext, position);
+
+    if (setCaretPositionMethod != (jmethodID) 0) {
+        result = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                 setCaretPositionMethod,
+                                                 accessibleContext, position);
+        EXCEPTION_CHECK("setCaretPostion - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("\r\n    result = %d", result);
+        return result;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or setCaretPositionMethod == 0");
+        return result;
+    }
+}
+
+
+// -----------------------------------
+
+/**
+ * getVersionInfo - returns the version string of the java.version property
+ *                  and the AccessBridge.java version
+ *
+ */
+BOOL
+AccessBridgeJavaEntryPoints::getVersionInfo(AccessBridgeVersionInfo *info) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getVersionInfo():");
+
+    if (getJavaVersionPropertyMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getJavaVersionPropertyMethod);
+        EXCEPTION_CHECK("Getting JavaVersionProperty - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            length = jniEnv->GetStringLength(js);
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            if (stringBytes == NULL) {
+                if (!jniEnv->ExceptionCheck()) {
+                    PrintDebugString("\r\n *** Exception when getting JavaVersionProperty - call to GetStringChars");
+                    jniEnv->ExceptionDescribe();
+                    jniEnv->ExceptionClear();
+                }
+                return FALSE;
+            }
+            wcsncpy(info->bridgeJavaDLLVersion,
+                    stringBytes,
+                    sizeof(info->bridgeJavaDLLVersion)  / sizeof(wchar_t));
+            info->bridgeJavaDLLVersion[length < (sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t)) ?
+                            length : (sizeof(info->bridgeJavaDLLVersion) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            wcsncpy(info->VMversion,
+                    stringBytes,
+                    sizeof(info->VMversion)  / sizeof(wchar_t));
+            info->VMversion[length < (sizeof(info->VMversion) / sizeof(wchar_t)) ?
+                            length : (sizeof(info->VMversion) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            wcsncpy(info->bridgeJavaClassVersion,
+                    stringBytes,
+                    sizeof(info->bridgeJavaClassVersion)  / sizeof(wchar_t));
+            info->bridgeJavaClassVersion[length < (sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t)) ?
+                                         length : (sizeof(info->bridgeJavaClassVersion) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            wcsncpy(info->bridgeWinDLLVersion,
+                    stringBytes,
+                    sizeof(info->bridgeWinDLLVersion)  / sizeof(wchar_t));
+            info->bridgeWinDLLVersion[length < (sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t)) ?
+                                         length : (sizeof(info->bridgeWinDLLVersion) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting JavaVersionProperty - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting JavaVersionProperty - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Java version = %ls", info->VMversion);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting JavaVersionProperty - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Java version is null.");
+            info->VMversion[0] = (wchar_t) 0;
+            return FALSE;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getJavaVersionPropertyMethod == 0");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/*
+ * Verifies the Java VM still exists and obj is an
+ * instance of AccessibleText
+ */
+BOOL AccessBridgeJavaEntryPoints::verifyAccessibleText(jobject obj) {
+    JavaVM *vm;
+    BOOL retval;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::verifyAccessibleText");
+
+    if (jniEnv->GetJavaVM(&vm) != 0) {
+        PrintDebugString("  Error! No Java VM");
+        return FALSE;
+    }
+
+    if (obj == (jobject)0) {
+        PrintDebugString("  Error! Null jobject");
+        return FALSE;
+    }
+
+    // Copied from getAccessibleContextInfo
+    if (getAccessibleTextFromContextMethod != (jmethodID) 0) {
+        jobject returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                           getAccessibleTextFromContextMethod,
+                                                           (jobject)obj);
+        EXCEPTION_CHECK("Getting AccessibleText - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  AccessibleText = %p", returnedJobject);
+        retval = returnedJobject != (jobject) 0;
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("Getting AccessibleText - call to DeleteLocalRef()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextFromContextMethod == 0");
+        return FALSE;
+    }
+    if (retval == FALSE) {
+        PrintDebugString("  Error! jobject is not an AccessibleText");
+    }
+    return retval;
+}
+
+
+/********** AccessibleContext routines ***********************************/
+
+/**
+ * getAccessibleContextAt - performs the Java method call:
+ *   Accessible AccessBridge.getAccessibleContextAt(x, y)
+ *
+ * Note: this call explicitly goes through the AccessBridge,
+ * so that it can keep a reference the returned jobject for the JavaVM.
+ * You must explicity call INTreleaseJavaObject() when you are through using
+ * the Accessible returned, to let the AccessBridge know it can release the
+ * object, so that the can then garbage collect it.
+ *
+ */
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleContextAt(jint x, jint y, jobject accessibleContext) {
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleContextAt(%d, %d, %p):",
+                     x, y, accessibleContext);
+
+    if (getAccessibleContextAtMethod != (jmethodID) 0) {
+        returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                             getAccessibleContextAtMethod,
+                                                             x, y, accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleContextAt - call to CallObjectMethod()", FALSE);
+        globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleContextAt - call to NewGlobalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         returnedAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleContextAtMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+/**
+ * getAccessibleWithFocus - performs the Java method calls:
+ *   Accessible Translator.getAccessible(SwingEventMonitor.getComponentWithFocus();
+ *
+ * Note: this call explicitly goes through the AccessBridge,
+ * so that the AccessBridge can hide expected changes in how this functions
+ * between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some
+ * of this functionality may be built into the platform
+ *
+ */
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleContextWithFocus() {
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleContextWithFocus()");
+
+    if (getAccessibleContextWithFocusMethod != (jmethodID) 0) {
+        returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                             getAccessibleContextWithFocusMethod);
+        EXCEPTION_CHECK("Getting AccessibleContextWithFocus - call to CallObjectMethod()", FALSE);
+        globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleContextWithFocus - call to NewGlobalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         returnedAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("  Error! either jniEnv == 0 or getAccessibleContextWithFocusMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+/**
+ * getAccessibleContextInfo - fills a struct with a bunch of information
+ * contained in the Java Accessibility API
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ *
+ * Note: this call explicitly goes through the AccessBridge,
+ * so that it can keep a reference the returned jobject for the JavaVM.
+ * You must explicity call releaseJavaObject() when you are through using
+ * the AccessibleContext returned, to let the AccessBridge know it can release the
+ * object, so that the JavaVM can then garbage collect it.
+ */
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleContextInfo(jobject accessibleContext, AccessibleContextInfo *info) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jobject returnedJobject;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\n##### Calling AccessBridgeJavaEntryPoints::getAccessibleContextInfo(%p):", accessibleContext);
+
+    ZeroMemory(info, sizeof(AccessibleContextInfo));
+
+    if (accessibleContext == (jobject) 0) {
+        PrintDebugString(" passed in AccessibleContext == null! (oops)");
+        return (FALSE);
+    }
+
+    // Get the Accessible Name
+    if (getAccessibleNameFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleNameFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleName - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE);
+            wcsncpy(info->name, stringBytes, (sizeof(info->name) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            info->name[length < (sizeof(info->name) / sizeof(wchar_t)) ?
+                       length : (sizeof(info->name) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Name = %ls", info->name);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Name is null.");
+            info->name[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleNameFromContextMethod == 0");
+        return FALSE;
+    }
+
+
+    // Get the Accessible Description
+    if (getAccessibleDescriptionFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleDescriptionFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleDescription - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleName - call to GetStringChars()", FALSE);
+            wcsncpy(info->description, stringBytes, (sizeof(info->description) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            info->description[length < (sizeof(info->description) / sizeof(wchar_t)) ?
+                              length : (sizeof(info->description) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleName - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleName - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleName - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Description = %ls", info->description);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleName - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Description is null.");
+            info->description[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleDescriptionFromContextMethod == 0");
+        return FALSE;
+    }
+
+
+    // Get the Accessible Role String
+    if (getAccessibleRoleStringFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleRoleStringFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleRole - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleRole - call to GetStringChars()", FALSE);
+            wcsncpy(info->role, stringBytes, (sizeof(info->role) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            info->role[length < (sizeof(info->role) / sizeof(wchar_t)) ?
+                       length : (sizeof(info->role) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleRole - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleRole - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleRole - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Role = %ls", info->role);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleRole - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Role is null.");
+            info->role[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleRoleStringFromContextMethod == 0");
+        return FALSE;
+    }
+
+
+    // Get the Accessible Role String in the en_US locale
+    if (getAccessibleRoleStringFromContext_en_USMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleRoleStringFromContext_en_USMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to GetStringChars()", FALSE);
+            wcsncpy(info->role_en_US, stringBytes, (sizeof(info->role_en_US) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            info->role_en_US[length < (sizeof(info->role_en_US) / sizeof(wchar_t)) ?
+                             length : (sizeof(info->role_en_US) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Role en_US = %ls", info->role_en_US);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleRole_en_US - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Role en_US is null.");
+            info->role[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleRoleStringFromContext_en_USMethod == 0");
+        return FALSE;
+    }
+
+    // Get the Accessible States String
+    if (getAccessibleStatesStringFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleStatesStringFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleState - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleState - call to GetStringChars()", FALSE);
+            wcsncpy(info->states, stringBytes, (sizeof(info->states) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            info->states[length < (sizeof(info->states) / sizeof(wchar_t)) ?
+                         length : (sizeof(info->states) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleState - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleState - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleState - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible States = %ls", info->states);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleState - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible States is null.");
+            info->states[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleStatesStringFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the Accessible States String in the en_US locale
+    if (getAccessibleStatesStringFromContext_en_USMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleStatesStringFromContext_en_USMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleState_en_US - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleState_en_US - call to GetStringChars()", FALSE);
+            wcsncpy(info->states_en_US, stringBytes, (sizeof(info->states_en_US) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            info->states_en_US[length < (sizeof(info->states_en_US) / sizeof(wchar_t)) ?
+                               length : (sizeof(info->states_en_US) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleState_en_US - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleState_en_US - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleState_en_US - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible States en_US = %ls", info->states_en_US);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleState_en_US - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible States en_US is null.");
+            info->states[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleStatesStringFromContext_en_USMethod == 0");
+        return FALSE;
+    }
+
+
+    // Get the index in Parent
+    if (getAccessibleIndexInParentFromContextMethod != (jmethodID) 0) {
+        info->indexInParent = jniEnv->CallIntMethod(accessBridgeObject,
+                                                    getAccessibleIndexInParentFromContextMethod,
+                                                    accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleIndexInParent - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Index in Parent = %d", info->indexInParent);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleIndexInParentFromContextMethod == 0");
+        return FALSE;
+    }
+
+
+    PrintDebugString("*** jniEnv: %p; accessBridgeObject: %p; AccessibleContext: %p ***",
+                     jniEnv, accessBridgeObject, accessibleContext);
+
+    // Get the children count
+    if (getAccessibleChildrenCountFromContextMethod != (jmethodID) 0) {
+        info->childrenCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                    getAccessibleChildrenCountFromContextMethod,
+                                                    accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleChildrenCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Children count = %d", info->childrenCount);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleChildrenCountFromContextMethod == 0");
+        return FALSE;
+    }
+
+    PrintDebugString("*** jniEnv: %p; accessBridgeObject: %p; AccessibleContext: %X ***",
+                     jniEnv, accessBridgeObject, accessibleContext);
+
+
+    // Get the x coord
+    if (getAccessibleXcoordFromContextMethod != (jmethodID) 0) {
+        info->x = jniEnv->CallIntMethod(accessBridgeObject,
+                                        getAccessibleXcoordFromContextMethod,
+                                        accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleXcoord - call to CallIntMethod()", FALSE);
+        PrintDebugString("  X coord = %d", info->x);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleXcoordFromContextMethod == 0");
+        return FALSE;
+    }
+
+    PrintDebugString("*** jniEnv: %X; accessBridgeObject: %X; AccessibleContext: %p ***",
+                     jniEnv, accessBridgeObject, accessibleContext);
+
+
+    // Get the y coord
+    if (getAccessibleYcoordFromContextMethod != (jmethodID) 0) {
+        info->y = jniEnv->CallIntMethod(accessBridgeObject,
+                                        getAccessibleYcoordFromContextMethod,
+                                        accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleYcoord - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Y coord = %d", info->y);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleYcoordFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the width
+    if (getAccessibleWidthFromContextMethod != (jmethodID) 0) {
+        info->width = jniEnv->CallIntMethod(accessBridgeObject,
+                                            getAccessibleWidthFromContextMethod,
+                                            accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleWidth - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Width = %d", info->width);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleWidthFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the height
+    if (getAccessibleHeightFromContextMethod != (jmethodID) 0) {
+        info->height = jniEnv->CallIntMethod(accessBridgeObject,
+                                             getAccessibleHeightFromContextMethod,
+                                             accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleHeight - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Height = %d", info->height);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleHeightFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the AccessibleComponent
+    if (getAccessibleComponentFromContextMethod != (jmethodID) 0) {
+        returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleComponentFromContextMethod,
+                                                   accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleComponent - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  AccessibleComponent = %p", returnedJobject);
+        info->accessibleComponent = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("Getting AccessibleComponent - call to DeleteLocalRef()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleComponentFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the AccessibleAction
+    if (getAccessibleActionFromContextMethod != (jmethodID) 0) {
+        returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleActionFromContextMethod,
+                                                   accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleAction - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  AccessibleAction = %p", returnedJobject);
+        info->accessibleAction = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("Getting AccessibleAction - call to DeleteLocalRef()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleActionFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the AccessibleSelection
+    if (getAccessibleSelectionFromContextMethod != (jmethodID) 0) {
+        returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleSelectionFromContextMethod,
+                                                   accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleSelection - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  AccessibleSelection = %p", returnedJobject);
+        info->accessibleSelection = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("Getting AccessibleSelection - call to DeleteLocalRef()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleSelectionFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the AccessibleTable
+    if (getAccessibleTableFromContextMethod != (jmethodID) 0) {
+        PrintDebugString("##### Calling getAccessibleTableFromContextMethod ...");
+        returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleTableFromContextMethod,
+                                                   accessibleContext);
+        PrintDebugString("##### ... Returned from getAccessibleTableFromContextMethod");
+        EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  ##### AccessibleTable = %p", returnedJobject);
+        if (returnedJobject != (jobject) 0) {
+            info->accessibleInterfaces |= cAccessibleTableInterface;
+        }
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("##### Getting AccessibleTable - call to DeleteLocalRef()", FALSE);
+
+        /*
+          returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+          getAccessibleTableFromContextMethod,
+          AccessibleContext);
+          PrintDebugString("##### ... Returned from getAccessibleTableFromContextMethod");
+          EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
+          PrintDebugString("  ##### AccessibleTable = %X", returnedJobject);
+          info->accessibleTable = returnedJobject;
+        */
+
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the AccessibleText
+    if (getAccessibleTextFromContextMethod != (jmethodID) 0) {
+        returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleTextFromContextMethod,
+                                                   accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleText - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  AccessibleText = %p", returnedJobject);
+        info->accessibleText = (returnedJobject != (jobject) 0 ? TRUE : FALSE);
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("Getting AccessibleText - call to DeleteLocalRef()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the AccessibleValue
+    if (getAccessibleValueFromContextMethod != (jmethodID) 0) {
+        returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleValueFromContextMethod,
+                                                   accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleValue - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  AccessibleValue = %p", returnedJobject);
+        if (returnedJobject != (jobject) 0) {
+            info->accessibleInterfaces |= cAccessibleValueInterface;
+        }
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("Getting AccessibleValue - call to DeleteLocalRef()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleValueFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // FIX
+    // get the AccessibleHypertext
+    if (getAccessibleHypertextMethod != (jmethodID) 0 &&
+        getAccessibleHyperlinkCountMethod != (jmethodID) 0 &&
+        getAccessibleHyperlinkMethod != (jmethodID) 0 &&
+        getAccessibleHyperlinkTextMethod != (jmethodID) 0 &&
+        getAccessibleHyperlinkStartIndexMethod != (jmethodID) 0 &&
+        getAccessibleHyperlinkEndIndexMethod != (jmethodID) 0) {
+        returnedJobject = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleHypertextMethod,
+                                                   accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleHypertext - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  AccessibleHypertext = %p",
+                         returnedJobject);
+        if (returnedJobject != (jobject) 0) {
+            info->accessibleInterfaces |= cAccessibleHypertextInterface;
+        }
+        jniEnv->DeleteLocalRef(returnedJobject);
+        EXCEPTION_CHECK("Getting AccessibleHypertext - call to DeleteLocalRef()", FALSE);
+    }
+
+    // set new accessibleInterfaces flags from old BOOL values
+    if(info->accessibleComponent)
+        info->accessibleInterfaces |= cAccessibleComponentInterface;
+    if(info->accessibleAction)
+        info->accessibleInterfaces |= cAccessibleActionInterface;
+    if(info->accessibleSelection)
+        info->accessibleInterfaces |= cAccessibleSelectionInterface;
+    if(info->accessibleText)
+        info->accessibleInterfaces |= cAccessibleTextInterface;
+    // FIX END
+
+    return TRUE;
+}
+
+/**
+ * getAccessibleChildFromContext - performs the Java method call:
+ *   AccessibleContext AccessBridge.getAccessibleChildContext(AccessibleContext)
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ *
+ * Note: this call explicitly goes through the AccessBridge,
+ * so that it can keep a reference the returned jobject for the JavaVM.
+ * You must explicity call releaseJavaObject() when you are through using
+ * the AccessibleContext returned, to let the AccessBridge know it can release the
+ * object, so that the JavaVM can then garbage collect it.
+ */
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleChildFromContext(jobject accessibleContext, jint childIndex) {
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleChildContext(%p, %d):",
+                     accessibleContext, childIndex);
+
+    if (getAccessibleChildFromContextMethod != (jmethodID) 0) {
+        returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                             getAccessibleChildFromContextMethod,
+                                                             accessibleContext, childIndex);
+        EXCEPTION_CHECK("Getting AccessibleChild - call to CallObjectMethod()", FALSE);
+        globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleChild - call to NewGlobalRef()", FALSE);
+        jniEnv->DeleteLocalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleChild - call to DeleteLocalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         returnedAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleChildContextMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+/**
+ * getAccessibleParentFromContext - returns the AccessibleContext parent
+ *
+ */
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleParentFromContext(jobject accessibleContext)
+{
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleParentFromContext(%p):", accessibleContext);
+
+    if (getAccessibleParentFromContextMethod != (jmethodID) 0) {
+        returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                             getAccessibleParentFromContextMethod,
+                                                             accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleParent - call to CallObjectMethod()", FALSE);
+        globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleParent - call to NewGlobalRef()", FALSE);
+        jniEnv->DeleteLocalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleParent - call to DeleteLocalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         returnedAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleParentFromContextMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+
+/********** AccessibleTable routines **********************************/
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTableInfo(jobject accessibleContext,
+                                                    AccessibleTableInfo *tableInfo) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableInfo(%p):",
+                     accessibleContext);
+
+    // get the table row count
+    if (getAccessibleTableRowCountMethod != (jmethodID) 0) {
+        tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                    getAccessibleTableRowCountMethod,
+                                                    accessibleContext);
+        EXCEPTION_CHECK("##### Getting AccessibleTableRowCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table row count = %d", tableInfo->rowCount);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleRowCountMethod == 0");
+        return FALSE;
+    }
+
+    // get the table column count
+    if (getAccessibleTableColumnCountMethod != (jmethodID) 0) {
+        tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                       getAccessibleTableColumnCountMethod,
+                                                       accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTableColumnCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table column count = %d", tableInfo->columnCount);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableColumnCountMethod == 0");
+        return FALSE;
+    }
+
+    // get the AccessibleTable
+    if (getAccessibleTableFromContextMethod != (jmethodID) 0) {
+        PrintDebugString("##### Calling getAccessibleTableFromContextMethod ...");
+        jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                    getAccessibleTableFromContextMethod,
+                                                    accessibleContext);
+        PrintDebugString("##### ... Returned from getAccessibleTableFromContextMethod");
+        EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(accTable);
+        EXCEPTION_CHECK("##### Getting AccessibleTable - call to NewGlobalRef()", FALSE);
+        tableInfo->accessibleTable = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### accessibleTable = %p", globalRef);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // cache the AccessibleContext
+    if (getContextFromAccessibleTableMethod != (jmethodID) 0) {
+        PrintDebugString("##### Calling getContextFromAccessibleTable Method ...");
+        jobject ac = jniEnv->CallObjectMethod(accessBridgeObject,
+                                              getContextFromAccessibleTableMethod,
+                                              accessibleContext);
+        PrintDebugString("##### ... Returned from getContextFromAccessibleTable Method");
+        EXCEPTION_CHECK("##### Getting AccessibleTable - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(ac);
+        EXCEPTION_CHECK("##### Getting AccessibleTable - call to NewGlobalRef()", FALSE);
+        tableInfo->accessibleContext = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### accessibleContext = %p", globalRef);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getContextFromAccessibleTable Method == 0");
+        return FALSE;
+    }
+
+    // FIX - set unused elements
+    tableInfo->caption = NULL;
+    tableInfo->summary = NULL;
+
+    PrintDebugString("##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableInfo succeeded");
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo(jobject accessibleTable, jint row, jint column,
+                                                        AccessibleTableCellInfo *tableCellInfo) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo(%p): row=%d, column=%d",
+                     accessibleTable, row, column);
+
+    // FIX
+    ZeroMemory(tableCellInfo, sizeof(AccessibleTableCellInfo));
+    tableCellInfo->row = row;
+    tableCellInfo->column = column;
+    // FIX END
+
+    // get the table cell index
+    if (getAccessibleTableCellIndexMethod != (jmethodID) 0) {
+        tableCellInfo->index = jniEnv->CallIntMethod(accessBridgeObject,
+                                                     getAccessibleTableCellIndexMethod,
+                                                     accessibleTable, row, column);
+        EXCEPTION_CHECK("##### Getting AccessibleTableCellIndex - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table cell index = %d", tableCellInfo->index);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableCellIndexMethod == 0");
+        return FALSE;
+    }
+
+    // get the table cell row extent
+    if (getAccessibleTableCellRowExtentMethod != (jmethodID) 0) {
+        tableCellInfo->rowExtent = jniEnv->CallIntMethod(accessBridgeObject,
+                                                         getAccessibleTableCellRowExtentMethod,
+                                                         accessibleTable, row, column);
+        EXCEPTION_CHECK("##### Getting AccessibleTableCellRowExtentCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table cell row extent = %d", tableCellInfo->rowExtent);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableCellRowExtentMethod == 0");
+        return FALSE;
+    }
+
+    // get the table cell column extent
+    if (getAccessibleTableCellColumnExtentMethod != (jmethodID) 0) {
+        tableCellInfo->columnExtent = jniEnv->CallIntMethod(accessBridgeObject,
+                                                            getAccessibleTableCellColumnExtentMethod,
+                                                            accessibleTable, row, column);
+        EXCEPTION_CHECK("##### Getting AccessibleTableCellColumnExtentCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table cell column extent = %d", tableCellInfo->columnExtent);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableCellColumnExtentMethod == 0");
+        return FALSE;
+    }
+
+    // get whether the table cell is selected
+    if (isAccessibleTableCellSelectedMethod != (jmethodID) 0) {
+        tableCellInfo->isSelected = jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                              isAccessibleTableCellSelectedMethod,
+                                                              accessibleTable, row, column);
+        EXCEPTION_CHECK("##### Getting isAccessibleTableCellSelected - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("  ##### table cell isSelected = %d", tableCellInfo->isSelected);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or isAccessibleTableCellSelectedMethod == 0");
+        return FALSE;
+    }
+
+    // get the table cell AccessibleContext
+    if (getAccessibleTableCellAccessibleContextMethod != (jmethodID) 0) {
+        jobject tableCellAC = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                       getAccessibleTableCellAccessibleContextMethod,
+                                                       accessibleTable, row, column);
+        EXCEPTION_CHECK("##### Getting AccessibleTableCellAccessibleContext - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(tableCellAC);
+        EXCEPTION_CHECK("##### Getting AccessibleTableCellAccessibleContext - call to NewGlobalRef()", FALSE);
+        tableCellInfo->accessibleContext = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### table cell AccessibleContext = %p", globalRef);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableCellAccessibleContextMethod == 0");
+        return FALSE;
+    }
+
+    PrintDebugString("  ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableCellInfo succeeded");
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader(jobject acParent, AccessibleTableInfo *tableInfo) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader(%p):",
+                     acParent);
+
+    // get the header row count
+    if (getAccessibleTableRowHeaderRowCountMethod != (jmethodID) 0) {
+        tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                    getAccessibleTableRowHeaderRowCountMethod,
+                                                    acParent);
+        EXCEPTION_CHECK("##### Getting AccessibleTableRowHeaderRowCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table row count = %d", tableInfo->rowCount);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleRowHeaderRowCountMethod == 0");
+        return FALSE;
+    }
+
+    // get the header column count
+    if (getAccessibleTableRowHeaderColumnCountMethod != (jmethodID) 0) {
+        tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                       getAccessibleTableRowHeaderColumnCountMethod,
+                                                       acParent);
+        EXCEPTION_CHECK("Getting AccessibleTableRowHeaderColumnCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table column count = %d", tableInfo->columnCount);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableRowHeaderColumnCountMethod == 0");
+        return FALSE;
+    }
+
+    // get the header AccessibleTable
+    if (getAccessibleTableRowHeaderMethod != (jmethodID) 0) {
+        jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                    getAccessibleTableRowHeaderMethod,
+                                                    acParent);
+        EXCEPTION_CHECK("##### Getting AccessibleTableRowHeader - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(accTable);
+        EXCEPTION_CHECK("##### Getting AccessibleTableRowHeader - call to NewGlobalRef()", FALSE);
+        tableInfo->accessibleTable = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### row header AccessibleTable = %p", globalRef);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableRowHeaderMethod == 0");
+        return FALSE;
+    }
+
+    // FIX - set unused elements
+    tableInfo->caption = NULL;
+    tableInfo->summary = NULL;
+    tableInfo->accessibleContext = NULL;
+
+    PrintDebugString("  ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowHeader succeeded");
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader(jobject acParent, AccessibleTableInfo *tableInfo) {
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader(%p):",
+                     acParent);
+
+    // get the header row count
+    if (getAccessibleTableColumnHeaderRowCountMethod != (jmethodID) 0) {
+        tableInfo->rowCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                    getAccessibleTableColumnHeaderRowCountMethod,
+                                                    acParent);
+        EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeaderRowCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table row count = %d", tableInfo->rowCount);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleColumnHeaderRowCountMethod == 0");
+        return FALSE;
+    }
+
+    // get the header column count
+    if (getAccessibleTableColumnHeaderColumnCountMethod != (jmethodID) 0) {
+        tableInfo->columnCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                       getAccessibleTableColumnHeaderColumnCountMethod,
+                                                       acParent);
+        EXCEPTION_CHECK("Getting AccessibleTableColumnHeaderColumnCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table column count = %d", tableInfo->columnCount);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableColumnHeaderColumnCountMethod == 0");
+        return FALSE;
+    }
+    // get the header AccessibleTable
+    if (getAccessibleTableColumnHeaderMethod != (jmethodID) 0) {
+        jobject accTable = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                    getAccessibleTableColumnHeaderMethod,
+                                                    acParent);
+        EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeader - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(accTable);
+        EXCEPTION_CHECK("##### Getting AccessibleTableColumnHeader - call to NewGlobalRef()", FALSE);
+        tableInfo->accessibleTable = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### column header AccessibleTable = %p", globalRef);
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableColumnHeaderMethod == 0");
+        return FALSE;
+    }
+
+    // FIX - set unused elements
+    tableInfo->caption = NULL;
+    tableInfo->summary = NULL;
+    tableInfo->accessibleContext = NULL;
+
+    PrintDebugString("  ##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnHeader succeeded");
+    return TRUE;
+}
+
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleTableRowDescription(jobject acParent, jint row) {
+
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableRowDescription(%p):",
+                     acParent);
+
+    if (getAccessibleTableRowDescriptionMethod != (jmethodID) 0) {
+        returnedAccessibleContext = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                             getAccessibleTableRowDescriptionMethod,
+                                                             acParent, row);
+        EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to CallObjectMethod()", FALSE);
+        globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to NewGlobalRef()", FALSE);
+        jniEnv->DeleteLocalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTableRowDescription - call to DeleteLocalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         returnedAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTableRowDescriptionMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleTableColumnDescription(jobject acParent, jint column) {
+
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### Calling AccessBridgeJavaEntryPoints::getAccessibleTableColumnDescription(%p):",
+                     acParent);
+
+    if (getAccessibleTableColumnDescriptionMethod != (jmethodID) 0) {
+        returnedAccessibleContext = jniEnv->CallObjectMethod(
+                                                             accessBridgeObject,
+                                                             getAccessibleTableColumnDescriptionMethod,
+                                                             acParent, column);
+        EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to CallObjectMethod()", FALSE);
+        globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to NewGlobalRef()", FALSE);
+        jniEnv->DeleteLocalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTableColumnDescription - call to DeleteLocalRef()", FALSE);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         returnedAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTableColumnDescriptionMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+jint
+AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount(jobject accessibleTable) {
+
+    jthrowable exception;
+    jint count;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount(%p)",
+                     accessibleTable);
+
+    // Get the table row selection count
+    if (getAccessibleTableRowSelectionCountMethod != (jmethodID) 0) {
+        count = jniEnv->CallIntMethod(accessBridgeObject,
+                                      getAccessibleTableRowSelectionCountMethod,
+                                      accessibleTable);
+        EXCEPTION_CHECK("##### Getting AccessibleTableRowSelectionCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table row selection count = %d", count);
+        return count;
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableRowSelectionCountMethod == 0");
+        return 0;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelectionCount failed");
+    return 0;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected(jobject accessibleTable, jint row) {
+    jthrowable exception;
+    BOOL result;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected(%p, %d)",
+                     accessibleTable, row);
+
+    if (isAccessibleTableRowSelectedMethod != (jmethodID) 0) {
+        result = jniEnv->CallBooleanMethod(accessBridgeObject,
+                                           isAccessibleTableRowSelectedMethod,
+                                           accessibleTable, row);
+        EXCEPTION_CHECK("##### Getting isAccessibleTableRowSelected - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("  ##### table row isSelected = %d", result);
+        return result;
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or isAccessibleTableRowSelectedMethod == 0");
+        return FALSE;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::isAccessibleTableRowSelected failed");
+    return FALSE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections(jobject accessibleTable, jint count,
+                                                             jint *selections) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections(%p, %d %p)",
+                     accessibleTable, count, selections);
+
+    if (getAccessibleTableRowSelectionsMethod == (jmethodID) 0) {
+        return FALSE;
+    }
+    // Get the table row selections
+    for (int i = 0; i < count; i++) {
+
+        selections[i] = jniEnv->CallIntMethod(accessBridgeObject,
+                                              getAccessibleTableRowSelectionsMethod,
+                                              accessibleTable,
+                                              i);
+        EXCEPTION_CHECK("##### Getting AccessibleTableRowSelections - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table row selection[%d] = %d", i, selections[i]);
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleTableRowSelections succeeded");
+    return TRUE;
+}
+
+
+jint
+AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount(jobject accessibleTable) {
+
+    jthrowable exception;
+    jint count;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount(%p)",
+                     accessibleTable);
+
+    // Get the table column selection count
+    if (getAccessibleTableColumnSelectionCountMethod != (jmethodID) 0) {
+        count = jniEnv->CallIntMethod(accessBridgeObject,
+                                      getAccessibleTableColumnSelectionCountMethod,
+                                      accessibleTable);
+        EXCEPTION_CHECK("##### Getting AccessibleTableColumnSelectionCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table column selection count = %d", count);
+        return count;
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleRowCountMethod == 0");
+        return 0;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelectionCount failed");
+    return 0;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected(jobject accessibleTable, jint column) {
+    jthrowable exception;
+    BOOL result;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected(%p, %d)",
+                     accessibleTable, column);
+
+    if (isAccessibleTableColumnSelectedMethod != (jmethodID) 0) {
+        result = jniEnv->CallBooleanMethod(accessBridgeObject,
+                                           isAccessibleTableColumnSelectedMethod,
+                                           accessibleTable, column);
+        EXCEPTION_CHECK("##### Getting isAccessibleTableColumnSelected - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("  ##### table column isSelected = %d", result);
+        return result;
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or isAccessibleTableColumnSelectedMethod == 0");
+        return FALSE;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::isAccessibleTableColumnSelected failed");
+    return FALSE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections(jobject accessibleTable, jint count,
+                                                                jint *selections) {
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections(%p, %d, %p)",
+                     accessibleTable, count, selections);
+
+    if (getAccessibleTableColumnSelectionsMethod == (jmethodID) 0) {
+        return FALSE;
+    }
+    // Get the table column selections
+    for (int i = 0; i < count; i++) {
+
+        selections[i] = jniEnv->CallIntMethod(accessBridgeObject,
+                                              getAccessibleTableColumnSelectionsMethod,
+                                              accessibleTable,
+                                              i);
+        EXCEPTION_CHECK("##### Getting AccessibleTableColumnSelections - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table Column selection[%d] = %d", i, selections[i]);
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumnSelections succeeded");
+    return TRUE;
+}
+
+
+jint
+AccessBridgeJavaEntryPoints::getAccessibleTableRow(jobject accessibleTable, jint index) {
+    jthrowable exception;
+    jint result;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleTableRow(%p, index=%d)",
+                     accessibleTable, index);
+
+    if (getAccessibleTableRowMethod != (jmethodID) 0) {
+        result = jniEnv->CallIntMethod(accessBridgeObject,
+                                       getAccessibleTableRowMethod,
+                                       accessibleTable, index);
+        EXCEPTION_CHECK("##### Getting AccessibleTableRow - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table row = %d", result);
+        return result;
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableRowMethod == 0");
+        return -1;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleTableRow failed");
+    return -1;
+}
+
+jint
+AccessBridgeJavaEntryPoints::getAccessibleTableColumn(jobject accessibleTable, jint index) {
+    jthrowable exception;
+    jint result;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleTableColumn(%p, index=%d)",
+                     accessibleTable, index);
+
+    if (getAccessibleTableColumnMethod != (jmethodID) 0) {
+        result = jniEnv->CallIntMethod(accessBridgeObject,
+                                       getAccessibleTableColumnMethod,
+                                       accessibleTable, index);
+        EXCEPTION_CHECK("##### Getting AccessibleTableColumn - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table column = %d", result);
+        return result;
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableColumnMethod == 0");
+        return -1;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleTableColumn failed");
+    return -1;
+}
+
+jint
+AccessBridgeJavaEntryPoints::getAccessibleTableIndex(jobject accessibleTable, jint row, jint column) {
+    jthrowable exception;
+    jint result;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleTableIndex(%p, row=%d, col=%d)",
+                     accessibleTable, row, column);
+
+    if (getAccessibleTableIndexMethod != (jmethodID) 0) {
+        result = jniEnv->CallIntMethod(accessBridgeObject,
+                                       getAccessibleTableIndexMethod,
+                                       accessibleTable, row, column);
+        EXCEPTION_CHECK("##### Getting getAccessibleTableIndex - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### table index = %d", result);
+        return result;
+    } else {
+        PrintDebugString("  ##### Error! either env == 0 or getAccessibleTableIndexMethod == 0");
+        return -1;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleTableIndex failed");
+    return -1;
+}
+
+/********** end AccessibleTable routines ******************************/
+
+
+/********** begin AccessibleRelationSet routines **********************/
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleRelationSet(jobject accessibleContext,
+                                                      AccessibleRelationSetInfo *relationSet) {
+
+    jthrowable exception;
+    const wchar_t *stringBytes;
+    jsize length;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleRelationSet(%p, %p)",
+                     accessibleContext, relationSet);
+
+    if (getAccessibleRelationCountMethod == (jmethodID) 0 ||
+        getAccessibleRelationKeyMethod == (jmethodID) 0 ||
+        getAccessibleRelationTargetCountMethod == (jmethodID) 0 ||
+        getAccessibleRelationTargetMethod == (jmethodID) 0) {
+        return FALSE;
+    }
+
+    // Get the relations set count
+    relationSet->relationCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                       getAccessibleRelationCountMethod,
+                                                       accessibleContext);
+    EXCEPTION_CHECK("##### Getting AccessibleRelationCount - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### AccessibleRelation count = %d", relationSet->relationCount);
+
+
+    // Get the relation set
+    for (int i = 0; i < relationSet->relationCount && i < MAX_RELATIONS; i++) {
+
+        jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
+                                                       getAccessibleRelationKeyMethod,
+                                                       accessibleContext,
+                                                       i);
+
+        EXCEPTION_CHECK("Getting AccessibleRelationKey - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleRelation key - call to GetStringChars()", FALSE);
+            wcsncpy(relationSet->relations[i].key, stringBytes, (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            relationSet->relations[i].key [length < (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t)) ?
+                                           length : (sizeof(relationSet->relations[i].key ) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleRelation key - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleRelation key - call to ReleaseStringChars()", FALSE);
+            // jniEnv->CallVoidMethod(accessBridgeObject,
+            //                        decrementReferenceMethod, js);
+            //EXCEPTION_CHECK("Getting AccessibleRelation key - call to CallVoidMethod()", FALSE);
+            PrintDebugString("##### AccessibleRelation key = %ls", relationSet->relations[i].key );
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleRelation key - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  AccessibleRelation key is null.");
+            relationSet->relations[i].key [0] = (wchar_t) 0;
+        }
+
+        relationSet->relations[i].targetCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                                      getAccessibleRelationTargetCountMethod,
+                                                                      accessibleContext,
+                                                                      i);
+
+        for (int j = 0; j < relationSet->relations[i].targetCount && j < MAX_RELATION_TARGETS; j++) {
+            jobject target = jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleRelationTargetMethod,
+                                                      accessibleContext, i, j);
+            EXCEPTION_CHECK("Getting AccessibleRelationSet - call to CallObjectMethod()", FALSE);
+            jobject globalRef = jniEnv->NewGlobalRef(target);
+            EXCEPTION_CHECK("Getting AccessibleRelationSet - call to NewGlobalRef()", FALSE);
+            relationSet->relations[i].targets[j] = (JOBJECT64)globalRef;
+            PrintDebugString("  relation set item: %p", globalRef);
+        }
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleRelationSet succeeded");
+    return TRUE;
+}
+
+
+/********** end AccessibleRelationSet routines ************************/
+
+
+/********** begin AccessibleHypertext routines **********************/
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleHypertext(jobject accessibleContext,
+                                                    AccessibleHypertextInfo *hypertext) {
+
+    jthrowable exception;
+    const wchar_t *stringBytes;
+    jsize length;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleHypertext(%p, %p)",
+                     accessibleContext, hypertext);
+
+    // get the AccessibleHypertext
+    jobject ht = jniEnv->CallObjectMethod(accessBridgeObject,
+                                          getAccessibleHypertextMethod,
+                                          accessibleContext);
+    EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to CallObjectMethod()", FALSE);
+    jobject globalRef = jniEnv->NewGlobalRef(ht);
+    EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to NewGlobalRef()", FALSE);
+    hypertext->accessibleHypertext = (JOBJECT64)globalRef;
+    PrintDebugString("  ##### AccessibleHypertext = %p", globalRef);
+
+    if (hypertext->accessibleHypertext == 0) {
+        PrintDebugString("  ##### null AccessibleHypertext; returning FALSE");
+        return false;
+    }
+
+    // get the hyperlink count
+    hypertext->linkCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                 getAccessibleHyperlinkCountMethod,accessibleContext);
+
+    EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### hyperlink count = %d", hypertext->linkCount);
+
+
+    // get the hypertext links
+    for (int i = 0; i < hypertext->linkCount && i < MAX_HYPERLINKS; i++) {
+
+        // get the hyperlink
+        jobject hl = jniEnv->CallObjectMethod(accessBridgeObject,
+                                              getAccessibleHyperlinkMethod,
+                                              accessibleContext,
+                                              i);
+        EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(hl);
+        EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE);
+        hypertext->links[i].accessibleHyperlink = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### AccessibleHyperlink = %p", globalRef);
+
+        // get the hyperlink text
+        jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
+                                                       getAccessibleHyperlinkTextMethod,
+                                                       hypertext->links[i].accessibleHyperlink,
+                                                       i);
+
+        EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE);
+            wcsncpy(hypertext->links[i].text, stringBytes, (sizeof(hypertext->links[i].text) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            if (length >= (sizeof(hypertext->links[i].text) / sizeof(wchar_t))) {
+                length = (sizeof(hypertext->links[i].text) / sizeof(wchar_t)) - 2;
+            }
+            hypertext->links[i].text[length] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE);
+            // jniEnv->CallVoidMethod(accessBridgeObject,
+            //                                     decrementReferenceMethod, js);
+            //EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE);
+            PrintDebugString("##### AccessibleHyperlink text = %ls", hypertext->links[i].text );
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  AccessibleHyperlink text is null.");
+            hypertext->links[i].text[0] = (wchar_t) 0;
+        }
+
+        hypertext->links[i].startIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                                               getAccessibleHyperlinkStartIndexMethod,
+                                                               hypertext->links[i].accessibleHyperlink,
+                                                               i);
+        EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### hyperlink start index = %d", hypertext->links[i].startIndex);
+
+
+        hypertext->links[i].endIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                                             getAccessibleHyperlinkEndIndexMethod,
+                                                             hypertext->links[i].accessibleHyperlink,
+                                                             i);
+        EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### hyperlink end index = %d", hypertext->links[i].endIndex);
+
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleHypertext succeeded");
+    return TRUE;
+}
+
+/*
+ * Activates an AccessibleHyperlink
+ */
+BOOL
+AccessBridgeJavaEntryPoints::activateAccessibleHyperlink(jobject accessibleContext,
+                                                         jobject accessibleHyperlink) {
+
+    jthrowable exception;
+    BOOL returnVal;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::activateAccessibleHyperlink(%p, %p):",
+                     accessibleContext, accessibleHyperlink);
+
+    if (activateAccessibleHyperlinkMethod != (jmethodID) 0) {
+        returnVal = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject, activateAccessibleHyperlinkMethod,
+                                                     accessibleContext, accessibleHyperlink);
+        EXCEPTION_CHECK("activateAccessibleHyperlink - call to CallBooleanMethod()", FALSE);
+        return returnVal;
+    } else {
+        PrintDebugString("\r\n  Error! either jniEnv == 0 or activateAccessibleHyperlinkMethod == 0");
+        return FALSE;
+    }
+}
+
+
+/*
+ * This method is used to iterate through the hyperlinks in a component.  It
+ * returns hypertext information for a component starting at hyperlink index
+ * nStartIndex.  No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
+ * be returned for each call to this method.
+ * returns FALSE on error.
+ */
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleHypertextExt(const jobject accessibleContext,
+                                                       const jint nStartIndex,
+                                                       /* OUT */ AccessibleHypertextInfo *hypertext) {
+
+    jthrowable exception;
+    const wchar_t *stringBytes;
+    jsize length;
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleHypertextExt(%p, %p, startIndex = %d)",
+                     accessibleContext, hypertext, nStartIndex);
+
+    // get the AccessibleHypertext
+    jobject ht = jniEnv->CallObjectMethod(accessBridgeObject, getAccessibleHypertextMethod,
+                                                              accessibleContext);
+    EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to CallObjectMethod()", FALSE);
+    jobject globalRef = jniEnv->NewGlobalRef(ht);
+    EXCEPTION_CHECK("##### Getting AccessibleHypertext - call to NewGlobalRef()", FALSE);
+    hypertext->accessibleHypertext = (JOBJECT64)globalRef;
+    PrintDebugString("  ##### AccessibleHypertext = %p", globalRef);
+    if (hypertext->accessibleHypertext == 0) {
+        PrintDebugString("  ##### null AccessibleHypertext; returning FALSE");
+        return FALSE;
+    }
+
+    // get the hyperlink count
+    hypertext->linkCount = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHyperlinkCountMethod,
+                                                 accessibleContext);
+    EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### hyperlink count = %d", hypertext->linkCount);
+
+    if (nStartIndex >= hypertext->linkCount) {
+        return FALSE;
+    }
+
+    // get the hypertext links
+    // NOTE: To avoid a crash when there are more than MAX_HYPERLINKS (64) links
+    // in the document, test for i < MAX_HYPERLINKS in addition to
+    // i < hypertext->linkCount
+    int bufIndex = 0;
+    for (int i = nStartIndex; (i < hypertext->linkCount) && (i < nStartIndex + MAX_HYPERLINKS); i++) {
+        PrintDebugString("  getting hyperlink %d ...", i);
+
+        // get the hyperlink
+        jobject hl = jniEnv->CallObjectMethod(accessBridgeObject,
+                                              getAccessibleHyperlinkMethod,
+                                              hypertext->accessibleHypertext,
+                                              i);
+        EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE);
+        jobject globalRef = jniEnv->NewGlobalRef(hl);
+        EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE);
+        hypertext->links[bufIndex].accessibleHyperlink = (JOBJECT64)globalRef;
+        PrintDebugString("  ##### AccessibleHyperlink = %p", globalRef);
+
+        // get the hyperlink text
+        jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
+                                                       getAccessibleHyperlinkTextMethod,
+                                                       hypertext->links[bufIndex].accessibleHyperlink,
+                                                       i);
+
+        EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE);
+            wcsncpy(hypertext->links[bufIndex].text, stringBytes,
+                    (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            if (length >= (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t))) {
+                length = (sizeof(hypertext->links[bufIndex].text) / sizeof(wchar_t)) - 2;
+            }
+            hypertext->links[bufIndex].text[length] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE);
+            // jniEnv->CallVoidMethod(accessBridgeObject,
+            //                        decrementReferenceMethod, js);
+            //EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE);
+            PrintDebugString("##### AccessibleHyperlink text = %ls", hypertext->links[bufIndex].text );
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE);
+
+        } else {
+            PrintDebugString("  AccessibleHyperlink text is null.");
+            hypertext->links[bufIndex].text[0] = (wchar_t) 0;
+        }
+
+        hypertext->links[bufIndex].startIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                                                      getAccessibleHyperlinkStartIndexMethod,
+                                                                      hypertext->links[bufIndex].accessibleHyperlink,
+                                                                      i);
+        EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### hyperlink start index = %d", hypertext->links[bufIndex].startIndex);
+
+        hypertext->links[bufIndex].endIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                                                    getAccessibleHyperlinkEndIndexMethod,
+                                                                    hypertext->links[bufIndex].accessibleHyperlink,
+                                                                    i);
+        EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### hyperlink end index = %d", hypertext->links[bufIndex].endIndex);
+
+        bufIndex++;
+    }
+
+    PrintDebugString("  ##### AccessBridgeJavaEntryPoints::getAccessibleHypertextExt succeeded");
+    return TRUE;
+}
+
+jint AccessBridgeJavaEntryPoints::getAccessibleHyperlinkCount(const jobject accessibleContext) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleHyperlinkCount(%X)",
+                     accessibleContext);
+
+    if (getAccessibleHyperlinkCountMethod == (jmethodID)0) {
+        return -1;
+    }
+
+    // get the hyperlink count
+    jint linkCount = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHyperlinkCountMethod,
+                                           accessibleContext);
+    EXCEPTION_CHECK("##### Getting hyperlink count - call to CallIntMethod()", -1);
+    PrintDebugString("  ##### hyperlink count = %d", linkCount);
+
+    return linkCount;
+}
+
+
+jint AccessBridgeJavaEntryPoints::getAccessibleHypertextLinkIndex(const jobject hypertext,
+                                                                  const jint nIndex) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleHypertextLinkIndex(%p, index = %d)",
+                     hypertext, nIndex);
+
+    if (getAccessibleHypertextLinkIndexMethod == (jmethodID)0) {
+        return -1;
+    }
+
+    // get the hyperlink index
+    jint index = jniEnv->CallIntMethod(accessBridgeObject, getAccessibleHypertextLinkIndexMethod,
+                                       hypertext, nIndex);
+
+    EXCEPTION_CHECK("##### Getting hyperlink index - call to CallIntMethod()", -1);
+    PrintDebugString("  ##### hyperlink index = %d", index);
+
+    return index;
+}
+
+BOOL AccessBridgeJavaEntryPoints::getAccessibleHyperlink(jobject hypertext,
+                                                         const jint index,
+                                                         /* OUT */ AccessibleHyperlinkInfo *info) {
+
+    jthrowable exception;
+    const wchar_t *stringBytes;
+    jsize length;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleHyperlink(%p, index = %d)",
+                     hypertext, index);
+
+
+    // get the hyperlink
+    jobject hl = jniEnv->CallObjectMethod(accessBridgeObject,
+                                          getAccessibleHyperlinkMethod,
+                                          hypertext,
+                                          index);
+    EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to CallObjectMethod()", FALSE);
+    jobject globalRef = jniEnv->NewGlobalRef(hl);
+    EXCEPTION_CHECK("##### Getting AccessibleHyperlink - call to NewGlobalRef()", FALSE);
+    info->accessibleHyperlink = (JOBJECT64)globalRef;
+    PrintDebugString("  ##### AccessibleHyperlink = %p", globalRef);
+
+    // get the hyperlink text
+    jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
+                                                   getAccessibleHyperlinkTextMethod,
+                                                   info->accessibleHyperlink,
+                                                   index);
+
+    EXCEPTION_CHECK("Getting hyperlink text - call to CallObjectMethod()", FALSE);
+    if (js != (jstring) 0) {
+        stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+        EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringChars()", FALSE);
+        wcsncpy(info->text, stringBytes,
+                (sizeof(info->text) / sizeof(wchar_t)));
+        length = jniEnv->GetStringLength(js);
+        if (length >= (sizeof(info->text) / sizeof(wchar_t))) {
+            length = (sizeof(info->text) / sizeof(wchar_t)) - 2;
+        }
+        info->text[length] = (wchar_t) 0;
+        EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to GetStringLength()", FALSE);
+        jniEnv->ReleaseStringChars(js, stringBytes);
+        EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to ReleaseStringChars()", FALSE);
+        // jniEnv->CallVoidMethod(accessBridgeObject,
+        //                        decrementReferenceMethod, js);
+        //EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to CallVoidMethod()", FALSE);
+        PrintDebugString("##### AccessibleHyperlink text = %ls", info->text );
+        jniEnv->DeleteLocalRef(js);
+        EXCEPTION_CHECK("Getting AccessibleHyperlink text - call to DeleteLocalRef()", FALSE);
+
+    } else {
+        PrintDebugString("  AccessibleHyperlink text is null.");
+        info->text[0] = (wchar_t) 0;
+    }
+
+    info->startIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                             getAccessibleHyperlinkStartIndexMethod,
+                                             info->accessibleHyperlink,
+                                             index);
+    EXCEPTION_CHECK("##### Getting hyperlink start index - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### hyperlink start index = %d", info->startIndex);
+
+    info->endIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                           getAccessibleHyperlinkEndIndexMethod,
+                                           info->accessibleHyperlink,
+                                           index);
+    EXCEPTION_CHECK("##### Getting hyperlink end index - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### hyperlink end index = %d", info->endIndex);
+
+    return TRUE;
+}
+
+
+/********** end AccessibleHypertext routines ************************/
+
+// Accessible Keybinding methods
+BOOL AccessBridgeJavaEntryPoints::getAccessibleKeyBindings(jobject accessibleContext,
+                                                           AccessibleKeyBindings *keyBindings) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleKeyBindings(%p, %p)",
+                     accessibleContext, keyBindings);
+
+    if (getAccessibleKeyBindingsCountMethod == (jmethodID) 0 ||
+        getAccessibleKeyBindingCharMethod == (jmethodID) 0 ||
+        getAccessibleKeyBindingModifiersMethod == (jmethodID) 0) {
+        return FALSE;
+    }
+
+    // get the key binding count
+    keyBindings->keyBindingsCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                          getAccessibleKeyBindingsCountMethod, accessibleContext);
+
+    EXCEPTION_CHECK("##### Getting key bindings count - call to CallIntMethod()", FALSE);
+
+    PrintDebugString("  ##### key bindings count = %d", keyBindings->keyBindingsCount);
+
+    // get the key bindings
+    for (int i = 0; i < keyBindings->keyBindingsCount && i < MAX_KEY_BINDINGS; i++) {
+
+        // get the key binding character
+        keyBindings->keyBindingInfo[i].character = jniEnv->CallCharMethod(accessBridgeObject,
+                                                                          getAccessibleKeyBindingCharMethod,
+                                                                          accessibleContext,
+                                                                          i);
+        EXCEPTION_CHECK("##### Getting key binding character - call to CallCharMethod()", FALSE);
+        PrintDebugString("  ##### key binding character = %c", keyBindings->keyBindingInfo[i].character);
+        PrintDebugString("  ##### key binding character in hex = %hx", keyBindings->keyBindingInfo[i].character);
+
+        // get the key binding modifiers
+        keyBindings->keyBindingInfo[i].modifiers = jniEnv->CallIntMethod(accessBridgeObject,
+                                                                         getAccessibleKeyBindingModifiersMethod,
+                                                                         accessibleContext,
+                                                                         i);
+        EXCEPTION_CHECK("##### Getting key binding modifiers - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### key binding modifiers = %x", keyBindings->keyBindingInfo[i].modifiers);
+    }
+    return FALSE;
+}
+
+// AccessibleIcon methods
+BOOL AccessBridgeJavaEntryPoints::getAccessibleIcons(jobject accessibleContext,
+                                                     AccessibleIcons *icons) {
+
+    jthrowable exception;
+    const wchar_t *stringBytes;
+    jsize length;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleIcons(%p, %p)",
+                     accessibleContext, icons);
+
+    if (getAccessibleIconsCountMethod == (jmethodID) 0 ||
+        getAccessibleIconDescriptionMethod == (jmethodID) 0 ||
+        getAccessibleIconHeightMethod == (jmethodID) 0 ||
+        getAccessibleIconWidthMethod == (jmethodID) 0) {
+        PrintDebugString("  ##### missing method(s) !!!");
+        return FALSE;
+    }
+
+
+    // get the icons count
+    icons->iconsCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                              getAccessibleIconsCountMethod, accessibleContext);
+
+    EXCEPTION_CHECK("##### Getting icons count - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### icons count = %d", icons->iconsCount);
+
+
+    // get the icons
+    for (int i = 0; i < icons->iconsCount && i < MAX_ICON_INFO; i++) {
+
+        // get the icon description
+        jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
+                                                       getAccessibleIconDescriptionMethod,
+                                                       accessibleContext,
+                                                       i);
+
+        EXCEPTION_CHECK("Getting icon description - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleIcon description - call to GetStringChars()", FALSE);
+            wcsncpy(icons->iconInfo[i].description, stringBytes, (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            if (length >= (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t))) {
+                length = (sizeof(icons->iconInfo[i].description) / sizeof(wchar_t)) - 2;
+            }
+            icons->iconInfo[i].description[length] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleIcon description - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleIcon description - call to ReleaseStringChars()", FALSE);
+            // jniEnv->CallVoidMethod(accessBridgeObject,
+            //                        decrementReferenceMethod, js);
+            //EXCEPTION_CHECK("Getting AccessibleIcon description - call to CallVoidMethod()", FALSE);
+            PrintDebugString("##### AccessibleIcon description = %ls", icons->iconInfo[i].description );
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleIcon description - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  AccessibleIcon description is null.");
+            icons->iconInfo[i].description[0] = (wchar_t) 0;
+        }
+
+
+        // get the icon height
+        icons->iconInfo[i].height = jniEnv->CallIntMethod(accessBridgeObject,
+                                                          getAccessibleIconHeightMethod,
+                                                          accessibleContext,
+                                                          i);
+        EXCEPTION_CHECK("##### Getting icon height - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### icon height = %d", icons->iconInfo[i].height);
+
+        // get the icon width
+        icons->iconInfo[i].width = jniEnv->CallIntMethod(accessBridgeObject,
+                                                         getAccessibleIconWidthMethod,
+                                                         accessibleContext,
+                                                         i);
+        EXCEPTION_CHECK("##### Getting icon width - call to CallIntMethod()", FALSE);
+        PrintDebugString("  ##### icon width = %d", icons->iconInfo[i].width);
+    }
+    return FALSE;
+}
+
+// AccessibleActionMethods
+BOOL AccessBridgeJavaEntryPoints::getAccessibleActions(jobject accessibleContext,
+                                                       AccessibleActions *actions) {
+
+    jthrowable exception;
+    const wchar_t *stringBytes;
+    jsize length;
+
+    PrintDebugString("\r\n##### AccessBridgeJavaEntryPoints::getAccessibleIcons(%p, %p)",
+                     accessibleContext, actions);
+
+    if (getAccessibleActionsCountMethod == (jmethodID) 0 ||
+        getAccessibleActionNameMethod == (jmethodID) 0) {
+        PrintDebugString("  ##### missing method(s) !!!");
+        return FALSE;
+    }
+
+
+    // get the icons count
+    actions->actionsCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                  getAccessibleActionsCountMethod,accessibleContext);
+
+    EXCEPTION_CHECK("##### Getting actions count - call to CallIntMethod()", FALSE);
+    PrintDebugString("  ##### key actions count = %d", actions->actionsCount);
+
+
+    // get the actions
+    for (int i = 0; i < actions->actionsCount && i < MAX_ACTION_INFO; i++) {
+
+        // get the action name
+        jstring js = (jstring)jniEnv->CallObjectMethod(accessBridgeObject,
+                                                       getAccessibleActionNameMethod,
+                                                       accessibleContext,
+                                                       i);
+
+        EXCEPTION_CHECK("Getting Action Name  - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleAction Name  - call to GetStringChars()", FALSE);
+            wcsncpy(actions->actionInfo[i].name , stringBytes, (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            if (length >= (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t))) {
+                length = (sizeof(actions->actionInfo[i].name ) / sizeof(wchar_t)) - 2;
+            }
+            actions->actionInfo[i].name [length] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleAction name  - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleAction name  - call to ReleaseStringChars()", FALSE);
+            // jniEnv->CallVoidMethod(accessBridgeObject,
+            //                        decrementReferenceMethod, js);
+            //EXCEPTION_CHECK("Getting AccessibleAction name  - call to CallVoidMethod()", FALSE);
+            PrintDebugString("##### AccessibleAction name  = %ls", actions->actionInfo[i].name  );
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleAction name  - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  AccessibleAction name  is null.");
+            actions->actionInfo[i].name [0] = (wchar_t) 0;
+        }
+    }
+    return FALSE;
+}
+
+BOOL AccessBridgeJavaEntryPoints::doAccessibleActions(jobject accessibleContext,
+                                                      AccessibleActionsToDo *actionsToDo,
+                                                      jint *failure) {
+
+    jthrowable exception;
+    BOOL returnVal;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::doAccessibleActions(%p, #actions %d %s):",
+                     accessibleContext,
+                     actionsToDo->actionsCount,
+                     actionsToDo->actions[0].name);
+
+    if (doAccessibleActionsMethod == (jmethodID) 0) {
+        *failure = 0;
+        return FALSE;
+    }
+
+    PrintDebugString("\r\n    doing %d actions ...", actionsToDo->actionsCount);
+    for (int i = 0; i < actionsToDo->actionsCount && i < MAX_ACTIONS_TO_DO; i++) {
+        PrintDebugString("\r    doing action %d: %s ...", i, actionsToDo->actions[i].name);
+
+        // create a Java String for the action name
+        wchar_t *actionName = (wchar_t *)actionsToDo->actions[i].name;
+        jstring javaName = jniEnv->NewString(actionName, (jsize)wcslen(actionName));
+        if (javaName == 0) {
+            PrintDebugString("\r    NewString failed");
+            *failure = i;
+            return FALSE;
+        }
+
+        returnVal = (BOOL)jniEnv->CallBooleanMethod(accessBridgeObject, doAccessibleActionsMethod,
+                                                    accessibleContext, javaName);
+        jniEnv->DeleteLocalRef(javaName);
+        EXCEPTION_CHECK("doAccessibleActions - call to CallBooleanMethod()", FALSE);
+
+        if (returnVal != TRUE) {
+            PrintDebugString("\r    Action %d failed", i);
+            *failure = i;
+            return FALSE;
+        }
+    }
+    *failure = -1;
+    return TRUE;
+}
+
+
+/********** AccessibleText routines ***********************************/
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTextInfo(jobject accessibleContext,
+                                                   AccessibleTextInfo *textInfo,
+                                                   jint x, jint y) {
+    jthrowable exception;
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleTextInfo(%p, %d, %d):",
+                     accessibleContext, x, y);
+
+    // Get the character count
+    if (getAccessibleCharCountFromContextMethod != (jmethodID) 0) {
+        textInfo->charCount = jniEnv->CallIntMethod(accessBridgeObject,
+                                                    getAccessibleCharCountFromContextMethod,
+                                                    accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleCharCount - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Char count = %d", textInfo->charCount);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleCharCountFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the index of the caret
+    if (getAccessibleCaretPositionFromContextMethod != (jmethodID) 0) {
+        textInfo->caretIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                                     getAccessibleCaretPositionFromContextMethod,
+                                                     accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleCaretPosition - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Index at caret = %d", textInfo->caretIndex);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleCaretPositionFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the index at the given point
+    if (getAccessibleIndexAtPointFromContextMethod != (jmethodID) 0) {
+        textInfo->indexAtPoint = jniEnv->CallIntMethod(accessBridgeObject,
+                                                       getAccessibleIndexAtPointFromContextMethod,
+                                                       accessibleContext, x, y);
+        EXCEPTION_CHECK("Getting AccessibleIndexAtPoint - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Index at point = %d", textInfo->indexAtPoint);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleIndexAtPointFromContextMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTextItems(jobject accessibleContext,
+                                                    AccessibleTextItemsInfo *textItems, jint index) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleTextItems(%p):", accessibleContext);
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    // Get the letter at index
+    if (getAccessibleLetterAtIndexFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleLetterAtIndexFromContextMethod,
+                                                accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to CallIntMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to GetStringChars()", FALSE);
+            textItems->letter = stringBytes[0];
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to CallVoidMethod()", FALSE);
+            PrintDebugString("  Accessible Text letter = %c", textItems->letter);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleLetterAtIndex - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Text letter is null.");
+            textItems->letter = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleLetterAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+
+    // Get the word at index
+    if (getAccessibleWordAtIndexFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleWordAtIndexFromContextMethod,
+                                                accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to CallIntMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to GetStringChars()", FALSE);
+            wcsncpy(textItems->word, stringBytes, (sizeof(textItems->word) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            textItems->word[length < (sizeof(textItems->word) / sizeof(wchar_t)) ?
+                            length : (sizeof(textItems->word) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Text word = %ls", textItems->word);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleWordAtIndex - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Text word is null.");
+            textItems->word[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleWordAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the sentence at index
+    if (getAccessibleSentenceAtIndexFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleSentenceAtIndexFromContextMethod,
+                                                accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to GetStringChars()", FALSE);
+            wcsncpy(textItems->sentence, stringBytes, (sizeof(textItems->sentence) / sizeof(wchar_t))-2);
+            length = jniEnv->GetStringLength(js);
+
+            if (length < sizeof(textItems->sentence) / sizeof(wchar_t)) {
+                textItems->sentence[length] = (wchar_t) 0;
+            } else {
+                textItems->sentence[(sizeof(textItems->sentence) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            }
+            EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Text sentence = %ls", textItems->sentence);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleSentenceAtIndex - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Text sentence is null.");
+            textItems->sentence[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleSentenceAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTextSelectionInfo(jobject accessibleContext,
+                                                            AccessibleTextSelectionInfo *selectionInfo) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleTextSelectionInfo(%p):",
+                     accessibleContext);
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    // Get the selection start index
+    if (getAccessibleTextSelectionStartFromContextMethod != (jmethodID) 0) {
+        selectionInfo->selectionStartIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                                                   getAccessibleTextSelectionStartFromContextMethod,
+                                                                   accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTextSelectionStart - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Selection start = %d", selectionInfo->selectionStartIndex);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextSelectionStartFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the selection end index
+    if (getAccessibleTextSelectionEndFromContextMethod != (jmethodID) 0) {
+        selectionInfo->selectionEndIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                                                 getAccessibleTextSelectionEndFromContextMethod,
+                                                                 accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTextSelectionEnd - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Selection end = %d", selectionInfo->selectionEndIndex);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextSelectionEndFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the selected text
+    if (getAccessibleTextSelectedTextFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleTextSelectedTextFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to GetStringChars()", FALSE);
+            wcsncpy(selectionInfo->selectedText, stringBytes, (sizeof(selectionInfo->selectedText) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            selectionInfo->selectedText[length < (sizeof(selectionInfo->selectedText) / sizeof(wchar_t)) ?
+                                        length : (sizeof(selectionInfo->selectedText) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to CallVoidMethod()", FALSE);
+            PrintDebugString("  Accessible's selected text = %s", selectionInfo->selectedText);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleTextSelectedText - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible's selected text is null.");
+            selectionInfo->selectedText[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextSelectedTextFromContextMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTextAttributes(jobject accessibleContext, jint index, AccessibleTextAttributesInfo *attributes) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jobject AttributeSet;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleTextAttributes(%p):", accessibleContext);
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    if (accessibleContext == (jobject) 0) {
+        PrintDebugString(" passed in AccessibleContext == null! (oops)");
+
+        attributes->bold = FALSE;
+        attributes->italic = FALSE;
+        attributes->underline = FALSE;
+        attributes->strikethrough = FALSE;
+        attributes->superscript = FALSE;
+        attributes->subscript = FALSE;
+        attributes->backgroundColor[0] = (wchar_t) 0;
+        attributes->foregroundColor[0] = (wchar_t) 0;
+        attributes->fontFamily[0] = (wchar_t) 0;
+        attributes->fontSize = -1;
+        attributes->alignment = -1;
+        attributes->bidiLevel = -1;
+        attributes->firstLineIndent = -1;
+        attributes->leftIndent = -1;
+        attributes->rightIndent = -1;
+        attributes->lineSpacing = -1;
+        attributes->spaceAbove = -1;
+        attributes->spaceBelow = -1;
+        attributes->fullAttributesString[0] = (wchar_t) 0;
+
+        return (FALSE);
+    }
+
+    // Get the AttributeSet
+    if (getAccessibleAttributeSetAtIndexFromContextMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting AttributeSet at index...");
+        AttributeSet = jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleAttributeSetAtIndexFromContextMethod,
+                                                accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleAttributeSetAtIndex - call to CallObjectMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleAttributeSetAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // It is legal for the AttributeSet object to be null, in which case we return false!
+    if (AttributeSet == (jobject) 0) {
+        PrintDebugString(" AttributeSet returned at index is null (this is legal! - see AWT in J2SE 1.3");
+
+        attributes->bold = FALSE;
+        attributes->italic = FALSE;
+        attributes->underline = FALSE;
+        attributes->strikethrough = FALSE;
+        attributes->superscript = FALSE;
+        attributes->subscript = FALSE;
+        attributes->backgroundColor[0] = (wchar_t) 0;
+        attributes->foregroundColor[0] = (wchar_t) 0;
+        attributes->fontFamily[0] = (wchar_t) 0;
+        attributes->fontSize = -1;
+        attributes->alignment = -1;
+        attributes->bidiLevel = -1;
+        attributes->firstLineIndent = -1;
+        attributes->leftIndent = -1;
+        attributes->rightIndent = -1;
+        attributes->lineSpacing = -1;
+        attributes->spaceAbove = -1;
+        attributes->spaceBelow = -1;
+        attributes->fullAttributesString[0] = (wchar_t) 0;
+
+        return (FALSE);
+    }
+
+    // Get the bold setting
+    if (getBoldFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting bold from AttributeSet...");
+        attributes->bold = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                            getBoldFromAttributeSetMethod,
+                                                            AttributeSet);
+        EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to CallBooleanMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getBoldFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting BoldFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the italic setting
+    if (getItalicFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting italic from AttributeSet...");
+        attributes->italic = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                              getItalicFromAttributeSetMethod,
+                                                              AttributeSet);
+        EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to CallBooleanMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getItalicdFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting ItalicFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the underline setting
+    if (getUnderlineFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting underline from AttributeSet...");
+        attributes->underline = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                                 getUnderlineFromAttributeSetMethod,
+                                                                 AttributeSet);
+        EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to CallBooleanMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getUnderlineFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting UnderlineFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the strikethrough setting
+    if (getStrikethroughFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting strikethrough from AttributeSet...");
+        attributes->strikethrough = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                                     getStrikethroughFromAttributeSetMethod,
+                                                                     AttributeSet);
+        EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to CallBooleanMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getStrikethroughFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting StrikethroughFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the superscript setting
+    if (getSuperscriptFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting superscript from AttributeSet...");
+        attributes->superscript = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                                   getSuperscriptFromAttributeSetMethod,
+                                                                   AttributeSet);
+        EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to CallBooleanMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getSuperscripteFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting SuperscriptFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the subscript setting
+    if (getSubscriptFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting subscript from AttributeSet...");
+        attributes->subscript = (BOOL) jniEnv->CallBooleanMethod(accessBridgeObject,
+                                                                 getSubscriptFromAttributeSetMethod,
+                                                                 AttributeSet);
+        EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to CallBooleanMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getSubscriptFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting SubscriptFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the backgroundColor setting
+    if (getBackgroundColorFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting backgroundColor from AttributeSet...");
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getBackgroundColorFromAttributeSetMethod,
+                                                AttributeSet);
+        EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to GetStringChars()", FALSE);
+            wcsncpy(attributes->backgroundColor, stringBytes, (sizeof(attributes->backgroundColor) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            attributes->backgroundColor[length < (sizeof(attributes->backgroundColor) / sizeof(wchar_t)) ?
+                                        length : (sizeof(attributes->backgroundColor) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  AttributeSet's background color = %ls", attributes->backgroundColor);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  AttributeSet's background color is null.");
+            attributes->backgroundColor[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getBackgroundColorFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting BackgroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the foregroundColor setting
+    if (getForegroundColorFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting foregroundColor from AttributeSet...");
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getForegroundColorFromAttributeSetMethod,
+                                                AttributeSet);
+        EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to GetStringChars()", FALSE);
+            wcsncpy(attributes->foregroundColor, stringBytes, (sizeof(attributes->foregroundColor) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            attributes->foregroundColor[length < (sizeof(attributes->foregroundColor) / sizeof(wchar_t)) ?
+                                        length : (sizeof(attributes->foregroundColor) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  AttributeSet's foreground color = %ls", attributes->foregroundColor);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  AttributeSet's foreground color is null.");
+            attributes->foregroundColor[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getForegroundColorFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting ForegroundColorFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the fontFamily setting
+    if (getFontFamilyFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting fontFamily from AttributeSet...");
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getFontFamilyFromAttributeSetMethod,
+                                                AttributeSet);
+        EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallObjectMethod()", FALSE);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to GetStringChars()", FALSE);
+            wcsncpy(attributes->fontFamily, stringBytes, (sizeof(attributes->fontFamily) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            attributes->fontFamily[length < (sizeof(attributes->fontFamily) / sizeof(wchar_t)) ?
+                                   length : (sizeof(attributes->fontFamily) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  AttributeSet's fontFamily = %ls", attributes->fontFamily);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  AttributeSet's fontFamily is null.");
+            attributes->backgroundColor[0] = (wchar_t) 0;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getFontFamilyFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting FontFamilyFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the font size
+    if (getFontSizeFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting font size from AttributeSet...");
+        attributes->fontSize = jniEnv->CallIntMethod(accessBridgeObject,
+                                                     getFontSizeFromAttributeSetMethod,
+                                                     AttributeSet);
+        EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to CallIntMethod()", FALSE);
+        PrintDebugString("  AttributeSet's font size = %d", attributes->fontSize);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAlignmentFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting FontSizeFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+
+    // Get the alignment setting
+    if (getAlignmentFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting alignment from AttributeSet...");
+        attributes->alignment = jniEnv->CallIntMethod(accessBridgeObject,
+                                                      getAlignmentFromAttributeSetMethod,
+                                                      AttributeSet);
+        EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAlignmentFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting AlignmentFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the bidiLevel setting
+    if (getBidiLevelFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting bidiLevel from AttributeSet...");
+        attributes->bidiLevel = jniEnv->CallIntMethod(accessBridgeObject,
+                                                      getBidiLevelFromAttributeSetMethod,
+                                                      AttributeSet);
+        EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getBidiLevelFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting BidiLevelFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the firstLineIndent setting
+    if (getFirstLineIndentFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting firstLineIndent from AttributeSet...");
+        attributes->firstLineIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
+                                                                       getFirstLineIndentFromAttributeSetMethod,
+                                                                       AttributeSet);
+        EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getFirstLineIndentFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting FirstLineIndentFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the leftIndent setting
+    if (getLeftIndentFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting leftIndent from AttributeSet...");
+        attributes->leftIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
+                                                                  getLeftIndentFromAttributeSetMethod,
+                                                                  AttributeSet);
+        EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getLeftIndentFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting LeftIndentFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the rightIndent setting
+    if (getRightIndentFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting rightIndent from AttributeSet...");
+        attributes->rightIndent = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
+                                                                   getRightIndentFromAttributeSetMethod,
+                                                                   AttributeSet);
+        EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getRightIndentFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting RightIndentFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the lineSpacing setting
+    if (getLineSpacingFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting lineSpacing from AttributeSet...");
+        attributes->lineSpacing = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
+                                                                   getLineSpacingFromAttributeSetMethod,
+                                                                   AttributeSet);
+        EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getLineSpacingFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting LineSpacingFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the spaceAbove setting
+    if (getSpaceAboveFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting spaceAbove from AttributeSet...");
+        attributes->spaceAbove = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
+                                                                  getSpaceAboveFromAttributeSetMethod,
+                                                                  AttributeSet);
+        EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getSpaceAboveFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting SpaceAboveFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the spaceBelow setting
+    if (getSpaceBelowFromAttributeSetMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting spaceBelow from AttributeSet...");
+        attributes->spaceBelow = (jfloat) jniEnv->CallFloatMethod(accessBridgeObject,
+                                                                  getSpaceBelowFromAttributeSetMethod,
+                                                                  AttributeSet);
+        EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to CallIntMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getSpaceBelowFromAttributeSetMethod == 0");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to CallVoidMethod()", FALSE);
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Getting SpaceBelowFromAttributeSet - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Release the AttributeSet object
+    if (decrementReferenceMethod != (jmethodID) 0) {
+        PrintDebugString(" Decrementing reference to AttributeSet...");
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               decrementReferenceMethod, AttributeSet);
+        EXCEPTION_CHECK("Releasing AttributeSet object - call to CallVoidMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or accessBridgeObject == 0");
+        jniEnv->DeleteLocalRef(AttributeSet);
+        EXCEPTION_CHECK("Releasing AttributeSet object - call to DeleteLocalRef()", FALSE);
+        return FALSE;
+    }
+
+    // Get the full attributes string at index
+    if (getAccessibleAttributesAtIndexFromContextMethod != (jmethodID) 0) {
+        PrintDebugString(" Getting full attributes string from Context...");
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleAttributesAtIndexFromContextMethod,
+                                                accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringChars()", FALSE);
+            wcsncpy(attributes->fullAttributesString, stringBytes, (sizeof(attributes->fullAttributesString) / sizeof(wchar_t)));
+            length = jniEnv->GetStringLength(js);
+            attributes->fullAttributesString[length < (sizeof(attributes->fullAttributesString) / sizeof(wchar_t)) ?
+                                             length : (sizeof(attributes->fullAttributesString) / sizeof(wchar_t))-2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Text attributes = %ls", attributes->fullAttributesString);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  Accessible Text attributes is null.");
+            attributes->fullAttributesString[0] = (wchar_t) 0;
+            jniEnv->DeleteLocalRef(AttributeSet);
+            EXCEPTION_CHECK("Getting AccessibleAttributesAtIndex - call to DeleteLocalRef()", FALSE);
+            return FALSE;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleAttributesAtIndexFromContextMethod == 0");
+        jniEnv->DeleteLocalRef(AttributeSet);
+        return FALSE;
+    }
+
+    jniEnv->DeleteLocalRef(AttributeSet);
+    EXCEPTION_CHECK("Getting AccessibleAttributeSetAtIndex - call to DeleteLocalRef()", FALSE);
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTextRect(jobject accessibleContext, AccessibleTextRectInfo *rectInfo, jint index) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleTextRect(%p), index = %d",
+                     accessibleContext, index);
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    // Get the x coord
+    if (getAccessibleXcoordTextRectAtIndexFromContextMethod != (jmethodID) 0) {
+        rectInfo->x = jniEnv->CallIntMethod(accessBridgeObject,
+                                            getAccessibleXcoordTextRectAtIndexFromContextMethod,
+                                            accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleXcoordTextRect - call to CallIntMethod()", FALSE);
+        PrintDebugString("  X coord = %d", rectInfo->x);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleXcoordTextRectAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the y coord
+    if (getAccessibleYcoordTextRectAtIndexFromContextMethod != (jmethodID) 0) {
+        rectInfo->y = jniEnv->CallIntMethod(accessBridgeObject,
+                                            getAccessibleYcoordTextRectAtIndexFromContextMethod,
+                                            accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleYcoordTextRect - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Y coord = %d", rectInfo->y);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleYcoordTextRectAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the width
+    if (getAccessibleWidthTextRectAtIndexFromContextMethod != (jmethodID) 0) {
+        rectInfo->width = jniEnv->CallIntMethod(accessBridgeObject,
+                                                getAccessibleWidthTextRectAtIndexFromContextMethod,
+                                                accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleWidthTextRect - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Width = %d", rectInfo->width);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleWidthTextRectAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the height
+    if (getAccessibleHeightTextRectAtIndexFromContextMethod != (jmethodID) 0) {
+        rectInfo->height = jniEnv->CallIntMethod(accessBridgeObject,
+                                                 getAccessibleHeightTextRectAtIndexFromContextMethod,
+                                                 accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleHeightTextRect - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Height = %d", rectInfo->height);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleHeightTextRectAtIndexFromContextMethod == 0");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+// =====
+
+/**
+ * gets the bounding rectangle for the text caret
+ */
+BOOL
+AccessBridgeJavaEntryPoints::getCaretLocation(jobject accessibleContext, AccessibleTextRectInfo *rectInfo, jint index) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getCaretLocation(%p), index = %d",
+                     accessibleContext, index);
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    // Get the x coord
+    if (getCaretLocationXMethod != (jmethodID) 0) {
+        rectInfo->x = jniEnv->CallIntMethod(accessBridgeObject,
+                                            getCaretLocationXMethod,
+                                            accessibleContext, index);
+        EXCEPTION_CHECK("Getting caret X coordinate - call to CallIntMethod()", FALSE);
+        PrintDebugString("  X coord = %d", rectInfo->x);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getCaretLocationXMethod == 0");
+        return FALSE;
+    }
+
+    // Get the y coord
+    if (getCaretLocationYMethod != (jmethodID) 0) {
+        rectInfo->y = jniEnv->CallIntMethod(accessBridgeObject,
+                                            getCaretLocationYMethod,
+                                            accessibleContext, index);
+        EXCEPTION_CHECK("Getting caret Y coordinate - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Y coord = %d", rectInfo->y);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getCaretLocationYMethod == 0");
+        return FALSE;
+    }
+
+    // Get the width
+    if (getCaretLocationWidthMethod != (jmethodID) 0) {
+        rectInfo->width = jniEnv->CallIntMethod(accessBridgeObject,
+                                                getCaretLocationWidthMethod,
+                                                accessibleContext, index);
+        EXCEPTION_CHECK("Getting caret width - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Width = %d", rectInfo->width);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getCaretLocationWidthMethod == 0");
+        return FALSE;
+    }
+
+    // Get the height
+    if (getCaretLocationHeightMethod != (jmethodID) 0) {
+        rectInfo->height = jniEnv->CallIntMethod(accessBridgeObject,
+                                                 getCaretLocationHeightMethod,
+                                                 accessibleContext, index);
+        EXCEPTION_CHECK("Getting caret height - call to CallIntMethod()", FALSE);
+        PrintDebugString("  Height = %d", rectInfo->height);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getCaretLocationHeightMethod == 0");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+// =====
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTextLineBounds(jobject accessibleContext, jint index, jint *startIndex, jint *endIndex) {
+
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleTextLineBounds(%p):", accessibleContext);
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    // Get the index of the left boundary of the line containing 'index'
+    if (getAccessibleTextLineLeftBoundsFromContextMethod != (jmethodID) 0) {
+        *startIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                            getAccessibleTextLineLeftBoundsFromContextMethod,
+                                            accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleTextLineLeftBounds - call to CallIntMethod()", FALSE);
+        PrintDebugString("  startIndex = %d", *startIndex);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextLineLeftBoundsFromContextMethod == 0");
+        return FALSE;
+    }
+
+    // Get the index of the right boundary of the line containing 'index'
+    if (getAccessibleTextLineRightBoundsFromContextMethod != (jmethodID) 0) {
+        *endIndex = jniEnv->CallIntMethod(accessBridgeObject,
+                                          getAccessibleTextLineRightBoundsFromContextMethod,
+                                          accessibleContext, index);
+        EXCEPTION_CHECK("Getting AccessibleTextLineRightBounds - call to CallIntMethod()", FALSE);
+        PrintDebugString("  endIndex = %d", *endIndex);
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextLineRightBoundsFromContextMethod == 0");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getAccessibleTextRange(jobject accessibleContext,
+                                                    jint start, jint end, wchar_t *text, short len) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleTextRange(%p, %d, %d, *text, %d):", accessibleContext, start, end, len);
+
+    // Verify the Java VM still exists and AccessibleContext is
+    // an instance of AccessibleText
+    if (verifyAccessibleText(accessibleContext) == FALSE) {
+        return FALSE;
+    }
+
+    // range is inclusive
+    if (end < start) {
+        PrintDebugString("  Error! end < start!");
+        text[0] = (wchar_t) 0;
+        return FALSE;
+    }
+
+    // Get the text range within [start, end] inclusive
+    if (getAccessibleTextRangeFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getAccessibleTextRangeFromContextMethod,
+                                                accessibleContext, start, end);
+        EXCEPTION_CHECK("Getting AccessibleTextRange - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting AccessibleTextRange - call to GetStringChars()", FALSE);
+            wPrintDebugString(L"  Accessible Text stringBytes returned from Java = %ls", stringBytes);
+            wcsncpy(text, stringBytes, len);
+            length = jniEnv->GetStringLength(js);
+            PrintDebugString("  Accessible Text stringBytes length = %d", length);
+            text[length < len ? length : len - 2] = (wchar_t) 0;
+            wPrintDebugString(L"  Accessible Text 'text' after null termination = %ls", text);
+            EXCEPTION_CHECK("Getting AccessibleTextRange - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting AccessibleTextRange - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting AccessibleTextRange - call to CallVoidMethod()", FALSE);
+            wPrintDebugString(L"  Accessible Text range = %ls", text);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting AccessibleTextRange - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  current Accessible Text range is null.");
+            text[0] = (wchar_t) 0;
+            return FALSE;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleTextRangeFromContextMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+/********** AccessibleValue routines ***************/
+
+BOOL
+AccessBridgeJavaEntryPoints::getCurrentAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getCurrentAccessibleValueFromContext(%p):", accessibleContext);
+
+    // Get the current Accessible Value
+    if (getCurrentAccessibleValueFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getCurrentAccessibleValueFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to GetStringChars()", FALSE);
+            wcsncpy(value, stringBytes, len);
+            length = jniEnv->GetStringLength(js);
+            value[length < len ? length : len - 2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to CallVoidMethod()", FALSE);
+            PrintDebugString("  current Accessible Value = %s", value);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting CurrentAccessibleValue - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  current Accessible Value is null.");
+            value[0] = (wchar_t) 0;
+            return FALSE;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getCurrentAccessibleValueFromContextMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getMaximumAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getMaximumAccessibleValueFromContext(%p):", accessibleContext);
+
+    // Get the maximum Accessible Value
+    if (getMaximumAccessibleValueFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getMaximumAccessibleValueFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to GetStringChars()", FALSE);
+            wcsncpy(value, stringBytes, len);
+            length = jniEnv->GetStringLength(js);
+            value[length < len ? length : len - 2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to CallVoidMethod()", FALSE);
+            PrintDebugString("  maximum Accessible Value = %s", value);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting MaximumAccessibleValue - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  maximum Accessible Value is null.");
+            value[0] = (wchar_t) 0;
+            return FALSE;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getMaximumAccessibleValueFromContextMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::getMinimumAccessibleValueFromContext(jobject accessibleContext, wchar_t *value, short len) {
+    jstring js;
+    const wchar_t *stringBytes;
+    jthrowable exception;
+    jsize length;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getMinimumAccessibleValueFromContext(%p):", accessibleContext);
+
+    // Get the mimimum Accessible Value
+    if (getMinimumAccessibleValueFromContextMethod != (jmethodID) 0) {
+        js = (jstring) jniEnv->CallObjectMethod(accessBridgeObject,
+                                                getMinimumAccessibleValueFromContextMethod,
+                                                accessibleContext);
+        EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to CallObjectMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod(), js = %p", js);
+        if (js != (jstring) 0) {
+            stringBytes = (const wchar_t *) jniEnv->GetStringChars(js, 0);
+            EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to GetStringChars()", FALSE);
+            wcsncpy(value, stringBytes, len);
+            length = jniEnv->GetStringLength(js);
+            value[length < len ? length : len - 2] = (wchar_t) 0;
+            EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to GetStringLength()", FALSE);
+            jniEnv->ReleaseStringChars(js, stringBytes);
+            EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to ReleaseStringChars()", FALSE);
+            jniEnv->CallVoidMethod(accessBridgeObject,
+                                   decrementReferenceMethod, js);
+            EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to CallVoidMethod()", FALSE);
+            PrintDebugString("  mimimum Accessible Value = %s", value);
+            jniEnv->DeleteLocalRef(js);
+            EXCEPTION_CHECK("Getting MinimumAccessibleValue - call to DeleteLocalRef()", FALSE);
+        } else {
+            PrintDebugString("  mimimum Accessible Value is null.");
+            value[0] = (wchar_t) 0;
+            return FALSE;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or getMinimumAccessibleValueFromContextMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+
+/********** AccessibleSelection routines ***************/
+
+void
+AccessBridgeJavaEntryPoints::addAccessibleSelectionFromContext(jobject accessibleContext, int i) {
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::addAccessibleSelectionFromContext(%p):", accessibleContext);
+
+    // Add the child to the AccessibleSelection
+    if (addAccessibleSelectionFromContextMethod != (jmethodID) 0) {
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               addAccessibleSelectionFromContextMethod,
+                               accessibleContext, i);
+        EXCEPTION_CHECK_VOID("Doing addAccessibleSelection - call to CallVoidMethod()");
+        PrintDebugString("  returned from CallObjectMethod()");
+    } else {
+        PrintDebugString("  Error! either env == 0 or addAccessibleSelectionFromContextMethod == 0");
+    }
+}
+
+void
+AccessBridgeJavaEntryPoints::clearAccessibleSelectionFromContext(jobject accessibleContext) {
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::clearAccessibleSelectionFromContext(%p):", accessibleContext);
+
+    // Clearing the Selection of the AccessibleSelection
+    if (clearAccessibleSelectionFromContextMethod != (jmethodID) 0) {
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               clearAccessibleSelectionFromContextMethod,
+                               accessibleContext);
+        EXCEPTION_CHECK_VOID("Doing clearAccessibleSelection - call to CallVoidMethod()");
+        PrintDebugString("  returned from CallObjectMethod()");
+    } else {
+        PrintDebugString("  Error! either env == 0 or clearAccessibleSelectionFromContextMethod == 0");
+    }
+}
+
+jobject
+AccessBridgeJavaEntryPoints::getAccessibleSelectionFromContext(jobject accessibleContext, int i) {
+    jobject returnedAccessibleContext;
+    jobject globalRef;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleSelectionFromContext(%p):", accessibleContext);
+
+    if (getAccessibleSelectionContextFromContextMethod != (jmethodID) 0) {
+        returnedAccessibleContext = jniEnv->CallObjectMethod(
+                                                             accessBridgeObject,
+                                                             getAccessibleSelectionContextFromContextMethod,
+                                                             accessibleContext, i);
+        EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to CallObjectMethod()", (jobject) 0);
+        globalRef = jniEnv->NewGlobalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to NewGlobalRef()", (jobject) 0);
+        jniEnv->DeleteLocalRef(returnedAccessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleSelectionContext - call to DeleteLocalRef()", (jobject) 0);
+        PrintDebugString("  Returning - returnedAccessibleContext = %p; globalRef = %p",
+                         returnedAccessibleContext, globalRef);
+        return globalRef;
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleSelectionContextFromContextMethod == 0");
+        return (jobject) 0;
+    }
+}
+
+int
+AccessBridgeJavaEntryPoints::getAccessibleSelectionCountFromContext(jobject accessibleContext) {
+    int count;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::getAccessibleSelectionCountFromContext(%p):", accessibleContext);
+
+    // Get (& return) the # of items selected in the AccessibleSelection
+    if (getAccessibleSelectionCountFromContextMethod != (jmethodID) 0) {
+        count = jniEnv->CallIntMethod(accessBridgeObject,
+                                      getAccessibleSelectionCountFromContextMethod,
+                                      accessibleContext);
+        EXCEPTION_CHECK("Getting AccessibleSelectionCount - call to CallIntMethod()", -1);
+        PrintDebugString("  returned from CallObjectMethod()");
+        return count;
+    } else {
+        PrintDebugString("  Error! either env == 0 or getAccessibleSelectionCountFromContextMethod == 0");
+        return -1;
+    }
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::isAccessibleChildSelectedFromContext(jobject accessibleContext, int i) {
+    jboolean result;
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::isAccessibleChildSelectedFromContext(%p):", accessibleContext);
+
+    // Get (& return) the # of items selected in the AccessibleSelection
+    if (isAccessibleChildSelectedFromContextMethod != (jmethodID) 0) {
+        result = jniEnv->CallBooleanMethod(accessBridgeObject,
+                                           isAccessibleChildSelectedFromContextMethod,
+                                           accessibleContext, i);
+        EXCEPTION_CHECK("Doing isAccessibleChildSelected - call to CallBooleanMethod()", FALSE);
+        PrintDebugString("  returned from CallObjectMethod()");
+        if (result != 0) {
+            return TRUE;
+        }
+    } else {
+        PrintDebugString("  Error! either env == 0 or isAccessibleChildSelectedFromContextMethod == 0");
+    }
+    return FALSE;
+}
+
+
+void
+AccessBridgeJavaEntryPoints::removeAccessibleSelectionFromContext(jobject accessibleContext, int i) {
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::removeAccessibleSelectionFromContext(%p):", accessibleContext);
+
+    // Remove the i-th child from the AccessibleSelection
+    if (removeAccessibleSelectionFromContextMethod != (jmethodID) 0) {
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               removeAccessibleSelectionFromContextMethod,
+                               accessibleContext, i);
+        EXCEPTION_CHECK_VOID("Doing removeAccessibleSelection - call to CallVoidMethod()");
+        PrintDebugString("  returned from CallObjectMethod()");
+    } else {
+        PrintDebugString("  Error! either env == 0 or removeAccessibleSelectionFromContextMethod == 0");
+    }
+}
+
+void
+AccessBridgeJavaEntryPoints::selectAllAccessibleSelectionFromContext(jobject accessibleContext) {
+    jthrowable exception;
+
+    PrintDebugString("\r\nCalling AccessBridgeJavaEntryPoints::selectAllAccessibleSelectionFromContext(%p):", accessibleContext);
+
+    // Select all children (if possible) of the AccessibleSelection
+    if (selectAllAccessibleSelectionFromContextMethod != (jmethodID) 0) {
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               selectAllAccessibleSelectionFromContextMethod,
+                               accessibleContext);
+        EXCEPTION_CHECK_VOID("Doing selectAllAccessibleSelection - call to CallVoidMethod()");
+        PrintDebugString("  returned from CallObjectMethod()");
+    } else {
+        PrintDebugString("  Error! either env == 0 or selectAllAccessibleSelectionFromContextMethod == 0");
+    }
+}
+
+
+/********** Event Notification Registration routines ***************/
+
+BOOL
+AccessBridgeJavaEntryPoints::addJavaEventNotification(jlong type) {
+    jthrowable exception;
+
+    PrintDebugString("\r\n  in AccessBridgeJavaEntryPoints::addJavaEventNotification(%016I64X);", type);
+
+    // Let AccessBridge know we want to add an event type
+    if (addJavaEventNotificationMethod != (jmethodID) 0) {
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               addJavaEventNotificationMethod, type);
+        EXCEPTION_CHECK("Doing addJavaEventNotification - call to CallVoidMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or addJavaEventNotificationMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::removeJavaEventNotification(jlong type) {
+    jthrowable exception;
+
+    PrintDebugString("\r\n  in AccessBridgeJavaEntryPoints::removeJavaEventNotification(%016I64X):", type);
+
+    // Let AccessBridge know we want to remove an event type
+    if (removeJavaEventNotificationMethod != (jmethodID) 0) {
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               removeJavaEventNotificationMethod, type);
+        EXCEPTION_CHECK("Doing removeJavaEventNotification - call to CallVoidMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or removeJavaEventNotificationMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::addAccessibilityEventNotification(jlong type) {
+    jthrowable exception;
+
+    PrintDebugString("\r\n  in AccessBridgeJavaEntryPoints::addAccessibilityEventNotification(%016I64X);", type);
+
+    // Let AccessBridge know we want to add an event type
+    if (addAccessibilityEventNotificationMethod != (jmethodID) 0) {
+        PrintDebugString("\r\n     addAccessibilityEventNotification: calling void method: accessBridgeObject = %p", accessBridgeObject);
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               addAccessibilityEventNotificationMethod, type);
+        EXCEPTION_CHECK("Doing addAccessibilityEvent - call to CallVoidMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or addAccessibilityEventNotificationMethod == 0");
+        return FALSE;
+    }
+    PrintDebugString("\r\n     addAccessibilityEventNotification: just returning true");
+    return TRUE;
+}
+
+BOOL
+AccessBridgeJavaEntryPoints::removeAccessibilityEventNotification(jlong type) {
+    jthrowable exception;
+
+    PrintDebugString("\r\n  in AccessBridgeJavaEntryPoints::removeAccessibilityEventNotification(%016I64X):", type);
+
+    // Let AccessBridge know we want to remove an event type
+    if (removeAccessibilityEventNotificationMethod != (jmethodID) 0) {
+        jniEnv->CallVoidMethod(accessBridgeObject,
+                               removeAccessibilityEventNotificationMethod, type);
+        EXCEPTION_CHECK("Doing removeAccessibilityEvent - call to CallVoidMethod()", FALSE);
+    } else {
+        PrintDebugString("  Error! either env == 0 or removeAccessibilityEventNotificationMethod == 0");
+        return FALSE;
+    }
+    return TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libjavaaccessbridge/AccessBridgeJavaEntryPoints.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,418 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage JNI calls into AccessBridge.java
+ */
+
+#include "AccessBridgePackages.h"
+
+#include <windows.h>
+#include <jni.h>
+
+#ifndef __AccessBridgeJavaEntryPoints_H__
+#define __AccessBridgeJavaEntryPoints_H__
+
+class AccessBridgeJavaEntryPoints {
+    JNIEnv *jniEnv;
+
+    jobject accessBridgeObject;
+
+    jclass bridgeClass;
+    jclass eventHandlerClass;
+
+    jmethodID decrementReferenceMethod;
+    jmethodID getJavaVersionPropertyMethod;
+
+    jmethodID isJavaWindowMethod;
+    jmethodID isSameObjectMethod;
+    jmethodID getAccessibleContextFromHWNDMethod;
+    jmethodID getHWNDFromAccessibleContextMethod;
+
+    jmethodID getAccessibleContextAtMethod;
+    jmethodID getAccessibleContextWithFocusMethod;
+
+    jmethodID getAccessibleNameFromContextMethod;
+    jmethodID getAccessibleDescriptionFromContextMethod;
+    jmethodID getAccessibleRoleStringFromContextMethod;
+    jmethodID getAccessibleRoleStringFromContext_en_USMethod;
+    jmethodID getAccessibleStatesStringFromContextMethod;
+    jmethodID getAccessibleStatesStringFromContext_en_USMethod;
+    jmethodID getAccessibleParentFromContextMethod;
+    jmethodID getAccessibleIndexInParentFromContextMethod;
+    jmethodID getAccessibleChildrenCountFromContextMethod;
+    jmethodID getAccessibleChildFromContextMethod;
+    jmethodID getAccessibleBoundsOnScreenFromContextMethod;
+    jmethodID getAccessibleXcoordFromContextMethod;
+    jmethodID getAccessibleYcoordFromContextMethod;
+    jmethodID getAccessibleHeightFromContextMethod;
+    jmethodID getAccessibleWidthFromContextMethod;
+
+    jmethodID getAccessibleComponentFromContextMethod;
+    jmethodID getAccessibleActionFromContextMethod;
+    jmethodID getAccessibleSelectionFromContextMethod;
+    jmethodID getAccessibleTextFromContextMethod;
+    jmethodID getAccessibleValueFromContextMethod;
+
+    /* begin AccessibleTable */
+    jmethodID getAccessibleTableFromContextMethod;
+    jmethodID getAccessibleTableRowHeaderMethod;
+    jmethodID getAccessibleTableColumnHeaderMethod;
+    jmethodID getAccessibleTableRowCountMethod;
+    jmethodID getAccessibleTableColumnCountMethod;
+    jmethodID getAccessibleTableCaptionMethod;
+    jmethodID getAccessibleTableSummaryMethod;
+
+    jmethodID getContextFromAccessibleTableMethod;
+    jmethodID getAccessibleTableCellAccessibleContextMethod;
+    jmethodID getAccessibleTableCellIndexMethod;
+    jmethodID getAccessibleTableCellRowExtentMethod;
+    jmethodID getAccessibleTableCellColumnExtentMethod;
+    jmethodID isAccessibleTableCellSelectedMethod;
+
+    jmethodID getAccessibleTableRowHeaderRowCountMethod;
+    jmethodID getAccessibleTableColumnHeaderRowCountMethod;
+
+    jmethodID getAccessibleTableRowHeaderColumnCountMethod;
+    jmethodID getAccessibleTableColumnHeaderColumnCountMethod;
+
+    jmethodID getAccessibleTableRowDescriptionMethod;
+    jmethodID getAccessibleTableColumnDescriptionMethod;
+
+    jmethodID getAccessibleTableRowSelectionCountMethod;
+    jmethodID isAccessibleTableRowSelectedMethod;
+    jmethodID getAccessibleTableRowSelectionsMethod;
+
+    jmethodID getAccessibleTableColumnSelectionCountMethod;
+    jmethodID isAccessibleTableColumnSelectedMethod;
+    jmethodID getAccessibleTableColumnSelectionsMethod;
+
+    jmethodID getAccessibleTableRowMethod;
+    jmethodID getAccessibleTableColumnMethod;
+    jmethodID getAccessibleTableIndexMethod;
+
+    /* end AccessibleTable */
+
+    /* begin AccessibleRelationSet */
+
+    jmethodID getAccessibleRelationSetMethod;
+    jmethodID getAccessibleRelationCountMethod;
+    jmethodID getAccessibleRelationKeyMethod;
+    jmethodID getAccessibleRelationTargetCountMethod;
+    jmethodID getAccessibleRelationTargetMethod;
+
+    /* end AccessibleRelationSet */
+
+    // AccessibleHypertext methods
+    jmethodID getAccessibleHypertextMethod;
+    jmethodID getAccessibleHyperlinkCountMethod;
+    jmethodID getAccessibleHyperlinkTextMethod;
+    jmethodID getAccessibleHyperlinkURLMethod;
+    jmethodID getAccessibleHyperlinkStartIndexMethod;
+    jmethodID getAccessibleHyperlinkEndIndexMethod;
+    jmethodID getAccessibleHypertextLinkIndexMethod;
+    jmethodID getAccessibleHyperlinkMethod;
+    jmethodID activateAccessibleHyperlinkMethod;
+
+    // AccessibleKeyBinding
+    jmethodID getAccessibleKeyBindingsCountMethod;
+    jmethodID getAccessibleKeyBindingCharMethod;
+    jmethodID getAccessibleKeyBindingModifiersMethod;
+
+    // AccessibleIcon
+    jmethodID getAccessibleIconsCountMethod;
+    jmethodID getAccessibleIconDescriptionMethod;
+    jmethodID getAccessibleIconHeightMethod;
+    jmethodID getAccessibleIconWidthMethod;
+
+    // AccessibleAction
+    jmethodID getAccessibleActionsCountMethod;
+    jmethodID getAccessibleActionNameMethod;
+    jmethodID doAccessibleActionsMethod;
+
+    // AccessibleText
+    jmethodID getAccessibleCharCountFromContextMethod;
+    jmethodID getAccessibleCaretPositionFromContextMethod;
+    jmethodID getAccessibleIndexAtPointFromContextMethod;
+
+    jmethodID getAccessibleLetterAtIndexFromContextMethod;
+    jmethodID getAccessibleWordAtIndexFromContextMethod;
+    jmethodID getAccessibleSentenceAtIndexFromContextMethod;
+
+    jmethodID getAccessibleTextSelectionStartFromContextMethod;
+    jmethodID getAccessibleTextSelectionEndFromContextMethod;
+    jmethodID getAccessibleTextSelectedTextFromContextMethod;
+    jmethodID getAccessibleAttributesAtIndexFromContextMethod;
+    jmethodID getAccessibleAttributeSetAtIndexFromContextMethod;
+    jmethodID getAccessibleTextRectAtIndexFromContextMethod;
+    jmethodID getAccessibleXcoordTextRectAtIndexFromContextMethod;
+    jmethodID getAccessibleYcoordTextRectAtIndexFromContextMethod;
+    jmethodID getAccessibleHeightTextRectAtIndexFromContextMethod;
+    jmethodID getAccessibleWidthTextRectAtIndexFromContextMethod;
+    jmethodID getAccessibleTextLineLeftBoundsFromContextMethod;
+    jmethodID getAccessibleTextLineRightBoundsFromContextMethod;
+    jmethodID getAccessibleTextRangeFromContextMethod;
+
+    jmethodID getCurrentAccessibleValueFromContextMethod;
+    jmethodID getMaximumAccessibleValueFromContextMethod;
+    jmethodID getMinimumAccessibleValueFromContextMethod;
+
+    jmethodID addAccessibleSelectionFromContextMethod;
+    jmethodID clearAccessibleSelectionFromContextMethod;
+    jmethodID getAccessibleSelectionContextFromContextMethod;
+    jmethodID getAccessibleSelectionCountFromContextMethod;
+    jmethodID isAccessibleChildSelectedFromContextMethod;
+    jmethodID removeAccessibleSelectionFromContextMethod;
+    jmethodID selectAllAccessibleSelectionFromContextMethod;
+
+    jmethodID addJavaEventNotificationMethod;
+    jmethodID removeJavaEventNotificationMethod;
+    jmethodID addAccessibilityEventNotificationMethod;
+    jmethodID removeAccessibilityEventNotificationMethod;
+
+    jmethodID getBoldFromAttributeSetMethod;
+    jmethodID getItalicFromAttributeSetMethod;
+    jmethodID getUnderlineFromAttributeSetMethod;
+    jmethodID getStrikethroughFromAttributeSetMethod;
+    jmethodID getSuperscriptFromAttributeSetMethod;
+    jmethodID getSubscriptFromAttributeSetMethod;
+    jmethodID getBackgroundColorFromAttributeSetMethod;
+    jmethodID getForegroundColorFromAttributeSetMethod;
+    jmethodID getFontFamilyFromAttributeSetMethod;
+    jmethodID getFontSizeFromAttributeSetMethod;
+    jmethodID getAlignmentFromAttributeSetMethod;
+    jmethodID getBidiLevelFromAttributeSetMethod;
+    jmethodID getFirstLineIndentFromAttributeSetMethod;
+    jmethodID getLeftIndentFromAttributeSetMethod;
+    jmethodID getRightIndentFromAttributeSetMethod;
+    jmethodID getLineSpacingFromAttributeSetMethod;
+    jmethodID getSpaceAboveFromAttributeSetMethod;
+    jmethodID getSpaceBelowFromAttributeSetMethod;
+
+    jmethodID setTextContentsMethod;
+    jmethodID getParentWithRoleMethod;
+    jmethodID getTopLevelObjectMethod;
+    jmethodID getParentWithRoleElseRootMethod;
+    jmethodID getObjectDepthMethod;
+    jmethodID getActiveDescendentMethod;
+
+    /**
+     * Additional methods for Teton
+     */
+    jmethodID getVirtualAccessibleNameFromContextMethod; // Ben Key
+    jmethodID requestFocusMethod;
+    jmethodID selectTextRangeMethod;
+    jmethodID getTextAttributesInRangeMethod;
+    jmethodID getVisibleChildrenCountMethod;
+    jmethodID getVisibleChildMethod;
+    jmethodID setCaretPositionMethod;
+
+    jmethodID getCaretLocationMethod;
+    jmethodID getCaretLocationXMethod;
+    jmethodID getCaretLocationYMethod;
+    jmethodID getCaretLocationHeightMethod;
+    jmethodID getCaretLocationWidthMethod;
+
+public:
+    AccessBridgeJavaEntryPoints(JNIEnv *jniEnvironment, jobject bridgeObject);
+    ~AccessBridgeJavaEntryPoints();
+    BOOL BuildJavaEntryPoints();
+
+    // HWND management methods
+    BOOL isJavaWindow(jint window);
+    jobject getAccessibleContextFromHWND(jint window);
+    HWND getHWNDFromAccessibleContext(jobject accessibleContext);
+
+    // version methods
+    BOOL getVersionInfo(AccessBridgeVersionInfo *info);
+
+    // verification methods
+    BOOL verifyAccessibleText(jobject obj);
+
+    /* ===== utility methods ===== */
+    BOOL isSameObject(jobject obj1, jobject obj2);
+    BOOL setTextContents(const jobject accessibleContext, const wchar_t *text);
+    jobject getParentWithRole (const jobject accessibleContext, const wchar_t *role);
+    jobject getTopLevelObject (const jobject accessibleContext);
+    jobject getParentWithRoleElseRoot (const jobject accessibleContext, const wchar_t *role);
+    jint getObjectDepth (const jobject accessibleContext);
+    jobject getActiveDescendent (const jobject accessibleContext);
+
+    // Accessible Context methods
+    jobject getAccessibleContextAt(jint x, jint y, jobject AccessibleContext);
+    jobject getAccessibleContextWithFocus();
+    BOOL getAccessibleContextInfo(jobject AccessibleContext, AccessibleContextInfo *info);
+    jobject getAccessibleChildFromContext(jobject AccessibleContext, jint childIndex);
+    jobject getAccessibleParentFromContext(jobject AccessibleContext);
+
+    /* begin AccessibleTable methods */
+
+    BOOL getAccessibleTableInfo(jobject acParent, AccessibleTableInfo *tableInfo);
+    BOOL getAccessibleTableCellInfo(jobject accessibleTable,jint row, jint column,
+                                    AccessibleTableCellInfo *tableCellInfo);
+
+    BOOL getAccessibleTableRowHeader(jobject acParent, AccessibleTableInfo *tableInfo);
+    BOOL getAccessibleTableColumnHeader(jobject acParent, AccessibleTableInfo *tableInfo);
+
+    jobject getAccessibleTableRowDescription(jobject acParent, jint row);
+    jobject getAccessibleTableColumnDescription(jobject acParent, jint column);
+
+    jint getAccessibleTableRowSelectionCount(jobject accessibleTable);
+    BOOL isAccessibleTableRowSelected(jobject accessibleTable, jint row);
+    BOOL getAccessibleTableRowSelections(jobject accessibleTable, jint count, jint *selections);
+
+    jint getAccessibleTableColumnSelectionCount(jobject accessibleTable);
+    BOOL isAccessibleTableColumnSelected(jobject accessibleTable, jint column);
+    BOOL getAccessibleTableColumnSelections(jobject accessibleTable, jint count, jint *selections);
+
+    jint getAccessibleTableRow(jobject accessibleTable, jint index);
+    jint getAccessibleTableColumn(jobject accessibleTable, jint index);
+    jint getAccessibleTableIndex(jobject accessibleTable, jint row, jint column);
+
+    /* end AccessibleTable methods */
+
+    BOOL getAccessibleRelationSet(jobject accessibleContext, AccessibleRelationSetInfo *relationSetInfo);
+
+    // AccessibleHypertext methods
+    BOOL getAccessibleHypertext(jobject accessibleContext, AccessibleHypertextInfo *hyperlink);
+
+    BOOL activateAccessibleHyperlink(jobject accessibleContext, jobject accessibleHyperlink);
+
+    BOOL getAccessibleHypertextExt(const jobject accessibleContext,
+                                   const jint nStartIndex,
+                                   /* OUT */ AccessibleHypertextInfo *hypertext);
+    jint getAccessibleHyperlinkCount(const jobject accessibleContext);
+    jint getAccessibleHypertextLinkIndex(const jobject accessibleContext,
+                                         const jint nIndex);
+    BOOL getAccessibleHyperlink(const jobject accessibleContext,
+                                const jint nIndex,
+                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
+
+    // Accessible Keybinding methods
+    BOOL getAccessibleKeyBindings(jobject accessibleContext, AccessibleKeyBindings *keyBindings);
+
+    // AccessibleIcon methods
+    BOOL getAccessibleIcons(jobject accessibleContext, AccessibleIcons *icons);
+
+    // AccessibleActionMethods
+    BOOL getAccessibleActions(jobject accessibleContext, AccessibleActions *actions);
+    BOOL doAccessibleActions(jobject accessibleContext, AccessibleActionsToDo *actionsToDo, jint *failure);
+
+    // Accessible Text methods
+    BOOL getAccessibleTextInfo(jobject AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y);
+    BOOL getAccessibleTextItems(jobject AccessibleContext, AccessibleTextItemsInfo *textItems, jint index);
+    BOOL getAccessibleTextSelectionInfo(jobject AccessibleContext, AccessibleTextSelectionInfo *selectionInfo);
+    BOOL getAccessibleTextAttributes(jobject AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes);
+    BOOL getAccessibleTextRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
+    BOOL getAccessibleCaretRect(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
+    BOOL getAccessibleTextLineBounds(jobject AccessibleContext, jint index, jint *startIndex, jint *endIndex);
+    BOOL getAccessibleTextRange(jobject AccessibleContext, jint start, jint end, wchar_t *text, short len);
+
+    // Accessible Value methods
+    BOOL getCurrentAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len);
+    BOOL getMaximumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len);
+    BOOL getMinimumAccessibleValueFromContext(jobject AccessibleContext, wchar_t *value, short len);
+
+    // Accessible Selection methods
+    void addAccessibleSelectionFromContext(jobject AccessibleContext, int i);
+    void clearAccessibleSelectionFromContext(jobject AccessibleContext);
+    jobject getAccessibleSelectionFromContext(jobject AccessibleContext, int i);
+    int getAccessibleSelectionCountFromContext(jobject AccessibleContext);
+    BOOL isAccessibleChildSelectedFromContext(jobject AccessibleContext, int i);
+    void removeAccessibleSelectionFromContext(jobject AccessibleContext, int i);
+    void selectAllAccessibleSelectionFromContext(jobject AccessibleContext);
+
+    // Event handling methods
+    BOOL addJavaEventNotification(jlong type);
+    BOOL removeJavaEventNotification(jlong type);
+    BOOL addAccessibilityEventNotification(jlong type);
+    BOOL removeAccessibilityEventNotification(jlong type);
+
+    /**
+     * Additional methods for Teton
+     */
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+     * whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    BOOL getVirtualAccessibleName(const jobject accessibleContext, wchar_t *name, int len);
+
+    /**
+     * Request focus for a component. Returns whether successful;
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    BOOL requestFocus(const jobject accessibleContext);
+
+    /**
+     * Selects text between two indices.  Selection includes the text at the start index
+     * and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    BOOL selectTextRange(const jobject accessibleContext, int startIndex, int endIndex);
+
+    /**
+     * Get text attributes between two indices.  The attribute list includes the text at the
+     * start index and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944761 - getTextAttributes between two indices method needed
+     */
+    BOOL getTextAttributesInRange(const jobject accessibleContext, int startIndex, int endIndex,
+                                  AccessibleTextAttributesInfo *attributes, short *len);
+
+    /**
+     * Gets the number of visible children of a component. Returns -1 on error.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    int getVisibleChildrenCount(const jobject accessibleContext);
+
+    /**
+     * Gets the visible children of an AccessibleContext. Returns whether successful;
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    BOOL getVisibleChildren(const jobject accessibleContext, const int startIndex,
+                            VisibleChildrenInfo *visibleChildrenInfo);
+
+    /**
+     * Set the caret to a text position. Returns whether successful;
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    BOOL setCaretPosition(const jobject accessibleContext, int position);
+
+    /**
+     * Gets the bounding rectangle for the text caret
+     */
+    BOOL getCaretLocation(jobject AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libjavaaccessbridge/JavaAccessBridge.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,2799 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A DLL which is loaded by Java applications to handle communication
+ * between Java VMs purposes of Accessbility.
+ */
+
+#include "AccessBridgeDebug.h"
+#include "JavaAccessBridge.h"
+#include "com_sun_java_accessibility_AccessBridge.h" // programatically generated by JNI
+#include "accessBridgeResource.h"
+#include "accessBridgeCallbacks.h"
+#include "AccessBridgeMessages.h"
+
+
+#include <windows.h>
+#include <stdio.h>
+
+#include <jawt.h>
+#include <jawt_md.h>
+
+JavaAccessBridge *theJavaAccessBridge;
+HWND theDialogWindow;
+
+// re-entrance lock for receiving memory messages
+CRITICAL_SECTION receiveMemoryIPCLock;
+
+
+// unique broadcast msg. IDs gotten dymanically
+extern UINT theFromJavaHelloMsgID;
+extern UINT theFromWindowsHelloMsgID;
+
+
+// ---------------------------------------------------------------------------
+
+extern "C" {
+    /**
+     * DllMain - where Windows executables will load/unload us
+     *
+     */
+    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) {
+
+        switch (fdwReason) {
+        case DLL_PROCESS_ATTACH:
+            InitializeCriticalSection(&receiveMemoryIPCLock);
+            theJavaAccessBridge = new JavaAccessBridge(hinstDll);
+            break;
+
+        case DLL_PROCESS_DETACH:        // A Windows executable unloaded us
+            if (theJavaAccessBridge != (JavaAccessBridge *) 0) {
+                delete theJavaAccessBridge;
+                DeleteCriticalSection(&receiveMemoryIPCLock);
+            }
+            break;
+        }
+        return TRUE;
+    }
+
+    /**
+     * Open a native window (and init the wrappers we'll be using)
+     *
+     */
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_runDLL(JNIEnv *env, jobject obj) {
+        PrintDebugString("\r\nJavaAccessBridge.DLL runDLL() called");
+        theJavaAccessBridge->javaRun(env, obj);
+    }
+
+#if 0 // SetDlgItemText has caused problems with JAWS
+    /**
+     * Append debug info to dialog
+     *
+     */
+    void AppendToCallInfo(char *s) {
+        char buffer[4096];
+
+        PrintDebugString(s);
+
+        GetDlgItemText(theDialogWindow, cCallInfo, buffer, sizeof(buffer));
+        if (strlen(buffer) < (sizeof(buffer) - strlen(s))) {
+            strncat(buffer, s, sizeof(buffer));
+            SetDlgItemText(theDialogWindow, cCallInfo, buffer);
+        } else {
+            SetDlgItemText(theDialogWindow, cCallInfo, s);
+        }
+    }
+#endif
+
+
+    /**
+     * Our window proc
+     *
+     */
+    BOOL APIENTRY AccessBridgeDialogProc (HWND hDlg, UINT message, UINT wParam, LONG lParam) {
+        int command;
+        COPYDATASTRUCT *sentToUs;
+        char *package;
+        //DEBUG_CODE(char buffer[256]);
+
+        switch (message) {
+        case WM_INITDIALOG:
+            //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Initializing"));
+            break;
+
+        case WM_COMMAND:
+            command = LOWORD (wParam);
+            break;
+
+            // call from Java with data for us to deliver
+        case WM_COPYDATA:
+            if (theDialogWindow == (HWND) wParam) {
+                //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got WM_COPYDATA from ourselves"));
+            } else {
+                //DEBUG_CODE(sprintf(buffer, "Got WM_COPYDATA from HWND %p", wParam));
+                //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, buffer));
+                sentToUs = (COPYDATASTRUCT *) lParam;
+                package = (char *) sentToUs->lpData;
+                theJavaAccessBridge->processPackage(package, sentToUs->cbData);
+            }
+            break;
+
+            // call from Java with data for us retrieve from memory mapped file and deliver
+        case AB_MESSAGE_WAITING:
+            // wParam == sourceHwnd
+            // lParam == buffer size in shared memory
+            if (theDialogWindow == (HWND) wParam) {
+                //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got AB_MESSAGE_WAITING from ourselves"));
+            } else {
+                //DEBUG_CODE(sprintf(buffer, "Got AB_MESSAGE_WAITING from HWND %p", wParam));
+                //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, buffer));
+                LRESULT returnVal = theJavaAccessBridge->receiveMemoryPackage((HWND) wParam, lParam);
+            }
+            break;
+
+            // a JavaAccessBridge DLL is going away
+        case AB_DLL_GOING_AWAY:
+            // wParam == sourceHwnd
+            //DEBUG_CODE(SetDlgItemText(theDialogWindow, cStatusText, "Got AB_DLL_GOING_AWAY message"));
+            theJavaAccessBridge->WindowsATDestroyed((HWND) wParam);
+            break;
+
+        default:
+            // the Windows AT is saying "hi"!
+            // wParam == sourceHwnc; lParam unused
+            if (message == theFromWindowsHelloMsgID) {
+                // A new Windows AT just said "hi";
+                // say "hi" back so it can mate up with us
+                // otherwise don't do anything (e.g. don't set up data structures yet)
+                theJavaAccessBridge->postHelloToWindowsDLLMsg((HWND) wParam);
+            }
+        }
+        return FALSE;
+    }
+
+}
+
+
+// -----------------------------
+
+
+/**
+ * Initialize the JavaAccessBridge
+ *
+ */
+JavaAccessBridge::JavaAccessBridge(HINSTANCE hInstance) {
+    windowsInstance = hInstance;
+    ATs = (AccessBridgeATInstance *) 0;
+    initBroadcastMessageIDs();          // get the unique to us broadcast msg. IDs
+}
+
+extern DWORD JavaBridgeThreadId;
+
+/**
+ * Destroy the JavaAccessBridge
+ *
+ */
+JavaAccessBridge::~JavaAccessBridge() {
+    // inform all other AccessBridges that we're going away
+
+    PrintDebugString("\r\nin JavaAccessBridge::~JavaAccessBridge()");
+
+    // Send a shutdown message for those applications like StarOffice that do
+    // send a shutdown message themselves.
+    javaShutdown(NULL, 0);
+
+    AccessBridgeATInstance *current = ATs;
+    while (current != (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  telling %p we're going away", current->winAccessBridgeWindow);
+                SendMessage(current->winAccessBridgeWindow,
+                    AB_DLL_GOING_AWAY, (WPARAM) dialogWindow, (LPARAM) 0);
+        current = current->nextATInstance;
+    }
+
+    PrintDebugString("  finished telling ATs about our demise");
+
+        if(JavaBridgeThreadId)
+                {
+                PostThreadMessage(JavaBridgeThreadId,WM_USER+1,0,0);
+                Sleep(100);
+                }
+
+    delete ATs;
+
+    PrintDebugString("  finished deleting ATs");
+    PrintDebugString("GOODBYE CRUEL WORLD...");
+}
+
+
+void
+JavaAccessBridge::javaRun(JNIEnv *env, jobject obj) {
+    MSG msg;
+
+    PrintDebugString("JavaAccessBridge::javaRun(%p, %p) called", env, obj);
+
+    if (env->GetJavaVM(&javaVM) != 0) {
+        return; // huh!?!?!
+    }
+    PrintDebugString("  -> javaVM = %p", javaVM);
+
+    if (javaVM->AttachCurrentThread((void **) &windowsThreadJNIEnv, NULL) != 0) {
+        return; // huh!?!?!
+    }
+    PrintDebugString("  -> windowsThreadJNIEnv = %p", windowsThreadJNIEnv);
+
+    javaThreadABObject = env->NewGlobalRef(obj);
+    windowsThreadABObject = windowsThreadJNIEnv->NewGlobalRef(obj);
+
+    // initialize the Java thread AccessBridge entry points
+    javaThreadEntryPoints = new AccessBridgeJavaEntryPoints(env, javaThreadABObject);
+    if (javaThreadEntryPoints->BuildJavaEntryPoints() == FALSE) {
+        return;         // couldn't build our entry points; let's get out of here!
+    }
+    PrintDebugString("  all Java thread entry points successfully found.");
+
+    // initialize the Windows thread AccessBridge entry points
+    windowsThreadEntryPoints = new AccessBridgeJavaEntryPoints(windowsThreadJNIEnv,
+                                                               windowsThreadABObject);
+    if (windowsThreadEntryPoints->BuildJavaEntryPoints() == FALSE) {
+        return;         // couldn't build our entry points; let's get out of here!
+    }
+    PrintDebugString("  all Windows thread entry points successfully found.");
+
+
+    // open our window
+    if (initWindow() == TRUE) {
+        PrintDebugString("  Window created.  HWND = %p", dialogWindow);
+
+        // post a broadcast msg.; let other AccessBridge DLLs know we exist
+        postHelloToWindowsDLLMsg(HWND_BROADCAST);
+
+        // do that message loop thing
+        while (GetMessage(&msg, NULL, 0, 0)) {
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+        }
+    } else {
+        PrintDebugString("  FAILED TO CREATE WINDOW!!!");
+    }
+
+    javaVM->DetachCurrentThread();
+}
+
+/**
+ * Bring up our window; make a connection to the rest of the world
+ *
+ */
+BOOL
+JavaAccessBridge::initWindow() {
+    theDialogWindow = CreateDialog(windowsInstance,
+                                   "ACCESSBRIDGESTATUSWINDOW", NULL,
+                                   (DLGPROC) AccessBridgeDialogProc);
+
+    // If window could not be created, return "failure".
+    if (!theDialogWindow)
+        return FALSE;
+
+    dialogWindow = theDialogWindow;
+
+    // Make the window visible, update its client area, & return "success".
+    // DEBUG_CODE(ShowWindow (theDialogWindow, SW_SHOWNORMAL));
+    // DEBUG_CODE(UpdateWindow (theDialogWindow));
+
+    return TRUE;
+}
+
+
+
+// -----------------------
+
+
+/**
+ * postHelloToWindowsDLLMsg
+ *          - PostMessage(theFromJavaHelloMsgID) to let one or
+ *            all WindowDLLs we're here and have a vmID
+ *
+ *            destHwnd is either a single hwnd or HWND_BROADCAST
+ *              (former if a reply, latter if we're just born)
+ *            wParam is our HWND
+ *            lParam is our vmID
+ *
+ */
+void
+JavaAccessBridge::postHelloToWindowsDLLMsg(HWND destHwnd) {
+    PrintDebugString("\r\nin JavaAccessBridge::postHelloToWindowsDLLMsg");
+    PrintDebugString("  calling PostMessage(%p, %X, %p, %p)",
+                     destHwnd, theFromJavaHelloMsgID, dialogWindow, javaVM);
+    PostMessage(destHwnd, theFromJavaHelloMsgID, (WPARAM) dialogWindow, (LPARAM) dialogWindow);
+}
+
+
+// -----------------------
+
+/**
+ * sendPackage - uses SendMessage(WM_COPYDATA) to do IPC messaging
+ *                                with the Java AccessBridge DLL
+ *
+ */
+void
+JavaAccessBridge::sendPackage(char *buffer, int bufsize, HWND destHwnd) {
+    COPYDATASTRUCT toCopy;
+    toCopy.dwData = 0;          // 32-bits we could use for something...
+    toCopy.cbData = bufsize;
+    toCopy.lpData = buffer;
+
+    SendMessage(destHwnd, WM_COPYDATA, (WPARAM) dialogWindow, (LPARAM) &toCopy);
+}
+
+
+/**
+ * sendJavaEventPackage - walk through ATs, sending event messages to 'em
+ *
+ */
+void
+JavaAccessBridge::sendJavaEventPackage(char *buffer, int bufsize, long type) {
+
+    PrintDebugString("JavaAccessBridge::sendJavaEventPackage(), type = %X", type);
+
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+    }
+
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        ati->sendJavaEventPackage(buffer, bufsize, type);
+        ati = ati->nextATInstance;
+    }
+}
+
+/**
+ * sendAccessibilityEventPackage - walk through ATs, sending event messages to 'em
+ *
+ */
+void
+JavaAccessBridge::sendAccessibilityEventPackage(char *buffer, int bufsize, long type) {
+
+    PrintDebugString("JavaAccessBridge::sendAccessibilityEventPackage(), type = %X", type);
+
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+    }
+
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        ati->sendAccessibilityEventPackage(buffer, bufsize, type);
+        ati = ati->nextATInstance;
+    }
+}
+
+
+
+
+/**
+ * receiveMemoryPackage - uses Memory-Mapped files to do IPC messaging
+ *                        with the Java AccessBridge DLL, receiving the
+ *                        message from Java AccessBridge DLL by reading the
+ *                        contents of the shared memory mapped file that
+ *                        is used for Java-initiated messages
+ *
+ */
+BOOL
+JavaAccessBridge::receiveMemoryPackage(HWND srcWindow, long bufsize) {
+    char *IPCview;
+
+    PrintDebugString("\r\nJavaAccessBridge::receiveMemoryPackage(%p, %d)", srcWindow, bufsize);
+
+    // look-up the appropriate IPCview based on the srcHWND of the Windows AccessBridge DLL
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR! - ATs == 0 (shouldn't happen in receiveMemoryPackage()!");
+        return FALSE;
+    }
+    AccessBridgeATInstance *ati = ATs->findABATInstanceFromATHWND(srcWindow);
+    if (ati != (AccessBridgeATInstance *) 0) {
+        IPCview = (char *) ati->memoryMappedView;
+
+        // wait for the lock if someone else has it (re-entrancy)
+        EnterCriticalSection(&receiveMemoryIPCLock);
+        {
+            // set byte at end of buffer to indicate to caller that we have reached this point
+            IPCview[bufsize] = 1;
+
+            // process the package
+            processPackage(IPCview, bufsize);
+        }
+        // release re-entrance lock
+        LeaveCriticalSection(&receiveMemoryIPCLock);
+
+        return TRUE;
+
+    } else {
+        //DEBUG_CODE(AppendToCallInfo("ERROR receiving memory package: couldn't find srcWindow"));
+        PrintDebugString("ERROR receiving memory package: couldn't find srcWindow");
+        return FALSE;
+    }
+}
+
+/**
+ * processPackage - processes the output of SendMessage(WM_COPYDATA)
+ *                                      to do IPC messaging with the Windows AccessBridge DLL
+ *
+ */
+LRESULT
+JavaAccessBridge::processPackage(char *buffer, int bufsize) {
+    PrintDebugString("\r\nProcessing package sent from Windows, bufsize = %d:", bufsize);
+
+    PackageType *type = (PackageType *) buffer;
+    LRESULT returnVal = 0;
+    PrintDebugString("  PackageType = %X:", *type);
+    jobject rAC;
+
+    switch (*type) {
+
+
+    case cMemoryMappedFileCreatedPackage:
+        // Windows is telling us it created a memory mapped file for us to use
+        // in repsonding to various information querying packages (see below)
+        PrintDebugString("   type == cMemoryMappedFileCreatedPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage))) {
+            MemoryMappedFileCreatedPackage *pkg =
+                (MemoryMappedFileCreatedPackage *) (buffer + sizeof(PackageType));
+            returnVal = MemoryMappedFileCreated((HWND)ABLongToHandle(pkg->bridgeWindow), pkg->filename);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage));
+        }
+        break;
+
+        // ------------ information querying packages ------------------
+
+    case cReleaseJavaObjectPackage:
+        PrintDebugString("   type == cReleaseJavaObjectPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage))) {
+            ReleaseJavaObjectPackage *pkg =
+                (ReleaseJavaObjectPackage *) (buffer + sizeof(PackageType));
+            releaseJavaObject((jobject)pkg->object);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage));
+        }
+        break;
+
+    case cGetAccessBridgeVersionPackage:
+        PrintDebugString("   type == cGetAccessBridgeVersionPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage))) {
+            GetAccessBridgeVersionPackage *pkg =
+                (GetAccessBridgeVersionPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getVersionInfo(&(pkg->rVersionInfo));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage));
+        }
+        break;
+
+    case cIsJavaWindowPackage:
+        PrintDebugString("   type == cIsJavaWindowPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(IsJavaWindowPackage))) {
+            IsJavaWindowPackage *pkg =
+                (IsJavaWindowPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult =
+                windowsThreadEntryPoints->isJavaWindow(pkg->window);
+            PrintDebugString("     -> returning result = %d", pkg->rResult);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(IsJavaWindowPackage));
+        }
+        break;
+
+    case cIsSameObjectPackage:
+        PrintDebugString("   type == cIsSameObjectPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(IsSameObjectPackage))) {
+            IsSameObjectPackage *pkg =
+                (IsSameObjectPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult =
+                windowsThreadEntryPoints->isSameObject((jobject)pkg->obj1, (jobject)pkg->obj2);
+            PrintDebugString("     -> returning result = %d", pkg->rResult);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(IsSameObjectPackage));
+        }
+        break;
+
+
+    case cGetAccessibleContextFromHWNDPackage:
+        PrintDebugString("   type == cGetAccessibleContextFromHWNDPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage))) {
+            GetAccessibleContextFromHWNDPackage *pkg =
+                (GetAccessibleContextFromHWNDPackage *) (buffer + sizeof(PackageType));
+            rAC = windowsThreadEntryPoints->getAccessibleContextFromHWND(pkg->window);
+            pkg->rAccessibleContext = (JOBJECT64)rAC;
+            pkg->rVMID = HandleToLong(dialogWindow);
+            PrintDebugString("     -> returning AC = %p, vmID = %X", rAC, pkg->rVMID);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage));
+        }
+        break;
+
+
+    case cGetHWNDFromAccessibleContextPackage:
+        PrintDebugString("   type == cGetHWNDFromAccessibleContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage))) {
+            GetHWNDFromAccessibleContextPackage *pkg =
+                (GetHWNDFromAccessibleContextPackage *) (buffer + sizeof(PackageType));
+            pkg->rHWND =
+                ABHandleToLong( windowsThreadEntryPoints->getHWNDFromAccessibleContext((jobject)pkg->accessibleContext) );
+            PrintDebugString("     -> returning HWND = %p", pkg->rHWND);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage));
+        }
+        break;
+
+
+        /* ===== utility methods ===== */
+
+    case cSetTextContentsPackage:
+        PrintDebugString("   type == cSetTextContentsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(SetTextContentsPackage))) {
+            SetTextContentsPackage *pkg =
+                (SetTextContentsPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult =
+                windowsThreadEntryPoints->setTextContents((jobject)pkg->accessibleContext, pkg->text);
+            PrintDebugString("     -> returning result = %d", pkg->rResult);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(SetTextContentsPackage));
+        }
+        break;
+
+    case cGetParentWithRolePackage:
+        if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRolePackage))) {
+            GetParentWithRolePackage *pkg =
+                (GetParentWithRolePackage *) (buffer + sizeof(PackageType));
+            rAC = windowsThreadEntryPoints->getParentWithRole((jobject)pkg->accessibleContext, pkg->role);
+            pkg->rAccessibleContext = (JOBJECT64)rAC;
+            PrintDebugString("   type == cGetParentWithRolePackage");
+            PrintDebugString("     pkg->vmID: %X", pkg->vmID);
+            PrintDebugString("     pkg->accessibleContext: %p", (jobject)pkg->accessibleContext);
+            PrintDebugString("     pkg->role: %ls", pkg->role);
+            PrintDebugString("     -> returning rAccessibleContext = %p", rAC);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetParentWithRolePackage));
+        }
+        break;
+
+    case cGetTopLevelObjectPackage:
+        PrintDebugString("   type == cGetTopLevelObjectPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetTopLevelObjectPackage))) {
+            GetTopLevelObjectPackage *pkg =
+                (GetTopLevelObjectPackage *) (buffer + sizeof(PackageType));
+            rAC = windowsThreadEntryPoints->getTopLevelObject((jobject)pkg->accessibleContext);
+            pkg->rAccessibleContext = (JOBJECT64)rAC;
+            PrintDebugString("     -> returning rAccessibleContext = %p", rAC);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetTopLevelObjectPackage));
+        }
+        break;
+
+    case cGetParentWithRoleElseRootPackage:
+        PrintDebugString("   type == cGetParentWithRoleElseRootPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage))) {
+            GetParentWithRoleElseRootPackage *pkg =
+                (GetParentWithRoleElseRootPackage *) (buffer + sizeof(PackageType));
+            rAC = windowsThreadEntryPoints->getParentWithRoleElseRoot((jobject)pkg->accessibleContext, pkg->role);
+            pkg->rAccessibleContext = (JOBJECT64)rAC;
+            PrintDebugString("     -> returning rAccessibleContext = %p", rAC);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage));
+        }
+        break;
+
+    case cGetObjectDepthPackage:
+        PrintDebugString("   type == cGetObjectDepthPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetObjectDepthPackage))) {
+            GetObjectDepthPackage *pkg =
+                (GetObjectDepthPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult =
+                windowsThreadEntryPoints->getObjectDepth((jobject)pkg->accessibleContext);
+            PrintDebugString("     -> returning rResult = %d", pkg->rResult);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetObjectDepthPackage));
+        }
+        break;
+
+    case cGetActiveDescendentPackage:
+        PrintDebugString("   type == cGetActiveDescendentPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetActiveDescendentPackage))) {
+            GetActiveDescendentPackage *pkg =
+                (GetActiveDescendentPackage *) (buffer + sizeof(PackageType));
+            rAC = windowsThreadEntryPoints->getActiveDescendent((jobject)pkg->accessibleContext);
+            pkg->rAccessibleContext = (JOBJECT64)rAC;
+            PrintDebugString("     -> returning rAccessibleContext = %p", rAC);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetActiveDescendentPackage));
+        }
+        break;
+
+    case cGetAccessibleContextAtPackage:
+        PrintDebugString("   type == cGetAccessibleContextAtPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage))) {
+            GetAccessibleContextAtPackage *pkg =
+                (GetAccessibleContextAtPackage *) (buffer + sizeof(PackageType));
+            pkg->rAccessibleContext = (JOBJECT64)
+                windowsThreadEntryPoints->getAccessibleContextAt(pkg->x, pkg->y,
+                                                                 (jobject)pkg->AccessibleContext);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage));
+        }
+        break;
+
+    case cGetAccessibleContextWithFocusPackage:
+        PrintDebugString("   type == cGetAccessibleContextWithFocusPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage))) {
+            GetAccessibleContextWithFocusPackage *pkg =
+                (GetAccessibleContextWithFocusPackage *) (buffer + sizeof(PackageType));
+            pkg->rAccessibleContext = (JOBJECT64)
+                windowsThreadEntryPoints->getAccessibleContextWithFocus();
+                        pkg->rVMID =  HandleToLong(dialogWindow);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage));
+        }
+        break;
+
+    case cGetAccessibleContextInfoPackage:
+        PrintDebugString("   type == cGetAccessibleContextInfoPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage))) {
+            GetAccessibleContextInfoPackage *pkg =
+                (GetAccessibleContextInfoPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleContextInfo(
+                                                               (jobject)pkg->AccessibleContext, &(pkg->rAccessibleContextInfo));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage));
+        }
+        break;
+
+    case cGetAccessibleChildFromContextPackage:
+        PrintDebugString("   type == cGetAccessibleChildFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage))) {
+            GetAccessibleChildFromContextPackage *pkg =
+                (GetAccessibleChildFromContextPackage *) (buffer + sizeof(PackageType));
+            pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleChildFromContext(
+                                                                                              (jobject)pkg->AccessibleContext, pkg->childIndex);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage));
+        }
+        break;
+
+    case cGetAccessibleParentFromContextPackage:
+        PrintDebugString("   type == cGetAccessibleParentFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage))) {
+            GetAccessibleParentFromContextPackage *pkg =
+                (GetAccessibleParentFromContextPackage *) (buffer + sizeof(PackageType));
+            pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleParentFromContext(
+                                                                                               (jobject)pkg->AccessibleContext);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage));
+        }
+        break;
+
+        // ------------ begin AccessibleTable packages ------------------
+
+    case cGetAccessibleTableInfoPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableInfoPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage))) {
+            GetAccessibleTableInfoPackage *pkg =
+                (GetAccessibleTableInfoPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTableInfo((jobject)pkg->accessibleContext,
+                                                             &(pkg->rTableInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage));
+        }
+        break;
+
+    case cGetAccessibleTableCellInfoPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableCellInfoPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage))) {
+            GetAccessibleTableCellInfoPackage *pkg =
+                (GetAccessibleTableCellInfoPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTableCellInfo((jobject)pkg->accessibleTable, pkg->row,
+                                                                 pkg->column, &(pkg->rTableCellInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage));
+        }
+        break;
+
+    case cGetAccessibleTableRowHeaderPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableRowHeaderPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage))) {
+            GetAccessibleTableRowHeaderPackage *pkg =
+                (GetAccessibleTableRowHeaderPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTableRowHeader((jobject)pkg->accessibleContext,
+                                                                  &(pkg->rTableInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage));
+        }
+        break;
+
+    case cGetAccessibleTableColumnHeaderPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableColumnHeaderPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage))) {
+            GetAccessibleTableColumnHeaderPackage *pkg =
+                (GetAccessibleTableColumnHeaderPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTableColumnHeader((jobject)pkg->accessibleContext,
+                                                                     &(pkg->rTableInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage));
+        }
+        break;
+
+
+    case cGetAccessibleTableRowDescriptionPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableRowDescriptionPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage))) {
+            GetAccessibleTableRowDescriptionPackage *pkg =
+                (GetAccessibleTableRowDescriptionPackage *) (buffer + sizeof(PackageType));
+            pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableRowDescription(
+                                                                                                 (jobject)pkg->accessibleContext, pkg->row);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage));
+        }
+        break;
+
+    case cGetAccessibleTableColumnDescriptionPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableColumnDescriptionPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage))) {
+            GetAccessibleTableColumnDescriptionPackage *pkg =
+                (GetAccessibleTableColumnDescriptionPackage *) (buffer + sizeof(PackageType));
+            pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleTableColumnDescription(
+                                                                                                    (jobject)pkg->accessibleContext, pkg->column);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage));
+        }
+        break;
+
+    case cGetAccessibleTableColumnSelectionCountPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableColumnSelectionCountPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage))) {
+            GetAccessibleTableColumnSelectionCountPackage *pkg =
+                (GetAccessibleTableColumnSelectionCountPackage *) (buffer + sizeof(PackageType));
+            pkg->rCount = windowsThreadEntryPoints->getAccessibleTableColumnSelectionCount(
+                                                                                           (jobject)pkg->accessibleTable);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage));
+        }
+        break;
+
+    case cGetAccessibleTableRowSelectionCountPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableRowSelectionCountPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage))) {
+            GetAccessibleTableRowSelectionCountPackage *pkg =
+                (GetAccessibleTableRowSelectionCountPackage *) (buffer + sizeof(PackageType));
+
+            pkg->rCount = windowsThreadEntryPoints->getAccessibleTableRowSelectionCount(
+                                                                                        (jobject)pkg->accessibleTable);
+
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage));
+        }
+        break;
+
+    case cIsAccessibleTableRowSelectedPackage:
+        PrintDebugString("   ##### type == cIsAccessibleTableRowSelectedPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage))) {
+            IsAccessibleTableRowSelectedPackage *pkg =
+                (IsAccessibleTableRowSelectedPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult = windowsThreadEntryPoints->isAccessibleTableRowSelected(
+                                                                                  (jobject)pkg->accessibleTable, pkg->row);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage));
+        }
+        break;
+
+    case cIsAccessibleTableColumnSelectedPackage:
+        PrintDebugString("   ##### type == cIsAccessibleTableColumnSelectedPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage))) {
+            IsAccessibleTableColumnSelectedPackage *pkg =
+                (IsAccessibleTableColumnSelectedPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult = windowsThreadEntryPoints->isAccessibleTableColumnSelected(
+                                                                                     (jobject)pkg->accessibleTable, pkg->column);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage));
+        }
+        break;
+
+    case cGetAccessibleTableColumnSelectionsPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableColumnSelectionsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage))) {
+            GetAccessibleTableColumnSelectionsPackage *pkg =
+                (GetAccessibleTableColumnSelectionsPackage *) (buffer + sizeof(PackageType));
+            PrintDebugString("     ##### cGetAccessibleTableColumnSelectionsPackage count=%d", pkg->count);
+            windowsThreadEntryPoints->getAccessibleTableColumnSelections(
+                                                                         (jobject)pkg->accessibleTable, pkg->count, pkg->rSelections);
+
+            for (int i = 0; i < pkg->count; i++) {
+                PrintDebugString("     ##### cGetAccessibleTableColumnSelectionsPackage(%d)=%d", i, pkg->rSelections[i]);
+            }
+
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage));
+        }
+        break;
+
+
+    case cGetAccessibleTableRowSelectionsPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableRowSelectionsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage))) {
+            GetAccessibleTableRowSelectionsPackage *pkg =
+                (GetAccessibleTableRowSelectionsPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTableRowSelections(
+                                                                      (jobject)pkg->accessibleTable, pkg->count, pkg->rSelections);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage));
+        }
+        break;
+
+    case cGetAccessibleTableRowPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableRowPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage))) {
+            GetAccessibleTableRowPackage *pkg =
+                (GetAccessibleTableRowPackage *) (buffer + sizeof(PackageType));
+            pkg->rRow = windowsThreadEntryPoints->getAccessibleTableRow(
+                                                                        (jobject)pkg->accessibleTable, pkg->index);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage));
+        }
+        break;
+
+    case cGetAccessibleTableColumnPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableColumnPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage))) {
+            GetAccessibleTableColumnPackage *pkg =
+                (GetAccessibleTableColumnPackage *) (buffer + sizeof(PackageType));
+            pkg->rColumn = windowsThreadEntryPoints->getAccessibleTableColumn(
+                                                                              (jobject)pkg->accessibleTable, pkg->index);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage));
+        }
+        break;
+
+    case cGetAccessibleTableIndexPackage:
+        PrintDebugString("   ##### type == cGetAccessibleTableIndexPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage))) {
+            GetAccessibleTableIndexPackage *pkg =
+                (GetAccessibleTableIndexPackage *) (buffer + sizeof(PackageType));
+            pkg->rIndex = windowsThreadEntryPoints->getAccessibleTableIndex(
+                                                                            (jobject)pkg->accessibleTable, pkg->row, pkg->column);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage));
+        }
+        break;
+
+        // ------------ end AccessibleTable packages ------------------
+
+
+        // ------------ begin AccessibleRelationSet packages ------------------
+
+    case cGetAccessibleRelationSetPackage:
+        PrintDebugString("   ##### type == cGetAccessibleRelationSetPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage))) {
+            GetAccessibleRelationSetPackage *pkg =
+                (GetAccessibleRelationSetPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleRelationSet(
+                                                               (jobject)pkg->accessibleContext, &(pkg->rAccessibleRelationSetInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage));
+        }
+        break;
+
+        // ------------ end AccessibleRelationSet packages ------------------
+
+        // ------------ begin AccessibleHypertext packages ------------------
+
+    case cGetAccessibleHypertextPackage:
+        PrintDebugString("   ##### type == cGetAccessibleHypertextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage))) {
+            GetAccessibleHypertextPackage *pkg =
+                (GetAccessibleHypertextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleHypertext(
+                                                             (jobject)pkg->accessibleContext, &(pkg->rAccessibleHypertextInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage));
+        }
+        break;
+
+    case cActivateAccessibleHyperlinkPackage:
+        PrintDebugString("   ##### type == cActivateAccessibleHyperlinkPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage))) {
+            ActivateAccessibleHyperlinkPackage *pkg =
+                (ActivateAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult = windowsThreadEntryPoints->activateAccessibleHyperlink(
+                                                                                 (jobject)pkg->accessibleContext, (jobject)pkg->accessibleHyperlink);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage));
+        }
+        break;
+
+    case cGetAccessibleHyperlinkCountPackage:
+        PrintDebugString("   ##### type == cGetAccessibleHyperlinkCountPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage))) {
+            GetAccessibleHyperlinkCountPackage *pkg =
+                (GetAccessibleHyperlinkCountPackage *) (buffer + sizeof(PackageType));
+            pkg->rLinkCount = windowsThreadEntryPoints->getAccessibleHyperlinkCount(
+                                                                                    (jobject)pkg->accessibleContext);
+            PrintDebugString("   ##### processing succeeded: pkg->rLinkCount = %d", pkg->rLinkCount);
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage));
+        }
+        break;
+
+    case cGetAccessibleHypertextExtPackage:
+        PrintDebugString("   ##### type == cGetAccessibleHypertextExtPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage))) {
+            GetAccessibleHypertextExtPackage *pkg =
+                (GetAccessibleHypertextExtPackage *) (buffer + sizeof(PackageType));
+            pkg->rSuccess = windowsThreadEntryPoints->getAccessibleHypertextExt(
+                                                                                (jobject)pkg->accessibleContext, pkg->startIndex, &(pkg->rAccessibleHypertextInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage));
+        }
+        break;
+
+    case cGetAccessibleHypertextLinkIndexPackage:
+        PrintDebugString("   ##### type == cGetAccessibleHypertextLinkIndexPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage))) {
+            GetAccessibleHypertextLinkIndexPackage *pkg =
+                (GetAccessibleHypertextLinkIndexPackage *) (buffer + sizeof(PackageType));
+            pkg->rLinkIndex = windowsThreadEntryPoints->getAccessibleHypertextLinkIndex(
+                                                                                        (jobject)pkg->hypertext, pkg->charIndex);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage));
+        }
+        break;
+
+    case cGetAccessibleHyperlinkPackage:
+        PrintDebugString("   ##### type == cGetAccessibleHyperlinkPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage))) {
+            GetAccessibleHyperlinkPackage *pkg =
+                (GetAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleHyperlink((jobject)pkg->hypertext, pkg->linkIndex,
+                                                             &(pkg->rAccessibleHyperlinkInfo));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage));
+        }
+        break;
+
+        // ------------ end AccessibleHypertext packages
+
+        // ------------ begin Accessible KeyBindings, Icons and Actions
+
+    case cGetAccessibleKeyBindingsPackage:
+        PrintDebugString("   ##### type == cGetAccessibleKeyBindingsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage))) {
+            GetAccessibleKeyBindingsPackage *pkg =
+                (GetAccessibleKeyBindingsPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleKeyBindings (
+                                                                (jobject)pkg->accessibleContext, &(pkg->rAccessibleKeyBindings));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage));
+        }
+        break;
+
+    case cGetAccessibleIconsPackage:
+        PrintDebugString("   ##### type == cGetAccessibleIconsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleIconsPackage))) {
+            GetAccessibleIconsPackage *pkg =
+                (GetAccessibleIconsPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleIcons (
+                                                          (jobject)pkg->accessibleContext, &(pkg->rAccessibleIcons));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleIconsPackage));
+        }
+        break;
+
+
+    case cGetAccessibleActionsPackage:
+        PrintDebugString("   ##### type == cGetAccessibleActionsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleActionsPackage))) {
+            GetAccessibleActionsPackage *pkg =
+                (GetAccessibleActionsPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleActions (
+                                                            (jobject)pkg->accessibleContext, &(pkg->rAccessibleActions));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleActionsPackage));
+        }
+        break;
+
+    case cDoAccessibleActionsPackage:
+        PrintDebugString("   ##### type == cDoAccessibleActionsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(DoAccessibleActionsPackage))) {
+            DoAccessibleActionsPackage *pkg =
+                (DoAccessibleActionsPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult =
+                windowsThreadEntryPoints->doAccessibleActions((jobject)pkg->accessibleContext, &(pkg->actionsToDo),
+                                                              &(pkg->failure));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(DoAccessibleActionsPackage));
+        }
+        break;
+
+        // ------------ begin addtional methods for Teton
+
+    case cGetVirtualAccessibleNamePackage:
+        PrintDebugString("   ##### type == GetVirtualAccessibleNamePackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage))) {
+            GetVirtualAccessibleNamePackage *pkg =
+                (GetVirtualAccessibleNamePackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getVirtualAccessibleName ((const jobject)pkg->accessibleContext,
+                                                             pkg->rName,
+                                                             pkg->len);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage));
+        }
+        break;
+
+    case cRequestFocusPackage:
+        PrintDebugString("   ##### type == RequestFocusPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(RequestFocusPackage))) {
+            RequestFocusPackage *pkg =
+                (RequestFocusPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->requestFocus (
+                                                    (jobject)pkg->accessibleContext);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(RequestFocusPackage));
+        }
+        break;
+
+    case cSelectTextRangePackage:
+        PrintDebugString("   ##### type == SelectTextRangePackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(SelectTextRangePackage))) {
+            SelectTextRangePackage *pkg =
+                (SelectTextRangePackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->selectTextRange (
+                                                       (jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(SelectTextRangePackage));
+        }
+        break;
+
+    case cGetTextAttributesInRangePackage:
+        PrintDebugString("   ##### type == GetTextAttributesInRangePackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage))) {
+            GetTextAttributesInRangePackage *pkg =
+                (GetTextAttributesInRangePackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getTextAttributesInRange (
+                                                                (jobject)pkg->accessibleContext, pkg->startIndex, pkg->endIndex,
+                                                                (AccessibleTextAttributesInfo *)&(pkg->attributes),
+                                                                &(pkg->rLength));
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage));
+        }
+        break;
+
+
+    case cGetVisibleChildrenCountPackage:
+        PrintDebugString("   ##### type == GetVisibleChildrenCountPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage))) {
+            GetVisibleChildrenCountPackage *pkg =
+                (GetVisibleChildrenCountPackage *) (buffer + sizeof(PackageType));
+            pkg->rChildrenCount = windowsThreadEntryPoints->getVisibleChildrenCount ((jobject)pkg->accessibleContext);
+
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage));
+        }
+        break;
+
+    case cGetVisibleChildrenPackage:
+        PrintDebugString("   ##### type == GetVisibleChildrenPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetVisibleChildrenPackage))) {
+            GetVisibleChildrenPackage *pkg =
+                (GetVisibleChildrenPackage *) (buffer + sizeof(PackageType));
+            pkg->rSuccess = windowsThreadEntryPoints->getVisibleChildren ((jobject)pkg->accessibleContext,
+                                                                          pkg->startIndex,
+                                                                          &(pkg->rVisibleChildrenInfo));
+
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetVisibleChildrenPackage));
+        }
+        break;
+
+    case cSetCaretPositionPackage:
+        PrintDebugString("   ##### type == SetCaretPositionPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(SetCaretPositionPackage))) {
+            SetCaretPositionPackage *pkg =
+                (SetCaretPositionPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->setCaretPosition (
+                                                        (jobject)pkg->accessibleContext, pkg->position);
+            PrintDebugString("   ##### processing succeeded");
+        } else {
+            PrintDebugString("   ##### processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(SetCaretPositionPackage));
+        }
+        break;
+
+        // ------------ end additional methods for Teton
+
+        // ------------ end Accessible KeyBindings, Icons and Actions
+
+        // ------------ Accessible Text packages ------------------
+
+    case cGetAccessibleTextInfoPackage:
+        PrintDebugString("   type == cGetAccessibleTextInfoPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage))) {
+            GetAccessibleTextInfoPackage *pkg =
+                (GetAccessibleTextInfoPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTextInfo((jobject)pkg->AccessibleContext,
+                                                            &(pkg->rTextInfo), pkg->x, pkg->y);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage));
+        }
+        break;
+
+    case cGetAccessibleTextItemsPackage:
+        PrintDebugString("   type == cGetAccessibleTextItemsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextItemsPackage))) {
+            GetAccessibleTextItemsPackage *pkg =
+                (GetAccessibleTextItemsPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTextItems((jobject)pkg->AccessibleContext,
+                                                             &(pkg->rTextItemsInfo), pkg->index);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage));
+        }
+        break;
+
+    case cGetAccessibleTextSelectionInfoPackage:
+        PrintDebugString("   type == cGetAccessibleTextSelectionInfoPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage))) {
+            GetAccessibleTextSelectionInfoPackage *pkg =
+                (GetAccessibleTextSelectionInfoPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTextSelectionInfo(
+                                                                     (jobject)pkg->AccessibleContext, &(pkg->rTextSelectionItemsInfo));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage));
+        }
+        break;
+
+    case cGetAccessibleTextAttributeInfoPackage:
+        PrintDebugString("   type == cGetAccessibleTextAttributeInfoPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage))) {
+            GetAccessibleTextAttributeInfoPackage *pkg =
+                (GetAccessibleTextAttributeInfoPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTextAttributes(
+                                                                  (jobject)pkg->AccessibleContext, pkg->index, (AccessibleTextAttributesInfo *) &(pkg->rAttributeInfo));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage));
+        }
+        break;
+
+    case cGetAccessibleTextRectInfoPackage:
+        PrintDebugString("   type == cGetAccessibleTextRectInfoPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage))) {
+            GetAccessibleTextRectInfoPackage *pkg =
+                (GetAccessibleTextRectInfoPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTextRect((jobject)pkg->AccessibleContext,
+                                                            &(pkg->rTextRectInfo), pkg->index);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage));
+        }
+        break;
+
+    case cGetCaretLocationPackage:
+        PrintDebugString("   type == cGetCaretLocationPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetCaretLocationPackage))) {
+            GetCaretLocationPackage *pkg =
+                (GetCaretLocationPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getCaretLocation((jobject)pkg->AccessibleContext,
+                                                            &(pkg->rTextRectInfo), pkg->index);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetCaretLocationPackage));
+        }
+        break;
+
+    case cGetAccessibleTextLineBoundsPackage:
+        PrintDebugString("   type == cGetAccessibleTextLineBoundsPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage))) {
+            GetAccessibleTextLineBoundsPackage *pkg =
+                (GetAccessibleTextLineBoundsPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTextLineBounds((jobject)pkg->AccessibleContext,
+                                                                  pkg->index, &(pkg->rLineStart), &(pkg->rLineEnd));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage));
+        }
+        break;
+
+    case cGetAccessibleTextRangePackage:
+        PrintDebugString("   type == cGetAccessibleTextRangePackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage))) {
+            GetAccessibleTextRangePackage *pkg =
+                (GetAccessibleTextRangePackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getAccessibleTextRange((jobject)pkg->AccessibleContext,
+                                                             pkg->start, pkg->end, (wchar_t *) &(pkg->rText), (sizeof(pkg->rText) / sizeof(wchar_t)));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage));
+        }
+        break;
+
+
+        // ------------ Accessible Value packages ------------------
+
+    case cGetCurrentAccessibleValueFromContextPackage:
+        PrintDebugString("   type == cGetCurrentAccessibleValueFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage))) {
+            GetCurrentAccessibleValueFromContextPackage *pkg =
+                (GetCurrentAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getCurrentAccessibleValueFromContext((jobject)pkg->AccessibleContext,
+                                                                           (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t)));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage));
+        }
+        break;
+
+    case cGetMaximumAccessibleValueFromContextPackage:
+        PrintDebugString("   type == cGetMaximumAccessibleValueFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage))) {
+            GetMaximumAccessibleValueFromContextPackage *pkg =
+                (GetMaximumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getMaximumAccessibleValueFromContext((jobject)pkg->AccessibleContext,
+                                                                           (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t)));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage));
+        }
+        break;
+
+    case cGetMinimumAccessibleValueFromContextPackage:
+        PrintDebugString("   type == cGetMinimumAccessibleValueFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage))) {
+            GetMinimumAccessibleValueFromContextPackage *pkg =
+                (GetMinimumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->getMinimumAccessibleValueFromContext((jobject)pkg->AccessibleContext,
+                                                                           (wchar_t *) &(pkg->rValue), (sizeof(pkg->rValue) / sizeof(wchar_t)));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage));
+        }
+        break;
+
+        // ------------ Accessible Selection packages ------------------
+
+    case cAddAccessibleSelectionFromContextPackage:
+        PrintDebugString("   type == cAddAccessibleSelectionFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage))) {
+            AddAccessibleSelectionFromContextPackage *pkg =
+                (AddAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->addAccessibleSelectionFromContext((jobject)pkg->AccessibleContext,
+                                                                        pkg->index);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage));
+        }
+        break;
+
+    case cClearAccessibleSelectionFromContextPackage:
+        PrintDebugString("   type == cClearAccessibleSelectionFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage))) {
+            ClearAccessibleSelectionFromContextPackage *pkg =
+                (ClearAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->clearAccessibleSelectionFromContext((jobject)pkg->AccessibleContext);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage));
+        }
+        break;
+
+    case cGetAccessibleSelectionFromContextPackage:
+        PrintDebugString("   type == cGetAccessibleSelectionFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage))) {
+            GetAccessibleSelectionFromContextPackage *pkg =
+                (GetAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+            pkg->rAccessibleContext = (JOBJECT64)windowsThreadEntryPoints->getAccessibleSelectionFromContext(
+                                                                                                  (jobject)pkg->AccessibleContext, pkg->index);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage));
+        }
+        break;
+
+    case cGetAccessibleSelectionCountFromContextPackage:
+        PrintDebugString("   type == cGetAccessibleSelectionCountFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage))) {
+            GetAccessibleSelectionCountFromContextPackage *pkg =
+                (GetAccessibleSelectionCountFromContextPackage *) (buffer + sizeof(PackageType));
+            pkg->rCount = windowsThreadEntryPoints->getAccessibleSelectionCountFromContext(
+                                                                                           (jobject)pkg->AccessibleContext);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage));
+        }
+        break;
+
+    case cIsAccessibleChildSelectedFromContextPackage:
+        PrintDebugString("   type == cIsAccessibleChildSelectedFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage))) {
+            IsAccessibleChildSelectedFromContextPackage *pkg =
+                (IsAccessibleChildSelectedFromContextPackage *) (buffer + sizeof(PackageType));
+            pkg->rResult = windowsThreadEntryPoints->isAccessibleChildSelectedFromContext(
+                                                                                          (jobject)pkg->AccessibleContext, pkg->index);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage));
+        }
+        break;
+
+    case cRemoveAccessibleSelectionFromContextPackage:
+        PrintDebugString("   type == cRemoveAccessibleSelectionFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage))) {
+            RemoveAccessibleSelectionFromContextPackage *pkg =
+                (RemoveAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->removeAccessibleSelectionFromContext((jobject)pkg->AccessibleContext,
+                                                                           pkg->index);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage));
+        }
+        break;
+
+    case cSelectAllAccessibleSelectionFromContextPackage:
+        PrintDebugString("   type == cSelectAllAccessibleSelectionFromContextPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage))) {
+            SelectAllAccessibleSelectionFromContextPackage *pkg =
+                (SelectAllAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+            windowsThreadEntryPoints->selectAllAccessibleSelectionFromContext((jobject)pkg->AccessibleContext);
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage));
+        }
+        break;
+
+
+        // ------------ event notification management packages ------------------
+
+    case cAddJavaEventNotificationPackage:
+        PrintDebugString("   type = cAddJavaEventNotificationPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage))) {
+            AddJavaEventNotificationPackage *pkg =
+                (AddJavaEventNotificationPackage *) (buffer + sizeof(PackageType));
+            addJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow ) );
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage));
+        }
+        break;
+
+    case cRemoveJavaEventNotificationPackage:
+        PrintDebugString("   type = cRemoveJavaEventNotificationPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage))) {
+            RemoveJavaEventNotificationPackage *pkg =
+                (RemoveJavaEventNotificationPackage *) (buffer + sizeof(PackageType));
+            removeJavaEventNotification(pkg->type, (HWND)ABLongToHandle( pkg->DLLwindow ));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage));
+        }
+        break;
+
+    case cAddAccessibilityEventNotificationPackage:
+        PrintDebugString("   type = cAddAccessibilityEventNotificationPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage))) {
+            AddAccessibilityEventNotificationPackage *pkg =
+                (AddAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));
+            addAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage));
+        }
+        break;
+
+    case cRemoveAccessibilityEventNotificationPackage:
+        PrintDebugString("   type = cRemoveAccessibilityEventNotificationPackage");
+        if (bufsize == (sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage))) {
+            RemoveAccessibilityEventNotificationPackage *pkg =
+                (RemoveAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));
+            removeAccessibilityEventNotification(pkg->type, (HWND)ABLongToHandle(pkg->DLLwindow));
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage));
+        }
+        break;
+
+    default:
+        PrintDebugString("   processing FAILED!! -> don't know how to handle type = %X", *type);
+        returnVal = -1;
+        break;
+    }
+
+    PrintDebugString("   package processing completed");
+    return returnVal;
+}
+
+
+// -----------------------------
+
+
+/**
+ * MemoryMappedFileCreated
+ *          - WindowsDLL letting us know it's created a memory-mapped file
+ *            for IPC.  We need to open it and write a magic string into
+ *            it to let the WindowsDLL know all is OK.  Also we need to
+ *            set up our own data structures to communicate with the
+ *            WindowsDLL
+ *
+ */
+LRESULT
+JavaAccessBridge::MemoryMappedFileCreated(HWND ATBridgeDLLWindow, char *filename) {
+    PrintDebugString("  in MemoryMappedFileCreated(%p, %s)!", ATBridgeDLLWindow, filename);
+    AccessBridgeATInstance *newAT =
+        new AccessBridgeATInstance(dialogWindow, ATBridgeDLLWindow, filename, ATs);
+    PrintDebugString("    just created a new ATInstance = %p, old = %p", newAT, ATs);
+    ATs = newAT;
+
+    LRESULT returnVal = ATs->initiateIPC();
+    if (returnVal == 0) {
+        PrintDebugString("  Successfully initiated IPC with AT!!!");
+    } else {
+        PrintDebugString("  ERROR: Failed to initiate IPC with AT!!!");
+    }
+
+    return returnVal;
+}
+
+
+/**
+ * WindowsATDestroyed - lets the JavaABDLL know a Windows AT disappeared
+ *
+ */
+void
+JavaAccessBridge::WindowsATDestroyed(HWND ATBridgeDLLWindow) {
+    PrintDebugString("\r\nin JavaAccessBridge::WindowsATDestroyed(%p)", ATBridgeDLLWindow);
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! -> ATs == 0! (shouldn't happen here)");
+        return;
+    }
+
+    AccessBridgeATInstance *currentAT = ATs;
+    AccessBridgeATInstance *previousAT = ATs;
+    if (ATs->winAccessBridgeWindow == ATBridgeDLLWindow) {
+        ATs = ATs->nextATInstance;
+        // remove event notification for this AT
+        removeJavaEventNotification(currentAT->javaEventMask, ATBridgeDLLWindow);
+        removeAccessibilityEventNotification(currentAT->accessibilityEventMask, ATBridgeDLLWindow);
+        delete currentAT;
+        PrintDebugString("  data structures successfully removed");
+    } else {
+        while (currentAT != (AccessBridgeATInstance *) NULL) {
+            if (currentAT->winAccessBridgeWindow == ATBridgeDLLWindow) {
+                previousAT->nextATInstance = currentAT->nextATInstance;
+                delete currentAT;
+                PrintDebugString("  data structures successfully removed");
+                return;
+            } else {
+                previousAT = currentAT;
+                currentAT = currentAT->nextATInstance;
+            }
+        }
+        PrintDebugString("  ERROR!! couldn't find matching data structures!");
+    }
+}
+
+
+// -----------------------------
+
+
+/**
+ * releaseJavaObject - lets the JavaVM know it can release the Java Object
+ *
+ * Note: once you have made this call, the JavaVM will garbage collect
+ * the jobject you pass in.  If you later use that jobject in another
+ * call, you will cause all maner of havoc!
+ *
+ */
+void
+JavaAccessBridge::releaseJavaObject(jobject object) {
+    PrintDebugString("In JavaAccessBridge::releaseJavaObject");
+    PrintDebugString("  object X: %p", object);
+    if (windowsThreadJNIEnv != (JNIEnv *) 0) {
+        windowsThreadJNIEnv->DeleteGlobalRef(object);
+        PrintDebugString("  global reference deleted.", object);
+    } else {
+        PrintDebugString("  Error! windowsThreadJNIEnv == 0");
+    }
+}
+
+// -----------------------------
+
+/**
+ * addJavaEventNotification - this AT now wants this type of events
+ *
+ */
+void
+JavaAccessBridge::addJavaEventNotification(jlong type, HWND DLLwindow) {
+    // walk through list of ATs, find this one and add this type
+    // and, if we weren't listening for these before, ask Java for 'em
+    PrintDebugString("  adding Java event type %016I64X to HWND %p", type, DLLwindow);
+    AccessBridgeATInstance *ati = ATs;
+    long globalEventMask = 0;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->winAccessBridgeWindow == DLLwindow) {
+            ati->javaEventMask |= type;
+            PrintDebugString("  found HWND, javaEventMask now is %X", ati->javaEventMask);
+        } else {
+            globalEventMask |= ati->javaEventMask;
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  union of all Java AT event masks: %X", globalEventMask);
+    if (!(globalEventMask & type)) {
+        // no other ATs wanted this event;
+        // start getting them from Java
+        PrintDebugString("  no other AT wanted this Java event (so not registered); adding to AccessBridge.java");
+        windowsThreadEntryPoints->addJavaEventNotification(type);
+    }
+}
+
+/**
+ * removeJavaEventNotification - this AT no longer wants this type of events
+ *
+ */
+void
+JavaAccessBridge::removeJavaEventNotification(jlong type, HWND DLLwindow) {
+    // walk through list of ATs, find this one and remove this type
+    // and, if no other AT wants 'em either, tell Java we no longer want 'em
+    PrintDebugString("  removing Java event type %016I64X from HWND %p", type, DLLwindow);
+    AccessBridgeATInstance *ati = ATs;
+    long globalEventMask = 0;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->winAccessBridgeWindow == DLLwindow) {
+            ati->javaEventMask &= (0xFFFFFFFF - type);
+            PrintDebugString("  found HWND, javaEventMask now is %X", ati->javaEventMask);
+        } else {
+            globalEventMask |= ati->javaEventMask;
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  union of all Java AT event masks: %X", globalEventMask);
+    if (!(globalEventMask & type)) {
+        // no other ATs wanted this event;
+        // stop getting them from Java
+        PrintDebugString("  no other AT wanted this Java event (so can remove); removing from AccessBridge.java");
+        windowsThreadEntryPoints->removeJavaEventNotification(type);
+    }
+}
+
+
+/**
+ * addAccesibilityEventNotification - this AT now wants this type of events
+ *
+ */
+void
+JavaAccessBridge::addAccessibilityEventNotification(jlong type, HWND DLLwindow) {
+    // walk through list of ATs, find this one and add this type
+    // and, if we weren't listening for these before, ask Java for 'em
+    PrintDebugString("  adding Accesibility event type %016I64X to HWND %p", type, DLLwindow);
+    AccessBridgeATInstance *ati = ATs;
+    long globalEventMask = 0;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->winAccessBridgeWindow == DLLwindow) {
+            ati->accessibilityEventMask |= type;
+            PrintDebugString("  found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask);
+        } else {
+            globalEventMask |= ati->accessibilityEventMask;
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  union of all Accessibility AT event masks: %X", globalEventMask);
+    if (!(globalEventMask & type)) {
+        // no other ATs wanted this event;
+        // start getting them from Java
+        PrintDebugString("  no other AT wanted this Accesibility event (so not registered); adding to AccessBridge.java");
+        windowsThreadEntryPoints->addAccessibilityEventNotification(type);
+    }
+}
+
+/**
+ * removeAccesibilityEventNotification - this AT no longer wants this type of events
+ *
+ */
+void
+JavaAccessBridge::removeAccessibilityEventNotification(jlong type, HWND DLLwindow) {
+    // walk through list of ATs, find this one and remove this type
+    // and, if no other AT wants 'em either, tell Java we no longer want 'em
+    PrintDebugString("  removing Accesibility event type %016I64X from HWND %p", type, DLLwindow);
+    AccessBridgeATInstance *ati = ATs;
+    long globalEventMask = 0;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->winAccessBridgeWindow == DLLwindow) {
+            ati->accessibilityEventMask &= (0xFFFFFFFF - type);
+            PrintDebugString("  found HWND, accessibilityEventMask now is %X", ati->accessibilityEventMask);
+        } else {
+            globalEventMask |= ati->accessibilityEventMask;
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  union of all Accessibility AT event masks: %X", globalEventMask);
+    if (!(globalEventMask & type)) {
+        // no other ATs wanted this event;
+        // stop getting them from Java
+        PrintDebugString("  no other AT wanted this Accessibility event (so can remove); removing from AccessBridge.java");
+        windowsThreadEntryPoints->removeAccessibilityEventNotification(type);
+    }
+}
+
+
+
+
+/**
+ * firePropertyCaretChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyCaretChange(JNIEnv *env, jobject callingObj,
+                                          jobject event, jobject source,
+                                          jint oldValue, jint newValue) {
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyCaretChanged(%p, %p, %p, %p, %d, %d)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    char buffer[sizeof(PackageType) + sizeof(PropertyCaretChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyCaretChangePackage *pkg = (PropertyCaretChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyCaretChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            pkg->oldPosition = oldValue;
+            pkg->newPosition = newValue;
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyCaretChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyCaretChange event");
+}
+
+/**
+ * firePropertyDescriptionChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyDescriptionChange(JNIEnv *env, jobject callingObj,
+                                                jobject event, jobject source,
+                                                jstring oldValue, jstring newValue){
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyDescriptionChanged(%p, %p, %p, %p, %p, %p)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    const wchar_t *stringBytes;
+    char buffer[sizeof(PackageType) + sizeof(PropertyDescriptionChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyDescriptionChangePackage *pkg = (PropertyDescriptionChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyDescriptionChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyCaretChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            if (oldValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->oldDescription, stringBytes, (sizeof(pkg->oldDescription) / sizeof(wchar_t)));
+                env->ReleaseStringChars(oldValue, stringBytes);
+            } else {
+                wcsncpy(pkg->oldDescription, L"(null)", (sizeof(pkg->oldDescription) / sizeof(wchar_t)));
+            }
+
+            if (newValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);
+                if (stringBytes == NULL) {
+                   if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->newDescription, stringBytes, (sizeof(pkg->newDescription) / sizeof(wchar_t)));
+                env->ReleaseStringChars(newValue, stringBytes);
+            } else {
+                wcsncpy(pkg->newDescription, L"(null)", (sizeof(pkg->newDescription) / sizeof(wchar_t)));
+            }
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyDescriptionChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyDescriptionChange event");
+}
+
+/**
+ * firePropertyNameChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyNameChange(JNIEnv *env, jobject callingObj,
+                                         jobject event, jobject source,
+                                         jstring oldValue, jstring newValue){
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyNameChanged(%p, %p, %p, %p, %p, %p)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    const wchar_t *stringBytes;
+    char buffer[sizeof(PackageType) + sizeof(PropertyNameChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyNameChangePackage *pkg = (PropertyNameChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyNameChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyNameChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            if (oldValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->oldName, stringBytes, (sizeof(pkg->oldName) / sizeof(wchar_t)));
+                env->ReleaseStringChars(oldValue, stringBytes);
+            } else {
+                wcsncpy(pkg->oldName, L"(null)", (sizeof(pkg->oldName) / sizeof(wchar_t)));
+            }
+
+            if (newValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->newName, stringBytes, (sizeof(pkg->newName) / sizeof(wchar_t)));
+                env->ReleaseStringChars(newValue, stringBytes);
+            } else {
+                wcsncpy(pkg->newName, L"(null)", (sizeof(pkg->newName) / sizeof(wchar_t)));
+            }
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyNameChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyNameChange event");
+}
+
+
+/**
+ * firePropertySelectionChange
+ *
+ */
+void
+JavaAccessBridge::firePropertySelectionChange(JNIEnv *env, jobject callingObj,
+                                              jobject event, jobject source) {
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertySelectionChanged(%p, %p, %p, %p)",
+                     env, callingObj, event, source);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    char buffer[sizeof(PackageType) + sizeof(PropertySelectionChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertySelectionChangePackage *pkg = (PropertySelectionChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertySelectionChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertySelectionChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertySelectionChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertySelectionChange event");
+}
+
+
+/**
+ * firePropertyStateChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyStateChange(JNIEnv *env, jobject callingObj,
+                                          jobject event, jobject source,
+                                          jstring oldValue, jstring newValue){
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyStateChanged(%p, %p, %p, %p, %p, %p)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    const wchar_t *stringBytes;
+    char buffer[sizeof(PackageType) + sizeof(PropertyStateChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyStateChangePackage *pkg = (PropertyStateChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyStateChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyStateChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            if (oldValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->oldState, stringBytes, (sizeof(pkg->oldState) / sizeof(wchar_t)));
+                env->ReleaseStringChars(oldValue, stringBytes);
+            } else {
+                wcsncpy(pkg->oldState, L"(null)", (sizeof(pkg->oldState) / sizeof(wchar_t)));
+            }
+
+            if (newValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->newState, stringBytes, (sizeof(pkg->newState) / sizeof(wchar_t)));
+                env->ReleaseStringChars(newValue, stringBytes);
+            } else {
+                wcsncpy(pkg->newState, L"(null)", (sizeof(pkg->newState) / sizeof(wchar_t)));
+            }
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyStateChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyStateChange event");
+}
+
+
+/**
+ * firePropertyTextChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyTextChange(JNIEnv *env, jobject callingObj,
+                                         jobject event, jobject source) {
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTextChanged(%p, %p, %p, %p)",
+                     env, callingObj, event, source);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    char buffer[sizeof(PackageType) + sizeof(PropertyTextChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyTextChangePackage *pkg = (PropertyTextChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyTextChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyTextChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTextChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyTextChange event");
+}
+
+
+/**
+ * firePropertyValueChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyValueChange(JNIEnv *env, jobject callingObj,
+                                          jobject event, jobject source,
+                                          jstring oldValue, jstring newValue){
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyValueChanged(%p, %p, %p, %p, %p, %p)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    const wchar_t *stringBytes;
+    char buffer[sizeof(PackageType) + sizeof(PropertyValueChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyValueChangePackage *pkg = (PropertyValueChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyValueChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyValueChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            if (oldValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t)));
+                env->ReleaseStringChars(oldValue, stringBytes);
+            } else {
+                wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t)));
+            }
+
+            if (newValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t)));
+                env->ReleaseStringChars(newValue, stringBytes);
+            } else {
+                wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t)));
+            }
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyValueChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyValueChange event");
+}
+
+/**
+ * firePropertyVisibleDataChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyVisibleDataChange(JNIEnv *env, jobject callingObj,
+                                                jobject event, jobject source) {
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChanged(%p, %p, %p, %p)",
+                     env, callingObj, event, source);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    char buffer[sizeof(PackageType) + sizeof(PropertyVisibleDataChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyVisibleDataChangePackage *pkg = (PropertyVisibleDataChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyVisibleDataChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyVisibleDataChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyVisibleDataChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyVisibleDataChange event");
+}
+
+
+/**
+ * firePropertyChildChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyChildChange(JNIEnv *env, jobject callingObj,
+                                          jobject event, jobject source,
+                                          jobject oldValue, jobject newValue){
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyChildPropertyChanged(%p, %p, %p, %p, %p, %p)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    char buffer[sizeof(PackageType) + sizeof(PropertyChildChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyChildChangePackage *pkg = (PropertyChildChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyChildChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyChildChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+            pkg->oldChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue);
+            pkg->newChildAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+            PrintDebugString("  GlobalRef'd OldChildAC: %p", pkg->oldChildAccessibleContext);
+            PrintDebugString("  GlobalRef'd NewChildAC: %p", pkg->newChildAccessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+            PrintDebugString("  GlobalRef'd OldChildAC: %016I64X", pkg->oldChildAccessibleContext);
+            PrintDebugString("  GlobalRef'd NewChildAC: %016I64X", pkg->newChildAccessibleContext);
+#endif
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyChildChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyChildChange event");
+}
+
+
+/**
+ * firePropertyActiveDescendentChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyActiveDescendentChange(JNIEnv *env, jobject callingObj,
+                                                     jobject event, jobject source,
+                                                     jobject oldValue, jobject newValue){
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentPropertyChanged(%p, %p, %p, %p, %p, %p)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    char buffer[sizeof(PackageType) + sizeof(PropertyActiveDescendentChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyActiveDescendentChangePackage *pkg = (PropertyActiveDescendentChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyActiveDescendentChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyActiveDescendentChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+            pkg->oldActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(oldValue);
+            pkg->newActiveDescendentAccessibleContext = (JOBJECT64)env->NewGlobalRef(newValue);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+            PrintDebugString("  GlobalRef'd OldActiveDescendentAC: %p", pkg->oldActiveDescendentAccessibleContext);
+            PrintDebugString("  GlobalRef'd NewActiveDescendentAC: %p", pkg->newActiveDescendentAccessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+            PrintDebugString("  GlobalRef'd OldActiveDescendentAC: %016I64X", pkg->oldActiveDescendentAccessibleContext);
+            PrintDebugString("  GlobalRef'd NewActiveDescendentAC: %016I64X", pkg->newActiveDescendentAccessibleContext);
+#endif
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyActiveDescendentChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyActiveChange event");
+}
+
+/**
+ * firePropertyValueChange
+ *
+ */
+void
+JavaAccessBridge::firePropertyTableModelChange(JNIEnv *env, jobject callingObj,
+                                               jobject event, jobject source,
+                                               jstring oldValue, jstring newValue){
+
+    PrintDebugString("\r\nJava_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(%p, %p, %p, %p, %p, %p)",
+                     env, callingObj, event,
+                     source, oldValue, newValue);
+
+    // sanity check
+    if (ATs == (AccessBridgeATInstance *) 0) {
+        PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+        return;         // panic!
+    }
+
+    // common setup
+    const wchar_t *stringBytes;
+    char buffer[sizeof(PackageType) + sizeof(PropertyTableModelChangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    PropertyTableModelChangePackage *pkg = (PropertyTableModelChangePackage *) (buffer + sizeof(PackageType));
+    *type = cPropertyTableModelChangePackage;
+    pkg->vmID = (long) dialogWindow;
+
+    // make new Global Refs and send events only to those ATs that want 'em
+    AccessBridgeATInstance *ati = ATs;
+    while (ati != (AccessBridgeATInstance *) 0) {
+        if (ati->accessibilityEventMask & cPropertyTableModelChangeEvent) {
+
+            PrintDebugString("  sending to AT");
+
+            // make new GlobalRefs for this AT
+            pkg->Event = (JOBJECT64)env->NewGlobalRef(event);
+            pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+            PrintDebugString("  GlobalRef'd Event: %p", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+            PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event);
+            PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+            if (oldValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(oldValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->oldValue, stringBytes, (sizeof(pkg->oldValue) / sizeof(wchar_t)));
+                env->ReleaseStringChars(oldValue, stringBytes);
+            } else {
+                wcsncpy(pkg->oldValue, L"(null)", (sizeof(pkg->oldValue) / sizeof(wchar_t)));
+            }
+
+            if (newValue != (jstring) 0) {
+                stringBytes = (const wchar_t *) env->GetStringChars(newValue, 0);
+                if (stringBytes == NULL) {
+                    if (!env->ExceptionCheck()) {
+                        jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                        if (cls != NULL) {
+                            env->ThrowNew(cls, NULL);
+                        }
+                    }
+                    return;
+                }
+                wcsncpy(pkg->newValue, stringBytes, (sizeof(pkg->newValue) / sizeof(wchar_t)));
+                env->ReleaseStringChars(newValue, stringBytes);
+            } else {
+                wcsncpy(pkg->newValue, L"(null)", (sizeof(pkg->newValue) / sizeof(wchar_t)));
+            }
+
+            ati->sendAccessibilityEventPackage(buffer, sizeof(buffer), cPropertyTableModelChangeEvent);
+        }
+        ati = ati->nextATInstance;
+    }
+    PrintDebugString("  done with propertyTableModelChange event");
+}
+
+
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+#define PRINT_GLOBALREFS() \
+    PrintDebugString("  GlobalRef'd Event: %p", pkg->Event); \
+    PrintDebugString("  GlobalRef'd Source: %p", pkg->AccessibleContextSource);
+#else // JOBJECT64 is jlong (64 bit)
+#define PRINT_GLOBALREFS() \
+    PrintDebugString("  GlobalRef'd Event: %016I64X", pkg->Event); \
+    PrintDebugString("  GlobalRef'd Source: %016I64X", pkg->AccessibleContextSource);
+#endif
+
+#define FIRE_EVENT(function, packageStruct, packageConstant, eventConstant)             \
+    void JavaAccessBridge::function(JNIEnv *env, jobject callingObj,                    \
+                                    jobject eventObj, jobject source) {                 \
+                                                                                        \
+        PrintDebugString("\r\nFiring event id = %d(%p, %p, %p, %p); vmID = %X",         \
+                         eventConstant, env, callingObj, eventObj, source, javaVM);     \
+                                                                                        \
+        /* sanity check */                                                              \
+        if (ATs == (AccessBridgeATInstance *) 0) {                                      \
+            PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");           \
+            return;         /* panic! */                                                \
+        }                                                                               \
+                                                                                        \
+        /* common setup */                                                              \
+        char buffer[sizeof(PackageType) + sizeof(packageStruct)];                       \
+        PackageType *type = (PackageType *) buffer;                                     \
+        packageStruct *pkg = (packageStruct *) (buffer + sizeof(PackageType));          \
+        *type = packageConstant;                                                        \
+        pkg->vmID = (long) dialogWindow;                                                \
+                                                                                        \
+        /* make new Global Refs, send events only to those ATs that want 'em */         \
+        AccessBridgeATInstance *ati = ATs;                                              \
+        while (ati != (AccessBridgeATInstance *) 0) {                                   \
+            PrintDebugString("\r\njavaEventMask = %X eventConstant=%d pkg->vmID=%X",    \
+                             ati->javaEventMask, eventConstant, pkg->vmID );            \
+            if (ati->javaEventMask & eventConstant) {                                   \
+                                                                                        \
+                PrintDebugString("  sending to AT");                                    \
+                /* make new GlobalRefs for this AT */                                   \
+                pkg->Event = (JOBJECT64)env->NewGlobalRef(eventObj);                    \
+                pkg->AccessibleContextSource = (JOBJECT64)env->NewGlobalRef(source);    \
+                PRINT_GLOBALREFS()                                                      \
+                                                                                        \
+                ati->sendJavaEventPackage(buffer, sizeof(buffer), eventConstant);       \
+            }                                                                           \
+            ati = ati->nextATInstance;                                                  \
+        }                                                                               \
+        PrintDebugString("  done with firing AWT event");                               \
+    }
+
+    void JavaAccessBridge::javaShutdown(JNIEnv *env, jobject callingObj) {
+
+        PrintDebugString("\r\nFiring event id = %d(%p, %p); vmID = %X",
+                         cJavaShutdownEvent, env, callingObj, javaVM);
+
+        /* sanity check */
+        if (ATs == (AccessBridgeATInstance *) 0) {
+            PrintDebugString("  ERROR!! ATs == 0! (shouldn't happen here!)");
+            return;             /* panic! */
+        }
+
+        /* common setup */
+        char buffer[sizeof(PackageType) + sizeof(JavaShutdownPackage)];
+        PackageType *type = (PackageType *) buffer;
+        JavaShutdownPackage *pkg = (JavaShutdownPackage *) (buffer + sizeof(PackageType));
+        *type = cJavaShutdownPackage;
+        pkg->vmID = (long) dialogWindow;
+
+        /* make new Global Refs, send events only to those ATs that want 'em */
+        AccessBridgeATInstance *ati = ATs;
+        while (ati != (AccessBridgeATInstance *) 0) {
+            if (ati->javaEventMask & cJavaShutdownEvent) {
+                PrintDebugString("  sending to AT");
+                ati->sendJavaEventPackage(buffer, sizeof(buffer), cJavaShutdownEvent);
+            }
+            ati = ati->nextATInstance;
+        }
+        PrintDebugString("  done with firing AWT event");
+    }
+
+    FIRE_EVENT(fireFocusGained, FocusGainedPackage, cFocusGainedPackage, cFocusGainedEvent)
+    FIRE_EVENT(fireFocusLost, FocusLostPackage, cFocusLostPackage, cFocusLostEvent)
+    FIRE_EVENT(fireCaretUpdate, CaretUpdatePackage, cCaretUpdatePackage, cCaretUpdateEvent)
+    FIRE_EVENT(fireMouseClicked, MouseClickedPackage, cMouseClickedPackage, cMouseClickedEvent)
+    FIRE_EVENT(fireMouseEntered, MouseEnteredPackage, cMouseEnteredPackage, cMouseEnteredEvent)
+    FIRE_EVENT(fireMouseExited, MouseExitedPackage, cMouseExitedPackage, cMouseExitedEvent)
+    FIRE_EVENT(fireMousePressed, MousePressedPackage, cMousePressedPackage, cMousePressedEvent)
+    FIRE_EVENT(fireMouseReleased, MouseReleasedPackage, cMouseReleasedPackage, cMouseReleasedEvent)
+    FIRE_EVENT(fireMenuCanceled, MenuCanceledPackage, cMenuCanceledPackage, cMenuCanceledEvent)
+    FIRE_EVENT(fireMenuDeselected, MenuDeselectedPackage, cMenuDeselectedPackage, cMenuDeselectedEvent)
+    FIRE_EVENT(fireMenuSelected, MenuSelectedPackage, cMenuSelectedPackage, cMenuSelectedEvent)
+    FIRE_EVENT(firePopupMenuCanceled, PopupMenuCanceledPackage, cPopupMenuCanceledPackage, cPopupMenuCanceledEvent)
+    FIRE_EVENT(firePopupMenuWillBecomeInvisible, PopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisiblePackage, cPopupMenuWillBecomeInvisibleEvent)
+    FIRE_EVENT(firePopupMenuWillBecomeVisible, PopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisiblePackage, cPopupMenuWillBecomeVisibleEvent)
+
+
+    // -----------------------------
+
+
+extern "C" {        // event stuff from AccessBridge.h, generated by JNI
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_sendDebugString(JNIEnv *env, jobject callingObj, jstring debugStr) {
+
+        const wchar_t *stringBytes;
+        stringBytes = (const wchar_t *) env->GetStringChars(debugStr, 0);
+        if (stringBytes == NULL) {
+            if (!env->ExceptionCheck()) {
+                jclass cls = env->FindClass("java/lang/OutOfMemoryError");
+                if (cls != NULL) {
+                    env->ThrowNew(cls, NULL);
+                }
+            }
+            return;
+        }
+        wPrintJavaDebugString(L"AccessBridge.java: %ls", stringBytes);
+        env->ReleaseStringChars(debugStr, stringBytes);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyCaretChange(JNIEnv *env, jobject callingObj,
+                                                                        jobject event, jobject source,
+                                                                        jint oldValue, jint newValue) {
+        theJavaAccessBridge->firePropertyCaretChange(env, callingObj,
+                                                        event, source,
+                                                        oldValue, newValue);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyDescriptionChange(JNIEnv *env, jobject callingObj,
+                                                                            jobject event, jobject source,
+                                                                            jstring oldValue, jstring newValue) {
+        theJavaAccessBridge->firePropertyDescriptionChange(env, callingObj,
+                                                            event, source,
+                                                            oldValue, newValue);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyNameChange(JNIEnv *env, jobject callingObj,
+                                                                    jobject event, jobject source,
+                                                                    jstring oldValue, jstring newValue) {
+        theJavaAccessBridge->firePropertyNameChange(env, callingObj,
+                                                    event, source,
+                                                    oldValue, newValue);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertySelectionChange(JNIEnv *env, jobject callingObj,
+                                                                            jobject event, jobject source) {
+        theJavaAccessBridge->firePropertySelectionChange(env, callingObj,
+                                                            event, source);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyStateChange(JNIEnv *env, jobject callingObj,
+                                                                        jobject event, jobject source,
+                                                                        jstring oldValue, jstring newValue) {
+        theJavaAccessBridge->firePropertyStateChange(env, callingObj,
+                                                        event, source,
+                                                        oldValue, newValue);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyTextChange(JNIEnv *env, jobject callingObj,
+                                                                    jobject event,  jobject source) {
+        theJavaAccessBridge->firePropertyTextChange(env, callingObj,
+                                                    event, source);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyValueChange(JNIEnv *env, jobject callingObj,
+                                                                        jobject event, jobject source,
+                                                                        jstring oldValue, jstring newValue) {
+        theJavaAccessBridge->firePropertyValueChange(env, callingObj,
+                                                        event, source,
+                                                        oldValue, newValue);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyVisibleDataChange(JNIEnv *env, jobject callingObj,
+                                                                            jobject event,  jobject source) {
+        theJavaAccessBridge->firePropertyVisibleDataChange(env, callingObj,
+                                                            event, source);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyChildChange(JNIEnv *env, jobject callingObj,
+                                                                        jobject event, jobject source,
+                                                                        jobject oldValue, jobject newValue) {
+        theJavaAccessBridge->firePropertyChildChange(env, callingObj,
+                                                        event, source,
+                                                        oldValue, newValue);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyActiveDescendentChange(JNIEnv *env, jobject callingObj,
+                                                                                jobject event,  jobject source,
+                                                                                jobject oldValue,
+                                                                                jobject newValue) {
+        theJavaAccessBridge->firePropertyActiveDescendentChange(env, callingObj,
+                                                                event, source,
+                                                                oldValue, newValue);
+    }
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_propertyTableModelChange(JNIEnv *env, jobject callingObj,
+                                                                            jobject event,  jobject source,
+                                                                            jstring oldValue, jstring newValue) {
+
+        theJavaAccessBridge->firePropertyTableModelChange(env, callingObj,
+                                                            event, source,
+                                                            oldValue, newValue);
+    }
+
+#define HANDLE_STANDARD_EVENT_FROM_JAVA(function, method) \
+    JNIEXPORT void JNICALL \
+    function(JNIEnv *env, jobject callingObj, jobject event, jobject source) { \
+        theJavaAccessBridge->method(env, callingObj, event, source); \
+    }
+
+
+    JNIEXPORT void JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_javaShutdown(JNIEnv *env, jobject callingObj) {
+        theJavaAccessBridge->javaShutdown(env, callingObj);
+    }
+
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusGained, fireFocusGained)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_focusLost, fireFocusLost)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_caretUpdate, fireCaretUpdate)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseClicked, fireMouseClicked)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseEntered, fireMouseEntered)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseExited, fireMouseExited)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mousePressed, fireMousePressed)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_mouseReleased, fireMouseReleased)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuCanceled, fireMenuCanceled)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuDeselected, fireMenuDeselected)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_menuSelected, fireMenuSelected)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuCanceled, firePopupMenuCanceled)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeInvisible, firePopupMenuWillBecomeInvisible)
+    HANDLE_STANDARD_EVENT_FROM_JAVA(Java_com_sun_java_accessibility_AccessBridge_popupMenuWillBecomeVisible, firePopupMenuWillBecomeVisible)
+
+    /*
+     * Map a HWND to a Java component
+     *
+     * Class:     com_sun_java_accessibility_AccessBridge
+     * Method:    jawtGetComponentFromNativeWindowHandle
+     * Signature: (I)Ljava/awt/Component;
+     */
+    JNIEXPORT jobject JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_jawtGetComponentFromNativeWindowHandle
+        (JNIEnv *env, jobject callingObj, jint windowHandle) {
+
+    JAWT awt;
+    jboolean result;
+    jobject component = (jobject)0;
+
+    // Get the AWT
+    awt.version = JAWT_VERSION_1_4;
+    result = JAWT_GetAWT(env, &awt);
+    if (result == JNI_FALSE) {
+        return (jobject)0;
+    }
+
+    // Get the component
+    return awt.GetComponent(env, (void *)windowHandle);
+    }
+
+
+    /*
+     * Map a Java component to a HWND
+     *
+     * Class:     com_sun_java_accessibility_AccessBridge
+     * Method:    jawtGetNativeWindowHandleFromComponent
+     * Signature: (Ljava/awt/Component;)I
+     */
+    JNIEXPORT jint JNICALL
+    Java_com_sun_java_accessibility_AccessBridge_jawtGetNativeWindowHandleFromComponent
+        (JNIEnv *env, jobject callingObj, jobject component) {
+
+        JAWT awt;
+        JAWT_DrawingSurface* ds;
+        JAWT_DrawingSurfaceInfo* dsi;
+        JAWT_Win32DrawingSurfaceInfo* dsi_win;
+        jboolean result;
+        // jint lock;
+        jint windowHandle = -1;
+
+        // Get the AWT
+        awt.version = JAWT_VERSION_1_4;
+        result = JAWT_GetAWT(env, &awt);
+        if (result == JNI_FALSE) {
+            return -1;
+        }
+
+        // Get the drawing surface
+        ds = awt.GetDrawingSurface(env, component);
+        if (ds == NULL) {
+            return -1;
+        }
+
+        // Get the drawing surface info
+        dsi = ds->GetDrawingSurfaceInfo(ds);
+
+        // Get the platform-specific drawing info
+        dsi_win = (JAWT_Win32DrawingSurfaceInfo *)dsi->platformInfo;
+
+        // Get the window handle
+        windowHandle = (jint)dsi_win->hwnd;
+
+        // Free the drawing surface info
+        ds->FreeDrawingSurfaceInfo(dsi);
+
+        // Free the drawing surface
+        awt.FreeDrawingSurface(ds);
+
+        return windowHandle;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libjavaaccessbridge/JavaAccessBridge.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A DLL which is loaded by Java applications to handle communication
+ * between Java VMs purposes of Accessbility.
+ */
+
+#include <windows.h>
+#include <jni.h>
+
+#include "AccessBridgePackages.h"
+#include "AccessBridgeATInstance.h"
+#include "AccessBridgeJavaEntryPoints.h"
+
+#ifndef __JavaAccessBridge_H__
+#define __JavaAccessBridge_H__
+
+
+extern "C" {
+        BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason,
+                            LPVOID lpvReserved);
+        void AppendToCallOutput(char *s);
+        BOOL APIENTRY AccessBridgeDialogProc(HWND hDlg, UINT message,
+                                             UINT wParam, LONG lParam);
+}
+
+/**
+ * The JavaAccessBridge class.  The core of the Windows AT AccessBridge dll
+ */
+class JavaAccessBridge {
+// for debugging
+public:
+// for debugging
+    HINSTANCE windowsInstance;
+    HWND dialogWindow;
+    AccessBridgeATInstance *ATs;
+    JavaVM *javaVM;
+    JNIEnv *windowsThreadJNIEnv;    // for calls initiated from Windows
+    AccessBridgeJavaEntryPoints *javaThreadEntryPoints;
+    AccessBridgeJavaEntryPoints *windowsThreadEntryPoints;
+    jobject javaThreadABObject;     // for calls initiated from Java
+    jobject windowsThreadABObject;  // for calls initiated from Windows
+
+public:
+    JavaAccessBridge(HINSTANCE hInstance);
+    ~JavaAccessBridge();
+    void javaRun(JNIEnv *env, jobject obj);
+    BOOL initWindow();
+
+    // IPC with the Java AccessBridge DLL
+    void postHelloToWindowsDLLMsg(HWND destHwnd);
+    LRESULT MemoryMappedFileCreated(HWND srcHwnd, char *filename);
+
+    void sendPackage(char *buffer, int bufsize, HWND destHwnd);
+    void sendJavaEventPackage(char *buffer, int bufsize, long type);
+    void sendAccessibilityEventPackage(char *buffer, int bufsize, long type);
+    BOOL sendMemoryPackage(char *buffer, long bufsize, HWND destWindow);
+    LRESULT processPackage(char *buffer, int bufsize);
+    BOOL receiveMemoryPackage(HWND srcWindow, long bufsize);
+    void WindowsATDestroyed(HWND ATBridgeDLLWindow);
+
+    // Java VM object memory management
+    void releaseJavaObject(jobject object);
+
+    // Event handling methods
+    void addJavaEventNotification(jlong type, HWND DLLwindow);
+    void removeJavaEventNotification(jlong type, HWND DLLwindow);
+    void addAccessibilityEventNotification(jlong type, HWND DLLwindow);
+    void removeAccessibilityEventNotification(jlong type, HWND DLLwindow);
+
+    // Event firing methods
+/*
+    void firePropertyChange(JNIEnv *env, jobject callingObj,
+                            jobject propertyChangeEvent,
+                            jobject source, jstring propertyName,
+                            jstring oldValue, jstring newValue);
+*/
+
+    void javaShutdown(JNIEnv *env, jobject callingObj);
+
+    void fireFocusGained(JNIEnv *env, jobject callingObj,
+                         jobject focusEvent, jobject source);
+    void fireFocusLost(JNIEnv *env, jobject callingObj,
+                       jobject focusEvent,jobject source);
+    void fireCaretUpdate(JNIEnv *env, jobject callingObj,
+                         jobject caretEvent, jobject source);
+    void fireMouseClicked(JNIEnv *env, jobject callingObj,
+                          jobject mouseEvent, jobject source);
+    void fireMouseEntered(JNIEnv *env, jobject callingObj,
+                          jobject mouseEvent, jobject source);
+    void fireMouseExited(JNIEnv *env, jobject callingObj,
+                         jobject mouseEvent, jobject source);
+    void fireMousePressed(JNIEnv *env, jobject callingObj,
+                          jobject mouseEvent, jobject source);
+    void fireMouseReleased(JNIEnv *env, jobject callingObj,
+                           jobject mouseEvent, jobject source);
+    void fireMenuCanceled(JNIEnv *env, jobject callingObj,
+                          jobject menuEvent, jobject source);
+    void fireMenuDeselected(JNIEnv *env, jobject callingObj,
+                            jobject menuEvent, jobject source);
+    void fireMenuSelected(JNIEnv *env, jobject callingObj,
+                          jobject menuEvent, jobject source);
+    void firePopupMenuCanceled(JNIEnv *env, jobject callingObj,
+                               jobject popupMenuEvent, jobject source);
+    void firePopupMenuWillBecomeInvisible(JNIEnv *env, jobject callingObj,
+                                          jobject popupMenuEvent, jobject source);
+    void firePopupMenuWillBecomeVisible(JNIEnv *env, jobject callingObj,
+                                        jobject popupMenuEvent, jobject source);
+
+    void firePropertyCaretChange(JNIEnv *env, jobject callingObj,
+                                 jobject event, jobject source,
+                                 jint oldValue, jint newValue);
+    void firePropertyDescriptionChange(JNIEnv *env, jobject callingObj,
+                                       jobject event, jobject source,
+                                       jstring oldValue, jstring newValue);
+    void firePropertyNameChange(JNIEnv *env, jobject callingObj,
+                                jobject event, jobject source,
+                                jstring oldValue, jstring newValue);
+    void firePropertySelectionChange(JNIEnv *env, jobject callingObj,
+                                     jobject event, jobject source);
+    void firePropertyStateChange(JNIEnv *env, jobject callingObj,
+                                 jobject event, jobject source,
+                                 jstring oldValue, jstring newValue);
+    void firePropertyTextChange(JNIEnv *env, jobject callingObj,
+                                jobject event, jobject source);
+    void firePropertyValueChange(JNIEnv *env, jobject callingObj,
+                                 jobject event, jobject source,
+                                 jstring oldValue, jstring newValue);
+    void firePropertyVisibleDataChange(JNIEnv *env, jobject callingObj,
+                                       jobject event, jobject source);
+    void firePropertyChildChange(JNIEnv *env, jobject callingObj,
+                                 jobject event, jobject source,
+                                 jobject oldValue, jobject newValue);
+   void firePropertyActiveDescendentChange(JNIEnv *env, jobject callingObj,
+                                           jobject event, jobject source,
+                                           jobject oldValue, jobject newValue);
+
+   void firePropertyTableModelChange(JNIEnv *env, jobject callingObj,
+                                     jobject event, jobject source,
+                                     jstring oldValue, jstring newValue);
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeEventHandler.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,382 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage firing Accessibility events to Windows AT
+ */
+
+#include "AccessBridgeDebug.h"
+#include "AccessBridgeEventHandler.h"
+#include "AccessBridgePackages.h"
+#include "WinAccessBridge.h"
+
+DEBUG_CODE(extern HWND theDialogWindow);
+extern "C" {
+DEBUG_CODE(void AppendToCallInfo(char *s));
+}
+
+
+// -----------------------------
+
+/**
+ * Initialization.  Set all callbacks to null
+ */
+AccessBridgeEventHandler::AccessBridgeEventHandler() {
+    javaEventMask = 0;
+    accessibilityEventMask = 0;
+
+    propertyChangeFP = (AccessBridge_PropertyChangeFP) NULL;
+    javaShutdownFP = (AccessBridge_JavaShutdownFP) NULL;
+    focusGainedFP = (AccessBridge_FocusGainedFP) NULL;
+    focusLostFP = (AccessBridge_FocusLostFP) NULL;
+    caretUpdateFP = (AccessBridge_CaretUpdateFP) NULL;
+    mouseClickedFP = (AccessBridge_MouseClickedFP) NULL;
+    mouseEnteredFP = (AccessBridge_MouseEnteredFP) NULL;
+    mouseExitedFP = (AccessBridge_MouseExitedFP) NULL;
+    mousePressedFP = (AccessBridge_MousePressedFP) NULL;
+    mouseReleasedFP = (AccessBridge_MouseReleasedFP) NULL;
+    menuCanceledFP = (AccessBridge_MenuCanceledFP) NULL;
+    menuDeselectedFP = (AccessBridge_MenuDeselectedFP) NULL;
+    menuSelectedFP = (AccessBridge_MenuSelectedFP) NULL;
+    popupMenuCanceledFP = (AccessBridge_PopupMenuCanceledFP) NULL;
+    popupMenuWillBecomeInvisibleFP = (AccessBridge_PopupMenuWillBecomeInvisibleFP) NULL;
+    popupMenuWillBecomeVisibleFP = (AccessBridge_PopupMenuWillBecomeVisibleFP) NULL;
+
+    propertyNameChangeFP = (AccessBridge_PropertyNameChangeFP) NULL;
+    propertyDescriptionChangeFP = (AccessBridge_PropertyDescriptionChangeFP) NULL;
+    propertyStateChangeFP = (AccessBridge_PropertyStateChangeFP) NULL;
+    propertyValueChangeFP = (AccessBridge_PropertyValueChangeFP) NULL;
+    propertySelectionChangeFP = (AccessBridge_PropertySelectionChangeFP) NULL;
+    propertyTextChangeFP = (AccessBridge_PropertyTextChangeFP) NULL;
+    propertyCaretChangeFP = (AccessBridge_PropertyCaretChangeFP) NULL;
+    propertyVisibleDataChangeFP = (AccessBridge_PropertyVisibleDataChangeFP) NULL;
+    propertyChildChangeFP = (AccessBridge_PropertyChildChangeFP) NULL;
+    propertyActiveDescendentChangeFP = (AccessBridge_PropertyActiveDescendentChangeFP) NULL;
+
+    propertyTableModelChangeFP = (AccessBridge_PropertyTableModelChangeFP) NULL;
+
+}
+
+/**
+ * Destruction.
+ */
+AccessBridgeEventHandler::~AccessBridgeEventHandler() {
+}
+
+
+// ------------ Event handling methods
+
+#define SET_JAVA_EVENT_FP(function, eventFP, callbackFP, eventConstant) \
+    void AccessBridgeEventHandler::function(eventFP fp, WinAccessBridge *wab) { \
+        callbackFP = fp; \
+        if (fp != (eventFP) 0) { \
+            javaEventMask |= eventConstant; \
+            wab->addJavaEventNotification(eventConstant); \
+        } else { \
+            javaEventMask &= (0xFFFFFFFF - eventConstant); \
+            wab->removeJavaEventNotification(eventConstant); \
+        } \
+    }
+
+SET_JAVA_EVENT_FP(setPropertyChangeFP, AccessBridge_PropertyChangeFP, propertyChangeFP, cPropertyChangeEvent)
+SET_JAVA_EVENT_FP(setJavaShutdownFP, AccessBridge_JavaShutdownFP, javaShutdownFP, cJavaShutdownEvent)
+SET_JAVA_EVENT_FP(setFocusGainedFP, AccessBridge_FocusGainedFP, focusGainedFP, cFocusGainedEvent)
+SET_JAVA_EVENT_FP(setFocusLostFP, AccessBridge_FocusLostFP, focusLostFP, cFocusLostEvent)
+SET_JAVA_EVENT_FP(setCaretUpdateFP, AccessBridge_CaretUpdateFP, caretUpdateFP, cCaretUpdateEvent)
+SET_JAVA_EVENT_FP(setMouseClickedFP, AccessBridge_MouseClickedFP, mouseClickedFP, cMouseClickedEvent)
+SET_JAVA_EVENT_FP(setMouseEnteredFP, AccessBridge_MouseEnteredFP, mouseEnteredFP, cMouseEnteredEvent)
+SET_JAVA_EVENT_FP(setMouseExitedFP, AccessBridge_MouseExitedFP, mouseExitedFP, cMouseExitedEvent)
+SET_JAVA_EVENT_FP(setMousePressedFP, AccessBridge_MousePressedFP, mousePressedFP, cMousePressedEvent)
+SET_JAVA_EVENT_FP(setMouseReleasedFP, AccessBridge_MouseReleasedFP, mouseReleasedFP, cMouseReleasedEvent)
+SET_JAVA_EVENT_FP(setMenuCanceledFP, AccessBridge_MenuCanceledFP, menuCanceledFP, cMenuCanceledEvent)
+SET_JAVA_EVENT_FP(setMenuDeselectedFP, AccessBridge_MenuDeselectedFP, menuDeselectedFP, cMenuDeselectedEvent)
+SET_JAVA_EVENT_FP(setMenuSelectedFP, AccessBridge_MenuSelectedFP, menuSelectedFP, cMenuSelectedEvent)
+SET_JAVA_EVENT_FP(setPopupMenuCanceledFP, AccessBridge_PopupMenuCanceledFP, popupMenuCanceledFP, cPopupMenuCanceledEvent)
+SET_JAVA_EVENT_FP(setPopupMenuWillBecomeInvisibleFP, AccessBridge_PopupMenuWillBecomeInvisibleFP, popupMenuWillBecomeInvisibleFP, cPopupMenuWillBecomeInvisibleEvent)
+SET_JAVA_EVENT_FP(setPopupMenuWillBecomeVisibleFP, AccessBridge_PopupMenuWillBecomeVisibleFP, popupMenuWillBecomeVisibleFP, cPopupMenuWillBecomeVisibleEvent)
+
+#define SET_ACCESSIBILITY_EVENT_FP(function, eventFP, callbackFP, eventConstant) \
+    void AccessBridgeEventHandler::function(eventFP fp, WinAccessBridge *wab) { \
+        callbackFP = fp; \
+        if (fp != (eventFP) 0) { \
+            accessibilityEventMask |= eventConstant; \
+            wab->addAccessibilityEventNotification(eventConstant); \
+        } else { \
+            accessibilityEventMask &= (0xFFFFFFFF - eventConstant); \
+            wab->removeAccessibilityEventNotification(eventConstant); \
+        } \
+    }
+
+
+SET_ACCESSIBILITY_EVENT_FP(setPropertyNameChangeFP, AccessBridge_PropertyNameChangeFP, propertyNameChangeFP, cPropertyNameChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyDescriptionChangeFP, AccessBridge_PropertyDescriptionChangeFP, propertyDescriptionChangeFP, cPropertyDescriptionChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyStateChangeFP, AccessBridge_PropertyStateChangeFP, propertyStateChangeFP, cPropertyStateChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyValueChangeFP, AccessBridge_PropertyValueChangeFP, propertyValueChangeFP, cPropertyValueChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertySelectionChangeFP, AccessBridge_PropertySelectionChangeFP, propertySelectionChangeFP, cPropertySelectionChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyTextChangeFP, AccessBridge_PropertyTextChangeFP, propertyTextChangeFP, cPropertyTextChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyCaretChangeFP, AccessBridge_PropertyCaretChangeFP, propertyCaretChangeFP, cPropertyCaretChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyVisibleDataChangeFP, AccessBridge_PropertyVisibleDataChangeFP, propertyVisibleDataChangeFP, cPropertyVisibleDataChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyChildChangeFP, AccessBridge_PropertyChildChangeFP, propertyChildChangeFP, cPropertyChildChangeEvent)
+SET_ACCESSIBILITY_EVENT_FP(setPropertyActiveDescendentChangeFP, AccessBridge_PropertyActiveDescendentChangeFP, propertyActiveDescendentChangeFP, cPropertyActiveDescendentChangeEvent)
+
+SET_ACCESSIBILITY_EVENT_FP(setPropertyTableModelChangeFP, AccessBridge_PropertyTableModelChangeFP, propertyTableModelChangeFP, cPropertyTableModelChangeEvent)
+
+
+/**
+ * propertyChange - extends the Java method call to Windows:
+ *   propertyChange(PropertyChangeEvent e, )
+ *
+ * Note: PropertyChangeEvent object passed in is a globalReference;
+ *       It is critical that releaseJavaObject() be called
+ *       on the PropertyChangeEvent once it is no longer needed,
+ *       otherwise the JavaVM/JNI will suffer memory leaks
+ *
+ */
+void
+AccessBridgeEventHandler::firePropertyChange(long vmID,
+                                             JOBJECT64 event, JOBJECT64 source,
+                                             wchar_t *property, wchar_t *oldName,
+                                             wchar_t *newName) {
+    DEBUG_CODE(char debugBuf[255]);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    DEBUG_CODE(sprintf(debugBuf, "\r\nCalling firePropertyChange(%p, %p):\r\n", event, source));
+#else // JOBJECT64 is jlong (64 bit)
+    DEBUG_CODE(sprintf(debugBuf, "\r\nCalling firePropertyChange(%016I64X, %016I64X):\r\n", event, source));
+#endif
+    DEBUG_CODE(AppendToCallInfo(debugBuf));
+
+    if (propertyChangeFP != (AccessBridge_PropertyChangeFP) 0) {
+        propertyChangeFP(vmID, event, source, property, oldName, newName);
+    } else {
+        DEBUG_CODE(AppendToCallInfo("  Error! propertyChangeFP == 0\r\n"));
+    }
+}
+
+
+/**
+ * FIRE_EVENT - macro for all fireXXX methods (which
+ *   all are basically identical to one another...)
+ *
+ * Note: the event and source objects passed in are globalReferences;
+ *       It is critical that releaseJavaObject() be called
+ *       on them once they are no longer needed, otherwise
+ *       the JavaVM/JNI will suffer memory leaks
+ *
+ */
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+const char fireEventDebugString[] = "\r\nIn AccessBridgeEventHandler::%s(%p, %p); vmID = %X\r\n";
+#else // JOBJECT64 is jlong (64 bit)
+const char fireEventDebugString[] = "\r\nIn AccessBridgeEventHandler::%s(%016I64X, %016I64X); vmID = %X\r\n";
+#endif
+
+#define FIRE_EVENT(method, FPprototype, eventFP) \
+    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source) { \
+        DEBUG_CODE(char debugBuf[255]); \
+        DEBUG_CODE(sprintf(debugBuf, fireEventDebugString, #method, event, source, vmID)); \
+        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
+        if (eventFP != (FPprototype) 0) { \
+            eventFP(vmID, event, source); \
+        } else { \
+            DEBUG_CODE(AppendToCallInfo("  Error! eventFP == 0\r\n")); \
+        } \
+    }
+
+    void AccessBridgeEventHandler::fireJavaShutdown(long vmID) {
+        DEBUG_CODE(char debugBuf[255]);
+        DEBUG_CODE(sprintf(debugBuf, "\r\nCalling fireJavaShutdown; vmID = %X\r\n", vmID));
+        DEBUG_CODE(AppendToCallInfo(debugBuf));
+        if (javaShutdownFP != (AccessBridge_JavaShutdownFP) 0) {
+            javaShutdownFP(vmID);
+        } else {
+            DEBUG_CODE(AppendToCallInfo("  Error! javaShutdownFP == 0\r\n"));
+        }
+    }
+
+FIRE_EVENT(fireFocusGained, AccessBridge_FocusGainedFP, focusGainedFP)
+FIRE_EVENT(fireFocusLost, AccessBridge_FocusLostFP, focusLostFP)
+FIRE_EVENT(fireCaretUpdate, AccessBridge_CaretUpdateFP, caretUpdateFP)
+FIRE_EVENT(fireMouseClicked, AccessBridge_MouseClickedFP, mouseClickedFP)
+FIRE_EVENT(fireMouseEntered, AccessBridge_MouseEnteredFP, mouseEnteredFP)
+FIRE_EVENT(fireMouseExited, AccessBridge_MouseExitedFP, mouseExitedFP)
+FIRE_EVENT(fireMousePressed, AccessBridge_MousePressedFP, mousePressedFP)
+FIRE_EVENT(fireMouseReleased, AccessBridge_MouseReleasedFP, mouseReleasedFP)
+FIRE_EVENT(fireMenuCanceled, AccessBridge_MenuCanceledFP, menuCanceledFP)
+FIRE_EVENT(fireMenuDeselected, AccessBridge_MenuDeselectedFP, menuDeselectedFP)
+FIRE_EVENT(fireMenuSelected, AccessBridge_MenuSelectedFP, menuSelectedFP)
+FIRE_EVENT(firePopupMenuCanceled, AccessBridge_PopupMenuCanceledFP, popupMenuCanceledFP)
+FIRE_EVENT(firePopupMenuWillBecomeInvisible, AccessBridge_PopupMenuWillBecomeInvisibleFP, popupMenuWillBecomeInvisibleFP)
+FIRE_EVENT(firePopupMenuWillBecomeVisible, AccessBridge_PopupMenuWillBecomeVisibleFP, popupMenuWillBecomeVisibleFP)
+
+
+/**
+ * FIRE_PROPERTY_CHANGE - macro for all fireXXX methods (which
+ *   all are basically identical to one another...
+ *
+ * Note: the event and source objects passed in are globalReferences;
+ *       It is critical that releaseJavaObject() be called
+ *       on them once they are no longer needed, otherwise
+ *       the JavaVM/JNI will suffer memory leaks
+ *
+ */
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+const char firePropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing a no-param property change (%p, %p):\r\n";
+#else // JOBJECT64 is jlong (64 bit)
+const char firePropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing a no-param property change (%016I64X, %016I64X):\r\n";
+#endif
+
+#define FIRE_PROPERTY_CHANGE(method, FPprototype, eventFP) \
+    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source) { \
+        DEBUG_CODE(char debugBuf[255]); \
+        DEBUG_CODE(sprintf(debugBuf, firePropertyChangeDebugString, #method, event, source)); \
+        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
+        if (eventFP != (FPprototype) 0) { \
+            eventFP(vmID, event, source); \
+        } else { \
+            DEBUG_CODE(AppendToCallInfo("  Error! eventFP == 0\r\n")); \
+        } \
+    }
+
+/**
+ * FIRE_STRING_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
+ *   that have strings as the old/new values
+
+ * Note: the event and source objects passed in are globalReferences;
+ *       It is critical that releaseJavaObject() be called
+ *       on them once they are no longer needed, otherwise
+ *       the JavaVM/JNI will suffer memory leaks
+ *
+ */
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+const char fireStringPropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing a string property change (%p, %p, %ls, %ls):\r\n";
+#else // JOBJECT64 is jlong (64 bit)
+const char fireStringPropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing a string property change (%016I64X, %016I64X, %ls, %ls):\r\n";
+#endif
+
+#define FIRE_STRING_PROPERTY_CHANGE(method, FPprototype, eventFP, oldValue, newValue) \
+    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source, \
+                                          wchar_t *oldValue, wchar_t *newValue) { \
+        DEBUG_CODE(char debugBuf[255]); \
+        DEBUG_CODE(sprintf(debugBuf, fireStringPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
+        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
+        if (eventFP != (FPprototype) 0) { \
+            eventFP(vmID, event, source, oldValue, newValue); \
+        } else { \
+            DEBUG_CODE(AppendToCallInfo("  Error! eventFP == 0\r\n")); \
+        } \
+    }
+
+/**
+ * FIRE_INT_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
+ *   that have ints as the old/new values
+ *
+ * Note: the event and source objects passed in are globalReferences;
+ *       It is critical that releaseJavaObject() be called
+ *       on them once they are no longer needed, otherwise
+ *       the JavaVM/JNI will suffer memory leaks
+ *
+ */
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+const char fireIntPropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing an int property change (%p, %p, %d, %d):\r\n";
+#else // JOBJECT64 is jlong (64 bit)
+const char fireIntPropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing an int property change (%016I64X, %016I64X, %d, %d):\r\n";
+#endif
+
+#define FIRE_INT_PROPERTY_CHANGE(method, FPprototype, eventFP) \
+    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source,  \
+                                          int oldValue, int newValue) { \
+        DEBUG_CODE(char debugBuf[255]); \
+        DEBUG_CODE(sprintf(debugBuf, fireIntPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
+        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
+        if (eventFP != (FPprototype) 0) { \
+            eventFP(vmID, event, source, oldValue, newValue); \
+        } else { \
+            DEBUG_CODE(AppendToCallInfo("  Error! eventFP == 0\r\n")); \
+        } \
+    }
+
+/**
+ * FIRE_AC_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
+ *   that have jobjects (AccessibleContexts) as the old/new values
+ *
+ * Note: the event and source objects passed in are globalReferences;
+ *       It is critical that releaseJavaObject() be called
+ *       on them once they are no longer needed, otherwise
+ *       the JavaVM/JNI will suffer memory leaks
+ *
+ */
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+const char fireACPropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing an AC property change (%p, %p, %p, %p):\r\n";
+#else // JOBJECT64 is jlong (64 bit)
+const char fireACPropertyChangeDebugString[] = "\r\nIn AccessBridgeEventHandler::%s, Firing an AC property change (%016I64X, %016I64X, %016I64X, %016I64X):\r\n";
+#endif
+
+#define FIRE_AC_PROPERTY_CHANGE(method, FPprototype, eventFP) \
+    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source,  \
+                                          JOBJECT64 oldValue, JOBJECT64 newValue) { \
+        DEBUG_CODE(char debugBuf[255]); \
+        DEBUG_CODE(sprintf(debugBuf, fireACPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
+        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
+        if (eventFP != (FPprototype) 0) { \
+            eventFP(vmID, event, source, oldValue, newValue); \
+        } else { \
+            DEBUG_CODE(AppendToCallInfo("  Error! eventFP == 0\r\n")); \
+        } \
+    }
+
+FIRE_STRING_PROPERTY_CHANGE(firePropertyNameChange,
+                            AccessBridge_PropertyNameChangeFP,
+                            propertyNameChangeFP, oldName, newName)
+FIRE_STRING_PROPERTY_CHANGE(firePropertyDescriptionChange,
+                            AccessBridge_PropertyDescriptionChangeFP,
+                            propertyDescriptionChangeFP,
+                            oldDescription, newDescription)
+FIRE_STRING_PROPERTY_CHANGE(firePropertyStateChange,
+                            AccessBridge_PropertyStateChangeFP,
+                            propertyStateChangeFP, oldState, newState)
+FIRE_STRING_PROPERTY_CHANGE(firePropertyValueChange,
+                            AccessBridge_PropertyValueChangeFP,
+                            propertyValueChangeFP, oldValue, newValue)
+FIRE_PROPERTY_CHANGE(firePropertySelectionChange,
+                     AccessBridge_PropertySelectionChangeFP,
+                     propertySelectionChangeFP)
+FIRE_PROPERTY_CHANGE(firePropertyTextChange,
+                     AccessBridge_PropertyTextChangeFP,
+                     propertyTextChangeFP);
+FIRE_INT_PROPERTY_CHANGE(firePropertyCaretChange,
+                         AccessBridge_PropertyCaretChangeFP,
+                         propertyCaretChangeFP)
+FIRE_PROPERTY_CHANGE(firePropertyVisibleDataChange,
+                     AccessBridge_PropertyVisibleDataChangeFP,
+                     propertyVisibleDataChangeFP)
+FIRE_AC_PROPERTY_CHANGE(firePropertyChildChange,
+                        AccessBridge_PropertyChildChangeFP,
+                        propertyChildChangeFP)
+FIRE_AC_PROPERTY_CHANGE(firePropertyActiveDescendentChange,
+                        AccessBridge_PropertyActiveDescendentChangeFP,
+                        propertyActiveDescendentChangeFP)
+
+FIRE_STRING_PROPERTY_CHANGE(firePropertyTableModelChange,
+                     AccessBridge_PropertyTableModelChangeFP,
+                     propertyTableModelChangeFP, oldValue, newValue)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeEventHandler.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage firing Accessibility events to Windows AT
+ */
+
+#ifndef __AccessBridgeEventHandler_H__
+#define __AccessBridgeEventHandler_H__
+
+#include "AccessBridgeCallbacks.h"
+#include "AccessBridgePackages.h"
+
+class WinAccessBridge;
+
+class AccessBridgeEventHandler {
+        long javaEventMask;
+        long accessibilityEventMask;
+
+        AccessBridge_PropertyChangeFP propertyChangeFP;
+        AccessBridge_JavaShutdownFP javaShutdownFP;
+        AccessBridge_FocusGainedFP focusGainedFP;
+        AccessBridge_FocusLostFP focusLostFP;
+        AccessBridge_CaretUpdateFP caretUpdateFP;
+        AccessBridge_MouseClickedFP mouseClickedFP;
+        AccessBridge_MouseEnteredFP mouseEnteredFP;
+        AccessBridge_MouseExitedFP mouseExitedFP;
+        AccessBridge_MousePressedFP mousePressedFP;
+        AccessBridge_MouseReleasedFP mouseReleasedFP;
+        AccessBridge_MenuCanceledFP menuCanceledFP;
+        AccessBridge_MenuDeselectedFP menuDeselectedFP;
+        AccessBridge_MenuSelectedFP menuSelectedFP;
+        AccessBridge_PopupMenuCanceledFP popupMenuCanceledFP;
+        AccessBridge_PopupMenuWillBecomeInvisibleFP popupMenuWillBecomeInvisibleFP;
+        AccessBridge_PopupMenuWillBecomeVisibleFP popupMenuWillBecomeVisibleFP;
+
+    AccessBridge_PropertyNameChangeFP propertyNameChangeFP;
+    AccessBridge_PropertyDescriptionChangeFP propertyDescriptionChangeFP;
+    AccessBridge_PropertyStateChangeFP propertyStateChangeFP;
+    AccessBridge_PropertyValueChangeFP propertyValueChangeFP;
+    AccessBridge_PropertySelectionChangeFP propertySelectionChangeFP;
+    AccessBridge_PropertyTextChangeFP propertyTextChangeFP;
+    AccessBridge_PropertyCaretChangeFP propertyCaretChangeFP;
+    AccessBridge_PropertyVisibleDataChangeFP propertyVisibleDataChangeFP;
+    AccessBridge_PropertyChildChangeFP propertyChildChangeFP;
+    AccessBridge_PropertyActiveDescendentChangeFP propertyActiveDescendentChangeFP;
+
+        AccessBridge_PropertyTableModelChangeFP propertyTableModelChangeFP;
+
+
+
+public:
+        AccessBridgeEventHandler();
+        ~AccessBridgeEventHandler();
+        long getJavaEventMask() {return javaEventMask;};
+        long getAccessibilityEventMask() {return accessibilityEventMask;};
+
+        // ------- Registry methods
+        void setPropertyChangeFP(AccessBridge_PropertyChangeFP fp, WinAccessBridge *wab);
+        void setJavaShutdownFP(AccessBridge_JavaShutdownFP fp, WinAccessBridge *wab);
+        void setFocusGainedFP(AccessBridge_FocusGainedFP fp, WinAccessBridge *wab);
+        void setFocusLostFP(AccessBridge_FocusLostFP fp, WinAccessBridge *wab);
+        void setCaretUpdateFP(AccessBridge_CaretUpdateFP fp, WinAccessBridge *wab);
+        void setMouseClickedFP(AccessBridge_MouseClickedFP fp, WinAccessBridge *wab);
+        void setMouseEnteredFP(AccessBridge_MouseEnteredFP fp, WinAccessBridge *wab);
+        void setMouseExitedFP(AccessBridge_MouseExitedFP fp, WinAccessBridge *wab);
+        void setMousePressedFP(AccessBridge_MousePressedFP fp, WinAccessBridge *wab);
+        void setMouseReleasedFP(AccessBridge_MouseReleasedFP fp, WinAccessBridge *wab);
+        void setMenuCanceledFP(AccessBridge_MenuCanceledFP fp, WinAccessBridge *wab);
+        void setMenuDeselectedFP(AccessBridge_MenuDeselectedFP fp, WinAccessBridge *wab);
+        void setMenuSelectedFP(AccessBridge_MenuSelectedFP fp, WinAccessBridge *wab);
+        void setPopupMenuCanceledFP(AccessBridge_PopupMenuCanceledFP fp, WinAccessBridge *wab);
+        void setPopupMenuWillBecomeInvisibleFP(AccessBridge_PopupMenuWillBecomeInvisibleFP fp,
+                                               WinAccessBridge *wab);
+        void setPopupMenuWillBecomeVisibleFP(AccessBridge_PopupMenuWillBecomeVisibleFP fp,
+                                             WinAccessBridge *wab);
+
+        void setPropertyNameChangeFP(AccessBridge_PropertyNameChangeFP fp, WinAccessBridge *wab);
+        void setPropertyDescriptionChangeFP(AccessBridge_PropertyDescriptionChangeFP fp,
+                                            WinAccessBridge *wab);
+        void setPropertyStateChangeFP(AccessBridge_PropertyStateChangeFP fp, WinAccessBridge *wab);
+        void setPropertyValueChangeFP(AccessBridge_PropertyValueChangeFP fp, WinAccessBridge *wab);
+        void setPropertySelectionChangeFP(AccessBridge_PropertySelectionChangeFP fp,
+                                          WinAccessBridge *wab);
+        void setPropertyTextChangeFP(AccessBridge_PropertyTextChangeFP fp, WinAccessBridge *wab);
+        void setPropertyCaretChangeFP(AccessBridge_PropertyCaretChangeFP fp, WinAccessBridge *wab);
+        void setPropertyVisibleDataChangeFP(AccessBridge_PropertyVisibleDataChangeFP fp,
+                                            WinAccessBridge *wab);
+        void setPropertyChildChangeFP(AccessBridge_PropertyChildChangeFP fp, WinAccessBridge *wab);
+        void setPropertyActiveDescendentChangeFP(AccessBridge_PropertyActiveDescendentChangeFP fp,
+                                                 WinAccessBridge *wab);
+
+        void setPropertyTableModelChangeFP(AccessBridge_PropertyTableModelChangeFP fp,
+                                           WinAccessBridge *wab);
+
+        // ------- Event notification methods
+        void firePropertyChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                wchar_t *property, wchar_t *oldName, wchar_t *newName);
+        void fireJavaShutdown(long vmID);
+        void fireFocusGained(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireFocusLost(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireCaretUpdate(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMouseClicked(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMouseEntered(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMouseExited(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMousePressed(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMouseReleased(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMenuCanceled(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMenuDeselected(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void fireMenuSelected(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void firePopupMenuCanceled(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void firePopupMenuWillBecomeInvisible(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void firePopupMenuWillBecomeVisible(long vmID, JOBJECT64 event, JOBJECT64 source);
+
+        void firePropertyNameChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                        wchar_t *oldName, wchar_t *newName);
+        void firePropertyDescriptionChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                               wchar_t *oldDescription, wchar_t *newDescription);
+        void firePropertyStateChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                         wchar_t *oldState, wchar_t *newState);
+        void firePropertyValueChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                         wchar_t *oldValue, wchar_t *newValue);
+        void firePropertySelectionChange(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void firePropertyTextChange(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void firePropertyCaretChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                         int oldPosition, int newPosition);
+        void firePropertyVisibleDataChange(long vmID, JOBJECT64 event, JOBJECT64 source);
+        void firePropertyChildChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                         JOBJECT64 oldChild, JOBJECT64 newChild);
+        void firePropertyActiveDescendentChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                                    JOBJECT64 oldActiveDescendent, JOBJECT64 newActiveDescendent);
+
+        void firePropertyTableModelChange(long vmID, JOBJECT64 event, JOBJECT64 source,
+                                                              wchar_t *oldValue, wchar_t *newValue);
+
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeJavaVMInstance.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,358 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to track key JVM instance info from the AT WinAccessBridge
+ */
+
+#include "AccessBridgeDebug.h"
+#include "AccessBridgeJavaVMInstance.h"
+#include "AccessBridgeMessages.h"
+#include "AccessBridgePackages.h"
+#include "accessBridgeResource.h"       // for debugging messages
+
+#include <winbase.h>
+#include <jni.h>
+
+// The initialization must only be done one time and to provide for that the initialization
+// is now done in WinAccessBridge and the CRITICAL_SECTION memory has been moved to there.
+// send memory lock
+//CRITICAL_SECTION sendMemoryIPCLock;
+extern CRITICAL_SECTION sendMemoryIPCLock;
+
+// protects the javaVMs chain while in use
+extern bool isVMInstanceChainInUse;
+
+DEBUG_CODE(extern HWND theDialogWindow);
+extern "C" {
+    DEBUG_CODE(void AppendToCallInfo(char *s));
+}
+
+
+/**
+ *
+ *
+ */
+AccessBridgeJavaVMInstance::AccessBridgeJavaVMInstance(HWND ourABWindow,
+                                                       HWND javaABWindow,
+                                                       long javaVMID,
+                                                       AccessBridgeJavaVMInstance *next) {
+    goingAway = FALSE;
+    // This should be called once.  Moved to WinAccessBridge c'tor
+    //InitializeCriticalSection(&sendMemoryIPCLock);
+    ourAccessBridgeWindow = ourABWindow;
+    javaAccessBridgeWindow = javaABWindow;
+    vmID = javaVMID;
+    nextJVMInstance = next;
+    memoryMappedFileMapHandle = (HANDLE) 0;
+    memoryMappedView = (char *) 0;
+    sprintf(memoryMappedFileName, "AccessBridge-%p-%p.mmf",
+            ourAccessBridgeWindow, javaAccessBridgeWindow);
+}
+
+/**
+ *
+ *
+ */
+AccessBridgeJavaVMInstance::~AccessBridgeJavaVMInstance() {
+    DEBUG_CODE(char buffer[256]);
+
+    DEBUG_CODE(AppendToCallInfo("***** in AccessBridgeJavaVMInstance::~AccessBridgeJavaVMInstance\r\n"));
+    EnterCriticalSection(&sendMemoryIPCLock);
+
+    // if IPC memory mapped file view is valid, unmap it
+    goingAway = TRUE;
+    if (memoryMappedView != (char *) 0) {
+        DEBUG_CODE(sprintf(buffer, "  unmapping memoryMappedView; view = %p\r\n", memoryMappedView));
+        DEBUG_CODE(AppendToCallInfo(buffer));
+        UnmapViewOfFile(memoryMappedView);
+        memoryMappedView = (char *) 0;
+    }
+    // if IPC memory mapped file handle map is open, close it
+    if (memoryMappedFileMapHandle != (HANDLE) 0) {
+        DEBUG_CODE(sprintf(buffer, "  closing memoryMappedFileMapHandle; handle = %p\r\n", memoryMappedFileMapHandle));
+        DEBUG_CODE(AppendToCallInfo(buffer));
+        CloseHandle(memoryMappedFileMapHandle);
+        memoryMappedFileMapHandle = (HANDLE) 0;
+    }
+    LeaveCriticalSection(&sendMemoryIPCLock);
+
+}
+
+/**
+ * initiateIPC - sets up the memory-mapped file to do IPC messaging
+ *               1 file is created: to handle requests for information
+ *               initiated from Windows AT.  The package is placed into
+ *               the memory-mapped file (char *memoryMappedView),
+ *               and then a special SendMessage() is sent.  When the
+ *               JavaDLL returns from SendMessage() processing, the
+ *               data will be in memoryMappedView.  The SendMessage()
+ *               return value tells us if all is right with the world.
+ *
+ *               The set-up proces involves creating the memory-mapped
+ *               file, and handshaking with the JavaDLL so it knows
+ *               about it as well.
+ *
+ */
+LRESULT
+AccessBridgeJavaVMInstance::initiateIPC() {
+    DEBUG_CODE(char debugBuf[256]);
+    DWORD errorCode;
+
+    DEBUG_CODE(AppendToCallInfo(" in AccessBridgeJavaVMInstance::initiateIPC()\r\n"));
+
+    // create Windows-initiated IPC file & map it to a ptr
+    memoryMappedFileMapHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
+                                                  PAGE_READWRITE, 0,
+                                                  // 8 bytes for return code
+                                                  sizeof(WindowsInitiatedPackages) + 8,
+                                                  memoryMappedFileName);
+    if (memoryMappedFileMapHandle == NULL) {
+        errorCode = GetLastError();
+        DEBUG_CODE(sprintf(debugBuf, "  Failed to CreateFileMapping for %s, error: %X", memoryMappedFileName, errorCode));
+        DEBUG_CODE(AppendToCallInfo(debugBuf));
+        return errorCode;
+    } else {
+        DEBUG_CODE(sprintf(debugBuf, "  CreateFileMapping worked - filename: %s\r\n", memoryMappedFileName));
+        DEBUG_CODE(AppendToCallInfo(debugBuf));
+    }
+
+    memoryMappedView = (char *) MapViewOfFile(memoryMappedFileMapHandle,
+                                              FILE_MAP_READ | FILE_MAP_WRITE,
+                                              0, 0, 0);
+    if (memoryMappedView == NULL) {
+        errorCode = GetLastError();
+        DEBUG_CODE(sprintf(debugBuf, "  Failed to MapViewOfFile for %s, error: %X", memoryMappedFileName, errorCode));
+        DEBUG_CODE(AppendToCallInfo(debugBuf));
+        return errorCode;
+    } else {
+        DEBUG_CODE(sprintf(debugBuf, "  MapViewOfFile worked - view: %p\r\n", memoryMappedView));
+        DEBUG_CODE(AppendToCallInfo(debugBuf));
+    }
+
+
+    // write some data to the memory mapped file
+    strcpy(memoryMappedView, AB_MEMORY_MAPPED_FILE_OK_QUERY);
+
+
+    // inform the JavaDLL that we've a memory mapped file ready for it
+    char buffer[sizeof(PackageType) + sizeof(MemoryMappedFileCreatedPackage)];
+    PackageType *type = (PackageType *) buffer;
+    MemoryMappedFileCreatedPackage *pkg = (MemoryMappedFileCreatedPackage *) (buffer + sizeof(PackageType));
+    *type = cMemoryMappedFileCreatedPackage;
+    pkg->bridgeWindow = ABHandleToLong(ourAccessBridgeWindow);
+    strncpy(pkg->filename, memoryMappedFileName, cMemoryMappedNameSize);
+    sendPackage(buffer, sizeof(buffer));
+
+
+    // look for the JavaDLL's answer to see if it could read the file
+    if (strcmp(memoryMappedView, AB_MEMORY_MAPPED_FILE_OK_ANSWER) != 0) {
+        DEBUG_CODE(sprintf(debugBuf, "  JavaVM failed to deal with memory mapped file %s\r\n",
+                      memoryMappedFileName));
+        DEBUG_CODE(AppendToCallInfo(debugBuf));
+        return -1;
+    } else {
+        DEBUG_CODE(sprintf(debugBuf, "  Success!  JavaVM accpeted our file\r\n"));
+        DEBUG_CODE(AppendToCallInfo(debugBuf));
+    }
+
+    return 0;
+}
+
+// -----------------------
+
+/**
+ * sendPackage - uses SendMessage(WM_COPYDATA) to do IPC messaging
+ *               with the Java AccessBridge DLL
+ *
+ *               NOTE: WM_COPYDATA is only for one-way IPC; there
+ *               is now way to return parameters (especially big ones)
+ *               Use sendMemoryPackage() to do that!
+ */
+LRESULT
+AccessBridgeJavaVMInstance::sendPackage(char *buffer, long bufsize) {
+    COPYDATASTRUCT toCopy;
+    toCopy.dwData = 0;          // 32-bits we could use for something...
+    toCopy.cbData = bufsize;
+    toCopy.lpData = buffer;
+
+    PrintDebugString("In AccessBridgeVMInstance::sendPackage");
+    PrintDebugString("    javaAccessBridgeWindow: %p", javaAccessBridgeWindow);
+    /* This was SendMessage.  Normally that is a blocking call.  However, if
+     * SendMessage is sent to another process, e.g. another JVM and an incoming
+     * SendMessage is pending, control will be passed to the DialogProc to handle
+     * the incoming message.  A bug occurred where this allowed an AB_DLL_GOING_AWAY
+     * message to be processed deleting an AccessBridgeJavaVMInstance object in
+     * the javaVMs chain.  SendMessageTimeout with SMTO_BLOCK set will prevent the
+     * calling thread from processing other requests while waiting, i.e control
+     * will not be passed to the DialogProc.  Also note that PostMessage or
+     * SendNotifyMessage can't be used.  Although they don't allow transfer to
+     * the DialogProc they can't be used in cases where pointers are passed.  This
+     * is because the referenced memory needs to be available when the other thread
+     * gets control.
+     */
+    UINT flags = SMTO_BLOCK | SMTO_NOTIMEOUTIFNOTHUNG;
+    DWORD_PTR out; // not used
+    LRESULT lr = SendMessageTimeout( javaAccessBridgeWindow, WM_COPYDATA,
+                                     (WPARAM)ourAccessBridgeWindow, (LPARAM)&toCopy,
+                                     flags, 4000, &out );
+    return lr;
+}
+
+
+/**
+ * sendMemoryPackage - uses Memory-Mapped files to do IPC messaging
+ *                     with the Java AccessBridge DLL, informing the
+ *                     Java AccessBridge DLL via SendMessage that something
+ *                     is waiting for it in the shared file...
+ *
+ *                     In the SendMessage call, the third param (WPARAM) is
+ *                     the source HWND (ourAccessBridgeWindow in this case),
+ *                     and the fourth param (LPARAM) is the size in bytes of
+ *                     the package put into shared memory.
+ *
+ */
+BOOL
+AccessBridgeJavaVMInstance::sendMemoryPackage(char *buffer, long bufsize) {
+
+    // Protect against race condition where the memory mapped file is
+    // deallocated before the memory package is being sent
+    if (goingAway) {
+        return FALSE;
+    }
+    BOOL retval = FALSE;
+
+    DEBUG_CODE(char outputBuf[256]);
+    DEBUG_CODE(sprintf(outputBuf, "AccessBridgeJavaVMInstance::sendMemoryPackage(, %d)", bufsize));
+    DEBUG_CODE(AppendToCallInfo(outputBuf));
+
+    DEBUG_CODE(PackageType *type = (PackageType *) buffer);
+    DEBUG_CODE(if (*type == cGetAccessibleTextRangePackage) {)
+        DEBUG_CODE(AppendToCallInfo("  'buffer' contains:"));
+        DEBUG_CODE(GetAccessibleTextRangePackage *pkg = (GetAccessibleTextRangePackage *) (buffer + sizeof(PackageType)));
+        DEBUG_CODE(sprintf(outputBuf, "    PackageType = %X", *type));
+        DEBUG_CODE(AppendToCallInfo(outputBuf));
+        DEBUG_CODE(sprintf(outputBuf, "    GetAccessibleTextRange: start = %d, end = %d, rText = %ls",
+            pkg->start, pkg->end, pkg->rText));
+        DEBUG_CODE(AppendToCallInfo(outputBuf));
+    DEBUG_CODE(})
+
+    EnterCriticalSection(&sendMemoryIPCLock);
+    {
+        // copy the package into shared memory
+        if (!goingAway) {
+            memcpy(memoryMappedView, buffer, bufsize);
+
+            DEBUG_CODE(PackageType *type = (PackageType *) memoryMappedView);
+            DEBUG_CODE(if (*type == cGetAccessibleTextItemsPackage) {)
+                DEBUG_CODE(AppendToCallInfo("  'memoryMappedView' now contains:"));
+                DEBUG_CODE(GetAccessibleTextItemsPackage *pkg = (GetAccessibleTextItemsPackage *) (buffer + sizeof(PackageType)));
+                DEBUG_CODE(sprintf(outputBuf, "    PackageType = %X", *type));
+                DEBUG_CODE(AppendToCallInfo(outputBuf));
+            DEBUG_CODE(})
+        }
+
+        if (!goingAway) {
+            // Let the recipient know there is a package waiting for them. The unset byte
+            // at end of buffer which will only be set if message is properly received
+            char *done = &memoryMappedView[bufsize];
+            *done = 0;
+
+            PrintDebugString("    javaAccessBridgeWindow: %p", javaAccessBridgeWindow);
+            // See the comment above the call to SendMessageTimeout in SendPackage method above.
+            UINT flags = SMTO_BLOCK | SMTO_NOTIMEOUTIFNOTHUNG;
+            DWORD_PTR out; // not used
+            SendMessageTimeout( javaAccessBridgeWindow, AB_MESSAGE_WAITING, (WPARAM)ourAccessBridgeWindow, (LPARAM)bufsize,
+                                flags, 4000, &out );
+
+            // only succeed if message has been properly received
+            if(!goingAway) retval = (*done == 1);
+        }
+
+        // copy the package back from shared memory
+        if (!goingAway) {
+            memcpy(buffer, memoryMappedView, bufsize);
+        }
+    }
+    LeaveCriticalSection(&sendMemoryIPCLock);
+    return retval;
+}
+
+
+/**
+ * findAccessBridgeWindow - walk through linked list from where we are,
+ *                          return the HWND of the ABJavaVMInstance that
+ *                          matches the passed in vmID; no match: return 0
+ *
+ */
+HWND
+AccessBridgeJavaVMInstance::findAccessBridgeWindow(long javaVMID) {
+    PrintDebugString("In findAccessBridgeWindow");
+    // no need to recurse really
+    if (vmID == javaVMID) {
+        return javaAccessBridgeWindow;
+    } else {
+        isVMInstanceChainInUse = true;
+        AccessBridgeJavaVMInstance *current = nextJVMInstance;
+        while (current != (AccessBridgeJavaVMInstance *) 0) {
+            if (current->vmID == javaVMID) {
+                isVMInstanceChainInUse = false;
+                return current->javaAccessBridgeWindow;
+            }
+            current = current->nextJVMInstance;
+        }
+        isVMInstanceChainInUse = false;
+    }
+    return 0;
+}
+
+/**
+ * findABJavaVMInstanceFromJavaHWND - walk through linked list from
+ *                                    where we are.  Return the
+ *                                    AccessBridgeJavaVMInstance
+ *                                    of the ABJavaVMInstance that
+ *                                    matches the passed in vmID;
+ *                                    no match: return 0
+ */
+AccessBridgeJavaVMInstance *
+AccessBridgeJavaVMInstance::findABJavaVMInstanceFromJavaHWND(HWND window) {
+    PrintDebugString("In findABJavaInstanceFromJavaHWND");
+    // no need to recurse really
+    if (javaAccessBridgeWindow == window) {
+        return this;
+    } else {
+        isVMInstanceChainInUse = true;
+        AccessBridgeJavaVMInstance *current = nextJVMInstance;
+        while (current != (AccessBridgeJavaVMInstance *) 0) {
+            if (current->javaAccessBridgeWindow == window) {
+                isVMInstanceChainInUse = false;
+                return current;
+            }
+            current = current->nextJVMInstance;
+        }
+    }
+    isVMInstanceChainInUse = false;
+    return (AccessBridgeJavaVMInstance *) 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeJavaVMInstance.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to track key JVM instance info from the AT WinAccessBridge
+ */
+
+#ifndef __AccessBridgeJavaVMInstance_H__
+#define __AccessBridgeJavaVMInstance_H__
+
+#include "AccessBridgePackages.h"
+
+#include <jni.h>
+#include <windows.h>
+
+/**
+ * The AccessBridgeJavaVMInstance class.
+ */
+class AccessBridgeJavaVMInstance {
+        friend class WinAccessBridge;
+
+        AccessBridgeJavaVMInstance *nextJVMInstance;
+        HWND ourAccessBridgeWindow;
+        HWND javaAccessBridgeWindow;
+        long vmID;
+
+        // IPC variables
+        HANDLE memoryMappedFileMapHandle;       // handle to file map
+        char *memoryMappedView;                         // ptr to shared memory
+        char memoryMappedFileName[cMemoryMappedNameSize];
+        BOOL goingAway;
+
+
+public:
+        AccessBridgeJavaVMInstance(HWND ourABWindow, HWND javaABWindow,
+                                                           long javaVMID,
+                                                           AccessBridgeJavaVMInstance *next);
+        ~AccessBridgeJavaVMInstance();
+        LRESULT initiateIPC();
+        LRESULT sendPackage(char *buffer, long bufsize);
+        BOOL sendMemoryPackage(char *buffer, long bufsize);
+        HWND findAccessBridgeWindow(long javaVMID);
+        AccessBridgeJavaVMInstance *findABJavaVMInstanceFromJavaHWND(HWND window);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeMessageQueue.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage queueing of messages for IPC
+ */
+
+#include "AccessBridgeDebug.h"
+#include "AccessBridgeMessageQueue.h"
+#include "AccessBridgePackages.h"               // for debugging only
+#include <windows.h>
+#include <malloc.h>
+
+DEBUG_CODE(extern HWND theDialogWindow);
+extern "C" {
+    DEBUG_CODE(void AppendToCallInfo(char *s));
+}
+
+// -------------------
+
+
+AccessBridgeQueueElement::AccessBridgeQueueElement(char *buf, int size) {
+    bufsize = size;
+    next = (AccessBridgeQueueElement *) 0;
+    previous = (AccessBridgeQueueElement *) 0;
+    buffer = (char *) malloc(bufsize);
+    memcpy(buffer, buf, bufsize);
+}
+
+AccessBridgeQueueElement::~AccessBridgeQueueElement() {
+    //  delete buffer;
+    free(buffer);
+}
+
+
+// -------------------
+
+
+AccessBridgeMessageQueue::AccessBridgeMessageQueue() {
+    queueLocked = FALSE;
+    queueRemoveLocked = FALSE;
+    start = (AccessBridgeQueueElement *) 0;
+    end = (AccessBridgeQueueElement *) 0;
+    size = 0;
+}
+
+AccessBridgeMessageQueue::~AccessBridgeMessageQueue() {
+    // empty queue, then exit
+}
+
+/**
+ * getEventsWaiting - gets the number of events waiting to fire
+ */
+int
+AccessBridgeMessageQueue::getEventsWaiting() {
+    return size;
+}
+
+/**
+ * add - add an element to the queue, which is locked with semaphores
+ *
+ */
+QueueReturns
+AccessBridgeMessageQueue::add(AccessBridgeQueueElement *element) {
+    PrintDebugString("  in AccessBridgeMessageQueue::add()");
+    PrintDebugString("    queue size = %d", size);
+
+    QueueReturns returnVal = cElementPushedOK;
+    if (queueLocked) {
+        PrintDebugString("    queue was locked; returning cQueueInUse!");
+        return cQueueInUse;
+    }
+    queueLocked = TRUE;
+    {
+        PrintDebugString("    adding element to queue!");
+        if (end == (AccessBridgeQueueElement *) 0) {
+            if (start == (AccessBridgeQueueElement *) 0 && size == 0) {
+                start = element;
+                end = element;
+                element->previous = (AccessBridgeQueueElement *) 0;
+                element->next = (AccessBridgeQueueElement *) 0;
+                size++;
+            } else {
+                returnVal = cQueueBroken;       // bad voodo!
+            }
+        } else {
+            element->previous = end;
+            element->next = (AccessBridgeQueueElement *) 0;
+            end->next = element;
+            end = element;
+            size++;
+        }
+    }
+    queueLocked = FALSE;
+    PrintDebugString("    returning from AccessBridgeMessageQueue::add()");
+    return returnVal;
+}
+
+
+/**
+ * remove - remove an element from the queue, which is locked with semaphores
+ *
+ */
+QueueReturns
+AccessBridgeMessageQueue::remove(AccessBridgeQueueElement **element) {
+    PrintDebugString("  in AccessBridgeMessageQueue::remove()");
+    PrintDebugString("    queue size = %d", size);
+
+    QueueReturns returnVal = cMoreMessages;
+    if (queueLocked) {
+        PrintDebugString("    queue was locked; returning cQueueInUse!");
+        return cQueueInUse;
+    }
+    queueLocked = TRUE;
+    {
+        PrintDebugString("    removing element from queue!");
+        if (size > 0) {
+            if (start != (AccessBridgeQueueElement *) 0) {
+                *element = start;
+                start = start->next;
+                if (start != (AccessBridgeQueueElement *) 0) {
+                    start->previous = (AccessBridgeQueueElement *) 0;
+                } else {
+                    end = (AccessBridgeQueueElement *) 0;
+                    if (size != 1) {
+                        returnVal = cQueueBroken;       // bad voodo, should only be 1 in this situation
+                    }
+                }
+                size--;
+            } else {
+                returnVal = cQueueBroken;       // bad voodo!
+            }
+        } else {
+            returnVal = cQueueEmpty;
+        }
+    }
+    queueLocked = FALSE;
+    PrintDebugString("    returning from AccessBridgeMessageQueue::remove()");
+    return returnVal;
+}
+
+
+/**
+ * setRemoveLock - set the state of the removeLock (TRUE or FALSE)
+ *
+ */
+QueueReturns
+AccessBridgeMessageQueue::setRemoveLock(BOOL removeLockSetting) {
+    if (queueLocked) {
+        return cQueueInUse;
+    }
+    queueRemoveLocked = removeLockSetting;
+
+    return cQueueOK;
+}
+
+/**
+ * setRemoveLock - set the state of the removeLock (TRUE or FALSE)
+ *
+ */
+BOOL
+AccessBridgeMessageQueue::getRemoveLockSetting() {
+    return queueRemoveLocked;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeMessageQueue.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A class to manage queueing of messages for IPC
+ */
+
+#include <windows.h>
+
+#ifndef __AccessBridgeMessageQueue_H__
+#define __AccessBridgeMessageQueue_H__
+
+
+enum QueueReturns {
+    cQueueEmpty = 0,
+    cMoreMessages = 1,
+    cQueueInUse,
+    cElementPushedOK,
+    cQueueFull,
+    cQueueOK,
+    cQueueBroken                // shouldn't ever happen!
+};
+
+class AccessBridgeQueueElement {
+    friend class AccessBridgeMessageQueue;
+    friend class WinAccessBridge;
+    char *buffer;
+    int bufsize;
+    AccessBridgeQueueElement *next;
+    AccessBridgeQueueElement *previous;
+
+public:
+    AccessBridgeQueueElement(char *buf, int size);
+    ~AccessBridgeQueueElement();
+};
+
+class AccessBridgeMessageQueue {
+    BOOL queueLocked;
+    BOOL queueRemoveLocked;
+    AccessBridgeQueueElement *start;
+    AccessBridgeQueueElement *end;
+    int size;
+
+public:
+    AccessBridgeMessageQueue();
+    ~AccessBridgeMessageQueue();
+
+    int getEventsWaiting();
+
+    QueueReturns add(AccessBridgeQueueElement *element);
+    QueueReturns remove(AccessBridgeQueueElement **element);
+    QueueReturns setRemoveLock(BOOL removeLockSetting);
+    BOOL getRemoveLockSetting();
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeWindowsEntryPoints.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,856 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Glue routines called by Windows AT into the WindowsAccessBridge dll
+ */
+
+#include "AccessBridgeDebug.h"
+#include "AccessBridgeWindowsEntryPoints.h"
+#include "WinAccessBridge.h"
+#include "accessBridgeResource.h"
+
+#include <windows.h>
+#include <jni.h>
+
+
+extern WinAccessBridge *theWindowsAccessBridge;
+extern HWND theDialogWindow;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    /**
+     * Windows_run - where Windows executables will load/unload us
+     *
+     */
+    void Windows_run() {
+        // open our window
+        if (theWindowsAccessBridge != (WinAccessBridge *) 0) {
+            theWindowsAccessBridge->initWindow();
+            DEBUG_CODE(SetDlgItemText(theDialogWindow, cInvokedByText, "Windows"));
+        }
+    }
+
+    /*
+      /**
+      * Windows_shutdown - where Windows executables will load/unload us
+      *
+      *
+      void Windows_shutdown() {
+      if (theWindowsAccessBridge != (WinAccessBridge *) 0) {
+      theWindowsAccessBridge->initWindow();
+      }
+      }
+    */
+
+    /**
+     * getTopLevelHWND - returns the top-level window parent of the descendent
+     *
+     */
+    HWND getTopLevelHWND(HWND descendent) {
+        HWND hwnd;
+        if (descendent == NULL) {
+            return NULL;
+        }
+
+        if (!IsWindow(descendent)) {
+            return NULL;
+        }
+
+        hwnd = descendent;
+        for(;;) {
+            LONG style = GetWindowLong(hwnd, GWL_STYLE);
+            if ( (style & WS_CHILD) == 0 ) {
+                // found a non-child window so terminate
+                break;
+            }
+            hwnd = GetParent(hwnd);
+        }
+
+        return hwnd;
+    }
+
+    void releaseJavaObject(long vmID, JOBJECT64 object) {
+        if (theWindowsAccessBridge != 0) {
+            theWindowsAccessBridge->releaseJavaObject(vmID, object);
+        }
+    }
+
+    void getVersionInfo(long vmID, AccessBridgeVersionInfo *info) {
+        if (theWindowsAccessBridge != 0) {
+            theWindowsAccessBridge->getVersionInfo(vmID, info);
+        }
+    }
+
+
+    BOOL isJavaWindow(HWND window) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->isJavaWindow(window);
+        }
+        return FALSE;
+    }
+
+    /*
+     * Returns whether two object references refer to the same object
+     */
+    BOOL isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2) {
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+        PrintDebugString("\r\nAccessBridgeWindowsEntryPoints::isSameObject(%p %p)", obj1, obj2);
+#else // JOBJECT64 is jlong (64 bit)
+        PrintDebugString("\r\nAccessBridgeWindowsEntryPoints::isSameObject(%016I64X %016I64X)", obj1, obj2);
+#endif
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->isSameObject(vmID, obj1, obj2);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Sets a text field to the specified string. Returns whether successful
+     */
+    BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext,const wchar_t *text) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->setTextContents(vmID, accessibleContext, text);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Returns the Accessible Context of an object of the specified role that is the
+     * ancestor of a given object.  If the object is of the specified role
+     * or an ancestor object of the specified role was found, returns the object's
+     * AccessibleContext.
+     * If there is no ancestor object of the specified role,
+     * returns (AccessibleContext)0.
+     */
+    AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getParentWithRole(vmID, accessibleContext, role);
+        }
+        return (AccessibleContext)0;
+    }
+
+
+    /**
+     * Returns the Accessible Context for the top level object in
+     * a Java Window.  This is same Accessible Context that is obtained
+     * from GetAccessibleContextFromHWND for that window.  Returns
+     * (AccessibleContext)0 on error.
+     */
+    AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getTopLevelObject(vmID, accessibleContext);
+        }
+        return (AccessibleContext)0;
+    }
+
+    /**
+     * If there is an Ancestor object of the specified role,
+     * returns the Accessible Context of the found object.
+     * Otherwise, returns the top level object for that
+     * Java Window.  Returns (AccessibleContext)0 on error.
+     */
+    AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getParentWithRoleElseRoot(vmID, accessibleContext, role);
+        }
+        return (AccessibleContext)0;
+    }
+
+    /**
+     * Returns how deep in the object hierarchy a given object is.
+     * The top most object in the object hierarchy has an object depth of 0.
+     * Returns -1 on error.
+     */
+    int getObjectDepth (const long vmID, const AccessibleContext accessibleContext) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getObjectDepth(vmID, accessibleContext);
+        }
+        return -1;
+    }
+
+    /**
+     * Returns the Accessible Context of the currently ActiveDescendent of an object.
+     * Returns (AccessibleContext)0 on error.
+     */
+    AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getActiveDescendent(vmID, accessibleContext);
+        }
+        return (AccessibleContext)0;
+    }
+
+    // -------- Accessible Context methods -------------
+
+    BOOL getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleContextFromHWND(window, vmID, AccessibleContext);
+        }
+        return FALSE;
+    }
+
+    HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getHWNDFromAccessibleContext(vmID, accessibleContext);
+        }
+        return (HWND)0;
+    }
+
+    BOOL getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent,
+                                jint x, jint y, JOBJECT64 *AccessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleContextAt(vmID, AccessibleContextParent,
+                                                                  x, y, AccessibleContext);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleContextWithFocus(window, vmID, AccessibleContext);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleContextInfo(long vmID,
+                                  JOBJECT64 AccessibleContext,
+                                  AccessibleContextInfo *info) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleContextInfo(
+                                                                    vmID,
+                                                                    AccessibleContext,
+                                                                    info);
+        }
+        return FALSE;
+    }
+
+    JOBJECT64 getAccessibleChildFromContext(long vmID,
+                                          JOBJECT64 AccessibleContext,
+                                          jint childIndex) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleChildFromContext(
+                                                                         vmID,
+                                                                         AccessibleContext,
+                                                                         childIndex);
+        }
+        return (JOBJECT64) 0;
+    }
+
+    JOBJECT64 getAccessibleParentFromContext(long vmID,
+                                           JOBJECT64 AccessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleParentFromContext(
+                                                                          vmID,
+                                                                          AccessibleContext);
+        }
+        return (JOBJECT64) 0;
+    }
+
+    // -------- begin AccessibleTable routines -------------
+
+    BOOL getAccessibleTableInfo(long vmID, JOBJECT64 ac,
+                                AccessibleTableInfo *tableInfo) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTableInfo(
+                                                                  vmID,
+                                                                  ac,
+                                                                  tableInfo);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable,
+                                    jint row, jint column, AccessibleTableCellInfo *tableCellInfo) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTableCellInfo(
+                                                                      vmID,
+                                                                      accessibleTable,
+                                                                      row, column, tableCellInfo);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTableRowHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTableRowHeader(
+                                                                       vmID,
+                                                                       acParent,
+                                                                       tableInfo);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTableColumnHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTableColumnHeader(
+                                                                          vmID,
+                                                                          acParent,
+                                                                          tableInfo);
+        }
+        return FALSE;
+    }
+
+    JOBJECT64 getAccessibleTableRowDescription(long vmID, JOBJECT64 acParent, jint row) {
+
+        if (theWindowsAccessBridge != 0) {
+            return (JOBJECT64)theWindowsAccessBridge->getAccessibleTableRowDescription(
+                                                                            vmID,
+                                                                            acParent,
+                                                                            row);
+        }
+        return (JOBJECT64)0;
+    }
+
+    JOBJECT64 getAccessibleTableColumnDescription(long vmID, JOBJECT64 acParent, jint column) {
+
+        if (theWindowsAccessBridge != 0) {
+            return (JOBJECT64)theWindowsAccessBridge->getAccessibleTableColumnDescription(
+                                                                               vmID,
+                                                                               acParent,
+                                                                               column);
+        }
+        return (JOBJECT64)0;
+    }
+
+    jint getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTableRowSelectionCount(vmID, accessibleTable);
+        }
+        return -1;
+    }
+
+    BOOL isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->isAccessibleTableRowSelected(vmID, accessibleTable, row);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count, jint *selections) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->getAccessibleTableRowSelections(vmID, accessibleTable, count,
+                                                                           selections);
+        }
+        return FALSE;
+    }
+
+
+    jint getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->getAccessibleTableColumnSelectionCount(vmID, accessibleTable);
+        }
+        return -1;
+    }
+
+    BOOL isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->isAccessibleTableColumnSelected(vmID, accessibleTable, column);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count, jint *selections) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->getAccessibleTableColumnSelections(vmID, accessibleTable, count,
+                                                                              selections);
+        }
+        return FALSE;
+    }
+
+    jint getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->getAccessibleTableRow(vmID, accessibleTable, index);
+        }
+        return -1;
+    }
+
+    jint getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->getAccessibleTableColumn(vmID, accessibleTable, index);
+        }
+        return -1;
+    }
+
+    jint getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column) {
+        if (theWindowsAccessBridge != 0 ) {
+            return theWindowsAccessBridge->getAccessibleTableIndex(vmID, accessibleTable, row, column);
+        }
+        return -1;
+    }
+
+    /* --------- end AccessibleTable routines ------- */
+
+    // --------- AccessibleRelationSet methods
+
+    BOOL getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext,
+                                  AccessibleRelationSetInfo *relationSetInfo) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleRelationSet(vmID, accessibleContext, relationSetInfo);
+        }
+        return FALSE;
+    }
+
+    // --------- AccessibleHypertext methods
+
+    BOOL getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext,
+                                AccessibleHypertextInfo *accessibleHypertextInfo) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleHypertext(vmID, accessibleContext,
+                                                                  accessibleHypertextInfo);
+        }
+        return FALSE;
+    }
+
+    BOOL activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext, JOBJECT64 accessibleHyperlink) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->activateAccessibleHyperlink(vmID, accessibleContext,
+                                                                       accessibleHyperlink);
+        }
+        return FALSE;
+    }
+
+    jint getAccessibleHyperlinkCount(const long vmID,
+                                     const AccessibleContext accessibleContext) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleHyperlinkCount(vmID, accessibleContext);
+        }
+        return -1;
+    }
+
+
+    BOOL getAccessibleHypertextExt(const long vmID,
+                                   const AccessibleContext accessibleContext,
+                                   const jint nStartIndex,
+                                   /* OUT */ AccessibleHypertextInfo *hypertextInfo) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleHypertextExt(vmID,
+                                                                     accessibleContext,
+                                                                     nStartIndex,
+                                                                     hypertextInfo);
+        }
+        return FALSE;
+    }
+
+
+    jint getAccessibleHypertextLinkIndex(const long vmID,
+                                         const AccessibleHypertext hypertext,
+                                         const jint nIndex) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleHypertextLinkIndex(vmID,
+                                                                           hypertext,
+                                                                           nIndex);
+        }
+        return -1;
+    }
+
+
+    BOOL getAccessibleHyperlink(const long vmID,
+                                const AccessibleHypertext hypertext,
+                                const jint nIndex,
+                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleHyperlink(vmID,
+                                                                  hypertext,
+                                                                  nIndex,
+                                                                  hyperlinkInfo);
+        }
+        return FALSE;
+    }
+
+
+    /* Accessible KeyBindings, Icons and Actions */
+    BOOL getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext, AccessibleKeyBindings *keyBindings) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleKeyBindings(vmID, accessibleContext, keyBindings);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleIcons(long vmID, JOBJECT64 accessibleContext, AccessibleIcons *icons) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleIcons(vmID, accessibleContext, icons);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleActions(long vmID, JOBJECT64 accessibleContext, AccessibleActions *actions) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleActions(vmID, accessibleContext, actions);
+        }
+        return FALSE;
+    }
+
+    BOOL doAccessibleActions(long vmID, JOBJECT64 accessibleContext, AccessibleActionsToDo *actionsToDo,
+                             jint *failure) {
+
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->doAccessibleActions(vmID, accessibleContext, actionsToDo,
+                                                               failure);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Additional methods for Teton
+     */
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+     * whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    BOOL getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext, wchar_t *name, int len) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getVirtualAccessibleName(vmID, accessibleContext, name, len);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Request focus for a component. Returns whether successful;
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    BOOL requestFocus(long vmID, AccessibleContext accessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->requestFocus(vmID, accessibleContext);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Selects text between two indices.  Selection includes the text at the start index
+     * and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    BOOL selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->selectTextRange(vmID, accessibleContext, startIndex, endIndex);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Get text attributes between two indices.  The attribute list includes the text at the
+     * start index and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944761 - getTextAttributes between two indices method needed
+     */
+    BOOL getTextAttributesInRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex,
+                                  AccessibleTextAttributesInfo *attributes, short *len) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getTextAttributesInRange(vmID, accessibleContext,
+                                                                    startIndex, endIndex, attributes, len);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Gets the number of visible children of a component.  Returns -1 on error.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    int getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getVisibleChildrenCount(vmID, accessibleContext);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Gets the visible children of an AccessibleContext. Returns whether successful;
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    BOOL getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex,
+                            VisibleChildrenInfo *visibleChildrenInfo) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getVisibleChildren(vmID, accessibleContext, startIndex,
+                                                              visibleChildrenInfo);
+        }
+        return FALSE;
+    }
+
+    /**
+     * Set the caret to a text position. Returns whether successful;
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext,
+                          const int position) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->setCaretPosition(vmID, accessibleContext, position);
+        }
+        return FALSE;
+    }
+
+    // -------- Accessible Text methods -------------
+
+    BOOL getAccessibleTextInfo(long vmID, JOBJECT64 AccessibleContext,
+                               AccessibleTextInfo *textInfo, jint x, jint y) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTextInfo(
+                                                                 vmID,
+                                                                 AccessibleContext,
+                                                                 textInfo, x, y);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTextItems(long vmID, JOBJECT64 AccessibleContext,
+                                AccessibleTextItemsInfo *textItems, jint index) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTextItems(
+                                                                  vmID,
+                                                                  AccessibleContext,
+                                                                  textItems, index);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTextSelectionInfo(long vmID, JOBJECT64 AccessibleContext,
+                                        AccessibleTextSelectionInfo *selectionInfo) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTextSelectionInfo(
+                                                                          vmID,
+                                                                          AccessibleContext,
+                                                                          selectionInfo);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTextAttributes(long vmID, JOBJECT64 AccessibleContext,
+                                     jint index, AccessibleTextAttributesInfo *attributes) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTextAttributes(
+                                                                       vmID,
+                                                                       AccessibleContext,
+                                                                       index, attributes);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTextRect(long vmID, JOBJECT64 AccessibleContext,
+                               AccessibleTextRectInfo *rectInfo, jint index) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTextRect(
+                                                                 vmID,
+                                                                 AccessibleContext,
+                                                                 rectInfo, index);
+        }
+        return FALSE;
+    }
+
+    BOOL getCaretLocation(long vmID, JOBJECT64 AccessibleContext,
+                          AccessibleTextRectInfo *rectInfo, jint index) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getCaretLocation(vmID,
+                                                            AccessibleContext,
+                                                            rectInfo, index);
+        }
+        return FALSE;
+    }
+
+    int getEventsWaiting() {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getEventsWaiting();
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTextLineBounds(long vmID, JOBJECT64 AccessibleContext,
+                                     jint index, jint *startIndex, jint *endIndex) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTextLineBounds(
+                                                                       vmID,
+                                                                       AccessibleContext,
+                                                                       index, startIndex, endIndex);
+        }
+        return FALSE;
+    }
+
+    BOOL getAccessibleTextRange(long vmID, JOBJECT64 AccessibleContext,
+                                jint start, jint end, wchar_t *text, short len) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleTextRange(
+                                                                  vmID,
+                                                                  AccessibleContext,
+                                                                  start, end, text, len);
+        }
+        return FALSE;
+    }
+
+
+    // -------- Accessible Value methods -------------
+
+    BOOL getCurrentAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext,
+                                              wchar_t *value, short len) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getCurrentAccessibleValueFromContext(
+                                                                                vmID, AccessibleContext, value, len);
+        }
+        return FALSE;
+    }
+
+    BOOL getMaximumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext,
+                                              wchar_t *value, short len) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getMaximumAccessibleValueFromContext(
+                                                                                vmID, AccessibleContext, value, len);
+        }
+        return FALSE;
+    }
+
+    BOOL getMinimumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext,
+                                              wchar_t *value, short len) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getMinimumAccessibleValueFromContext(
+                                                                                vmID, AccessibleContext, value, len);
+        }
+        return FALSE;
+    }
+
+    // -------- Accessible Selection methods -------------
+
+    void addAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
+        if (theWindowsAccessBridge != 0) {
+            theWindowsAccessBridge->addAccessibleSelectionFromContext(
+                                                                      vmID, AccessibleContext, i);
+        }
+    }
+
+    void clearAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            theWindowsAccessBridge->clearAccessibleSelectionFromContext(
+                                                                        vmID, AccessibleContext);
+        }
+    }
+
+    JOBJECT64 getAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleSelectionFromContext(
+                                                                             vmID, AccessibleContext, i);
+        }
+        return (JOBJECT64) 0;
+    }
+
+    int getAccessibleSelectionCountFromContext(long vmID, JOBJECT64 AccessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->getAccessibleSelectionCountFromContext(
+                                                                                  vmID, AccessibleContext);
+        }
+        return -1;
+    }
+
+    BOOL isAccessibleChildSelectedFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
+        if (theWindowsAccessBridge != 0) {
+            return theWindowsAccessBridge->isAccessibleChildSelectedFromContext(
+                                                                                vmID, AccessibleContext, i);
+        }
+        return FALSE;
+    }
+
+    void removeAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i) {
+        if (theWindowsAccessBridge != 0) {
+            theWindowsAccessBridge->removeAccessibleSelectionFromContext(
+                                                                         vmID, AccessibleContext, i);
+        }
+    }
+
+    void selectAllAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext) {
+        if (theWindowsAccessBridge != 0) {
+            theWindowsAccessBridge->selectAllAccessibleSelectionFromContext(
+                                                                            vmID, AccessibleContext);
+        }
+    }
+
+
+    // -------- Event Handler methods -------------
+
+#define SET_EVENT_FP(function, callbackFP)          \
+    void function(callbackFP fp) {                  \
+        if (theWindowsAccessBridge != 0) {          \
+            theWindowsAccessBridge->function(fp);   \
+        }                                           \
+}
+
+    void setJavaShutdownFP(AccessBridge_JavaShutdownFP fp) {
+        if (theWindowsAccessBridge != 0) {
+            theWindowsAccessBridge->setJavaShutdownFP(fp);
+        }
+    }
+
+        SET_EVENT_FP(setPropertyChangeFP, AccessBridge_PropertyChangeFP)
+        SET_EVENT_FP(setFocusGainedFP, AccessBridge_FocusGainedFP)
+        SET_EVENT_FP(setFocusLostFP, AccessBridge_FocusLostFP)
+        SET_EVENT_FP(setCaretUpdateFP, AccessBridge_CaretUpdateFP)
+        SET_EVENT_FP(setMouseClickedFP, AccessBridge_MouseClickedFP)
+        SET_EVENT_FP(setMouseEnteredFP, AccessBridge_MouseEnteredFP)
+        SET_EVENT_FP(setMouseExitedFP, AccessBridge_MouseExitedFP)
+        SET_EVENT_FP(setMousePressedFP, AccessBridge_MousePressedFP)
+        SET_EVENT_FP(setMouseReleasedFP, AccessBridge_MouseReleasedFP)
+        SET_EVENT_FP(setMenuCanceledFP, AccessBridge_MenuCanceledFP)
+        SET_EVENT_FP(setMenuDeselectedFP, AccessBridge_MenuDeselectedFP)
+        SET_EVENT_FP(setMenuSelectedFP, AccessBridge_MenuSelectedFP)
+        SET_EVENT_FP(setPopupMenuCanceledFP, AccessBridge_PopupMenuCanceledFP)
+        SET_EVENT_FP(setPopupMenuWillBecomeInvisibleFP, AccessBridge_PopupMenuWillBecomeInvisibleFP)
+        SET_EVENT_FP(setPopupMenuWillBecomeVisibleFP, AccessBridge_PopupMenuWillBecomeVisibleFP)
+
+        SET_EVENT_FP(setPropertyNameChangeFP, AccessBridge_PropertyNameChangeFP)
+        SET_EVENT_FP(setPropertyDescriptionChangeFP, AccessBridge_PropertyDescriptionChangeFP)
+        SET_EVENT_FP(setPropertyStateChangeFP, AccessBridge_PropertyStateChangeFP)
+        SET_EVENT_FP(setPropertyValueChangeFP, AccessBridge_PropertyValueChangeFP)
+        SET_EVENT_FP(setPropertySelectionChangeFP, AccessBridge_PropertySelectionChangeFP)
+        SET_EVENT_FP(setPropertyTextChangeFP, AccessBridge_PropertyTextChangeFP)
+        SET_EVENT_FP(setPropertyCaretChangeFP, AccessBridge_PropertyCaretChangeFP)
+        SET_EVENT_FP(setPropertyVisibleDataChangeFP, AccessBridge_PropertyVisibleDataChangeFP)
+        SET_EVENT_FP(setPropertyChildChangeFP, AccessBridge_PropertyChildChangeFP)
+        SET_EVENT_FP(setPropertyActiveDescendentChangeFP, AccessBridge_PropertyActiveDescendentChangeFP)
+
+        SET_EVENT_FP(setPropertyTableModelChangeFP, AccessBridge_PropertyTableModelChangeFP)
+
+#ifdef __cplusplus
+        }
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/AccessBridgeWindowsEntryPoints.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,300 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Glue routines called by Windows AT into the WindowsAccessBridge dll
+ */
+
+#ifndef __AccessBridgeWindowsEntryPoints_H__
+#define __AccessBridgeWindowsEntryPoints_H__
+
+#include <windows.h>
+#include <jni.h>
+
+#include "AccessBridgePackages.h"
+#include "AccessBridgeCallbacks.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    void Windows_run();
+
+    void releaseJavaObject(long vmID, JOBJECT64 object);
+    void getVersionInfo(long vmID, AccessBridgeVersionInfo *info);
+
+    // Window related functions
+    HWND getTopLevelHWND(HWND descendent);
+    BOOL isJavaWindow(HWND window);
+    BOOL getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext);
+    HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext);
+
+    // returns whether two objects are the same
+    BOOL isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
+
+    // Accessible Context functions
+    BOOL getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent,
+                                jint x, jint y, JOBJECT64 *AccessibleContext);
+    BOOL getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext);
+    BOOL getAccessibleContextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleContextInfo *info);
+    JOBJECT64 getAccessibleChildFromContext(long vmID, JOBJECT64 AccessibleContext, jint childIndex);
+    JOBJECT64 getAccessibleParentFromContext(long vmID, JOBJECT64 AccessibleContext);
+
+    /* begin AccessibleTable */
+    BOOL getAccessibleTableInfo(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
+    BOOL getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable, jint row, jint column,
+                                    AccessibleTableCellInfo *tableCellInfo);
+
+    BOOL getAccessibleTableRowHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
+    BOOL getAccessibleTableColumnHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
+
+    JOBJECT64 getAccessibleTableRowDescription(long vmID, JOBJECT64 acParent, jint row);
+    JOBJECT64 getAccessibleTableColumnDescription(long vmID, JOBJECT64 acParent, jint column);
+
+    jint getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable);
+    BOOL isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row);
+    BOOL getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count,
+                                         jint *selections);
+
+    jint getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable);
+    BOOL isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column);
+    BOOL getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count,
+                                            jint *selections);
+
+    jint getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index);
+    jint getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index);
+    jint getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column);
+
+    /* end AccessibleTable */
+
+    BOOL getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext,
+                                  AccessibleRelationSetInfo *relationSetInfo);
+
+    // AccessibleHypertext methods
+    BOOL getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext, AccessibleHypertextInfo *hypertextInfo);
+
+    BOOL activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext, JOBJECT64 accessibleHyperlink);
+
+    jint getAccessibleHyperlinkCount(const long vmID,
+                                     const AccessibleContext accessibleContext);
+
+    BOOL getAccessibleHypertextExt(const long vmID,
+                                   const AccessibleContext accessibleContext,
+                                   const jint nStartIndex,
+                                   /* OUT */ AccessibleHypertextInfo *hypertextInfo);
+
+    jint getAccessibleHypertextLinkIndex(const long vmID,
+                                         const AccessibleHypertext hypertext,
+                                         const jint nIndex);
+
+    BOOL getAccessibleHyperlink(const long vmID,
+                                const AccessibleHypertext hypertext,
+                                const jint nIndex,
+                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
+
+
+    /* Accessible KeyBindings, Icons and Actions */
+    BOOL getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext,
+                                  AccessibleKeyBindings *keyBindings);
+
+    BOOL getAccessibleIcons(long vmID, JOBJECT64 accessibleContext,
+                            AccessibleIcons *icons);
+
+    BOOL getAccessibleActions(long vmID, JOBJECT64 accessibleContext,
+                              AccessibleActions *actions);
+
+    BOOL doAccessibleActions(long vmID, JOBJECT64 accessibleContext,
+                             AccessibleActionsToDo *actionsToDo, jint *failure);
+
+    /* ----- Additional AccessibleHypertext methods for Teton */
+
+
+    jint getAccessibleHypertextLinkCount(const long vmID,
+                                         const AccessibleContext accessibleContext);
+
+    BOOL getAccessibleHypertextExt(const long vmID,
+                                   const AccessibleContext accessibleContext,
+                                   const jint nStartIndex,
+                                   /* OUT */ AccessibleHypertextInfo *hypertextInfo);
+
+    jint getAccessibleHypertextLinkIndex(const long vmID,
+                                         const AccessibleContext accessibleContext,
+                                         const jint nIndex);
+
+    BOOL getAccessibleHyperlink(const long vmID,
+                                const AccessibleContext accessibleContext,
+                                const jint nIndex,
+                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
+
+
+    /* Additional utility methods */
+    BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text);
+
+    AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role);
+
+    AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext);
+
+    AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role);
+
+    int getObjectDepth (const long vmID, const AccessibleContext accessibleContext);
+
+    AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext);
+
+    /**
+     * Additional methods for Teton
+     */
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+     * whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    BOOL getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext, wchar_t *name, int len);
+
+    /**
+     * Request focus for a component. Returns whether successful;
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    BOOL requestFocus(long vmID, AccessibleContext accessibleContext);
+
+    /**
+     * Selects text between two indices.  Selection includes the text at the start index
+     * and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    BOOL selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex);
+
+    /**
+     * Get text attributes between two indices.  The attribute list includes the text at the
+     * start index and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944761 - getTextAttributes between two indices method needed
+     */
+    BOOL getTextAttributesInRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex,
+                                  AccessibleTextAttributesInfo *attributes, short *len);
+
+    /**
+     * Returns the number of visible children of a component. Returns -1 on error.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    int getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext);
+
+    /**
+     * Gets the visible children of an AccessibleContext. Returns whether successful;
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    BOOL getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex,
+                            VisibleChildrenInfo *visibleChildrenInfo);
+
+    /**
+     * Set the caret to a text position. Returns whether successful;
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    BOOL setCaretPosition(long vmID, AccessibleContext accessibleContext, int position);
+
+    /**
+     * Gets the text caret bounding rectangle
+     */
+    BOOL getCaretLocation(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
+
+    // Accessible Text functions
+    BOOL getAccessibleTextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y);
+    BOOL getAccessibleTextItems(long vmID, JOBJECT64 AccessibleContext, AccessibleTextItemsInfo *textItems, jint index);
+    BOOL getAccessibleTextSelectionInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextSelectionInfo *selectionInfo);
+    BOOL getAccessibleTextAttributes(long vmID, JOBJECT64 AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes);
+    BOOL getAccessibleTextRect(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
+    BOOL getAccessibleTextLineBounds(long vmID, JOBJECT64 AccessibleContext, jint index, jint *startIndex, jint *endIndex);
+    BOOL getAccessibleTextRange(long vmID, JOBJECT64 AccessibleContext, jint start, jint end, wchar_t *text, short len);
+
+    // Accessible Value methods
+    BOOL getCurrentAccessibleValueFromContext(long vmID,JOBJECT64 AccessibleContext, wchar_t *value, short len);
+    BOOL getMaximumAccessibleValueFromContext(long vmID,JOBJECT64 AccessibleContext, wchar_t *value, short len);
+    BOOL getMinimumAccessibleValueFromContext(long vmID,JOBJECT64 AccessibleContext, wchar_t *value, short len);
+
+    // Accessible Selection methods
+    void addAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext, int i);
+    void clearAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext);
+    JOBJECT64 getAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext, int i);
+    int getAccessibleSelectionCountFromContext(long vmID,JOBJECT64 AccessibleContext);
+    BOOL isAccessibleChildSelectedFromContext(long vmID,JOBJECT64 AccessibleContext, int i);
+    void removeAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext, int i);
+    void selectAllAccessibleSelectionFromContext(long vmID,JOBJECT64 AccessibleContext);
+
+
+    // PropertyChange Event registry routines
+    void setPropertyChangeFP(AccessBridge_PropertyChangeFP fp);
+
+    // Java application shutdown
+    void setJavaShutdownFP(AccessBridge_JavaShutdownFP fp);
+
+    // Focus Event registry routines
+    void setFocusGainedFP(AccessBridge_FocusGainedFP fp);
+    void setFocusLostFP(AccessBridge_FocusLostFP fp);
+
+    // Caret Event registry routines
+    void setCaretUpdateFP(AccessBridge_CaretUpdateFP fp);
+
+    // Mouse Event registry routines
+    void setMouseClickedFP(AccessBridge_MouseClickedFP fp);
+    void setMouseEnteredFP(AccessBridge_MouseEnteredFP fp);
+    void setMouseExitedFP(AccessBridge_MouseExitedFP fp);
+    void setMousePressedFP(AccessBridge_MousePressedFP fp);
+    void setMouseReleasedFP(AccessBridge_MouseReleasedFP fp);
+
+    // Menu/PopupMenu Event registry routines
+    void setMenuCanceledFP(AccessBridge_MenuCanceledFP fp);
+    void setMenuDeselectedFP(AccessBridge_MenuDeselectedFP fp);
+    void setMenuSelectedFP(AccessBridge_MenuSelectedFP fp);
+    void setPopupMenuCanceledFP(AccessBridge_PopupMenuCanceledFP fp);
+    void setPopupMenuWillBecomeInvisibleFP(AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
+    void setPopupMenuWillBecomeVisibleFP(AccessBridge_PopupMenuWillBecomeVisibleFP fp);
+
+    // Accessibility PropertyChange Event registry routines
+    void setPropertyNameChangeFP(AccessBridge_PropertyNameChangeFP fp);
+    void setPropertyDescriptionChangeFP(AccessBridge_PropertyDescriptionChangeFP fp);
+    void setPropertyStateChangeFP(AccessBridge_PropertyStateChangeFP fp);
+    void setPropertyValueChangeFP(AccessBridge_PropertyValueChangeFP fp);
+    void setPropertySelectionChangeFP(AccessBridge_PropertySelectionChangeFP fp);
+    void setPropertyTextChangeFP(AccessBridge_PropertyTextChangeFP fp);
+    void setPropertyCaretChangeFP(AccessBridge_PropertyCaretChangeFP fp);
+    void setPropertyVisibleDataChangeFP(AccessBridge_PropertyVisibleDataChangeFP fp);
+    void setPropertyChildChangeFP(AccessBridge_PropertyChildChangeFP fp);
+    void setPropertyActiveDescendentChangeFP(AccessBridge_PropertyActiveDescendentChangeFP fp);
+
+    void setPropertyTableModelChangeFP(AccessBridge_PropertyTableModelChangeFP fp);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.DEF	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,154 @@
+;
+; Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+;
+; This code is free software; you can redistribute it and/or modify it
+; under the terms of the GNU General Public License version 2 only, as
+; published by the Free Software Foundation.  Oracle designates this
+; particular file as subject to the "Classpath" exception as provided
+; by Oracle in the LICENSE file that accompanied this code.
+;
+; This code is distributed in the hope that it will be useful, but WITHOUT
+; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+; version 2 for more details (a copy is included in the LICENSE file that
+; accompanied this code).
+;
+; You should have received a copy of the GNU General Public License version
+; 2 along with this work; if not, write to the Free Software Foundation,
+; Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+;
+; Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+; or visit www.oracle.com if you need additional information or have any
+; questions.
+;
+;
+;LIBRARY	WINDOWSACCESSBRIDGE
+
+;DESCRIPTION 'WINDOWSACCESSBRIDGE.DLL'
+HEAPSIZE	4096
+EXPORTS
+
+    addJavaEventNotification
+    removeJavaEventNotification
+    addAccessibilityEventNotification
+    removeAccessibilityEventNotification
+
+    Windows_run
+
+    getAccessibleTableInfo
+    getAccessibleTableCellInfo
+
+    getAccessibleTableRowHeader
+    getAccessibleTableColumnHeader
+
+    getAccessibleTableRowDescription
+    getAccessibleTableColumnDescription
+
+    isAccessibleTableRowSelected
+    isAccessibleTableColumnSelected
+
+    getAccessibleTableColumnSelectionCount
+    getAccessibleTableRowSelectionCount
+
+    getAccessibleTableColumnSelections
+    getAccessibleTableRowSelections
+
+    getAccessibleTableRow
+    getAccessibleTableColumn
+    getAccessibleTableIndex
+
+    getAccessibleRelationSet
+
+    getAccessibleHypertext
+    activateAccessibleHyperlink
+    getAccessibleHyperlinkCount
+    getAccessibleHypertextExt
+    getAccessibleHypertextLinkIndex
+    getAccessibleHyperlink
+
+    getAccessibleKeyBindings
+    getAccessibleIcons
+    getAccessibleActions
+    doAccessibleActions
+
+    setTextContents
+    getParentWithRole
+    getParentWithRoleElseRoot
+    getTopLevelObject
+    getObjectDepth
+    getActiveDescendent
+
+    getVirtualAccessibleName
+    requestFocus
+    selectTextRange
+    getTextAttributesInRange
+    getVisibleChildrenCount
+    getVisibleChildren
+    setCaretPosition
+    getCaretLocation
+
+    getEventsWaiting
+
+    releaseJavaObject
+    getVersionInfo
+
+    isJavaWindow
+    isSameObject
+    getAccessibleContextFromHWND
+    getHWNDFromAccessibleContext
+
+    getAccessibleContextAt
+    getAccessibleContextWithFocus
+    getAccessibleContextInfo
+    getAccessibleChildFromContext
+    getAccessibleParentFromContext
+
+    getAccessibleTextInfo
+    getAccessibleTextItems
+    getAccessibleTextSelectionInfo
+    getAccessibleTextAttributes
+    getAccessibleTextRect
+    getAccessibleTextLineBounds
+    getAccessibleTextRange
+
+    getCurrentAccessibleValueFromContext
+    getMaximumAccessibleValueFromContext
+    getMinimumAccessibleValueFromContext
+
+    addAccessibleSelectionFromContext
+    clearAccessibleSelectionFromContext
+    getAccessibleSelectionFromContext
+    getAccessibleSelectionCountFromContext
+    isAccessibleChildSelectedFromContext
+    removeAccessibleSelectionFromContext
+    selectAllAccessibleSelectionFromContext
+
+    setPropertyChangeFP
+    setJavaShutdownFP
+    setFocusGainedFP
+    setFocusLostFP
+    setCaretUpdateFP
+    setMouseClickedFP
+    setMouseEnteredFP
+    setMouseExitedFP
+    setMousePressedFP
+    setMouseReleasedFP
+    setMenuCanceledFP
+    setMenuDeselectedFP
+    setMenuSelectedFP
+    setPopupMenuCanceledFP
+    setPopupMenuWillBecomeInvisibleFP
+    setPopupMenuWillBecomeVisibleFP
+
+    setPropertyNameChangeFP
+    setPropertyDescriptionChangeFP
+    setPropertyStateChangeFP
+    setPropertyValueChangeFP
+    setPropertySelectionChangeFP
+    setPropertyTextChangeFP
+    setPropertyCaretChangeFP
+    setPropertyVisibleDataChangeFP
+    setPropertyChildChangeFP
+    setPropertyActiveDescendentChangeFP
+    setPropertyTableModelChangeFP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,3503 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A DLL which is loaded by Windows executables to handle communication
+ * between Java VMs purposes of Accessbility.
+ */
+
+#include "AccessBridgeDebug.h"
+#include "WinAccessBridge.h"
+#include "accessBridgeResource.h"
+#include "accessBridgeCallbacks.h"
+#include "AccessBridgeMessages.h"
+#include "AccessBridgeMessageQueue.h"
+
+#include <windows.h>
+#include <jni.h>
+#include <stdio.h>
+
+// send memory lock
+//
+// This lock is need to serialize access to the buffer used by sendMemoryPackage.
+// If a JVM goes away while the associated memory buffer is in use, a thread switch
+// allows a call to JavaVMDestroyed and deallocation of the memory buffer.
+CRITICAL_SECTION sendMemoryIPCLock;
+
+// registry paths to newly found JVMs that don't have the bridge installed
+char **newJVMs;
+
+WinAccessBridge *theWindowsAccessBridge;
+HWND theDialogWindow;
+
+// unique broadcast msg. IDs gotten dymanically
+extern UINT theFromJavaHelloMsgID;
+extern UINT theFromWindowsHelloMsgID;
+
+// protects the javaVMs chain while in use
+bool isVMInstanceChainInUse;
+
+/* =================================================================================== */
+
+
+
+/**
+ * Proc for "New JVM Found" dialog
+ */
+BOOL CALLBACK newJVMFoundDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) {
+
+    switch (message) {
+    case WM_COMMAND:
+        // PrintDebugString("    newJVMDialogProc: LOWORD(wParam) = %d", LOWORD(wParam));
+
+        switch (LOWORD(wParam)) {
+
+            // Remind user later that a new JVM was installed
+        case cRemindThereIsNewJVM:
+            PrintDebugString("    newJVMDialogProc: cRemindThereIsNewJVM");
+            // do nothing
+            EndDialog(hwndDlg, wParam);
+            return TRUE;
+
+            // Do not remind user later that a new JVM was installed
+            /*
+        case cDoNotRemindThereIsNewJVM:
+            PrintDebugString("    newJVMDialogProc: cDoNotRemindThereIsNewJVM");
+            // remember to not remind the user there are new JVMs
+            PrintDebugString("theWindowsAccessBridge = %x", theWindowsAccessBridge);
+            if (theWindowsAccessBridge != NULL) {
+                dontRemindUser(newJVMs);
+            }
+            EndDialog(hwndDlg, wParam);
+            return TRUE;
+            */
+
+            // Run the AccessBridge installer
+            /*
+        case cInstallAccessBridge:
+            PrintDebugString("    newJVMDialogProc: cInstallAccessBridge");
+            // start the installer
+            if (theWindowsAccessBridge != NULL) {
+                startInstaller(newJVMs);
+            }
+            EndDialog(hwndDlg, wParam);
+            return TRUE;
+            */
+
+        default:
+            ;
+        }
+    default:
+        ;
+    }
+    return FALSE;
+}
+
+
+
+/* =========================================================================== */
+
+// ---------------------------------------------------------------------------
+
+extern "C" {
+    /**
+     * DllMain - where Windows executables will load/unload us
+     *
+     */
+    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) {
+
+        switch (fdwReason) {
+        case DLL_PROCESS_ATTACH:        // A Windows executable loaded us
+            PrintDebugString("DLL_PROCESS_ATTACH");
+            theWindowsAccessBridge = new WinAccessBridge(hinstDll);
+            break;
+
+        case DLL_PROCESS_DETACH:        // A Windows executable unloaded us
+            if (theWindowsAccessBridge != (WinAccessBridge *) 0) {
+                PrintDebugString("*** AccessBridgeDialogProc -> deleting theWindowsAccessBridge");
+                delete theWindowsAccessBridge;
+            }
+            break;
+        }
+
+        return(TRUE);
+    }
+
+    /**
+     * Append debug info to dialog
+     *
+     * replaced with code to send output to debug file
+     *
+     */
+    void AppendToCallInfo(char *s) {
+
+        /*
+          _CrtDbgReport(_CRT_WARN, (const char *) NULL, NULL, (const char *) NULL,
+          (const char *) "WinAccessBridge: %s", s);
+        */
+
+        char buf[1024];
+        sprintf(buf, "WinAccessBridge: %s", s);
+        OutputDebugString(buf);
+    }
+
+    /**
+     * Our window proc
+     *
+     */
+    BOOL CALLBACK AccessBridgeDialogProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) {
+        COPYDATASTRUCT *sentToUs;
+        char *package;
+
+        switch (message) {
+        case WM_INITDIALOG:
+            PrintDebugString("AccessBridgeDialogProc -> Initializing");
+            break;
+
+            // call from Java with data for us to deliver
+        case WM_COPYDATA:
+            if (theDialogWindow == (HWND) wParam) {
+                PrintDebugString("AccessBridgeDialogProc -> Got WM_COPYDATA from Java Bridge DLL");
+            } else {
+                PrintDebugString("AccessBridgeDialogProc -> Got WM_COPYDATA from HWND %p", wParam);
+                sentToUs = (COPYDATASTRUCT *) lParam;
+                package = (char *) sentToUs->lpData;
+                theWindowsAccessBridge->preProcessPackage(package, sentToUs->cbData);
+            }
+            break;
+
+            // message to ourselves -> de-queue messages and send 'em
+        case AB_MESSAGE_QUEUED:
+            PrintDebugString("AccessBridgeDialogProc -> Got AB_MESSAGE_QUEUED from ourselves");
+            theWindowsAccessBridge->receiveAQueuedPackage();
+            break;
+
+            // a JavaAccessBridge DLL is going away
+            //
+            // When JavaVMDestroyed is called a AccessBridgeJavaVMInstance in the
+            // javaVMs chain will be removed.  If that chain is in use this will
+            // cause a crash.  One way AB_DLL_GOING_AWAY can arrive is on any
+            // outgoing SendMessage call.  SendMessage normally spins waiting for
+            // a response.  However, if there is an incoming SendMessage, e.g. for
+            // AB_DLL_GOING_AWAY Windows will send that request to this DialogProc.
+            // One seemingly easy way to combat that is to use SendMessageTimeout
+            // with the SMTO_BLOCK flag set.  However, it has been the case that
+            // even after using that technique AB_DLL_GOING_AWAY can still arrive
+            // in the middle of processing the javaVMs chain.  An alternative that
+            // was tried was to use a critical section around any access ot the
+            // javaVMs chain but unfortunately the AB_DLL_GOING_AWAY message arrives
+            // on the same thread and thus the use of a critical section is ineffective.
+            // The solution then is to set a flag whenever the javaVMs chain is being
+            // used and if that flag is set at this point the message will be posted
+            // to the message queue.  That would delay the destruction of the instance
+            // until the chain is not being traversed.
+        case AB_DLL_GOING_AWAY:
+            PrintDebugString("***** AccessBridgeDialogProc -> Got AB_DLL_GOING_AWAY message");
+            if (isVMInstanceChainInUse) {
+                PrintDebugString("  javaVMs chain in use, calling PostMessage");
+                PostMessage(hDlg, AB_DLL_GOING_AWAY, wParam, (LPARAM)0);
+            } else {
+                PrintDebugString("  calling javaVMDestroyed");
+                theWindowsAccessBridge->JavaVMDestroyed((HWND) wParam);
+            }
+            break;
+
+        default:
+            // the JavaVM is saying "hi"!
+            // wParam == sourceHwnd; lParam == JavaVMID
+            if (message == theFromJavaHelloMsgID) {
+                PrintDebugString("AccessBridgeDialogProc -> Got theFromJavaHelloMsgID; wParam = %p, lParam = %p", wParam, lParam);
+                theWindowsAccessBridge->rendezvousWithNewJavaDLL((HWND) wParam, (long ) lParam);
+            }
+            break;
+        }
+
+        return (FALSE);
+    }
+
+}
+
+
+
+
+// ---------------------------------------------------------------------------
+
+/**
+ * Initialize the WinAccessBridge
+ *
+ */
+WinAccessBridge::WinAccessBridge(HINSTANCE hInstance) {
+
+    PrintDebugString("WinAccessBridge ctor");
+
+    //  IntializeCriticalSection should only be called once.
+    InitializeCriticalSection(&sendMemoryIPCLock);
+    windowsInstance = hInstance;
+    javaVMs = (AccessBridgeJavaVMInstance *) 0;
+    eventHandler = new AccessBridgeEventHandler();
+    messageQueue = new AccessBridgeMessageQueue();
+    initBroadcastMessageIDs();          // get the unique to us broadcast msg. IDs
+    theWindowsAccessBridge = this;
+    isVMInstanceChainInUse = false;
+
+
+    // notify the user if new JVMs are found
+    /*
+      newJVMs = (char **)malloc(MAX_NEW_JVMS_FOUND);
+      for (int i = 0; i < MAX_NEW_JVMS_FOUND; i++) {
+      newJVMs[i] = (char *)malloc(SHORT_STRING_SIZE);
+      newJVMs[i][0] = 0;
+      }
+
+      BOOL newJ2SEFound = findNewJVMs(J2SE_REG_PATH, newJVMs);
+      BOOL newJ2REFound = TRUE; // findNewJVMs(J2RE_REG_PATH, newJVMs);
+
+      if (newJ2SEFound || newJ2REFound) {
+
+      int result = DialogBox(windowsInstance,
+      "FOUNDNEWJVMDIALOG",
+      NULL,
+      (DLGPROC)newJVMFoundDialogProc);
+      if (result < 0) {
+      printError("DialogBox failed");
+      }
+
+      PrintDebugString("  FOUNDNEWJVMDIALOG: result = %d", result);
+
+      ShowWindow((HWND)result, SW_SHOW);
+      }
+    */
+
+    ShowWindow(theDialogWindow, SW_SHOW);
+}
+
+
+
+/**
+ * Destroy the WinAccessBridge
+ *
+ */
+WinAccessBridge::~WinAccessBridge() {
+    // inform all other AccessBridges that we're going away
+    //  -> shut down all event listening
+    //  -> release all objects held in the JVM by us
+
+    PrintDebugString("*****in WinAccessBridge::~WinAccessBridge()");
+
+    // send a broadcast msg.; let other AccessBridge DLLs know we're going away
+    AccessBridgeJavaVMInstance *current = javaVMs;
+    while (current != (AccessBridgeJavaVMInstance *) 0) {
+        PrintDebugString("  telling %p we're going away", current->javaAccessBridgeWindow);
+        SendMessage(current->javaAccessBridgeWindow,
+                    AB_DLL_GOING_AWAY, (WPARAM) dialogWindow, (LPARAM) 0);
+        current = current->nextJVMInstance;
+    }
+
+    PrintDebugString("  finished telling JVMs about our demise");
+
+    delete eventHandler;
+    delete messageQueue;
+    delete javaVMs;
+
+    PrintDebugString("  finished deleting eventHandler, messageQueue, and javaVMs");
+    PrintDebugString("GOODBYE CRUEL WORLD...");
+
+    DestroyWindow(theDialogWindow);
+}
+
+
+/**
+ * Bring up our window; make a connection to the rest of the world
+ *
+ */
+BOOL
+WinAccessBridge::initWindow() {
+    theDialogWindow = CreateDialog(windowsInstance,
+                                   "ACCESSBRIDGESTATUSWINDOW", NULL,
+                                   (DLGPROC) AccessBridgeDialogProc);
+
+    // If window could not be created, return "failure".
+    if (!theDialogWindow)
+        return (FALSE);
+
+    dialogWindow = theDialogWindow;
+
+    // Make the window visible, update its client area, & return "success".
+    // DEBUG_CODE(ShowWindow (theDialogWindow, SW_SHOWNORMAL));
+    // DEBUG_CODE(UpdateWindow (theDialogWindow));
+
+    // post a broadcast msg.; let other AccessBridge DLLs know we exist
+    PostMessage(HWND_BROADCAST, theFromWindowsHelloMsgID, (WPARAM) dialogWindow, (LPARAM) 0);
+
+    return (TRUE);
+}
+
+// -----------------------
+
+/**
+ * rendezvousWithNewJavaDLL
+ *              - Build AccessBridgeJavaVMInstance data structure
+ *                (including setting up Memory-Mapped file info)
+ *
+ */
+LRESULT
+WinAccessBridge::rendezvousWithNewJavaDLL(HWND JavaBridgeDLLwindow, long vmID) {
+    LRESULT returnVal;
+
+    PrintDebugString("in JavaAccessBridge::rendezvousWithNewJavaDLL(%p, %X)",
+                     JavaBridgeDLLwindow, vmID);
+
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *newVM =
+        new AccessBridgeJavaVMInstance(dialogWindow, JavaBridgeDLLwindow, vmID, javaVMs);
+    javaVMs = newVM;
+    isVMInstanceChainInUse = false;
+
+    returnVal = javaVMs->initiateIPC();
+    if (returnVal == 0) {
+
+        // tell the newly created JavaVM what events we're interested in, if any
+        long javaEventMask = eventHandler->getJavaEventMask();
+        long accessibilityEventMask = eventHandler->getAccessibilityEventMask();
+
+        PrintDebugString("  Setting Java event mask to: %X", javaEventMask);
+
+        if (javaEventMask != 0) {
+            addJavaEventNotification(javaEventMask);
+        }
+
+        PrintDebugString("  Setting Accessibility event mask to: %X", accessibilityEventMask);
+
+        if (accessibilityEventMask != 0) {
+            addAccessibilityEventNotification(accessibilityEventMask);
+        }
+    } else {
+        PrintDebugString("  ERROR: Failed to initiate IPC with newly created JavaVM!!!");
+        return FALSE;
+    }
+
+    PrintDebugString("  Success!!  We rendezvoused with the JavaDLL");
+    return returnVal;
+}
+
+// -----------------------
+
+/**
+ * sendPackage - uses SendMessage(WM_COPYDATA) to do IPC messaging
+ *               with the Java AccessBridge DLL
+ *
+ *               NOTE: WM_COPYDATA is only for one-way IPC; there
+ *               is now way to return parameters (especially big ones)
+ *               Use sendMemoryPackage() to do that!
+ */
+void
+WinAccessBridge::sendPackage(char *buffer, long bufsize, HWND destWindow) {
+    COPYDATASTRUCT toCopy;
+    toCopy.dwData = 0;          // 32-bits we could use for something...
+    toCopy.cbData = bufsize;
+    toCopy.lpData = buffer;
+
+    SendMessage(destWindow, WM_COPYDATA, (WPARAM) dialogWindow, (LPARAM) &toCopy);
+}
+
+
+/**
+ * sendMemoryPackage - uses Memory-Mapped files to do IPC messaging
+ *                     with the Java AccessBridge DLL, informing the
+ *                     Java AccessBridge DLL via SendMessage that something
+ *                     is waiting for it in the shared file...
+ *
+ *                     In the SendMessage call, the third param (WPARAM) is
+ *                     the source HWND (theDialogWindow in this case), and
+ *                     the fourth param (LPARAM) is the size in bytes of
+ *                     the package put into shared memory.
+ *
+ */
+BOOL
+WinAccessBridge::sendMemoryPackage(char *buffer, long bufsize, HWND destWindow) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    AccessBridgeJavaVMInstance *ourABJavaVMInstance;
+    ourABJavaVMInstance = javaVMs->findABJavaVMInstanceFromJavaHWND(destWindow);
+    if (ourABJavaVMInstance != (AccessBridgeJavaVMInstance *) 0) {
+        if (!ourABJavaVMInstance->sendMemoryPackage(buffer, bufsize)) {
+            // return falue to the caller
+            memset(buffer, 0, bufsize);
+            return FALSE;
+        }
+    } else {
+        PrintDebugString("ERROR sending memory package: couldn't find destWindow");
+        return FALSE;
+    }
+    return TRUE;
+}
+
+
+/**
+ * queuePackage - put a package onto the queue for latter processing
+ *
+ */
+BOOL
+WinAccessBridge::queuePackage(char *buffer, long bufsize) {
+    PrintDebugString("  in WinAccessBridge::queuePackage(%p, %d)", buffer, bufsize);
+
+    AccessBridgeQueueElement *element = new AccessBridgeQueueElement(buffer, bufsize);
+
+    messageQueue->add(element);
+    PostMessage(dialogWindow, AB_MESSAGE_QUEUED, (WPARAM) 0, (LPARAM) 0);
+    return TRUE;
+}
+
+
+/**
+ * receiveAQueuedPackage - remove a pending packge from the queue and
+ *                         handle it. If the queue is busy, post a
+ *                         message to self to retrieve it later
+ *
+ */
+BOOL
+WinAccessBridge::receiveAQueuedPackage() {
+    AccessBridgeQueueElement *element;
+
+    PrintDebugString("in WinAccessBridge::receiveAQueuedPackage()");
+
+    // ensure against re-entrancy problems...
+    if (messageQueue->getRemoveLockSetting() == FALSE) {
+        messageQueue->setRemoveLock(TRUE);
+
+        PrintDebugString("  dequeueing message");
+
+        QueueReturns result = messageQueue->remove(&element);
+
+        PrintDebugString("   'element->buffer' contains:");
+        DEBUG_CODE(PackageType *type = (PackageType *) element->buffer);
+        DEBUG_CODE(FocusGainedPackageTag *pkg = (FocusGainedPackageTag *) (((char *) element->buffer) + sizeof(PackageType)));
+        DEBUG_CODE(PrintDebugString("     PackageType = %X", *type));
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+        DEBUG_CODE(PrintDebugString("     EventPackage: vmID = %X, event = %p, source = %p", pkg->vmID, pkg->Event, pkg->AccessibleContextSource));
+#else // JOBJECT64 is jlong (64 bit)
+        DEBUG_CODE(PrintDebugString("     EventPackage: vmID = %X, event = %016I64X, source = %016I64X", pkg->vmID, pkg->Event, pkg->AccessibleContextSource));
+#endif
+        switch (result) {
+
+        case cQueueBroken:
+            PrintDebugString("  ERROR!!! Queue seems to be broken!");
+            messageQueue->setRemoveLock(FALSE);
+            return FALSE;
+
+        case cMoreMessages:
+        case cQueueEmpty:
+            if (element != (AccessBridgeQueueElement *) 0) {
+                PrintDebugString("  found one; sending it!");
+                processPackage(element->buffer, element->bufsize);
+                delete element;
+            } else {
+                PrintDebugString("  ODD... element == 0!");
+                return FALSE;
+            }
+            break;
+
+        case cQueueInUse:
+            PrintDebugString("  Queue in use, will try again later...");
+            PostMessage(dialogWindow, AB_MESSAGE_QUEUED, (WPARAM) 0, (LPARAM) 0);
+            break;
+
+        default:
+            messageQueue->setRemoveLock(FALSE);
+            return FALSE;       // should never get something we don't recognize!
+        }
+    } else {
+        PrintDebugString("  unable to dequeue message; remove lock is set");
+        PostMessage(dialogWindow, AB_MESSAGE_QUEUED, (WPARAM) 0, (LPARAM) 0); // Fix for 6995891
+    }
+
+    messageQueue->setRemoveLock(FALSE);
+    return TRUE;
+}
+
+// -----------------------
+
+/**
+ * preProcessPackage
+ *              - do triage on incoming packages; queue some, deal with others
+ *
+ */
+void
+WinAccessBridge::preProcessPackage(char *buffer, long bufsize) {
+    PrintDebugString("PreProcessing package sent from Java:");
+
+    PackageType *type = (PackageType *) buffer;
+
+    switch (*type) {
+
+    PrintDebugString("   type == %X", *type);
+
+    // event packages all get queued for later handling
+    //case cPropertyChangePackage:
+    case cJavaShutdownPackage:
+    case cFocusGainedPackage:
+    case cFocusLostPackage:
+    case cCaretUpdatePackage:
+    case cMouseClickedPackage:
+    case cMouseEnteredPackage:
+    case cMouseExitedPackage:
+    case cMousePressedPackage:
+    case cMouseReleasedPackage:
+    case cMenuCanceledPackage:
+    case cMenuDeselectedPackage:
+    case cMenuSelectedPackage:
+    case cPopupMenuCanceledPackage:
+    case cPopupMenuWillBecomeInvisiblePackage:
+    case cPopupMenuWillBecomeVisiblePackage:
+
+    case cPropertyCaretChangePackage:
+    case cPropertyDescriptionChangePackage:
+    case cPropertyNameChangePackage:
+    case cPropertySelectionChangePackage:
+    case cPropertyStateChangePackage:
+    case cPropertyTextChangePackage:
+    case cPropertyValueChangePackage:
+    case cPropertyVisibleDataChangePackage:
+    case cPropertyChildChangePackage:
+    case cPropertyActiveDescendentChangePackage:
+
+    case cPropertyTableModelChangePackage:
+
+        queuePackage(buffer, bufsize);
+        break;
+
+        // perhaps there will be some other packages to process at some point... //
+
+    default:
+        PrintDebugString("   processing FAILED!! -> don't know how to handle type = %X", *type);
+        break;
+    }
+
+    PrintDebugString("   package preprocessing completed");
+}
+
+
+#define DISPATCH_EVENT_PACKAGE(packageID, eventPackage, fireEventMethod)            \
+    case packageID:                                                                 \
+        if (bufsize == sizeof(PackageType) + sizeof(eventPackage)) {                \
+            eventPackage *pkg =                                                     \
+                (eventPackage *) (buffer + sizeof(PackageType));                    \
+            PrintDebugString("   begin callback to AT, type == %X", *type);         \
+                theWindowsAccessBridge->eventHandler->fireEventMethod(              \
+                    pkg->vmID, pkg->Event, pkg->AccessibleContextSource);           \
+                PrintDebugString("   event callback complete!");                    \
+        } else {                                                                    \
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d", \
+                bufsize, sizeof(PackageType) + sizeof(eventPackage));               \
+        }                                                                           \
+        break;
+
+#define DISPATCH_PROPERTY_CHANGE_PACKAGE(packageID, eventPackage, fireEventMethod, oldValue, newValue) \
+    case packageID:                                                                 \
+        if (bufsize == sizeof(PackageType) + sizeof(eventPackage)) {                \
+            eventPackage *pkg =                                                     \
+                (eventPackage *) (buffer + sizeof(PackageType));                    \
+            PrintDebugString("   begin callback to AT, type == %X", *type);         \
+            theWindowsAccessBridge->eventHandler->fireEventMethod(                  \
+                pkg->vmID, pkg->Event, pkg->AccessibleContextSource,                \
+                pkg->oldValue, pkg->newValue);                                      \
+            PrintDebugString("   event callback complete!");                        \
+        } else {                                                                    \
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d", \
+                bufsize, sizeof(PackageType) + sizeof(eventPackage));               \
+        }                                                                           \
+        break;
+
+#define DISPATCH_PROPERTY_TABLE_MODEL_CHANGE_PACKAGE(packageID, eventPackage, fireEventMethod, oldValue, newValue) \
+    case packageID:                                                                 \
+        if (bufsize == sizeof(PackageType) + sizeof(eventPackage)) {                \
+            eventPackage *pkg =                                                     \
+                (eventPackage *) (buffer + sizeof(PackageType));                    \
+            PrintDebugString("   begin callback to AT, type == %X", *type);         \
+            theWindowsAccessBridge->eventHandler->fireEventMethod(                  \
+                pkg->vmID, pkg->Event, pkg->AccessibleContextSource,                \
+                pkg->oldValue, pkg->newValue);                                      \
+            PrintDebugString("   event callback complete!");                        \
+        } else {                                                                    \
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d", \
+                bufsize, sizeof(PackageType) + sizeof(eventPackage));                \
+        }                                                                            \
+        break;
+
+/**
+ * processPackage - processes the output of SendMessage(WM_COPYDATA)
+ *                  to do IPC messaging with the Java AccessBridge DLL
+ *
+ */
+void
+WinAccessBridge::processPackage(char *buffer, long bufsize) {
+    PrintDebugString("WinAccessBridge::Processing package sent from Java:");
+
+    PackageType *type = (PackageType *) buffer;
+
+    switch (*type) {
+
+    PrintDebugString("   type == %X", *type);
+
+    case cJavaShutdownPackage:
+        PrintDebugString("   type == cJavaShutdownPackage");
+        if (bufsize == sizeof(PackageType) + sizeof(JavaShutdownPackage)) {
+            JavaShutdownPackage *pkg =
+                (JavaShutdownPackage *) (buffer + sizeof(PackageType));
+            theWindowsAccessBridge->eventHandler->fireJavaShutdown(pkg->vmID);
+            PrintDebugString("   event callback complete!");
+            PrintDebugString("   event fired!");
+        } else {
+            PrintDebugString("   processing FAILED!! -> bufsize = %d; expectation = %d",
+                             bufsize, sizeof(PackageType) + sizeof(JavaShutdownPackage));
+        }
+        break;
+
+
+        DISPATCH_EVENT_PACKAGE(cFocusGainedPackage, FocusGainedPackage, fireFocusGained);
+        DISPATCH_EVENT_PACKAGE(cFocusLostPackage, FocusLostPackage, fireFocusLost);
+
+        DISPATCH_EVENT_PACKAGE(cCaretUpdatePackage, CaretUpdatePackage, fireCaretUpdate);
+
+        DISPATCH_EVENT_PACKAGE(cMouseClickedPackage, MouseClickedPackage, fireMouseClicked);
+        DISPATCH_EVENT_PACKAGE(cMouseEnteredPackage, MouseEnteredPackage, fireMouseEntered);
+        DISPATCH_EVENT_PACKAGE(cMouseExitedPackage, MouseExitedPackage, fireMouseExited);
+        DISPATCH_EVENT_PACKAGE(cMousePressedPackage, MousePressedPackage, fireMousePressed);
+        DISPATCH_EVENT_PACKAGE(cMouseReleasedPackage, MouseReleasedPackage, fireMouseReleased);
+
+        DISPATCH_EVENT_PACKAGE(cMenuCanceledPackage, MenuCanceledPackage, fireMenuCanceled);
+        DISPATCH_EVENT_PACKAGE(cMenuDeselectedPackage, MenuDeselectedPackage, fireMenuDeselected);
+        DISPATCH_EVENT_PACKAGE(cMenuSelectedPackage, MenuSelectedPackage, fireMenuSelected);
+        DISPATCH_EVENT_PACKAGE(cPopupMenuCanceledPackage, PopupMenuCanceledPackage, firePopupMenuCanceled);
+        DISPATCH_EVENT_PACKAGE(cPopupMenuWillBecomeInvisiblePackage, PopupMenuWillBecomeInvisiblePackage, firePopupMenuWillBecomeInvisible);
+        DISPATCH_EVENT_PACKAGE(cPopupMenuWillBecomeVisiblePackage, PopupMenuWillBecomeVisiblePackage, firePopupMenuWillBecomeVisible);
+
+        DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyNameChangePackage,
+                                         PropertyNameChangePackage,
+                                         firePropertyNameChange, oldName, newName)
+            DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyDescriptionChangePackage,
+                                             PropertyDescriptionChangePackage,
+                                             firePropertyDescriptionChange,
+                                             oldDescription, newDescription)
+            DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyStateChangePackage,
+                                             PropertyStateChangePackage,
+                                             firePropertyStateChange, oldState, newState)
+            DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyValueChangePackage,
+                                             PropertyValueChangePackage,
+                                             firePropertyValueChange, oldValue, newValue)
+            DISPATCH_EVENT_PACKAGE(cPropertySelectionChangePackage,
+                                   PropertySelectionChangePackage, firePropertySelectionChange)
+            DISPATCH_EVENT_PACKAGE(cPropertyTextChangePackage,
+                                   PropertyTextChangePackage, firePropertyTextChange)
+            DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyCaretChangePackage,
+                                             PropertyCaretChangePackage,
+                                             firePropertyCaretChange, oldPosition, newPosition)
+            DISPATCH_EVENT_PACKAGE(cPropertyVisibleDataChangePackage,
+                                   PropertyVisibleDataChangePackage, firePropertyVisibleDataChange)
+            DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyChildChangePackage,
+                                             PropertyChildChangePackage,
+                                             firePropertyChildChange,
+                                             oldChildAccessibleContext,
+                                             newChildAccessibleContext)
+            DISPATCH_PROPERTY_CHANGE_PACKAGE(cPropertyActiveDescendentChangePackage,
+                                             PropertyActiveDescendentChangePackage,
+                                             firePropertyActiveDescendentChange,
+                                             oldActiveDescendentAccessibleContext,
+                                             newActiveDescendentAccessibleContext)
+
+            DISPATCH_PROPERTY_TABLE_MODEL_CHANGE_PACKAGE(cPropertyTableModelChangePackage,
+                                                         PropertyTableModelChangePackage,
+                                                         firePropertyTableModelChange,
+                                                         oldValue, newValue)
+
+
+            default:
+        PrintDebugString("   processing FAILED!! -> don't know how to handle type = %X", *type);
+        break;
+    }
+
+    PrintDebugString("   package processing completed");
+}
+
+
+// -----------------------------
+
+void
+WinAccessBridge::JavaVMDestroyed(HWND VMBridgeDLLWindow) {
+    PrintDebugString("***** WinAccessBridge::JavaVMDestroyed(%p)", VMBridgeDLLWindow);
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *currentVM = javaVMs;
+    AccessBridgeJavaVMInstance *previousVM = javaVMs;
+    if (javaVMs->javaAccessBridgeWindow == VMBridgeDLLWindow) {
+        javaVMs = javaVMs->nextJVMInstance;
+        delete currentVM;
+
+        PrintDebugString("  data structures successfully removed");
+
+        // [[[FIXME]]] inform Windows AT that a JVM went away,
+        // and that any jobjects it's got lying around for that JVM
+        // are now invalid
+
+    } else {
+        while (currentVM != (AccessBridgeJavaVMInstance *) 0) {
+            if (currentVM->javaAccessBridgeWindow == VMBridgeDLLWindow) {
+                previousVM->nextJVMInstance = currentVM->nextJVMInstance;
+                delete currentVM;
+
+                PrintDebugString("  data structures successfully removed");
+
+                // [[[FIXME]]] inform Windows AT that a JVM went away,
+                // and that any jobjects it's got lying around for that JVM
+                // are now invalid
+                isVMInstanceChainInUse = false;
+                return;
+            } else {
+                previousVM = currentVM;
+                currentVM = currentVM->nextJVMInstance;
+            }
+        }
+        PrintDebugString("  ERROR!! couldn't find matching data structures!");
+    }
+    isVMInstanceChainInUse = false;
+}
+
+// -----------------------
+
+/**
+ * releaseJavaObject - lets the JavaVM know it can release the Java Object
+ *
+ * Note: once you have made this call, the JavaVM will garbage collect
+ * the jobject you pass in.  If you later use that jobject in another
+ * call, you will cause all maner of havoc!
+ *
+ */
+void
+WinAccessBridge::releaseJavaObject(long vmID, JOBJECT64 object) {
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::releaseJavaObject(%X, %p)", vmID, object);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::releaseJavaObject(%X, %016I64X)", vmID, object);
+#endif
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(ReleaseJavaObjectPackage)];
+    PackageType *type = (PackageType *) buffer;
+    ReleaseJavaObjectPackage *pkg = (ReleaseJavaObjectPackage *) (buffer + sizeof(PackageType));
+    *type = cReleaseJavaObjectPackage;
+    pkg->vmID = vmID;
+    pkg->object = object;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        sendPackage(buffer, sizeof(buffer), destABWindow);              // no return values!
+    }
+}
+
+// -----------------------
+
+/**
+ * getVersionInfo - fill the AccessBridgeVersionInfo struct
+ *
+ */
+BOOL
+WinAccessBridge::getVersionInfo(long vmID, AccessBridgeVersionInfo *info) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessBridgeVersionPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessBridgeVersionPackage *pkg = (GetAccessBridgeVersionPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessBridgeVersionPackage;
+    pkg->vmID = vmID;
+
+    PrintDebugString("WinAccessBridge::getVersionInfo(%X, )", vmID);
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(info, &(pkg->rVersionInfo), sizeof(AccessBridgeVersionInfo));
+            PrintDebugString("  VMversion: %ls", info->VMversion);
+            PrintDebugString("  bridgeJavaClassVersion: %ls", info->bridgeJavaClassVersion);
+            PrintDebugString("  bridgeJavaDLLVersion: %ls", info->bridgeJavaDLLVersion);
+            PrintDebugString("  bridgeWinDLLVersion: %ls", info->bridgeWinDLLVersion);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+
+/********** Window-related routines ***********************************/
+
+/**
+ * isJavaWindow - returns TRUE if the HWND is a top-level Java Window
+ *
+ * Note: just because the Windnow is a top-level Java window, that doesn't
+ * mean that it is accessible.  Call getAccessibleContextFromHWND(HWND) to get the
+ * AccessibleContext, if any, for an HWND that is a Java Window.
+ *
+ */
+BOOL
+WinAccessBridge::isJavaWindow(HWND window) {
+    HWND hwnd;
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    // quick check to see if 'window' is top-level; if not, it's not interesting...
+    // [[[FIXME]]] is this for sure an OK optimization?
+    hwnd = getTopLevelHWND(window);
+    if (hwnd == (HWND) NULL) {
+        return FALSE;
+    }
+
+    PrintDebugString("  in WinAccessBridge::isJavaWindow");
+
+
+
+    char buffer[sizeof(PackageType) + sizeof(IsJavaWindowPackage)];
+    PackageType *type = (PackageType *) buffer;
+    IsJavaWindowPackage *pkg = (IsJavaWindowPackage *) (buffer + sizeof(PackageType));
+    *type = cIsJavaWindowPackage;
+    pkg->window = (jint) window;
+
+    PrintDebugString("WinAccessBridge::isJavaWindow(%p)", window);
+
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *current = javaVMs;
+    while (current != (AccessBridgeJavaVMInstance *) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), current->javaAccessBridgeWindow) == TRUE) {
+            if (pkg->rResult != 0) {
+                isVMInstanceChainInUse = false;
+                return TRUE;
+            }
+        }
+        current = current->nextJVMInstance;
+    }
+    isVMInstanceChainInUse = false;
+    return FALSE;
+
+
+    /*
+      char classname[256];
+      HWND hwnd;
+
+      hwnd = getTopLevelHWND(window);
+      if (hwnd == (HWND) NULL) {
+      return FALSE;
+      }
+      GetClassName(hwnd, classname, 256);
+
+      if (strstr(classname, "AwtFrame") != 0) {
+      return TRUE;
+      } else if (strstr(classname, "AwtWindow") != 0) {
+      return TRUE;
+      } else if (strstr(classname, "AwtDialog") != 0) {
+      return TRUE;
+      }
+    */
+    // JDK 1.4 introduces new (and changes old) classnames
+    /*
+      else if (strstr(classname, "SunAwtToolkit") != 0) {
+      return TRUE;
+      } else if (strstr(classname, "javax.swing.JFrame") != 0) {
+      return TRUE;
+      }
+    */
+
+    return FALSE;
+}
+
+/**
+ * isSameObject - returns TRUE if the two object references refer to
+ *     the same object. Otherwise, this method returns FALSE:
+ */
+BOOL
+WinAccessBridge::isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::isSameObject(%p %p)", obj1, obj2);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::isSameObject(%016I64X %016I64X)", obj1, obj2);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(IsSameObjectPackage)];
+    PackageType *type = (PackageType *) buffer;
+    IsSameObjectPackage *pkg = (IsSameObjectPackage *) (buffer + sizeof(PackageType));
+    *type = cIsSameObjectPackage;
+    pkg->vmID = vmID;
+    pkg->obj1 = obj1;
+    pkg->obj2 = obj2;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);
+    if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+        if (pkg->rResult != 0) {
+            PrintDebugString("  WinAccessBridge::isSameObject returning TRUE (same object)");
+            return TRUE;
+        } else {
+            PrintDebugString("  WinAccessBridge::isSameObject returning FALSE (different object)");
+            return FALSE;
+        }
+    }
+    PrintDebugString("  WinAccessBridge::isSameObject returning FALSE (sendMemoryPackage failed)");
+    return FALSE;
+}
+
+/**
+ * FromHWND - returns the AccessibleContext jobject for the HWND
+ *
+ * Note: this routine can return null, even if the HWND is a Java Window,
+ * because the Java Window may not be accessible.
+ *
+ */
+BOOL
+WinAccessBridge::getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextFromHWNDPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleContextFromHWNDPackage *pkg = (GetAccessibleContextFromHWNDPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleContextFromHWNDPackage;
+    pkg->window = (jint) window;
+
+    PrintDebugString("WinAccessBridge::getAccessibleContextFromHWND(%p, )", window);
+
+    DEBUG_CODE(pkg->rVMID = (long ) 0x01010101);
+    DEBUG_CODE(pkg->rAccessibleContext = (JOBJECT64) 0x01010101);
+
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *current = javaVMs;
+    while (current != (AccessBridgeJavaVMInstance *) 0) {
+
+        if (sendMemoryPackage(buffer, sizeof(buffer), current->javaAccessBridgeWindow) == TRUE) {
+            if (pkg->rAccessibleContext != 0) {
+                *vmID = pkg->rVMID;
+                *AccessibleContext = (JOBJECT64)pkg->rAccessibleContext;
+                PrintDebugString("    current->vmID = %X", current->vmID);
+                PrintDebugString("    pkg->rVMID = %X", pkg->rVMID);
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+                PrintDebugString("    pkg->rAccessibleContext = %p", pkg->rAccessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+                PrintDebugString("    pkg->rAccessibleContext = %016I64X", pkg->rAccessibleContext);
+#endif
+                if (pkg->rVMID != current->vmID) {
+                    PrintDebugString("    ERROR! getAccessibleContextFromHWND vmIDs don't match!");
+                    isVMInstanceChainInUse = false;
+                    return FALSE;
+                }
+                isVMInstanceChainInUse = false;
+                return TRUE;
+            }
+        }
+        current = current->nextJVMInstance;
+    }
+    isVMInstanceChainInUse = false;
+
+    // This isn't really an error; it just means that the HWND was for a non-Java
+    // window.  It's also possible the HWND was for a Java window but the JVM has
+    // since been shut down and sendMemoryPackage returned FALSE.
+    PrintDebugString("    ERROR! getAccessibleContextFromHWND no matching HWND found!");
+    return FALSE;
+}
+
+/**
+ * Returns the HWND for an AccessibleContext.  Returns (HWND)0 on error.
+ */
+HWND
+WinAccessBridge::getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext) {
+    PrintDebugString("  in WinAccessBridge::getHWNDFromAccessibleContext");
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (HWND)0;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetHWNDFromAccessibleContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetHWNDFromAccessibleContextPackage *pkg = (GetHWNDFromAccessibleContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetHWNDFromAccessibleContextPackage;
+    pkg->accessibleContext = accessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getHWNDFromAccessibleContext(%p)", accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getHWNDFromAccessibleContext(%016I64X)", accessibleContext);
+#endif
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return ((HWND)ABLongToHandle(pkg->rHWND));
+        }
+    }
+    return (HWND)0;
+}
+
+/********** AccessibleContext routines ***********************************/
+
+/**
+ * Walk through Java Windows, in front-to-back Z-order.
+ * If NULL is passed it, this function starts at the top.
+ *
+ */
+HWND
+WinAccessBridge::getNextJavaWindow(HWND previous) {
+    HWND current = previous;
+    if (current == NULL) {
+        current = GetTopWindow(NULL);
+    } else {
+        current = GetNextWindow(current, GW_HWNDNEXT);
+    }
+    while (current != NULL) {
+        if (isJavaWindow(current)) {
+            return current;
+        }
+        current = GetNextWindow(current, GW_HWNDNEXT);
+    }
+    return NULL;
+}
+
+
+/**
+ * getAccessibleContextAt - performs the Java code:
+ *   Accessible a = EventQueueMonitor.getAccessibleAt(x, y);
+ *       return a.getAccessibleContext();
+ *
+ * Note: this call explicitly goes through the AccessBridge,
+ * so that the AccessBridge can hide expected changes in how this functions
+ * between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some
+ * of this functionality may be built into the platform
+ *
+ */
+BOOL
+WinAccessBridge::getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent,
+                                        jint x, jint y, JOBJECT64 *AccessibleContext) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextAtPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleContextAtPackage *pkg = (GetAccessibleContextAtPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleContextAtPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContextParent;
+    pkg->x = x;
+    pkg->y = y;
+
+    PrintDebugString("WinAccessBridge::getAccessibleContextAt(%X, %p, %d, %c)", vmID, AccessibleContextParent, x, y);
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);
+    if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+        *AccessibleContext = pkg->rAccessibleContext;
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/**
+ * getAccessibleContextWithFocus - performs the Java code:
+ *   Accessible a = Translator.getAccessible(SwingEventMonitor.getComponentWithFocus());
+ *   return a.getAccessibleContext();
+ *
+ * Note: this call explicitly goes through the AccessBridge,
+ * so that the AccessBridge can hide expected changes in how this functions
+ * between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some
+ * of this functionality may be built into the platform
+ *
+ */
+BOOL
+WinAccessBridge::getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextWithFocusPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleContextWithFocusPackage *pkg = (GetAccessibleContextWithFocusPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleContextWithFocusPackage;
+
+    PrintDebugString("WinAccessBridge::getAccessibleContextWithFocus(%p, %X, )", window, vmID);
+    // find vmID, etc. from HWND; ask that VM for the AC w/Focus
+        HWND pkgVMID = (HWND)ABLongToHandle( pkg->rVMID ) ;
+    if (getAccessibleContextFromHWND(window, (long *)&(pkgVMID), &(pkg->rAccessibleContext)) == TRUE) {
+        HWND destABWindow = javaVMs->findAccessBridgeWindow((long)pkgVMID);     // ineffecient [[[FIXME]]]
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            *vmID = pkg->rVMID;
+            *AccessibleContext = pkg->rAccessibleContext;
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+/**
+ * getAccessibleContextInfo - fills a struct with a bunch of information
+ * contained in the Java Accessibility API
+ *
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleContextInfo(long vmID,
+                                          JOBJECT64 accessibleContext,
+                                          AccessibleContextInfo *info) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleContextInfoPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleContextInfoPackage *pkg = (GetAccessibleContextInfoPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleContextInfoPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = accessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleContextInfo(%X, %p, )", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleContextInfo(%X, %016I64X, )", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(info, &(pkg->rAccessibleContextInfo), sizeof(AccessibleContextInfo));
+            PrintDebugString("  name: %ls", info->name);
+            PrintDebugString("  description: %ls", info->description);
+            PrintDebugString("  role: %ls", info->role);
+            PrintDebugString("  role_en_US: %ls", info->role_en_US);
+            PrintDebugString("  states: %ls", info->states);
+            PrintDebugString("  states_en_US: %ls", info->states_en_US);
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+/**
+ * getAccessibleChildFromContext - performs the Java code:
+ *   Accessible child = ac.getAccessibleChild(i);
+ *   return child.getAccessibleContext();
+ *
+ * Note: this call explicitly goes through the AccessBridge,
+ * so that the AccessBridge can hide expected changes in how this functions
+ * between JDK 1.1.x w/AccessibilityUtility classes, and JDK 1.2, when some
+ * of this functionality may be built into the platform
+ *
+ */
+JOBJECT64
+WinAccessBridge::getAccessibleChildFromContext(long vmID,
+                                               JOBJECT64 AccessibleContext,
+                                               jint childIndex) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (JOBJECT64)0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleChildFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleChildFromContextPackage *pkg = (GetAccessibleChildFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleChildFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->childIndex = childIndex;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleChildFromContext(%X, %p, %d)", vmID, AccessibleContext, childIndex);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleChildFromContext(%X, %016I64X, %d)", vmID, AccessibleContext, childIndex);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rAccessibleContext;
+        }
+    }
+
+    return (JOBJECT64) 0;
+}
+
+/**
+ * getAccessibleParentFromContext - returns the parent AccessibleContext jobject
+ *
+ * Note: this may be null, if the AccessibleContext passed in is a top-level
+ * window, then it has no parent.
+ *
+ */
+JOBJECT64
+WinAccessBridge::getAccessibleParentFromContext(long vmID,
+                                                JOBJECT64 AccessibleContext) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (JOBJECT64)0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleParentFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleParentFromContextPackage *pkg = (GetAccessibleParentFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleParentFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+    PrintDebugString("WinAccessBridge::getAccessibleParentFromContext(%X, %p)", vmID, AccessibleContext);
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rAccessibleContext;
+        }
+    }
+
+    return (JOBJECT64) 0;
+}
+
+/********** AccessibleTable routines ***********************************/
+
+BOOL
+WinAccessBridge::getAccessibleTableInfo(long vmID,
+                                        JOBJECT64 accessibleContext,
+                                        AccessibleTableInfo *tableInfo) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableInfo(%X, %p, %p)", vmID, accessibleContext,
+                     tableInfo);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableInfo(%X, %016I64X, %p)", vmID, accessibleContext,
+                     tableInfo);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableInfoPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableInfoPackage *pkg = (GetAccessibleTableInfoPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableInfoPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(tableInfo, &(pkg->rTableInfo), sizeof(AccessibleTableInfo));
+            if (pkg->rTableInfo.rowCount != -1) {
+                PrintDebugString("  ##### WinAccessBridge::getAccessibleTableInfo succeeded");
+                return TRUE;
+            }
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableInfo failed");
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable,
+                                            jint row, jint column,
+                                            AccessibleTableCellInfo *tableCellInfo) {
+
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableCellInfo(%X, %p, %d, %d, %p)", vmID,
+                     accessibleTable, row, column, tableCellInfo);
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableCellInfoPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableCellInfoPackage *pkg = (GetAccessibleTableCellInfoPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableCellInfoPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+    pkg->row = row;
+    pkg->column = column;
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  XXXX pkg->rTableCellInfo.accessibleContext = %p", pkg->rTableCellInfo.accessibleContext);
+            memcpy(tableCellInfo, &(pkg->rTableCellInfo), sizeof(AccessibleTableCellInfo));
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableCellInfo succeeded");
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableCellInfo failed");
+    return FALSE;
+}
+
+
+BOOL
+WinAccessBridge::getAccessibleTableRowHeader(long vmID, JOBJECT64 accessibleContext, AccessibleTableInfo *tableInfo) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowHeader(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowHeader(%X, %016I64X)", vmID, accessibleContext);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowHeaderPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableRowHeaderPackage *pkg = (GetAccessibleTableRowHeaderPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableRowHeaderPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowHeader succeeded");
+            memcpy(tableInfo, &(pkg->rTableInfo), sizeof(AccessibleTableInfo));
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowHeader failed");
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getAccessibleTableColumnHeader(long vmID, JOBJECT64 accessibleContext, AccessibleTableInfo *tableInfo) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnHeader(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnHeader(%X, %016I64X)", vmID, accessibleContext);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnHeaderPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableColumnHeaderPackage *pkg = (GetAccessibleTableColumnHeaderPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableColumnHeaderPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnHeader succeeded");
+            memcpy(tableInfo, &(pkg->rTableInfo), sizeof(AccessibleTableInfo));
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnHeader failed");
+    return FALSE;
+}
+
+JOBJECT64
+WinAccessBridge::getAccessibleTableRowDescription(long vmID,
+                                                  JOBJECT64 accessibleContext,
+                                                  jint row) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowDescription(%X, %p, %d)", vmID, accessibleContext,
+                     row);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowDescription(%X, %016I64X, %d)", vmID, accessibleContext,
+                     row);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowDescriptionPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableRowDescriptionPackage *pkg = (GetAccessibleTableRowDescriptionPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableRowDescriptionPackage;
+    pkg->vmID = vmID;
+    pkg->row = row;
+    pkg->accessibleContext = accessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowDescription succeeded");
+            return pkg->rAccessibleContext;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowDescription failed");
+    return (JOBJECT64)0;
+}
+
+JOBJECT64
+WinAccessBridge::getAccessibleTableColumnDescription(long vmID,
+                                                     JOBJECT64 accessibleContext,
+                                                     jint column) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnDescription(%X, %p, %d)", vmID, accessibleContext,
+                     column);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnDescription(%X, %016I64X, %d)", vmID, accessibleContext,
+                     column);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnDescriptionPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableColumnDescriptionPackage *pkg =
+        (GetAccessibleTableColumnDescriptionPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableColumnDescriptionPackage;
+    pkg->vmID = vmID;
+    pkg->column = column;
+    pkg->accessibleContext = accessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnDescription succeeded");
+            return pkg->rAccessibleContext;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnDescription failed");
+    return (JOBJECT64)0;
+}
+
+jint
+WinAccessBridge::getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowSelectionCount(%X, %p)", vmID, accessibleTable);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowSelectionCount(%X, %016I64X)", vmID, accessibleTable);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return 0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionCountPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableRowSelectionCountPackage *pkg =
+        (GetAccessibleTableRowSelectionCountPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableRowSelectionCountPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowSelectionCount succeeded");
+            return pkg->rCount;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowSelectionCount failed");
+    return 0;
+}
+
+BOOL
+WinAccessBridge::isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::isAccessibleTableRowSelected(%X, %p)", vmID, accessibleTable);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::isAccessibleTableRowSelected(%X, %016I64X)", vmID, accessibleTable);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(IsAccessibleTableRowSelectedPackage)];
+    PackageType *type = (PackageType *) buffer;
+    IsAccessibleTableRowSelectedPackage *pkg = (IsAccessibleTableRowSelectedPackage *) (buffer + sizeof(PackageType));
+    *type = cIsAccessibleTableRowSelectedPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+    pkg->row = row;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::isAccessibleTableRowSelected succeeded");
+            return pkg->rResult;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::isAccessibleTableRowSelected failed");
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count, jint *selections) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowSelections(%X, %p)", vmID, accessibleTable);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRowSelections(%X, %016I64X)", vmID, accessibleTable);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowSelectionsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableRowSelectionsPackage *pkg =
+        (GetAccessibleTableRowSelectionsPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableRowSelectionsPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+    pkg->count = count;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowSelections succeeded");
+            memcpy(selections, pkg->rSelections, count * sizeof(jint));
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRowSelections failed");
+    return FALSE;
+}
+
+
+jint
+WinAccessBridge::getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnSelectionCount(%X, %p)", vmID,
+                     accessibleTable);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnSelectionCount(%X, %016I64X)", vmID,
+                     accessibleTable);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionCountPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableColumnSelectionCountPackage *pkg =
+        (GetAccessibleTableColumnSelectionCountPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableColumnSelectionCountPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnSelectionCount succeeded");
+            return pkg->rCount;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnSelectionCount failed");
+    return 0;
+}
+
+BOOL
+WinAccessBridge::isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column) {
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::isAccessibleTableColumnSelected(%X, %p)", vmID, accessibleTable);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::isAccessibleTableColumnSelected(%X, %016I64X)", vmID, accessibleTable);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(IsAccessibleTableColumnSelectedPackage)];
+    PackageType *type = (PackageType *) buffer;
+    IsAccessibleTableColumnSelectedPackage *pkg = (IsAccessibleTableColumnSelectedPackage *) (buffer + sizeof(PackageType));
+    *type = cIsAccessibleTableColumnSelectedPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+    pkg->column = column;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::isAccessibleTableColumnSelected succeeded");
+            return pkg->rResult;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::isAccessibleTableColumnSelected failed");
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count,
+                                                    jint *selections) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnSelections(%X, %p)", vmID, accessibleTable);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumnSelections(%X, %016I64X)", vmID, accessibleTable);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnSelectionsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableColumnSelectionsPackage *pkg =
+        (GetAccessibleTableColumnSelectionsPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableColumnSelectionsPackage;
+    pkg->vmID = vmID;
+    pkg->count = count;
+    pkg->accessibleTable = accessibleTable;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnSelections succeeded");
+            memcpy(selections, pkg->rSelections, count * sizeof(jint));
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumnSelections failed");
+    return FALSE;
+}
+
+jint
+WinAccessBridge::getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRow(%X, %p, index=%d)", vmID,
+                     accessibleTable, index);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableRow(%X, %016I64X, index=%d)", vmID,
+                     accessibleTable, index);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableRowPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableRowPackage *pkg =
+        (GetAccessibleTableRowPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableRowPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+    pkg->index = index;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRow succeeded");
+            return pkg->rRow;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableRow failed");
+    return 0;
+}
+
+jint
+WinAccessBridge::getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumn(%X, %p, index=%d)", vmID,
+                     accessibleTable, index);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableColumn(%X, %016I64X, index=%d)", vmID,
+                     accessibleTable, index);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableColumnPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableColumnPackage *pkg =
+        (GetAccessibleTableColumnPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableColumnPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+    pkg->index = index;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumn succeeded");
+            return pkg->rColumn;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableColumn failed");
+    return 0;
+}
+
+jint
+WinAccessBridge::getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableIndex(%X, %p, row=%d, col=%d)", vmID,
+                     accessibleTable, row, column);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleTableIndex(%X, %016I64X, row=%d, col=%d)", vmID,
+                     accessibleTable, row, column);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTableIndexPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTableIndexPackage *pkg =
+        (GetAccessibleTableIndexPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTableIndexPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleTable = accessibleTable;
+    pkg->row = row;
+    pkg->column = column;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleTableIndex succeeded");
+            return pkg->rIndex;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleTableIndex failed");
+    return 0;
+}
+
+/********** end AccessibleTable routines ******************************/
+
+BOOL
+WinAccessBridge::getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext,
+                                          AccessibleRelationSetInfo *relationSetInfo) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleRelationSet(%X, %p, %X)", vmID,
+                     accessibleContext, relationSetInfo);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleRelationSet(%X, %016I64X, %X)", vmID,
+                     accessibleContext, relationSetInfo);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleRelationSetPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleRelationSetPackage *pkg = (GetAccessibleRelationSetPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleRelationSetPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### pkg->rAccessibleRelationSetInfo.relationCount = %X",
+                             pkg->rAccessibleRelationSetInfo.relationCount);
+            memcpy(relationSetInfo, &(pkg->rAccessibleRelationSetInfo), sizeof(AccessibleRelationSetInfo));
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleRelationSet succeeded");
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleRelationSet failed");
+    return FALSE;
+}
+
+
+/********** AccessibleHypertext routines ***********/
+
+BOOL
+WinAccessBridge::getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext,
+                                        AccessibleHypertextInfo *hypertextInfo) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHypertext(%X, %p, %X)", vmID,
+                     accessibleContext, hypertextInfo);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHypertext(%X, %016I64X, %X)", vmID,
+                     accessibleContext, hypertextInfo);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleHypertextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleHypertextPackage *pkg = (GetAccessibleHypertextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleHypertextPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(hypertextInfo, &(pkg->rAccessibleHypertextInfo), sizeof(AccessibleHypertextInfo));
+
+            PrintDebugString("  ##### hypertextInfo.linkCount = %d", hypertextInfo->linkCount);
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertext succeeded");
+
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertext failed");
+    return FALSE;
+}
+
+
+BOOL
+WinAccessBridge::activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext,
+                                             JOBJECT64 accessibleHyperlink) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::activateAccessibleHyperlink(%p %p)", accessibleContext,
+                     accessibleHyperlink);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::activateAccessibleHyperlink(%016I64X %016I64X)", accessibleContext,
+                     accessibleHyperlink);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(ActivateAccessibleHyperlinkPackage)];
+    PackageType *type = (PackageType *) buffer;
+    ActivateAccessibleHyperlinkPackage *pkg = (ActivateAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));
+    *type = cActivateAccessibleHyperlinkPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    pkg->accessibleHyperlink = accessibleHyperlink;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);
+    if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+        return pkg->rResult;
+    }
+    PrintDebugString("  WinAccessBridge::activateAccessibleHyperlink returning FALSE (sendMemoryPackage failed)");
+    return FALSE;
+}
+
+/*
+ * Returns the number of hyperlinks in a component
+ * Maps to AccessibleHypertext.getLinkCount.
+ * Returns -1 on error.
+ */
+jint
+WinAccessBridge::getAccessibleHyperlinkCount(const long vmID,
+                                             const AccessibleContext accessibleContext) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHyperlinkCount(%X, %p)",
+                     vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHyperlinkCount(%X, %016I64X)",
+                     vmID, accessibleContext);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleHyperlinkCountPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleHyperlinkCountPackage *pkg = (GetAccessibleHyperlinkCountPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleHyperlinkCountPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### hypetext link count = %d", pkg->rLinkCount);
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleHyperlinkCount succeeded");
+            return pkg->rLinkCount;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleHyperlinkCount failed");
+    return -1;
+}
+
+/*
+ * This method is used to iterate through the hyperlinks in a component.  It
+ * returns hypertext information for a component starting at hyperlink index
+ * nStartIndex.  No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
+ * be returned for each call to this method.
+ * returns FALSE on error.
+ */
+BOOL
+WinAccessBridge::getAccessibleHypertextExt(const long vmID,
+                                           const AccessibleContext accessibleContext,
+                                           const jint startIndex,
+                                           /* OUT */ AccessibleHypertextInfo *hypertextInfo) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHypertextExt(%X, %p %p)", vmID,
+                     accessibleContext, hypertextInfo);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHypertextExt(%X, %016I64X %p)", vmID,
+                     accessibleContext, hypertextInfo);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleHypertextExtPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleHypertextExtPackage *pkg = (GetAccessibleHypertextExtPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleHypertextExtPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    pkg->startIndex = startIndex;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### pkg->rSuccess = %d", pkg->rSuccess);
+
+            memcpy(hypertextInfo, &(pkg->rAccessibleHypertextInfo), sizeof(AccessibleHypertextInfo));
+            if (pkg->rSuccess == TRUE) {
+                PrintDebugString("  ##### hypertextInfo.linkCount = %d", hypertextInfo->linkCount);
+                PrintDebugString("  ##### hypertextInfo.linkCount = %d", hypertextInfo->linkCount);
+            } else {
+                PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertextExt failed");
+            }
+            return pkg->rSuccess;;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertextExt failed");
+    return FALSE;
+}
+
+
+/*
+ * Returns the index into an array of hyperlinks that is associated with
+ * a character index in document;
+ * Maps to AccessibleHypertext.getLinkIndex.
+ * Returns -1 on error.
+ */
+jint
+WinAccessBridge::getAccessibleHypertextLinkIndex(const long vmID,
+                                                 const AccessibleHyperlink hypertext,
+                                                 const jint charIndex) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHypertextLinkIndex(%X, %p)",
+                     vmID, hypertext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHypertextLinkIndex(%X, %016I64X)",
+                     vmID, hypertext);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleHypertextLinkIndexPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleHypertextLinkIndexPackage *pkg = (GetAccessibleHypertextLinkIndexPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleHypertextLinkIndexPackage;
+    pkg->vmID = vmID;
+    pkg->hypertext = hypertext;
+    pkg->charIndex = charIndex;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  ##### hypetext link index = %d", pkg->rLinkIndex);
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertextLinkIndex  succeeded");
+            return pkg->rLinkIndex;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertextLinkIndex  failed");
+    return -1;
+}
+
+/*
+ * Returns the nth hyperlink in a document.
+ * Maps to AccessibleHypertext.getLink.
+ * Returns -1 on error
+ */
+BOOL
+WinAccessBridge::getAccessibleHyperlink(const long vmID,
+                                        const AccessibleHyperlink hypertext,
+                                        const jint linkIndex,
+                                        /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHyperlink(%X, %p, %p)", vmID,
+                     hypertext, hyperlinkInfo);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleHyperlink(%X, %016I64X, %p)", vmID,
+                     hypertext, hyperlinkInfo);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleHyperlinkPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleHyperlinkPackage *pkg = (GetAccessibleHyperlinkPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleHyperlinkPackage;
+    pkg->vmID = vmID;
+    pkg->hypertext = hypertext;
+    pkg->linkIndex = linkIndex;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(hyperlinkInfo, &(pkg->rAccessibleHyperlinkInfo),
+                   sizeof(AccessibleHyperlinkInfo));
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertext succeeded");
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleHypertext failed");
+    return FALSE;
+}
+
+
+/********** AccessibleKeyBinding routines ***********/
+
+BOOL
+WinAccessBridge::getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext,
+                                          AccessibleKeyBindings *keyBindings) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleKeyBindings(%X, %p, %p)", vmID,
+                     accessibleContext, keyBindings);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleKeyBindings(%X, %016I64X, %p)", vmID,
+                     accessibleContext, keyBindings);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleKeyBindingsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleKeyBindingsPackage *pkg = (GetAccessibleKeyBindingsPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleKeyBindingsPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(keyBindings, &(pkg->rAccessibleKeyBindings), sizeof(AccessibleKeyBindings));
+
+            PrintDebugString("  ##### keyBindings.keyBindingsCount = %d", keyBindings->keyBindingsCount);
+            for (int i = 0; i < keyBindings->keyBindingsCount; ++i) {
+                PrintDebugString("  Key Binding # %d", i+1);
+                PrintDebugString("    Modifiers: 0x%x", keyBindings->keyBindingInfo[i].modifiers);
+                PrintDebugString("    Character (hex):  0x%x", keyBindings->keyBindingInfo[i].character);
+                PrintDebugString("    Character (wide char):  %lc", keyBindings->keyBindingInfo[i].character);
+            }
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleKeyBindings succeeded");
+
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleKeyBindings failed");
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getAccessibleIcons(long vmID, JOBJECT64 accessibleContext, AccessibleIcons *icons) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleIcons(%X, %p, %p)", vmID,
+                     accessibleContext, icons);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleIcons(%X, %016I64X, %p)", vmID,
+                     accessibleContext, icons);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleIconsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleIconsPackage *pkg = (GetAccessibleIconsPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleIconsPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(icons, &(pkg->rAccessibleIcons), sizeof(AccessibleIcons));
+
+            PrintDebugString("  ##### icons.iconsCount = %d", icons->iconsCount);
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleIcons succeeded");
+
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleIcons failed");
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getAccessibleActions(long vmID, JOBJECT64 accessibleContext, AccessibleActions *actions) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("##### WinAccessBridge::getAccessibleActions(%X, %p, %p)", vmID,
+                     accessibleContext, actions);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("##### WinAccessBridge::getAccessibleActions(%X, %016I64X, %p)", vmID,
+                     accessibleContext, actions);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleActionsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleActionsPackage *pkg = (GetAccessibleActionsPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleActionsPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(actions, &(pkg->rAccessibleActions), sizeof(AccessibleActions));
+
+            PrintDebugString("  ##### actions.actionsCount = %d", actions->actionsCount);
+            PrintDebugString("  ##### WinAccessBridge::getAccessibleActions succeeded");
+
+            return TRUE;
+        }
+    }
+    PrintDebugString("  ##### WinAccessBridge::getAccessibleActions failed");
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::doAccessibleActions(long vmID, JOBJECT64 accessibleContext,
+                                     AccessibleActionsToDo *actionsToDo, jint *failure) {
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::doAccessibleActions(%p #actions %d %ls)", accessibleContext,
+                     actionsToDo->actionsCount,
+                     actionsToDo->actions[0].name);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::doAccessibleActions(%016I64X #actions %d %ls)", accessibleContext,
+                     actionsToDo->actionsCount,
+                     actionsToDo->actions[0].name);
+#endif
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(DoAccessibleActionsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    DoAccessibleActionsPackage *pkg = (DoAccessibleActionsPackage *) (buffer + sizeof(PackageType));
+    *type = cDoAccessibleActionsPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    memcpy((void *)(&(pkg->actionsToDo)), (void *)actionsToDo, sizeof(AccessibleActionsToDo));
+    pkg->failure = -1;
+
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(pkg->vmID);
+    if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+        *failure = pkg->failure;
+        return pkg->rResult;
+    }
+    PrintDebugString("  WinAccessBridge::doAccessibleActions returning FALSE (sendMemoryPackage failed)");
+    return FALSE;
+}
+
+/* ====== Utility methods ====== */
+
+/**
+ * Sets a text field to the specified string. Returns whether successful.
+ */
+BOOL
+WinAccessBridge::setTextContents (const long vmID, const AccessibleContext accessibleContext,
+                                  const wchar_t *text) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(SetTextContentsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    SetTextContentsPackage *pkg = (SetTextContentsPackage *) (buffer + sizeof(PackageType));
+    *type = cSetTextContentsPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    wcsncpy(pkg->text, text, sizeof(pkg->text)/sizeof(wchar_t)); // wide character copy
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::setTextContents(%X, %016I64X %ls)", vmID, accessibleContext, text);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::setTextContents(%X, %p %ls)", vmID, accessibleContext, text);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rResult;
+        }
+    }
+    return FALSE;
+}
+
+/**
+ * Returns the Accessible Context of a Page Tab object that is the
+ * ancestor of a given object.  If the object is a Page Tab object
+ * or a Page Tab ancestor object was found, returns the object
+ * AccessibleContext.
+ * If there is no ancestor object that has an Accessible Role of Page Tab,
+ * returns (AccessibleContext)0.
+ */
+AccessibleContext
+WinAccessBridge::getParentWithRole (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (JOBJECT64)0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetParentWithRolePackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetParentWithRolePackage *pkg = (GetParentWithRolePackage *) (buffer + sizeof(PackageType));
+    *type = cGetParentWithRolePackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    memcpy((void *)(&(pkg->role)), (void *)role, sizeof(pkg->role));
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getParentWithRole(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getParentWithRole(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    PrintDebugString("  pkg->vmID: %X", pkg->vmID);
+    PrintDebugString("  pkg->accessibleContext: %p", pkg->accessibleContext);
+    PrintDebugString("  pkg->role: %ls", pkg->role);
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            PrintDebugString("  pkg->rAccessibleContext: %p", pkg->rAccessibleContext);
+            return pkg->rAccessibleContext;
+        }
+    }
+    return (JOBJECT64) 0;
+}
+
+
+/**
+ * Returns the Accessible Context for the top level object in
+ * a Java Window.  This is same Accessible Context that is obtained
+ * from GetAccessibleContextFromHWND for that window.  Returns
+ * (AccessibleContext)0 on error.
+ */
+AccessibleContext
+WinAccessBridge::getTopLevelObject (const long vmID, const AccessibleContext accessibleContext) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (JOBJECT64)0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetTopLevelObjectPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetTopLevelObjectPackage *pkg = (GetTopLevelObjectPackage *) (buffer + sizeof(PackageType));
+    *type = cGetTopLevelObjectPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getTopLevelObject(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getTopLevelObject(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rAccessibleContext;
+        }
+    }
+    return (JOBJECT64) 0;
+}
+
+/**
+ * If there is an Ancestor object that has an Accessible Role of
+ * Internal Frame, returns the Accessible Context of the Internal
+ * Frame object.  Otherwise, returns the top level object for that
+ * Java Window.  Returns (AccessibleContext)0 on error.
+ */
+AccessibleContext
+WinAccessBridge::getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext, const wchar_t *role) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (JOBJECT64)0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetParentWithRoleElseRootPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetParentWithRoleElseRootPackage *pkg = (GetParentWithRoleElseRootPackage *) (buffer + sizeof(PackageType));
+    *type = cGetParentWithRoleElseRootPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    memcpy((void *)(&(pkg->role)), (void *)role, sizeof(pkg->role));
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getParentWithRoleElseRoot(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getParentWithRoleElseRoot(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rAccessibleContext;
+        }
+    }
+    return (JOBJECT64) 0;
+}
+
+/**
+ * Returns how deep in the object hierarchy a given object is.
+ * The top most object in the object hierarchy has an object depth of 0.
+ * Returns -1 on error.
+ */
+int
+WinAccessBridge::getObjectDepth (const long vmID, const AccessibleContext accessibleContext) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return -1;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetObjectDepthPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetObjectDepthPackage *pkg = (GetObjectDepthPackage *) (buffer + sizeof(PackageType));
+    *type = cGetObjectDepthPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getObjectDepth(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getObjectDepth(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rResult;
+        }
+    }
+    return -1;
+}
+
+/**
+ * Returns the Accessible Context of the currently ActiveDescendent of an object.
+ * Returns (AccessibleContext)0 on error.
+ */
+AccessibleContext
+WinAccessBridge::getActiveDescendent (const long vmID, const AccessibleContext accessibleContext) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (JOBJECT64)0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetActiveDescendentPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetActiveDescendentPackage *pkg = (GetActiveDescendentPackage *) (buffer + sizeof(PackageType));
+    *type = cGetActiveDescendentPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getActiveDescendent(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getActiveDescendent(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rAccessibleContext;
+        }
+    }
+    return (JOBJECT64) 0;
+}
+
+/**
+ * Additional methods for Teton
+ */
+
+/**
+ * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+ * whether successful.
+ *
+ * Bug ID 4916682 - Implement JAWS AccessibleName policy
+ */
+BOOL
+WinAccessBridge::getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext,
+                                          wchar_t *name, int len) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetVirtualAccessibleNamePackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetVirtualAccessibleNamePackage *pkg = (GetVirtualAccessibleNamePackage *) (buffer + sizeof(PackageType));
+    *type = cGetVirtualAccessibleNamePackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    size_t max = (len > sizeof(pkg->rName)) ? sizeof(pkg->rName) : len;
+    pkg->len = (int)max;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getVirtualAccessibleName(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getVirtualAccessibleName(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            wcsncpy(name, pkg->rName, max);
+            PrintDebugString("    WinAccessBridge::getVirtualAccessibleName: Virtual name = %ls", name);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+/**
+ * Request focus for a component. Returns whether successful;
+ *
+ * Bug ID 4944757 - requestFocus method needed
+ */
+BOOL
+WinAccessBridge::requestFocus(long vmID, AccessibleContext accessibleContext) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(RequestFocusPackage)];
+    PackageType *type = (PackageType *) buffer;
+    RequestFocusPackage *pkg = (RequestFocusPackage *) (buffer + sizeof(PackageType));
+    *type = cRequestFocusPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::requestFocus(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::requestFocus(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+/**
+ * Selects text between two indices.  Selection includes the text at the start index
+ * and the text at the end index. Returns whether successful;
+ *
+ * Bug ID 4944758 - selectTextRange method needed
+ */
+BOOL
+WinAccessBridge::selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(SelectTextRangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    SelectTextRangePackage *pkg = (SelectTextRangePackage *) (buffer + sizeof(PackageType));
+    *type = cSelectTextRangePackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    pkg->startIndex = startIndex;
+    pkg->endIndex = endIndex;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("    WinAccessBridge::selectTextRange(%X, %p %d %d)", vmID, accessibleContext,
+                     startIndex, endIndex);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("    WinAccessBridge::selectTextRange(%X, %016I64X %d %d)", vmID, accessibleContext,
+                     startIndex, endIndex);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+/**
+ * Get text attributes between two indices.  The attribute list includes the text at the
+ * start index and the text at the end index. Returns whether successful;
+ *
+ * Bug ID 4944761 - getTextAttributes between two indices method needed
+ */
+BOOL
+WinAccessBridge::getTextAttributesInRange(long vmID, AccessibleContext accessibleContext,
+                                          int startIndex, int endIndex,
+                                          AccessibleTextAttributesInfo *attributes, short *len) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetTextAttributesInRangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetTextAttributesInRangePackage *pkg = (GetTextAttributesInRangePackage *) (buffer + sizeof(PackageType));
+    *type = cGetTextAttributesInRangePackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    pkg->startIndex = startIndex;
+    pkg->endIndex = endIndex;
+    memcpy(&(pkg->attributes), attributes, sizeof(AccessibleTextAttributesInfo));
+
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("    WinAccessBridge::getTextAttributesInRange(%X, %p %d %d)", vmID, accessibleContext,
+                     startIndex, endIndex);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("    WinAccessBridge::getTextAttributesInRange(%X, %016I64X %d %d)", vmID, accessibleContext,
+                     startIndex, endIndex);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            *attributes = pkg->attributes;
+            *len = pkg->rLength;
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+/**
+ * Gets the number of visible children of a component. Returns -1 on error.
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+int
+WinAccessBridge::getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return -1;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetVisibleChildrenCountPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetVisibleChildrenCountPackage *pkg = (GetVisibleChildrenCountPackage *) (buffer + sizeof(PackageType));
+    *type = cGetVisibleChildrenCountPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getVisibleChildrenCount(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getVisibleChildrenCount(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rChildrenCount;
+        }
+    }
+    return -1;
+}
+
+/**
+ * Gets the visible children of an AccessibleContext. Returns whether successful;
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+BOOL
+WinAccessBridge::getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex,
+                                    VisibleChildrenInfo *visibleChildrenInfo) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetVisibleChildrenPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetVisibleChildrenPackage *pkg = (GetVisibleChildrenPackage *) (buffer + sizeof(PackageType));
+    *type = cGetVisibleChildrenPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    pkg->startIndex = startIndex;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getVisibleChildren(%X, %p)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getVisibleChildren(%X, %016I64X)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(visibleChildrenInfo, &(pkg->rVisibleChildrenInfo), sizeof(pkg->rVisibleChildrenInfo));
+            return pkg->rSuccess;
+        }
+    }
+    return FALSE;
+}
+
+/**
+ * Set the caret to a text position. Returns whether successful;
+ *
+ * Bug ID 4944770 - setCaretPosition method needed
+ */
+BOOL
+WinAccessBridge::setCaretPosition(long vmID, AccessibleContext accessibleContext, int position) {
+
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(SetCaretPositionPackage)];
+    PackageType *type = (PackageType *) buffer;
+    SetCaretPositionPackage *pkg = (SetCaretPositionPackage *) (buffer + sizeof(PackageType));
+    *type = cSetCaretPositionPackage;
+    pkg->vmID = vmID;
+    pkg->accessibleContext = accessibleContext;
+    pkg->position = position;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::setCaretPosition(%X, %p %ls)", vmID, accessibleContext);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::setCaretPosition(%X, %016I64X %ls)", vmID, accessibleContext);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+
+/********** AccessibleText routines ***********************************/
+
+/**
+ * getAccessibleTextInfo - fills a struct with a bunch of information
+ * contained in the Java Accessibility AccessibleText API
+ *
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleTextInfo(long vmID,
+                                       JOBJECT64 AccessibleContext,
+                                       AccessibleTextInfo *textInfo,
+                                       jint x, jint y) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextInfoPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTextInfoPackage *pkg = (GetAccessibleTextInfoPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTextInfoPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->x = x;
+    pkg->y = y;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleTextInfo(%X, %p, %p, %d, %d)", vmID, AccessibleContext, textInfo, x, y);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleTextInfo(%X, %016I64X, %p, %d, %d)", vmID, AccessibleContext, textInfo, x, y);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(textInfo, &(pkg->rTextInfo), sizeof(AccessibleTextInfo));
+            if (pkg->rTextInfo.charCount != -1) {
+                PrintDebugString("  charCount: %d", textInfo->charCount);
+                PrintDebugString("  caretIndex: %d", textInfo->caretIndex);
+                PrintDebugString("  indexAtPoint: %d", textInfo->indexAtPoint);
+                return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+/**
+ * getAccessibleTextItems - fills a struct with letter, word, and sentence info
+ * of the AccessibleText interface at a given index
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleTextItems(long vmID,
+                                        JOBJECT64 AccessibleContext,
+                                        AccessibleTextItemsInfo *textItems,
+                                        jint index) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextItemsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTextItemsPackage *pkg = (GetAccessibleTextItemsPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTextItemsPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = index;
+    // zero things out, in case the call fails
+    pkg->rTextItemsInfo.letter = '\0';
+    pkg->rTextItemsInfo.word[0] = '\0';
+    pkg->rTextItemsInfo.sentence[0] = '\0';
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleTextItems(%X, %p, %p, %d)", vmID, AccessibleContext, textItems, index);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleTextItems(%X, %016I64X, %p, %d)", vmID, AccessibleContext, textItems, index);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(textItems, &(pkg->rTextItemsInfo), sizeof(AccessibleTextItemsInfo));
+            if (pkg->rTextItemsInfo.letter != '/0') {
+                return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+/**
+ * getAccessibleTextSelectionInfo - returns information about the selected
+ * text of the object implementing AccessibleText
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleTextSelectionInfo(long vmID,
+                                                JOBJECT64 AccessibleContext,
+                                                AccessibleTextSelectionInfo *selectionInfo) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextSelectionInfoPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTextSelectionInfoPackage *pkg = (GetAccessibleTextSelectionInfoPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTextSelectionInfoPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleTextSelectionInfo(%X, %p, %p)", vmID, AccessibleContext, selectionInfo);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleTextSelectionInfo(%X, %016I64X, %p)", vmID, AccessibleContext, selectionInfo);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(selectionInfo, &(pkg->rTextSelectionItemsInfo), sizeof(AccessibleTextSelectionInfo));
+            // [[[FIXME]]] should test to see if valid info returned; return FALSE if not
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+/**
+ * getAccessibleTextAttributes - performs the Java code:
+ *   ...[[[FIXME]]] fill in this comment...
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleTextAttributes(long vmID,
+                                             JOBJECT64 AccessibleContext,
+                                             jint index,
+                                             AccessibleTextAttributesInfo *attributes) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextAttributeInfoPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTextAttributeInfoPackage *pkg = (GetAccessibleTextAttributeInfoPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTextAttributeInfoPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = index;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleTextAttributes(%X, %p, %d, %p)", vmID, AccessibleContext, index, attributes);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleTextAttributes(%X, %016I64X, %d, %p)", vmID, AccessibleContext, index, attributes);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(attributes, &(pkg->rAttributeInfo), sizeof(AccessibleTextAttributesInfo));
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+/**
+ * getAccessibleTextRect - gets the text bounding rectangle
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleTextRect(long vmID,
+                                       JOBJECT64 AccessibleContext,
+                                       AccessibleTextRectInfo *rectInfo,
+                                       jint index) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextRectInfoPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTextRectInfoPackage *pkg = (GetAccessibleTextRectInfoPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTextRectInfoPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = index;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleTextRect(%X, %p, %p, %d)", vmID, AccessibleContext, rectInfo, index);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleTextRect(%X, %016I64X, %p, %d)", vmID, AccessibleContext, rectInfo, index);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(rectInfo, (&pkg->rTextRectInfo), sizeof(AccessibleTextRectInfo));
+            // [[[FIXME]]] should test to see if valid info returned; return FALSE if not
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+
+/**
+ * getAccessibleTextRect - gets the text bounding rectangle
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getCaretLocation(long vmID,
+                                       JOBJECT64 AccessibleContext,
+                                       AccessibleTextRectInfo *rectInfo,
+                                       jint index) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetCaretLocationPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetCaretLocationPackage *pkg = (GetCaretLocationPackage *) (buffer + sizeof(PackageType));
+    *type = cGetCaretLocationPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = index;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getCaretLocation(%X, %p, %p, %d)", vmID, AccessibleContext, rectInfo, index);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getCaretLocation(%X, %016I64X, %p, %d)", vmID, AccessibleContext, rectInfo, index);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            memcpy(rectInfo, (&pkg->rTextRectInfo), sizeof(AccessibleTextRectInfo));
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+
+/**
+ * getEventsWaiting - gets the number of events waiting to fire
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+int
+WinAccessBridge::getEventsWaiting() {
+    if(messageQueue) {
+        return(messageQueue->getEventsWaiting());
+    }
+    return(0);
+}
+
+
+/**
+ * getAccessibleTextLineBounds - gets the bounding rectangle for the text line
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleTextLineBounds(long vmID,
+                                             JOBJECT64 AccessibleContext,
+                                             jint index, jint *startIndex, jint *endIndex) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextLineBoundsPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTextLineBoundsPackage *pkg = (GetAccessibleTextLineBoundsPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTextLineBoundsPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = index;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleTextLineBounds(%X, %p, %d, )", vmID, AccessibleContext, index);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleTextLineBounds(%X, %016I64X, %d, )", vmID, AccessibleContext, index);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            *startIndex = pkg->rLineStart;
+            *endIndex = pkg->rLineEnd;
+            // [[[FIXME]]] should test to see if valid info returned; return FALSE if not
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+
+/**
+ * getAccessibleTextLineBounds - performs the Java code:
+ *   ...[[[FIXME]]] fill in this comment...
+ *
+ * Note: if the AccessibleContext parameter is bogus, this call will blow up
+ */
+BOOL
+WinAccessBridge::getAccessibleTextRange(long vmID,
+                                        JOBJECT64 AccessibleContext,
+                                        jint start, jint end, wchar_t *text, short len) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleTextRangePackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleTextRangePackage *pkg = (GetAccessibleTextRangePackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleTextRangePackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->start = start;
+    pkg->end = end;
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
+    PrintDebugString("WinAccessBridge::getAccessibleTextRange(%X, %p, %d, %d, )", vmID, AccessibleContext, start, end);
+#else // JOBJECT64 is jlong (64 bit)
+    PrintDebugString("WinAccessBridge::getAccessibleTextRange(%X, %016I64X, %d, %d, )", vmID, AccessibleContext, start, end);
+#endif
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            wcsncpy(text, pkg->rText, len);
+            // [[[FIXME]]] should test to see if valid info returned; return FALSE if not
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+
+
+
+/********** AccessibleValue routines ***************/
+
+BOOL
+WinAccessBridge::getCurrentAccessibleValueFromContext(long vmID,
+                                                      JOBJECT64 AccessibleContext,
+                                                      wchar_t *value, short len) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetCurrentAccessibleValueFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetCurrentAccessibleValueFromContextPackage *pkg = (GetCurrentAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetCurrentAccessibleValueFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            wcsncpy(value, pkg->rValue, len);
+            // [[[FIXME]]] should test to see if valid info returned; return FALSE if not
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getMaximumAccessibleValueFromContext(long vmID,
+                                                      JOBJECT64 AccessibleContext,
+                                                      wchar_t *value, short len) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetMaximumAccessibleValueFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetMaximumAccessibleValueFromContextPackage *pkg = (GetMaximumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetMaximumAccessibleValueFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            wcsncpy(value, pkg->rValue, len);
+            // [[[FIXME]]] should test to see if valid info returned; return FALSE if not
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+BOOL
+WinAccessBridge::getMinimumAccessibleValueFromContext(long vmID,
+                                                      JOBJECT64 AccessibleContext,
+                                                      wchar_t *value, short len) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetMinimumAccessibleValueFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetMinimumAccessibleValueFromContextPackage *pkg = (GetMinimumAccessibleValueFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetMinimumAccessibleValueFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            wcsncpy(value, pkg->rValue, len);
+            // [[[FIXME]]] should test to see if valid info returned; return FALSE if not
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+
+/********** AccessibleSelection routines ***************/
+
+void
+WinAccessBridge::addAccessibleSelectionFromContext(long vmID,
+                                                   JOBJECT64 AccessibleContext, int i) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(AddAccessibleSelectionFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    AddAccessibleSelectionFromContextPackage *pkg = (AddAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cAddAccessibleSelectionFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = i;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        sendMemoryPackage(buffer, sizeof(buffer), destABWindow);
+    }
+}
+
+void
+WinAccessBridge::clearAccessibleSelectionFromContext(long vmID,
+                                                     JOBJECT64 AccessibleContext) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(ClearAccessibleSelectionFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    ClearAccessibleSelectionFromContextPackage *pkg = (ClearAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cClearAccessibleSelectionFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        sendMemoryPackage(buffer, sizeof(buffer), destABWindow);
+    }
+}
+
+JOBJECT64
+WinAccessBridge::getAccessibleSelectionFromContext(long vmID,
+                                                   JOBJECT64 AccessibleContext, int i) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return (JOBJECT64)0;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleSelectionFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleSelectionFromContextPackage *pkg = (GetAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleSelectionFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = i;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return pkg->rAccessibleContext;
+        }
+    }
+
+    return (JOBJECT64) 0;
+}
+
+int
+WinAccessBridge::getAccessibleSelectionCountFromContext(long vmID,
+                                                        JOBJECT64 AccessibleContext) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return -1;
+    }
+    char buffer[sizeof(PackageType) + sizeof(GetAccessibleSelectionCountFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    GetAccessibleSelectionCountFromContextPackage *pkg = (GetAccessibleSelectionCountFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cGetAccessibleSelectionCountFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            return (int) pkg->rCount;
+        }
+    }
+
+    return -1;
+}
+
+BOOL
+WinAccessBridge::isAccessibleChildSelectedFromContext(long vmID,
+                                                      JOBJECT64 AccessibleContext, int i) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return FALSE;
+    }
+    char buffer[sizeof(PackageType) + sizeof(IsAccessibleChildSelectedFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    IsAccessibleChildSelectedFromContextPackage *pkg = (IsAccessibleChildSelectedFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cIsAccessibleChildSelectedFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = i;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
+            if (pkg->rResult != 0) {
+                return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+
+void
+WinAccessBridge::removeAccessibleSelectionFromContext(long vmID,
+                                                      JOBJECT64 AccessibleContext, int i) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(RemoveAccessibleSelectionFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    RemoveAccessibleSelectionFromContextPackage *pkg = (RemoveAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cRemoveAccessibleSelectionFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+    pkg->index = i;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        sendMemoryPackage(buffer, sizeof(buffer), destABWindow);
+    }
+}
+
+void
+WinAccessBridge::selectAllAccessibleSelectionFromContext(long vmID,
+                                                         JOBJECT64 AccessibleContext) {
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(SelectAllAccessibleSelectionFromContextPackage)];
+    PackageType *type = (PackageType *) buffer;
+    SelectAllAccessibleSelectionFromContextPackage *pkg = (SelectAllAccessibleSelectionFromContextPackage *) (buffer + sizeof(PackageType));
+    *type = cSelectAllAccessibleSelectionFromContextPackage;
+    pkg->vmID = vmID;
+    pkg->AccessibleContext = AccessibleContext;
+
+    // need to call only the HWND/VM that contains this AC
+    HWND destABWindow = javaVMs->findAccessBridgeWindow(vmID);
+    if (destABWindow != (HWND) 0) {
+        sendMemoryPackage(buffer, sizeof(buffer), destABWindow);
+    }
+}
+
+
+/*********** Event handling methods **********************************/
+
+/**
+ * addEventNotification - tell all Java-launched AccessBridge DLLs
+ *                        that we want events of the specified type
+ *
+ * [[[FIXME]]] since we're just sending a long & a source window,
+ *                         we could use a private message rather than WM_COPYDATA
+ *                         (though we still may want it to be synchronous; dunno...)
+ *
+ */
+void
+WinAccessBridge::addJavaEventNotification(jlong type) {
+    PrintDebugString("WinAccessBridge::addJavaEventNotification(%016I64X)", type);
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+
+    char buffer[sizeof(PackageType) + sizeof(AddJavaEventNotificationPackage)];
+    PackageType *pkgType = (PackageType *) buffer;
+    AddJavaEventNotificationPackage *pkg = (AddJavaEventNotificationPackage *) (buffer + sizeof(PackageType));
+    *pkgType = cAddJavaEventNotificationPackage;
+    pkg->type = type;
+    pkg->DLLwindow = ABHandleToLong(dialogWindow);
+
+    PrintDebugString("  ->pkgType = %X, eventType = %016I64X, DLLwindow = %p",
+                     *pkgType, pkg->type, pkg->DLLwindow);
+
+    // send addEventNotification message to all JVMs
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *current = javaVMs;
+    while (current != (AccessBridgeJavaVMInstance *) 0) {
+        current->sendPackage(buffer, sizeof(buffer));           // no return values!
+        current = current->nextJVMInstance;
+    }
+    isVMInstanceChainInUse = false;
+}
+
+/**
+ * removeEventNotification - tell all Java-launched AccessBridge DLLs
+ *                                                       that we no longer want events of the
+ *                                                       specified type
+ *
+ * [[[FIXME]]] since we're just sending a long & a source window,
+ *                         we could use a private message rather than WM_COPYDATA
+ *                         (though we still may want it to be synchronous; dunno...)
+ *
+ */
+void
+WinAccessBridge::removeJavaEventNotification(jlong type) {
+    PrintDebugString("in WinAccessBridge::removeJavaEventNotification(%016I64X)", type);
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(RemoveJavaEventNotificationPackage)];
+    PackageType *pkgType = (PackageType *) buffer;
+    RemoveJavaEventNotificationPackage *pkg = (RemoveJavaEventNotificationPackage *) (buffer + sizeof(PackageType));
+    *pkgType = cRemoveJavaEventNotificationPackage;
+    pkg->type = type;
+    pkg->DLLwindow = ABHandleToLong(dialogWindow);
+
+    PrintDebugString("  ->pkgType = %X, eventType = %016I64X, DLLwindow = %p",
+                     *pkgType, pkg->type, pkg->DLLwindow);
+
+    // send removeEventNotification message to all JVMs
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *current = javaVMs;
+    while (current != (AccessBridgeJavaVMInstance *) 0) {
+        current->sendPackage(buffer, sizeof(buffer));           // no return values!
+        current = current->nextJVMInstance;
+    }
+    isVMInstanceChainInUse = false;
+}
+
+
+/*********** Event handling methods **********************************/
+
+/**
+ * addAccessibilityEventNotification - tell all Java-launched AccessBridge DLLs
+ *                        that we want events of the specified type
+ *
+ * [[[FIXME]]] since we're just sending a long & a source window,
+ *                         we could use a private message rather than WM_COPYDATA
+ *                         (though we still may want it to be synchronous; dunno...)
+ *
+ */
+void
+WinAccessBridge::addAccessibilityEventNotification(jlong type) {
+    PrintDebugString("in WinAccessBridge::addAccessibilityEventNotification(%016I64X)", type);
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(AddAccessibilityEventNotificationPackage)];
+    PackageType *pkgType = (PackageType *) buffer;
+    AddAccessibilityEventNotificationPackage *pkg = (AddAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));
+    *pkgType = cAddAccessibilityEventNotificationPackage;
+    pkg->type = type;
+    pkg->DLLwindow = ABHandleToLong(dialogWindow);
+
+    PrintDebugString("  ->pkgType = %X, eventType = %016I64X, DLLwindow = %X",
+                     *pkgType, pkg->type, pkg->DLLwindow);
+
+    // send addEventNotification message to all JVMs
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *current = javaVMs;
+    while (current != (AccessBridgeJavaVMInstance *) 0) {
+        current->sendPackage(buffer, sizeof(buffer));           // no return values!
+        current = current->nextJVMInstance;
+    }
+    isVMInstanceChainInUse = false;
+}
+
+/**
+ * removeAccessibilityEventNotification - tell all Java-launched AccessBridge DLLs
+ *                                                       that we no longer want events of the
+ *                                                       specified type
+ *
+ * [[[FIXME]]] since we're just sending a long & a source window,
+ *                         we could use a private message rather than WM_COPYDATA
+ *                         (though we still may want it to be synchronous; dunno...)
+ *
+ */
+void
+WinAccessBridge::removeAccessibilityEventNotification(jlong type) {
+    PrintDebugString("in WinAccessBridge::removeAccessibilityEventNotification(%016I64X)", type);
+    if ((AccessBridgeJavaVMInstance *) 0 == javaVMs) {
+        return;
+    }
+    char buffer[sizeof(PackageType) + sizeof(RemoveAccessibilityEventNotificationPackage)];
+    PackageType *pkgType = (PackageType *) buffer;
+    RemoveAccessibilityEventNotificationPackage *pkg = (RemoveAccessibilityEventNotificationPackage *) (buffer + sizeof(PackageType));
+    *pkgType = cRemoveAccessibilityEventNotificationPackage;
+    pkg->type = type;
+    pkg->DLLwindow = ABHandleToLong(dialogWindow);
+
+    PrintDebugString("  ->pkgType = %X, eventType = %016I64X, DLLwindow = %X",
+                     *pkgType, pkg->type, pkg->DLLwindow);
+
+    // send removeEventNotification message to all JVMs
+    isVMInstanceChainInUse = true;
+    AccessBridgeJavaVMInstance *current = javaVMs;
+    while (current != (AccessBridgeJavaVMInstance *) 0) {
+        current->sendPackage(buffer, sizeof(buffer));           // no return values!
+        current = current->nextJVMInstance;
+    }
+    isVMInstanceChainInUse = false;
+}
+
+
+#define CALL_SET_EVENT_FP(function, callbackFP)         \
+        void WinAccessBridge::function(callbackFP fp) { \
+                eventHandler->function(fp, this);                       \
+                /* eventHandler calls back to winAccessBridgeDLL to set eventMask */    \
+        }
+
+    void WinAccessBridge::setJavaShutdownFP(AccessBridge_JavaShutdownFP fp) {
+        eventHandler->setJavaShutdownFP(fp, this);
+    }
+
+    CALL_SET_EVENT_FP(setPropertyChangeFP, AccessBridge_PropertyChangeFP)
+    CALL_SET_EVENT_FP(setFocusGainedFP, AccessBridge_FocusGainedFP)
+    CALL_SET_EVENT_FP(setFocusLostFP, AccessBridge_FocusLostFP)
+    CALL_SET_EVENT_FP(setCaretUpdateFP, AccessBridge_CaretUpdateFP)
+    CALL_SET_EVENT_FP(setMouseClickedFP, AccessBridge_MouseClickedFP)
+    CALL_SET_EVENT_FP(setMouseEnteredFP, AccessBridge_MouseEnteredFP)
+    CALL_SET_EVENT_FP(setMouseExitedFP, AccessBridge_MouseExitedFP)
+    CALL_SET_EVENT_FP(setMousePressedFP, AccessBridge_MousePressedFP)
+    CALL_SET_EVENT_FP(setMouseReleasedFP, AccessBridge_MouseReleasedFP)
+    CALL_SET_EVENT_FP(setMenuCanceledFP, AccessBridge_MenuCanceledFP)
+    CALL_SET_EVENT_FP(setMenuDeselectedFP, AccessBridge_MenuDeselectedFP)
+    CALL_SET_EVENT_FP(setMenuSelectedFP, AccessBridge_MenuSelectedFP)
+    CALL_SET_EVENT_FP(setPopupMenuCanceledFP, AccessBridge_PopupMenuCanceledFP)
+    CALL_SET_EVENT_FP(setPopupMenuWillBecomeInvisibleFP, AccessBridge_PopupMenuWillBecomeInvisibleFP)
+    CALL_SET_EVENT_FP(setPopupMenuWillBecomeVisibleFP, AccessBridge_PopupMenuWillBecomeVisibleFP)
+
+    CALL_SET_EVENT_FP(setPropertyNameChangeFP, AccessBridge_PropertyNameChangeFP)
+    CALL_SET_EVENT_FP(setPropertyDescriptionChangeFP, AccessBridge_PropertyDescriptionChangeFP)
+    CALL_SET_EVENT_FP(setPropertyStateChangeFP, AccessBridge_PropertyStateChangeFP)
+    CALL_SET_EVENT_FP(setPropertyValueChangeFP, AccessBridge_PropertyValueChangeFP)
+    CALL_SET_EVENT_FP(setPropertySelectionChangeFP, AccessBridge_PropertySelectionChangeFP)
+    CALL_SET_EVENT_FP(setPropertyTextChangeFP, AccessBridge_PropertyTextChangeFP)
+    CALL_SET_EVENT_FP(setPropertyCaretChangeFP, AccessBridge_PropertyCaretChangeFP)
+    CALL_SET_EVENT_FP(setPropertyVisibleDataChangeFP, AccessBridge_PropertyVisibleDataChangeFP)
+    CALL_SET_EVENT_FP(setPropertyChildChangeFP, AccessBridge_PropertyChildChangeFP)
+    CALL_SET_EVENT_FP(setPropertyActiveDescendentChangeFP, AccessBridge_PropertyActiveDescendentChangeFP)
+
+    CALL_SET_EVENT_FP(setPropertyTableModelChangeFP, AccessBridge_PropertyTableModelChangeFP)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.h	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,317 @@
+/*
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * A DLL which is loaded by Windows executables to handle communication
+ * between Java VMs purposes of Accessbility.
+ */
+
+#ifndef __WinAccessBridge_H__
+#define __WinAccessBridge_H__
+
+#include <windows.h>
+#include "AccessBridgePackages.h"
+#include "AccessBridgeEventHandler.h"
+#include "AccessBridgeJavaVMInstance.h"
+#include "AccessBridgeMessageQueue.h"
+
+
+extern "C" {
+    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason,
+                        LPVOID lpvReserved);
+    void AppendToCallOutput(char *s);
+    BOOL CALLBACK AccessBridgeDialogProc(HWND hDlg, UINT message,
+                                         UINT wParam, LONG lParam);
+    HWND getTopLevelHWND(HWND descendent);
+}
+
+LRESULT CALLBACK WinAccessBridgeWindowProc(HWND hWnd, UINT message,
+                                           UINT wParam, LONG lParam);
+
+BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+/**
+ * The WinAccessBridge class.  The core of the Windows AT AccessBridge dll
+ */
+class WinAccessBridge {
+    HINSTANCE windowsInstance;
+    HWND dialogWindow;
+    AccessBridgeJavaVMInstance *javaVMs;
+    AccessBridgeEventHandler *eventHandler;
+    AccessBridgeMessageQueue *messageQueue;
+
+public:
+    WinAccessBridge(HINSTANCE hInstance);
+    ~WinAccessBridge();
+    BOOL initWindow();
+
+    HWND showWinAccessBridgeGUI(int showCommand);
+
+    // IPC with the Java AccessBridge DLL
+    LRESULT rendezvousWithNewJavaDLL(HWND JavaBridgeDLLwindow, long vmID);
+
+    void sendPackage(char *buffer, long bufsize, HWND destWindow);
+    BOOL sendMemoryPackage(char *buffer, long bufsize, HWND destWindow);
+    BOOL queuePackage(char *buffer, long bufsize);
+    BOOL receiveAQueuedPackage();
+    void preProcessPackage(char *buffer, long bufsize);
+    void processPackage(char *buffer, long bufsize);
+    void JavaVMDestroyed(HWND VMBridgeDLLWindow);
+
+    // Java VM object memory management
+    void releaseJavaObject(long vmID, JOBJECT64 object);
+
+    // Version info
+    BOOL getVersionInfo(long vmID, AccessBridgeVersionInfo *info);
+
+    // HWND management methods
+    HWND getNextJavaWindow(HWND previous);
+    BOOL isJavaWindow(HWND window);
+    BOOL getAccessibleContextFromHWND(HWND window, long *vmID, JOBJECT64 *AccessibleContext);
+    HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accessibleContext);
+
+    /* Additional utility methods */
+    BOOL isSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
+
+    BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text);
+
+    AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext,
+                                         const wchar_t *role);
+
+    AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext);
+
+    AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext,
+                                                 const wchar_t *role);
+
+    int getObjectDepth (const long vmID, const AccessibleContext accessibleContext);
+
+    AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext);
+
+
+    // Accessible Context methods
+    BOOL getAccessibleContextAt(long vmID, JOBJECT64 AccessibleContextParent,
+                                jint x, jint y, JOBJECT64 *AccessibleContext);
+    BOOL getAccessibleContextWithFocus(HWND window, long *vmID, JOBJECT64 *AccessibleContext);
+    BOOL getAccessibleContextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleContextInfo *info);
+    JOBJECT64 getAccessibleChildFromContext(long vmID, JOBJECT64 AccessibleContext, jint childIndex);
+    JOBJECT64 getAccessibleParentFromContext(long vmID, JOBJECT64 AccessibleContext);
+
+    /* begin AccessibleTable methods */
+    BOOL getAccessibleTableInfo(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
+    BOOL getAccessibleTableCellInfo(long vmID, JOBJECT64 accessibleTable, jint row, jint column,
+                                    AccessibleTableCellInfo *tableCellInfo);
+
+    BOOL getAccessibleTableRowHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
+    BOOL getAccessibleTableColumnHeader(long vmID, JOBJECT64 acParent, AccessibleTableInfo *tableInfo);
+
+    JOBJECT64 getAccessibleTableRowDescription(long vmID, JOBJECT64 acParent, jint row);
+    JOBJECT64 getAccessibleTableColumnDescription(long vmID, JOBJECT64 acParent, jint column);
+
+    jint getAccessibleTableRowSelectionCount(long vmID, JOBJECT64 accessibleTable);
+    BOOL isAccessibleTableRowSelected(long vmID, JOBJECT64 accessibleTable, jint row);
+    BOOL getAccessibleTableRowSelections(long vmID, JOBJECT64 accessibleTable, jint count,
+                                         jint *selections);
+
+    jint getAccessibleTableColumnSelectionCount(long vmID, JOBJECT64 accessibleTable);
+    BOOL isAccessibleTableColumnSelected(long vmID, JOBJECT64 accessibleTable, jint column);
+    BOOL getAccessibleTableColumnSelections(long vmID, JOBJECT64 accessibleTable, jint count,
+                                            jint *selections);
+
+    jint getAccessibleTableRow(long vmID, JOBJECT64 accessibleTable, jint index);
+    jint getAccessibleTableColumn(long vmID, JOBJECT64 accessibleTable, jint index);
+    jint getAccessibleTableIndex(long vmID, JOBJECT64 accessibleTable, jint row, jint column);
+
+    /* end AccessibleTable methods */
+
+    // --------- AccessibleRelationSet methods
+    BOOL getAccessibleRelationSet(long vmID, JOBJECT64 accessibleContext, AccessibleRelationSetInfo *relationSet);
+
+    // --------- AccessibleHypertext methods
+    BOOL getAccessibleHypertext(long vmID, JOBJECT64 accessibleContext, AccessibleHypertextInfo *hypertextInfo);
+    BOOL activateAccessibleHyperlink(long vmID, JOBJECT64 accessibleContext, JOBJECT64 accessibleHyperlink);
+
+    jint getAccessibleHyperlinkCount(const long vmID,
+                                     const AccessibleContext accessibleContext);
+
+    BOOL getAccessibleHypertextExt(const long vmID,
+                                   const AccessibleContext accessibleContext,
+                                   const jint nStartIndex,
+                                   /* OUT */ AccessibleHypertextInfo *hypertextInfo);
+
+    jint getAccessibleHypertextLinkIndex(const long vmID,
+                                         const AccessibleHypertext hypertext,
+                                         const jint nIndex);
+
+    BOOL getAccessibleHyperlink(const long vmID,
+                                const AccessibleHypertext hypertext,
+                                const jint nIndex,
+                                /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
+
+
+    /* Accessible KeyBindings, Icons and Actions */
+    BOOL getAccessibleKeyBindings(long vmID, JOBJECT64 accessibleContext,
+                                  AccessibleKeyBindings *keyBindings);
+
+    BOOL getAccessibleIcons(long vmID, JOBJECT64 accessibleContext,
+                            AccessibleIcons *icons);
+
+    BOOL getAccessibleActions(long vmID, JOBJECT64 accessibleContext,
+                              AccessibleActions *actions);
+
+    BOOL doAccessibleActions(long vmID, JOBJECT64 accessibleContext,
+                             AccessibleActionsToDo *actionsToDo, jint *failure);
+
+
+    // Accessible Text methods
+    BOOL getAccessibleTextInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextInfo *textInfo, jint x, jint y);
+    BOOL getAccessibleTextItems(long vmID, JOBJECT64 AccessibleContext, AccessibleTextItemsInfo *textItems, jint index);
+    BOOL getAccessibleTextSelectionInfo(long vmID, JOBJECT64 AccessibleContext, AccessibleTextSelectionInfo *selectionInfo);
+    BOOL getAccessibleTextAttributes(long vmID, JOBJECT64 AccessibleContext, jint index, AccessibleTextAttributesInfo *attributes);
+    BOOL getAccessibleTextRect(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
+    BOOL getAccessibleTextLineBounds(long vmID, JOBJECT64 AccessibleContext, jint index, jint *startIndex, jint *endIndex);
+    BOOL getAccessibleTextRange(long vmID, JOBJECT64 AccessibleContext, jint start, jint end, wchar_t *text, short len);
+
+    // Accessible Value methods
+    BOOL getCurrentAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len);
+    BOOL getMaximumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len);
+    BOOL getMinimumAccessibleValueFromContext(long vmID, JOBJECT64 AccessibleContext, wchar_t *value, short len);
+
+    // Accessible Selection methods
+    void addAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
+    void clearAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext);
+    JOBJECT64 getAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
+    int getAccessibleSelectionCountFromContext(long vmID, JOBJECT64 AccessibleContext);
+    BOOL isAccessibleChildSelectedFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
+    void removeAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext, int i);
+    void selectAllAccessibleSelectionFromContext(long vmID, JOBJECT64 AccessibleContext);
+
+    // Event handling methods
+    void addJavaEventNotification(jlong type);
+    void removeJavaEventNotification(jlong type);
+    void addAccessibilityEventNotification(jlong type);
+    void removeAccessibilityEventNotification(jlong type);
+
+    void setPropertyChangeFP(AccessBridge_PropertyChangeFP fp);
+    void setJavaShutdownFP(AccessBridge_JavaShutdownFP fp);
+    void setFocusGainedFP(AccessBridge_FocusGainedFP fp);
+    void setFocusLostFP(AccessBridge_FocusLostFP fp);
+    void setCaretUpdateFP(AccessBridge_CaretUpdateFP fp);
+    void setMouseClickedFP(AccessBridge_MouseClickedFP fp);
+    void setMouseEnteredFP(AccessBridge_MouseEnteredFP fp);
+    void setMouseExitedFP(AccessBridge_MouseExitedFP fp);
+    void setMousePressedFP(AccessBridge_MousePressedFP fp);
+    void setMouseReleasedFP(AccessBridge_MouseReleasedFP fp);
+    void setMenuCanceledFP(AccessBridge_MenuCanceledFP fp);
+    void setMenuDeselectedFP(AccessBridge_MenuDeselectedFP fp);
+    void setMenuSelectedFP(AccessBridge_MenuSelectedFP fp);
+    void setPopupMenuCanceledFP(AccessBridge_PopupMenuCanceledFP fp);
+    void setPopupMenuWillBecomeInvisibleFP(AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
+    void setPopupMenuWillBecomeVisibleFP(AccessBridge_PopupMenuWillBecomeVisibleFP fp);
+
+    void setPropertyNameChangeFP(AccessBridge_PropertyNameChangeFP fp);
+    void setPropertyDescriptionChangeFP(AccessBridge_PropertyDescriptionChangeFP fp);
+    void setPropertyStateChangeFP(AccessBridge_PropertyStateChangeFP fp);
+    void setPropertyValueChangeFP(AccessBridge_PropertyValueChangeFP fp);
+    void setPropertySelectionChangeFP(AccessBridge_PropertySelectionChangeFP fp);
+    void setPropertyTextChangeFP(AccessBridge_PropertyTextChangeFP fp);
+    void setPropertyCaretChangeFP(AccessBridge_PropertyCaretChangeFP fp);
+    void setPropertyVisibleDataChangeFP(AccessBridge_PropertyVisibleDataChangeFP fp);
+    void setPropertyChildChangeFP(AccessBridge_PropertyChildChangeFP fp);
+    void setPropertyActiveDescendentChangeFP(AccessBridge_PropertyActiveDescendentChangeFP fp);
+
+    void setPropertyTableModelChangeFP(AccessBridge_PropertyTableModelChangeFP fp);
+
+    /**
+     * Additional methods for Teton
+     */
+
+    /**
+     * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+     * whether successful.
+     *
+     * Bug ID 4916682 - Implement JAWS AccessibleName policy
+     */
+    BOOL getVirtualAccessibleName(long vmID, AccessibleContext accessibleContext, wchar_t *name, int len);
+
+    /**
+     * Request focus for a component. Returns whether successful;
+     *
+     * Bug ID 4944757 - requestFocus method needed
+     */
+    BOOL requestFocus(long vmID, AccessibleContext accessibleContext);
+
+    /**
+     * Selects text between two indices.  Selection includes the text at the start index
+     * and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944758 - selectTextRange method needed
+     */
+    BOOL selectTextRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex);
+
+    /**
+     * Get text attributes between two indices.  The attribute list includes the text at the
+     * start index and the text at the end index. Returns whether successful;
+     *
+     * Bug ID 4944761 - getTextAttributes between two indices method needed
+     */
+    BOOL getTextAttributesInRange(long vmID, AccessibleContext accessibleContext, int startIndex, int endIndex,
+                                  AccessibleTextAttributesInfo *attributes, short *len);
+
+    /**
+     * Gets number of visible children of a component. Returns -1 on error.
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    int getVisibleChildrenCount(long vmID, AccessibleContext accessibleContext);
+
+    /**
+     * Gets the visible children of an AccessibleContext. Returns whether successful;
+     *
+     * Bug ID 4944762- getVisibleChildren for list-like components needed
+     */
+    BOOL getVisibleChildren(long vmID, AccessibleContext accessibleContext, int startIndex,
+                            VisibleChildrenInfo *visibleChildrenInfo);
+
+    /**
+     * Set the caret to a text position. Returns whether successful;
+     *
+     * Bug ID 4944770 - setCaretPosition method needed
+     */
+    BOOL setCaretPosition(long vmID, AccessibleContext accessibleContext, int position);
+
+
+    /**
+     * Gets the text caret bounding rectangle
+     */
+    BOOL getCaretLocation(long vmID, JOBJECT64 AccessibleContext, AccessibleTextRectInfo *rectInfo, jint index);
+
+    /**
+     * Gets number of events waiting in the message queue
+     */
+    int getEventsWaiting();
+
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/Checkbox/SetStateExcessEvent/SetStateExcessEvent.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Checkbox;
+import java.awt.CheckboxGroup;
+import java.awt.Frame;
+import java.awt.GridBagLayout;
+import java.awt.Robot;
+
+/**
+ * @test
+ * @bug 8074500
+ * @summary Checkbox.setState() call should not post ItemEvent
+ * @author Sergey Bylokhov
+ */
+public final class SetStateExcessEvent {
+
+    private static boolean failed;
+
+    public static void main(final String[] args) throws Exception {
+        final Robot robot = new Robot();
+        final CheckboxGroup group = new CheckboxGroup();
+        final Checkbox[] cbs = {new Checkbox("checkbox1", true, group),
+                                new Checkbox("checkbox2", false, group),
+                                new Checkbox("checkbox3", true, group),
+
+                                new Checkbox("checkbox4", true),
+                                new Checkbox("checkbox5", false),
+                                new Checkbox("checkbox6", true)};
+        final Frame frame = new Frame();
+        frame.setLayout(new GridBagLayout());
+        try {
+            for (final Checkbox cb : cbs) {
+                cb.addItemListener(e -> {
+                    failed = true;
+                });
+            }
+            for (final Checkbox cb : cbs) {
+                frame.add(cb);
+            }
+            frame.pack();
+
+            for (final Checkbox cb : cbs) {
+                cb.setState(!cb.getState());
+            }
+
+            for (final Checkbox cb : cbs) {
+                group.setSelectedCheckbox(cb);
+            }
+            robot.waitForIdle();
+        } finally {
+            frame.dispose();
+        }
+        if (failed) {
+            throw new RuntimeException("Listener should not be called");
+        }
+        System.out.println("Test passed");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/TrayIcon/8072769/bug8072769.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 8072769
+   @summary System tray icon title freezes java
+   @author Semyon Sadetsky
+   @library ../../../../lib/testlibrary
+   @build jdk.testlibrary.OSInfo
+  */
+
+import jdk.testlibrary.OSInfo;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Arrays;
+
+public class bug8072769 {
+
+    public static void main(String[] args) throws Exception {
+        if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {
+            if (SystemTray.isSupported()) {
+                test();
+            } else {
+                System.out.println("SystemTray not supported. " +
+                        "Test is skipped.");
+            }
+        } else {
+            System.out.println("Test will only run on Windows platform. " +
+                    "Test is skipped.");
+        }
+        System.out.println("ok");
+    }
+
+    private static void test() throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                final SystemTray tray = SystemTray.getSystemTray();
+                final TrayIcon trayIcon = new TrayIcon(icon.getImage());
+                try {
+                    tray.add(trayIcon);
+                } catch (AWTException e) {
+                    throw new RuntimeException(
+                            "TrayIcon could not be added.");
+                }
+
+
+                try {
+                    trayIcon.displayMessage(createString(63, 'A'),
+                            createString(255, 'C'), TrayIcon.MessageType.ERROR);
+
+                    trayIcon.setToolTip(createString(127, 'B'));
+
+                    trayIcon.displayMessage(createString(64, 'A'),
+                            createString(256, 'C'), TrayIcon.MessageType.ERROR);
+
+                    trayIcon.setToolTip(createString(128, 'B'));
+
+                    trayIcon.displayMessage(createString(65, 'A'),
+                            createString(257, 'C'), TrayIcon.MessageType.ERROR);
+
+                    trayIcon.setToolTip(createString(129, 'B'));
+                }
+                finally {
+                    tray.remove(trayIcon);
+                }
+            }
+        });
+    }
+
+    private static String createString(int len, char letter) {
+        char[] chars = new char[len];
+        Arrays.fill(chars, letter);
+        chars[len - 2] = '=';
+        chars[len - 1] = '>';
+        return new String(chars);
+    }
+
+    private static ImageIcon icon = new ImageIcon(
+            new byte[]{71, 73, 70, 56, 57, 97, 32, 0, 35, 0, -43, 0, 0, -1, -1,
+                    -1, -19, -101, 9, -18, -95, 24, -14, -76, 71, -4, -19, -46,
+                    -3, -13, -31, -17, -88, 40, -12, -63, 102, -10, -51, -124,
+                    -16, -82, 55, -11, -57, 117, -2, -7, -15, -7, -32, -77, -9,
+                    -45, -108, -5, -26, -62, -13, -70, 86, -8, -39, -94, 83,
+                    -126, -95, -8, -38, -93, -6, -26, -63, -9, -45, -109, -4,
+                    -14, -32, -15, -76, 70, -12, -58, 116, -17, -89, 39, 77,
+                    121, -106, -3, -8, -17, 104, -111, -84, 126, -95, -72, 93,
+                    -119, -90, -14, -70, 85, -13, -64, 101, -16, -83, 55, -109,
+                    -80, -60, -7, -33, -78, -100, -84, -85, 94, -127, -104, -32,
+                    -99, 39, 127, -120, -114, 83, 113, -124, -12, -9, -7, -16,
+                    -16, -16, -115, 108, 45, 57, 89, 110, -50, -41, -35, 104,
+                    -111, -83, 41, 65, 80, 72, 113, -116, 115, -103, -78, 88,
+                    106, 112, -82, -78, -82, -45, -38, -40, -5, -20, -48, -65,
+                    -48, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, -7, 4, 0, 0, 0,
+                    0, 0, 44, 0, 0, 0, 0, 32, 0, 35, 0, 0, 6, -1, 64, -128, 112,
+                    72, 4, 16, 0, 14, -57, 2, 1, 96, 30, -117, -48, 40, -78,
+                    -55, 96, 28, 28, -125, -62, 0, 96, 48, 74, -91, -116, 102,
+                    3, 97, 64, 4, 20, -25, -128, 68, -80, 16, 24, 11, 95, 98,
+                    -29, -64, 72, 11, 2, 120, -68, 96, -64, 39, 116, -29, 0, 12,
+                    13, 5, 1, 3, 121, -121, -120, 9, 2, 7, 5, 15, 82, 11, 11,
+                    92, 15, 6, -120, -107, -121, 7, 2, 18, 0, 112, 80, 3, 8,
+                    104, -106, -95, 122, 88, 97, 68, 5, 11, 4, -95, 32, 8, 16,
+                    19, 16, 8, 22, -106, -114, 79, 66, 5, 2, 15, 9, -120, 22,
+                    19, 81, 21, 31, -120, 7, 6, 10, 67, 71, 4, 119, -121, 20,
+                    -128, 16, -57, 120, 7, -101, -111, -58, 9, -108, 121, -55,
+                    -128, 0, 16, 121, 123, -117, 67, 5, -71, 121, 30, -42, 67,
+                    23, -121, 13, 66, 14, 6, 3, -34, 120, 21, -31, 66, 26, -39,
+                    3, 6, -50, 11, -96, 120, 31, -19, 67, 30, 121, 9, 14, 0, 13,
+                    124, -121, 68, -32, 19, 98, 6, 15, 58, 71, 18, 12, -27, 97,
+                    55, 80, 68, 54, 5, 5, 24, 40, 80, 23, 96, -96, -112, 9, -39,
+                    30, 52, -112, 72, -47, 34, 0, 10, 25, -53, 37, 60, -60, 16,
+                    -33, 56, 61, 16, -1, 41, -60, 83, 13, 31, -122, 60, 7, 1,
+                    -48, 59, -124, 65, 3, 62, -116, 48, -5, 57, 72, -112, -18,
+                    -48, 5, -103, 124, 32, -32, 37, 112, -74, -119, 98, 0, 8,
+                    -31, 64, -110, 35, 38, 64, 26, 34, -92, 113, 42, 48, -45,
+                    70, -76, 24, -77, 60, 80, -91, -60, -70, -12, 76, -120, 49,
+                    92, -120, 4, -40, -116, -126, 51, 79, -80, 97, -36, 80, 89,
+                    -6, 25, -91, 96, -98, 89, -99, 62, 33, -62, 32, -59, -83, 0,
+                    82, 80, 32, 1, -72, 53, 13, -113, -42, 102, -103, 54, -127,
+                    25, 84, 40, 15, -115, 40, 37, 20, 49, 34, 26, 103, 78, 29,
+                    52, 42, 88, 16, 65, 17, -94, -49, 31, 107, 97, 16, -116, 49,
+                    32, 35, -61, 6, 14, 33, 56, 68, -120, -80, -96, 11, 1, 78,
+                    -31, -6, 33, 96, 48, -93, -61, -122, 21, 46, 50, -116, -10,
+                    -30, -47, -117, -125, 24, 29, 94, -100, -112, 61, -94, 54,
+                    -108, 20, 38, 90, -112, -128, 81, -61, 90, 16, 0, 59},
+            "try icon");
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/datatransfer/ClipboardInterVMTest/ClipboardInterVMTest.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+  @test
+  @bug 8071668
+  @summary Check whether clipboard see changes from external process after taking ownership
+  @author Anton Nashatyrev: area=datatransfer
+  @library /lib/testlibrary
+  @build jdk.testlibrary.Utils
+  @run main ClipboardInterVMTest
+*/
+
+import jdk.testlibrary.Utils;
+
+import java.awt.*;
+import java.awt.datatransfer.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class ClipboardInterVMTest {
+
+    static CountDownLatch lostOwnershipMonitor = new CountDownLatch(1);
+    static CountDownLatch flavorChangedMonitor = new CountDownLatch(1);
+    static Process process;
+
+    public static void main(String[] args) throws Throwable {
+        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
+
+        if (args.length > 0) {
+            System.out.println("Changing clip...");
+            clip.setContents(new StringSelection("pong"), null);
+            System.out.println("done");
+            // keeping this process running for a while since on Mac the clipboard
+            // will be invalidated via NSApplicationDidBecomeActiveNotification
+            // callback in the main process after this child process finishes
+            Thread.sleep(60 * 1000);
+            return;
+        };
+
+
+        clip.setContents(new CustomSelection(), new ClipboardOwner() {
+            @Override
+            public void lostOwnership(Clipboard clipboard, Transferable contents) {
+                System.out.println("ClipboardInterVMTest.lostOwnership");
+                lostOwnershipMonitor.countDown();
+            }
+        });
+
+        clip.addFlavorListener(new FlavorListener() {
+            @Override
+            public void flavorsChanged(FlavorEvent e) {
+                System.out.println("ClipboardInterVMTest.flavorsChanged");
+                flavorChangedMonitor.countDown();
+            }
+        });
+
+        System.out.println("Starting external clipborad modifier...");
+        new Thread(() -> runTest(ClipboardInterVMTest.class.getCanonicalName(), "pong")).start();
+
+        String content = "";
+        long startTime = System.currentTimeMillis();
+        while (System.currentTimeMillis() - startTime < 30 * 1000) {
+            Transferable c = clip.getContents(null);
+            if (c.isDataFlavorSupported(DataFlavor.plainTextFlavor)) {
+                Reader reader = DataFlavor.plainTextFlavor.getReaderForText(c);
+                content = new BufferedReader(reader).readLine();
+                System.out.println(content);
+                if (content.equals("pong")) {
+                    break;
+                }
+            }
+            Thread.sleep(200);
+        }
+
+        if (!lostOwnershipMonitor.await(10, TimeUnit.SECONDS)) {
+            throw new RuntimeException("No LostOwnership event received.");
+        };
+
+        if (!flavorChangedMonitor.await(10, TimeUnit.SECONDS)) {
+            throw new RuntimeException("No LostOwnership event received.");
+        };
+
+        if (!content.equals("pong")) {
+            throw new RuntimeException("Content was not passed.");
+        }
+
+        process.destroy();
+
+        System.out.println("Passed.");
+    }
+
+    private static void runTest(String main, String... args)  {
+
+        try {
+            List<String> opts = new ArrayList<>();
+            opts.add(getJavaExe());
+            opts.addAll(Arrays.asList(Utils.getTestJavaOpts()));
+            opts.add("-cp");
+            opts.add(System.getProperty("test.class.path", System.getProperty("java.class.path")));
+
+            opts.add(main);
+            opts.addAll(Arrays.asList(args));
+
+            ProcessBuilder pb = new ProcessBuilder(opts.toArray(new String[0]));
+            process = pb.start();
+        } catch (Throwable throwable) {
+            throw new RuntimeException(throwable);
+        }
+    }
+
+    private static String getJavaExe() throws IOException {
+        File p  = new File(System.getProperty("java.home"), "bin");
+        File j = new File(p, "java");
+        if (!j.canRead()) {
+            j = new File(p, "java.exe");
+        }
+        if (!j.canRead()) {
+            throw new RuntimeException("Can't find java executable in " + p);
+        }
+        return j.getCanonicalPath();
+    }
+
+    static class CustomSelection implements Transferable {
+        private static final DataFlavor[] flavors = { DataFlavor.allHtmlFlavor };
+
+        public DataFlavor[] getTransferDataFlavors() {
+            return flavors;
+        }
+
+        public boolean isDataFlavorSupported(DataFlavor flavor) {
+            return flavors[0].equals(flavor);
+        }
+
+        public Object getTransferData(DataFlavor flavor)
+                throws UnsupportedFlavorException, java.io.IOException {
+            if (isDataFlavorSupported(flavor)) {
+                return "ping";
+            } else {
+                throw new UnsupportedFlavorException(flavor);
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/geom/Path2D/Path2DCopyConstructor.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,537 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.IllegalPathStateException;
+import java.awt.geom.Path2D;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8076419
+ * @summary Check Path2D copy constructor (trims arrays)
+ *          and constructor with zero capacity
+ * @run main Path2DTrimCopy
+ */
+public class Path2DCopyConstructor {
+
+    private final static float EPSILON = 5e-6f;
+    private final static float FLATNESS = 1e-2f;
+
+    private final static AffineTransform at
+        = AffineTransform.getScaleInstance(1.3, 2.4);
+
+    private final static Rectangle2D.Double rect2d
+        = new Rectangle2D.Double(3.2, 4.1, 5.0, 10.0);
+
+    private final static Point2D.Double pt2d
+        = new Point2D.Double(2.0, 2.5);
+
+    public static boolean verbose;
+
+    static void log(String msg) {
+        if (verbose) {
+            System.out.println(msg);
+        }
+    }
+
+    public static void main(String argv[]) {
+        verbose = (argv.length != 0);
+
+        testEmptyDoublePaths();
+        testDoublePaths();
+
+        testEmptyFloatPaths();
+        testFloatPaths();
+
+        testEmptyGeneralPath();
+        testGeneralPath();
+    }
+
+    static void testEmptyDoublePaths() {
+        log("\n - Test(Path2D.Double[0]) ---");
+        test(() -> new Path2D.Double(Path2D.WIND_NON_ZERO, 0));
+    }
+
+    static void testDoublePaths() {
+        log("\n - Test(Path2D.Double) ---");
+        test(() -> new Path2D.Double());
+    }
+
+    static void testEmptyFloatPaths() {
+        log("\n - Test(Path2D.Float[0]) ---");
+        test(() -> new Path2D.Float(Path2D.WIND_NON_ZERO, 0));
+    }
+
+    static void testFloatPaths() {
+        log("\n - Test(Path2D.Float) ---");
+        test(() -> new Path2D.Float());
+    }
+
+    static void testEmptyGeneralPath() {
+        log("\n - Test(GeneralPath[0]) ---");
+        test(() -> new GeneralPath(Path2D.WIND_NON_ZERO, 0));
+    }
+
+    static void testGeneralPath() {
+        log("\n - Test(GeneralPath) ---");
+        test(() -> new GeneralPath());
+    }
+
+    interface PathFactory {
+        Path2D makePath();
+    }
+
+    static void test(PathFactory pf) {
+        log("\n --- test: path(empty) ---");
+        test(pf.makePath(), true);
+        log("\n\n --- test: path(addMove) ---");
+        test(addMove(pf.makePath()), false);
+        log("\n\n --- test: path(addMoveAndLines) ---");
+        test(addMoveAndLines(pf.makePath()), false);
+        log("\n\n --- test: path(addMoveAndQuads) ---");
+        test(addMoveAndQuads(pf.makePath()), false);
+        log("\n\n --- test: path(addMoveAndCubics) ---");
+        test(addMoveAndCubics(pf.makePath()), false);
+        log("\n\n --- test: path(addMoveAndClose) ---");
+        test(addMoveAndClose(pf.makePath()), false);
+    }
+
+    static Path2D addMove(Path2D p2d) {
+        p2d.moveTo(1.0, 0.5);
+        return p2d;
+    }
+
+    static Path2D addMoveAndLines(Path2D p2d) {
+        addMove(p2d);
+        addLines(p2d);
+        return p2d;
+    }
+
+    static Path2D addLines(Path2D p2d) {
+        for (int i = 0; i < 10; i++) {
+            p2d.lineTo(1.1 * i, 2.3 * i);
+        }
+        return p2d;
+    }
+
+    static Path2D addMoveAndCubics(Path2D p2d) {
+        addMove(p2d);
+        addCubics(p2d);
+        return p2d;
+    }
+
+    static Path2D addCubics(Path2D p2d) {
+        for (int i = 0; i < 10; i++) {
+            p2d.curveTo(1.1 * i, 1.2 * i, 1.3 * i, 1.4 * i, 1.5 * i, 1.6 * i);
+        }
+        return p2d;
+    }
+
+    static Path2D addMoveAndQuads(Path2D p2d) {
+        addMove(p2d);
+        addQuads(p2d);
+        return p2d;
+    }
+
+    static Path2D addQuads(Path2D p2d) {
+        for (int i = 0; i < 10; i++) {
+            p2d.quadTo(1.1 * i, 1.2 * i, 1.3 * i, 1.4 * i);
+        }
+        return p2d;
+    }
+
+    static Path2D addMoveAndClose(Path2D p2d) {
+        addMove(p2d);
+        addClose(p2d);
+        return p2d;
+    }
+
+    static Path2D addClose(Path2D p2d) {
+        p2d.closePath();
+        return p2d;
+    }
+
+    static void test(Path2D p2d, boolean isEmpty) {
+        testEqual(new Path2D.Float(p2d), p2d);
+        testEqual(new Path2D.Double(p2d), p2d);
+        testEqual(new GeneralPath(p2d), p2d);
+
+        testIterator(new Path2D.Float(p2d), p2d);
+        testIterator(new Path2D.Double(p2d), p2d);
+        testIterator((Path2D) p2d.clone(), p2d);
+
+        testFlattening(new Path2D.Float(p2d), p2d);
+        testFlattening(new Path2D.Double(p2d), p2d);
+        testFlattening((Path2D) p2d.clone(), p2d);
+
+        testAddMove(new Path2D.Float(p2d));
+        testAddMove(new Path2D.Double(p2d));
+        testAddMove((Path2D) p2d.clone());
+
+        // These should expect exception if empty
+        testAddLine(new Path2D.Float(p2d), isEmpty);
+        testAddLine(new Path2D.Double(p2d), isEmpty);
+        testAddLine((Path2D) p2d.clone(), isEmpty);
+
+        testAddQuad(new Path2D.Float(p2d), isEmpty);
+        testAddQuad(new Path2D.Double(p2d), isEmpty);
+        testAddQuad((Path2D) p2d.clone(), isEmpty);
+
+        testAddCubic(new Path2D.Float(p2d), isEmpty);
+        testAddCubic(new Path2D.Double(p2d), isEmpty);
+        testAddCubic((Path2D) p2d.clone(), isEmpty);
+
+        testAddClose(new Path2D.Float(p2d), isEmpty);
+        testAddClose(new Path2D.Double(p2d), isEmpty);
+        testAddClose((Path2D) p2d.clone(), isEmpty);
+
+        testGetBounds(new Path2D.Float(p2d), p2d);
+        testGetBounds(new Path2D.Double(p2d), p2d);
+        testGetBounds((Path2D) p2d.clone(), p2d);
+
+        testTransform(new Path2D.Float(p2d));
+        testTransform(new Path2D.Double(p2d));
+        testTransform((Path2D) p2d.clone());
+
+        testIntersect(new Path2D.Float(p2d), p2d);
+        testIntersect(new Path2D.Double(p2d), p2d);
+        testIntersect((Path2D) p2d.clone(), p2d);
+
+        testContains(new Path2D.Float(p2d), p2d);
+        testContains(new Path2D.Double(p2d), p2d);
+        testContains((Path2D) p2d.clone(), p2d);
+
+        testGetCurrentPoint(new Path2D.Float(p2d), p2d);
+        testGetCurrentPoint(new Path2D.Double(p2d), p2d);
+        testGetCurrentPoint((Path2D) p2d.clone(), p2d);
+    }
+
+    static void testEqual(Path2D pathA, Path2D pathB) {
+        final PathIterator itA = pathA.getPathIterator(null);
+        final PathIterator itB = pathB.getPathIterator(null);
+
+        float[] coordsA = new float[6];
+        float[] coordsB = new float[6];
+
+        int n = 0;
+        for (; !itA.isDone() && !itB.isDone(); itA.next(), itB.next(), n++) {
+            int typeA = itA.currentSegment(coordsA);
+            int typeB = itB.currentSegment(coordsB);
+
+            if (typeA != typeB) {
+                throw new IllegalStateException("Path-segment[" + n + "] "
+                    + " type are not equals [" + typeA + "|" + typeB + "] !");
+            }
+            if (!equalsArray(coordsA, coordsB, getLength(typeA))) {
+                throw new IllegalStateException("Path-segment[" + n + "] coords"
+                    + " are not equals [" + Arrays.toString(coordsA) + "|"
+                    + Arrays.toString(coordsB) + "] !");
+            }
+        }
+        if (!itA.isDone() || !itB.isDone()) {
+            throw new IllegalStateException("Paths do not have same lengths !");
+        }
+        log("testEqual: " + n + " segments.");
+    }
+
+    static void testIterator(Path2D pathA, Path2D pathB) {
+        final PathIterator itA = pathA.getPathIterator(at);
+        final PathIterator itB = pathB.getPathIterator(at);
+
+        float[] coordsA = new float[6];
+        float[] coordsB = new float[6];
+
+        int n = 0;
+        for (; !itA.isDone() && !itB.isDone(); itA.next(), itB.next(), n++) {
+            int typeA = itA.currentSegment(coordsA);
+            int typeB = itB.currentSegment(coordsB);
+
+            if (typeA != typeB) {
+                throw new IllegalStateException("Path-segment[" + n + "] "
+                    + "type are not equals [" + typeA + "|" + typeB + "] !");
+            }
+            // Take care of floating-point precision:
+            if (!equalsArrayEps(coordsA, coordsB, getLength(typeA))) {
+                throw new IllegalStateException("Path-segment[" + n + "] coords"
+                    + " are not equals [" + Arrays.toString(coordsA) + "|"
+                    + Arrays.toString(coordsB) + "] !");
+            }
+        }
+        if (!itA.isDone() || !itB.isDone()) {
+            throw new IllegalStateException("Paths do not have same lengths !");
+        }
+        log("testIterator: " + n + " segments.");
+    }
+
+    static void testFlattening(Path2D pathA, Path2D pathB) {
+        final PathIterator itA = pathA.getPathIterator(at, FLATNESS);
+        final PathIterator itB = pathB.getPathIterator(at, FLATNESS);
+
+        float[] coordsA = new float[6];
+        float[] coordsB = new float[6];
+
+        int n = 0;
+        for (; !itA.isDone() && !itB.isDone(); itA.next(), itB.next(), n++) {
+            int typeA = itA.currentSegment(coordsA);
+            int typeB = itB.currentSegment(coordsB);
+
+            if (typeA != typeB) {
+                throw new IllegalStateException("Path-segment[" + n + "] "
+                    + "type are not equals [" + typeA + "|" + typeB + "] !");
+            }
+            // Take care of floating-point precision:
+            if (!equalsArrayEps(coordsA, coordsB, getLength(typeA))) {
+                throw new IllegalStateException("Path-segment[" + n + "] coords"
+                    + " are not equals [" + Arrays.toString(coordsA) + "|"
+                    + Arrays.toString(coordsB) + "] !");
+            }
+        }
+        if (!itA.isDone() || !itB.isDone()) {
+            throw new IllegalStateException("Paths do not have same lengths !");
+        }
+        log("testFlattening: " + n + " segments.");
+    }
+
+    static void testAddMove(Path2D pathA) {
+        addMove(pathA);
+        log("testAddMove: passed.");
+    }
+
+    static void testAddLine(Path2D pathA, boolean isEmpty) {
+        try {
+            addLines(pathA);
+        }
+        catch (IllegalPathStateException ipse) {
+            if (isEmpty) {
+                log("testAddLine: passed "
+                    + "(expected IllegalPathStateException catched).");
+                return;
+            } else {
+                throw ipse;
+            }
+        }
+        if (isEmpty) {
+            throw new IllegalStateException("IllegalPathStateException not thrown !");
+        }
+        log("testAddLine: passed.");
+    }
+
+    static void testAddQuad(Path2D pathA, boolean isEmpty) {
+        try {
+            addQuads(pathA);
+        }
+        catch (IllegalPathStateException ipse) {
+            if (isEmpty) {
+                log("testAddQuad: passed "
+                    + "(expected IllegalPathStateException catched).");
+                return;
+            } else {
+                throw ipse;
+            }
+        }
+        if (isEmpty) {
+            throw new IllegalStateException("IllegalPathStateException not thrown !");
+        }
+        log("testAddQuad: passed.");
+    }
+
+    static void testAddCubic(Path2D pathA, boolean isEmpty) {
+        try {
+            addCubics(pathA);
+        }
+        catch (IllegalPathStateException ipse) {
+            if (isEmpty) {
+                log("testAddCubic: passed "
+                    + "(expected IllegalPathStateException catched).");
+                return;
+            } else {
+                throw ipse;
+            }
+        }
+        if (isEmpty) {
+            throw new IllegalStateException("IllegalPathStateException not thrown !");
+        }
+        log("testAddCubic: passed.");
+    }
+
+    static void testAddClose(Path2D pathA, boolean isEmpty) {
+        try {
+            addClose(pathA);
+        }
+        catch (IllegalPathStateException ipse) {
+            if (isEmpty) {
+                log("testAddClose: passed "
+                    + "(expected IllegalPathStateException catched).");
+                return;
+            } else {
+                throw ipse;
+            }
+        }
+        if (isEmpty) {
+            throw new IllegalStateException("IllegalPathStateException not thrown !");
+        }
+        log("testAddClose: passed.");
+    }
+
+    static void testGetBounds(Path2D pathA, Path2D pathB) {
+        final Rectangle rA = pathA.getBounds();
+        final Rectangle rB = pathB.getBounds();
+
+        if (!rA.equals(rB)) {
+            throw new IllegalStateException("Bounds are not equals [" + rA
+                + "|" + rB + "] !");
+        }
+        final Rectangle2D r2dA = pathA.getBounds2D();
+        final Rectangle2D r2dB = pathB.getBounds2D();
+
+        if (!equalsRectangle2D(r2dA, r2dB)) {
+            throw new IllegalStateException("Bounds2D are not equals ["
+                + r2dA + "|" + r2dB + "] !");
+        }
+        log("testGetBounds: passed.");
+    }
+
+    static void testTransform(Path2D pathA) {
+        pathA.transform(at);
+        log("testTransform: passed.");
+    }
+
+    static void testIntersect(Path2D pathA, Path2D pathB) {
+        boolean resA = pathA.intersects(rect2d);
+        boolean resB = pathB.intersects(rect2d);
+        if (resA != resB) {
+            throw new IllegalStateException("Intersects(rect2d) are not equals ["
+                + resA + "|" + resB + "] !");
+        }
+        resA = pathA.intersects(1.0, 2.0, 13.0, 17.0);
+        resB = pathB.intersects(1.0, 2.0, 13.0, 17.0);
+        if (resA != resB) {
+            throw new IllegalStateException("Intersects(doubles) are not equals ["
+                + resA + "|" + resB + "] !");
+        }
+        log("testIntersect: passed.");
+    }
+
+    static void testContains(Path2D pathA, Path2D pathB) {
+        boolean resA = pathA.contains(pt2d);
+        boolean resB = pathB.contains(pt2d);
+        if (resA != resB) {
+            throw new IllegalStateException("Contains(pt) are not equals ["
+                + resA + "|" + resB + "] !");
+        }
+        resA = pathA.contains(pt2d.getX(), pt2d.getY());
+        resB = pathB.contains(pt2d.getX(), pt2d.getY());
+        if (resA != resB) {
+            throw new IllegalStateException("Contains(x,y) are not equals ["
+                + resA + "|" + resB + "] !");
+        }
+        resA = pathA.contains(rect2d);
+        resB = pathB.contains(rect2d);
+        if (resA != resB) {
+            throw new IllegalStateException("Contains(rect2d) are not equals ["
+                + resA + "|" + resB + "] !");
+        }
+        resA = pathA.contains(1.0, 2.0, 13.0, 17.0);
+        resB = pathB.contains(1.0, 2.0, 13.0, 17.0);
+        if (resA != resB) {
+            throw new IllegalStateException("Contains(doubles) are not equals ["
+                + resA + "|" + resB + "] !");
+        }
+        log("testContains: passed.");
+    }
+
+    static void testGetCurrentPoint(Path2D pathA, Path2D pathB) {
+        final Point2D ptA = pathA.getCurrentPoint();
+        final Point2D ptB = pathA.getCurrentPoint();
+        if (((ptA == null) && (ptB != null))
+            || ((ptA != null) && !ptA.equals(ptB)))
+        {
+            throw new IllegalStateException("getCurrentPoint() are not equals ["
+                + ptA + "|" + ptB + "] !");
+        }
+        log("testGetCurrentPoint: passed.");
+    }
+
+    static int getLength(int type) {
+        switch(type) {
+            case PathIterator.SEG_CUBICTO:
+                return 6;
+            case PathIterator.SEG_QUADTO:
+                return 4;
+            case PathIterator.SEG_LINETO:
+            case PathIterator.SEG_MOVETO:
+                return 2;
+            case PathIterator.SEG_CLOSE:
+                return 0;
+            default:
+                throw new IllegalStateException("Invalid type: " + type);
+        }
+    }
+
+
+    // Custom equals methods ---
+
+    public static boolean equalsArray(float[] a, float[] a2, final int len) {
+        for (int i = 0; i < len; i++) {
+            if (Float.floatToIntBits(a[i]) != Float.floatToIntBits(a2[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    static boolean equalsArrayEps(float[] a, float[] a2, final int len) {
+        for (int i = 0; i < len; i++) {
+            if (!equalsEps(a[i], a2[i])) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    static boolean equalsRectangle2D(Rectangle2D a, Rectangle2D b) {
+        if (a == b) {
+            return true;
+        }
+        return equalsEps(a.getX(), b.getX())
+            && equalsEps(a.getY(), b.getY())
+            && equalsEps(a.getWidth(), b.getWidth())
+            && equalsEps(a.getHeight(), b.getHeight());
+    }
+
+    static boolean equalsEps(float a, float b) {
+        return (Math.abs(a - b) <= EPSILON);
+    }
+
+    static boolean equalsEps(double a, double b) {
+        return (Math.abs(a - b) <= EPSILON);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/GroupLayout/8013566/bug8013566.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 8013566
+   @summary Failure of GroupLayout in combination of addPreferredGap and addGroup's
+   last row
+   @author Semyon Sadetsky
+*/
+
+import javax.swing.*;
+
+public class bug8013566 {
+
+    public static void main(String[] args) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                final JFrame frame = new JFrame();
+                try {
+                    frame.setUndecorated(true);
+                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                    test(frame);
+
+
+                } finally {
+                    frame.dispose();
+                }
+            }
+        });
+
+        System.out.println("ok");
+    }
+
+    static void test(JFrame frame) {
+        JComponent c1 = new JButton("Label1");
+        JComponent c2 = new JButton("Label22");
+        JComponent c3 = new JButton("Label333");
+
+        JPanel panel = new JPanel();
+        GroupLayout layout = new GroupLayout(panel);
+        layout.setAutoCreateContainerGaps(true);
+        layout.setAutoCreateGaps(true);
+        panel.setLayout(layout);
+
+        layout.setHorizontalGroup(layout.createSequentialGroup().addGroup(
+                layout.createParallelGroup().addGroup(
+                        layout.createSequentialGroup().addComponent(c1)
+                                .addPreferredGap(
+                                        LayoutStyle.ComponentPlacement.RELATED,
+                                        50, 200))
+                        .addComponent(c2)).addComponent(c3));
+
+        layout.setVerticalGroup(layout.createSequentialGroup()
+                        .addComponent(c1).addComponent(c2).addComponent(c3)
+        );
+
+        frame.setContentPane(panel);
+        frame.pack();
+        frame.setVisible(true);
+
+        if (c3.getX() != c1.getX() + c1.getWidth() + 50) {
+            throw new RuntimeException(
+                    "Gap between 1st and 3rd component is wrong");
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JInternalFrame/8075314/bug8075314.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 8075314
+   @summary All the InternalFrames will be maximized after maximizing only one
+   of the InternalFrame with the special options "-client -Xmixed
+   -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel".
+   @author Semyon Sadetsky
+  */
+
+
+import javax.swing.*;
+import java.beans.PropertyVetoException;
+
+public class bug8075314 {
+
+
+    private static JFrame frame;
+    private static JInternalFrame frame1;
+    private static JInternalFrame frame2;
+
+    public static void main(String[] args) throws Exception {
+        for (UIManager.LookAndFeelInfo lookAndFeelInfo : UIManager
+                .getInstalledLookAndFeels()) {
+            UIManager.setLookAndFeel(lookAndFeelInfo.getClassName());
+            try {
+                SwingUtilities.invokeAndWait(new Runnable() {
+                    public void run() {
+                        frame = new JFrame();
+                        frame.setUndecorated(true);
+                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                        setup(frame);
+                    }
+                });
+
+                SwingUtilities.invokeAndWait(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            frame1.setMaximum(true);
+                            frame1.setClosed(true);
+                            if (frame2.isMaximum()) {
+                                throw new RuntimeException(
+                                        "Frame2 is maximized!");
+                            }
+                        } catch (PropertyVetoException e) {
+                            throw new RuntimeException(e);
+                        }
+
+                    }
+                });
+            } finally {
+                frame.dispose();
+            }
+        }
+        System.out.println("ok");
+    }
+
+    private static void setup(JFrame frame) {
+        JDesktopPane desktop = new JDesktopPane();
+        frame.setContentPane(desktop);
+
+        frame1 = new JInternalFrame("1", true, true, true, true);
+        frame1.setBounds(40, 40, 300, 200);
+        frame1.setVisible(true);
+        desktop.add(frame1);
+        frame2 = new JInternalFrame("2", true, true, true, true);
+        frame2.setBounds(20, 20, 300, 200);
+        frame2.setVisible(true);
+        desktop.add(frame2);
+
+        frame.setSize(500, 400);
+        frame.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JScrollPane/8033000/bug8033000.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.awt.BorderLayout;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import jdk.testlibrary.OSInfo;
+
+/**
+ * @test
+ * @bug 8033000
+ * @author Alexander Scherbatiy
+ * @summary No Horizontal Mouse Wheel Support In BasicScrollPaneUI
+ * @library ../../../../lib/testlibrary
+ * @build jdk.testlibrary.OSInfo
+ * @run main bug8033000
+ */
+public class bug8033000 {
+
+    private static JScrollPane scrollPane;
+    private static JTextArea textArea;
+    private static Point point;
+    private static final int delta;
+
+    static {
+        delta = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ? -30 : 30;
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        SwingUtilities.invokeAndWait(bug8033000::createAndShowGUI);
+        robot.waitForIdle();
+
+        SwingUtilities.invokeAndWait(() -> {
+            Point locationOnScreen = scrollPane.getLocationOnScreen();
+            point = new Point(
+                    locationOnScreen.x + scrollPane.getWidth() / 2,
+                    locationOnScreen.y + scrollPane.getHeight() / 2);
+        });
+
+        robot.mouseMove(point.x, point.y);
+        robot.waitForIdle();
+
+        // vertical scroll bar is enabled
+        initScrollPane(true, false);
+        robot.waitForIdle();
+        robot.mouseWheel(delta);
+        robot.waitForIdle();
+        checkScrollPane(true);
+
+        // vertical scroll bar is enabled + shift
+        initScrollPane(true, false);
+        robot.waitForIdle();
+        robot.keyPress(KeyEvent.VK_SHIFT);
+        robot.mouseWheel(delta);
+        robot.keyRelease(KeyEvent.VK_SHIFT);
+        robot.waitForIdle();
+        checkScrollPane(true);
+
+        // horizontal scroll bar is enabled
+        initScrollPane(false, true);
+        robot.waitForIdle();
+        robot.mouseWheel(delta);
+        robot.waitForIdle();
+        checkScrollPane(false);
+
+        // horizontal scroll bar is enabled + shift
+        initScrollPane(false, true);
+        robot.waitForIdle();
+        robot.keyPress(KeyEvent.VK_SHIFT);
+        robot.mouseWheel(delta);
+        robot.keyRelease(KeyEvent.VK_SHIFT);
+        robot.waitForIdle();
+        checkScrollPane(false);
+
+        // both scroll bars are enabled
+        initScrollPane(true, true);
+        robot.waitForIdle();
+        robot.mouseWheel(delta);
+        robot.waitForIdle();
+        checkScrollPane(true);
+
+        // both scroll bars are enabled + shift
+        initScrollPane(true, true);
+        robot.waitForIdle();
+        robot.keyPress(KeyEvent.VK_SHIFT);
+        robot.mouseWheel(delta);
+        robot.keyRelease(KeyEvent.VK_SHIFT);
+        robot.waitForIdle();
+        checkScrollPane(false);
+    }
+
+    static void initScrollPane(boolean vVisible, boolean hVisible) throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+            scrollPane.getVerticalScrollBar().setValue(0);
+            scrollPane.getHorizontalScrollBar().setValue(0);
+
+            textArea.setRows(vVisible ? 100 : 1);
+            textArea.setColumns(hVisible ? 100 : 1);
+            scrollPane.getVerticalScrollBar().setVisible(vVisible);
+            scrollPane.getHorizontalScrollBar().setVisible(hVisible);
+        });
+    }
+
+    static void checkScrollPane(boolean verticalScrolled) throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+
+            if (verticalScrolled) {
+                if (scrollPane.getVerticalScrollBar().getValue() == 0
+                        || scrollPane.getHorizontalScrollBar().getValue() != 0) {
+                    throw new RuntimeException("Wrong vertical scrolling!");
+                }
+            } else {
+                if (scrollPane.getVerticalScrollBar().getValue() != 0
+                        || scrollPane.getHorizontalScrollBar().getValue() == 0) {
+                    throw new RuntimeException("Wrong horizontal scrolling!");
+                }
+            }
+        });
+    }
+
+    static void createAndShowGUI() {
+        JFrame frame = new JFrame();
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setSize(300, 300);
+        textArea = new JTextArea("Hello World!");
+        scrollPane = new JScrollPane(textArea);
+        JPanel panel = new JPanel(new BorderLayout());
+        panel.add(scrollPane, BorderLayout.CENTER);
+        frame.getContentPane().add(panel);
+        frame.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JTable/6894632/bug6894632.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 6894632
+   @summary Removing rows from a DefaultTableModel with a RowSorter deselectes
+   last row
+   @author Semyon Sadetsky
+*/
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+import javax.swing.table.TableRowSorter;
+import java.util.ArrayList;
+import java.util.List;
+
+public class bug6894632 {
+    private static JTable table;
+
+    public static void main(String[] args) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+
+                //init table with empty sort order
+                test(new ArrayList<RowSorter.SortKey>());
+
+                //init table as unsorted
+                List<RowSorter.SortKey> sortKeys = new ArrayList<>();
+                sortKeys.add(0, new RowSorter.SortKey(0, SortOrder.UNSORTED));
+                test(sortKeys);
+            }
+        });
+
+        System.out.println("ok");
+    }
+
+    static void test(final List<RowSorter.SortKey> sortKeys) {
+        final JFrame frame = new JFrame();
+        try {
+            frame.setUndecorated(true);
+            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+            table = new JTable();
+            DefaultTableModel tableModel =
+                    new DefaultTableModel(10, 1) {
+                        public Object getValueAt(int row, int column) {
+                            return row == getRowCount() - 1 ? row + "==last" :
+                                    row;
+                        }
+                    };
+            table.setModel(tableModel);
+            TableRowSorter<TableModel> sorter =
+                    new TableRowSorter<TableModel>(tableModel);
+            sorter.setSortKeys(sortKeys);
+            table.setRowSorter(sorter);
+
+            frame.setContentPane(table);
+            frame.pack();
+            frame.setLocationRelativeTo(null);
+            frame.setVisible(true);
+
+            int lastRow = table.getRowCount() - 1;
+
+            //select last row
+            table.setRowSelectionInterval(lastRow, lastRow);
+
+            //remove row above the last
+            tableModel.removeRow(lastRow - 1);
+            lastRow = table.getRowCount() - 1;
+            if (lastRow != table.getSelectedRow()) {
+                throw new RuntimeException("last row must be still selected");
+            }
+
+            //sort table
+            sortKeys.clear();
+            sortKeys.add(0, new RowSorter.SortKey(0, SortOrder.ASCENDING));
+            sorter.setSortKeys(sortKeys);
+            //remove row above the last
+            lastRow = table.getRowCount() - 1;
+            tableModel.removeRow(lastRow - 1);
+
+            if (!table.getValueAt(table.getSelectedRow(), 0).toString()
+                    .endsWith("==last")) {
+                throw new RuntimeException(
+                        "row ends with \"==last\" row must be still selected");
+            }
+
+            //make table unsorted again
+            sortKeys.clear();
+            sortKeys.add(0, new RowSorter.SortKey(0, SortOrder.UNSORTED));
+            sorter.setSortKeys(sortKeys);
+            //remove row above the last
+            lastRow = table.getRowCount() - 1;
+            tableModel.removeRow(lastRow - 1);
+
+            lastRow = table.getRowCount() - 1;
+            if (lastRow != table.getSelectedRow()) {
+                throw new RuntimeException(
+                        "last row must be still selected");
+            }
+        } finally {
+            frame.dispose();
+        }
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/plaf/nimbus/8041642/bug8041642.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 8041642
+   @summary Incorrect paint of JProgressBar in Nimbus LF
+   @author Semyon Sadetsky
+*/
+
+import javax.swing.*;
+import java.awt.*;
+
+public class bug8041642 {
+
+    private static JFrame frame;
+    private static Point point;
+    private static JProgressBar bar;
+
+    public static void main(String[] args) throws Exception {
+        for (UIManager.LookAndFeelInfo info : UIManager
+                .getInstalledLookAndFeels()) {
+            if ("Nimbus".equals(info.getName())) {
+                try {
+                    UIManager.setLookAndFeel(info.getClassName());
+                } catch (Exception ex) {
+                }
+                break;
+            }
+        }
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    frame = new JFrame();
+                    frame.setUndecorated(true);
+                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                    setup(frame);
+                }
+            });
+            SwingUtilities.invokeAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    point = bar.getLocationOnScreen();
+                }
+            });
+            final Robot robot = new Robot();
+            Color color = robot.getPixelColor(point.x + 1, point.y + 7);
+            System.out.println(color);
+            if (color.getGreen() < 150 || color.getBlue() > 30 ||
+                    color.getRed() > 200) {
+                throw new RuntimeException("Bar padding color should be green");
+            }
+
+        } finally {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                @Override
+                public void run() {
+                    //frame.dispose();
+                }
+            });
+        }
+
+        System.out.println("ok");
+    }
+
+    static void setup(JFrame frame) {
+        bar = new JProgressBar();
+        bar.setBackground(Color.WHITE);
+        bar.setValue(2);
+        frame.getContentPane().add(bar, BorderLayout.NORTH);
+        frame.getContentPane().setBackground(Color.GREEN);
+        frame.setSize(200, 150);
+        frame.setLocation(100, 100);
+        frame.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/plaf/windows/6921687/bug6921687.java	Tue Apr 14 10:15:54 2015 -0700
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+   @bug 6921687
+   @summary Mnemonic disappears after repeated attempts to open menu items using
+   mnemonics
+   @author Semyon Sadetsky
+   @library /lib/testlibrary
+   @build jdk.testlibrary.OSInfo
+  */
+
+
+import jdk.testlibrary.OSInfo;
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+
+
+public class bug6921687 {
+
+    private static Class lafClass;
+    private static JFrame frame;
+
+    public static void main(String[] args) throws Exception {
+        if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) {
+            System.out.println("Only Windows platform test. Test is skipped.");
+            System.out.println("ok");
+            return;
+        }
+        lafClass = Class.forName(UIManager.getSystemLookAndFeelClassName());
+        UIManager.setLookAndFeel((LookAndFeel) lafClass.newInstance());
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    frame = new JFrame();
+                    frame.setUndecorated(true);
+                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                    setup(frame);
+                }
+            });
+
+            final Robot robot = new Robot();
+            robot.setAutoDelay(20);
+            robot.keyPress(KeyEvent.VK_ALT);
+            robot.keyPress(KeyEvent.VK_F);
+            robot.keyRelease(KeyEvent.VK_F);
+            robot.keyRelease(KeyEvent.VK_ALT);
+            robot.waitForIdle();
+            checkMnemonics();
+
+            robot.keyPress(KeyEvent.VK_ALT);
+            robot.keyPress(KeyEvent.VK_S);
+            robot.keyRelease(KeyEvent.VK_S);
+            robot.keyRelease(KeyEvent.VK_ALT);
+            robot.waitForIdle();
+            checkMnemonics();
+            System.out.println("ok");
+        } finally {
+            frame.dispose();
+        }
+
+    }
+
+    private static void checkMnemonics() throws Exception {
+        if ((Boolean) lafClass.getMethod("isMnemonicHidden").invoke(lafClass)) {
+            throw new RuntimeException("Mnemonics are hidden");
+        }
+    }
+
+    private static void setup(JFrame frame) {
+        JMenuBar menuBar = new JMenuBar();
+        frame.setJMenuBar(menuBar);
+
+        // First Menu, F - Mnemonic
+        JMenu firstMenu = new JMenu("First Menu");
+        firstMenu.setMnemonic(KeyEvent.VK_F);
+        firstMenu.add(new JMenuItem("One", KeyEvent.VK_O));
+        firstMenu.add(new JMenuItem("Two", KeyEvent.VK_T));
+        menuBar.add(firstMenu);
+
+        // Second Menu, S - Mnemonic
+        JMenu secondMenu = new JMenu("Second Menu");
+        secondMenu.setMnemonic(KeyEvent.VK_S);
+        secondMenu.add(new JMenuItem("A Menu Item", KeyEvent.VK_A));
+        menuBar.add(secondMenu);
+
+        frame.setSize(350, 250);
+        frame.setVisible(true);
+
+    }
+}
\ No newline at end of file